Merge remote-tracking branch 'upstream/main' into disablePro

This commit is contained in:
rainmakerv2 2024-12-28 13:34:31 +08:00
commit 750b860a62
101 changed files with 6047 additions and 818 deletions

4
.gitmodules vendored
View File

@ -119,3 +119,7 @@
path = externals/MoltenVK/cereal
url = https://github.com/USCiLab/cereal
shallow = true
[submodule "externals/cubeb"]
path = externals/cubeb
url = https://github.com/mozilla/cubeb
shallow = true

View File

@ -106,7 +106,7 @@ git_describe(GIT_DESC --always --long --dirty)
git_branch_name(GIT_BRANCH)
string(TIMESTAMP BUILD_DATE "%Y-%m-%d %H:%M:%S")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/common/scm_rev.cpp.in" "${CMAKE_CURRENT_SOURCE_DIR}/src/common/scm_rev.cpp" @ONLY)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/common/scm_rev.cpp.in" "${CMAKE_CURRENT_BINARY_DIR}/src/common/scm_rev.cpp" @ONLY)
find_package(Boost 1.84.0 CONFIG)
find_package(FFmpeg 5.1.2 MODULE)
@ -127,6 +127,7 @@ find_package(xxHash 0.8.2 MODULE)
find_package(ZLIB 1.3 MODULE)
find_package(Zydis 5.0.0 CONFIG)
find_package(pugixml 1.14 CONFIG)
find_package(cubeb CONFIG)
if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR NOT MSVC)
find_package(cryptopp 8.9.0 MODULE)
@ -198,9 +199,10 @@ set(AUDIO_LIB src/core/libraries/audio/audioin.cpp
src/core/libraries/audio/audioin.h
src/core/libraries/audio/audioout.cpp
src/core/libraries/audio/audioout.h
src/core/libraries/audio/sdl_audio.cpp
src/core/libraries/audio/sdl_audio.h
src/core/libraries/audio/audioout_backend.h
src/core/libraries/audio/audioout_error.h
src/core/libraries/audio/cubeb_audio.cpp
src/core/libraries/audio/sdl_audio.cpp
src/core/libraries/ngs2/ngs2.cpp
src/core/libraries/ngs2/ngs2.h
)
@ -493,6 +495,7 @@ set(COMMON src/common/logging/backend.cpp
src/common/polyfill_thread.h
src/common/rdtsc.cpp
src/common/rdtsc.h
src/common/ringbuffer.h
src/common/signal_context.h
src/common/signal_context.cpp
src/common/singleton.h
@ -517,7 +520,7 @@ set(COMMON src/common/logging/backend.cpp
src/common/number_utils.cpp
src/common/memory_patcher.h
src/common/memory_patcher.cpp
src/common/scm_rev.cpp
${CMAKE_CURRENT_BINARY_DIR}/src/common/scm_rev.cpp
src/common/scm_rev.h
)
@ -884,7 +887,7 @@ endif()
create_target_directory_groups(shadps4)
target_link_libraries(shadps4 PRIVATE magic_enum::magic_enum fmt::fmt toml11::toml11 tsl::robin_map xbyak::xbyak Tracy::TracyClient RenderDoc::API FFmpeg::ffmpeg Dear_ImGui gcn half::half ZLIB::ZLIB PNG::PNG)
target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator LibAtrac9 sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::glslang SDL3::SDL3 pugixml::pugixml stb::headers)
target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator LibAtrac9 sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::glslang SDL3::SDL3 pugixml::pugixml stb::headers cubeb::cubeb)
target_compile_definitions(shadps4 PRIVATE IMGUI_USER_CONFIG="imgui/imgui_config.h")
target_compile_definitions(Dear_ImGui PRIVATE IMGUI_USER_CONFIG="${PROJECT_SOURCE_DIR}/src/imgui/imgui_config.h")
@ -901,11 +904,18 @@ endif()
if (APPLE)
if (ENABLE_QT_GUI)
# Include MoltenVK in the app bundle, along with an ICD file so it can be found by the system Vulkan loader if used for loading layers.
target_sources(shadps4 PRIVATE externals/MoltenVK/MoltenVK_icd.json)
set_source_files_properties(externals/MoltenVK/MoltenVK_icd.json
PROPERTIES MACOSX_PACKAGE_LOCATION Resources/vulkan/icd.d)
add_custom_command(TARGET shadps4 POST_BUILD
COMMAND cmake -E copy $<TARGET_LINKER_FILE:MoltenVK> $<TARGET_BUNDLE_DIR:shadps4>/Contents/Frameworks/libMoltenVK.dylib)
set(MVK_ICD ${CMAKE_CURRENT_SOURCE_DIR}/externals/MoltenVK/MoltenVK_icd.json)
target_sources(shadps4 PRIVATE ${MVK_ICD})
set_source_files_properties(${MVK_ICD} PROPERTIES MACOSX_PACKAGE_LOCATION Resources/vulkan/icd.d)
set(MVK_DYLIB_SRC ${CMAKE_CURRENT_BINARY_DIR}/externals/MoltenVK/libMoltenVK.dylib)
set(MVK_DYLIB_DST ${CMAKE_CURRENT_BINARY_DIR}/shadps4.app/Contents/Frameworks/libMoltenVK.dylib)
add_custom_command(
OUTPUT ${MVK_DYLIB_DST}
DEPENDS ${MVK_DYLIB_SRC}
COMMAND cmake -E copy ${MVK_DYLIB_SRC} ${MVK_DYLIB_DST})
add_custom_target(CopyMoltenVK DEPENDS ${MVK_DYLIB_DST})
add_dependencies(shadps4 CopyMoltenVK)
set_property(TARGET shadps4 APPEND PROPERTY BUILD_RPATH "@executable_path/../Frameworks")
else()
# For non-bundled SDL build, just do a normal library link.

7
LICENSES/ISC.txt Normal file
View File

@ -0,0 +1,7 @@
ISC License
<copyright notice>
Permission to use, copy, modify, and /or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

View File

@ -86,32 +86,32 @@ F12 | Trigger RenderDoc Capture
> [!NOTE]
> Xbox and DualShock controllers work out of the box.
| Controller button | Keyboard equivelant |
|-------------|-------------|
LEFT AXIS UP | W |
LEFT AXIS DOWN | S |
LEFT AXIS LEFT | A |
LEFT AXIS RIGHT | D |
RIGHT AXIS UP | I |
RIGHT AXIS DOWN | K |
RIGHT AXIS LEFT | J |
RIGHT AXIS RIGHT | L |
TRIANGLE | Numpad 8 |
CIRCLE | Numpad 6 |
CROSS | Numpad 2 |
SQUARE | Numpad 4 |
PAD UP | UP |
PAD DOWN | DOWN |
PAD LEFT | LEFT |
PAD RIGHT | RIGHT |
OPTIONS | RETURN |
BACK BUTTON / TOUCH PAD | SPACE |
L1 | Q |
R1 | U |
L2 | E |
R2 | O |
L3 | X |
R3 | M |
| Controller button | Keyboard equivelant | Mac alternative |
|-------------|-------------|--------------|
LEFT AXIS UP | W | |
LEFT AXIS DOWN | S | |
LEFT AXIS LEFT | A | |
LEFT AXIS RIGHT | D | |
RIGHT AXIS UP | I | |
RIGHT AXIS DOWN | K | |
RIGHT AXIS LEFT | J | |
RIGHT AXIS RIGHT | L | |
TRIANGLE | Numpad 8 | C |
CIRCLE | Numpad 6 | B |
CROSS | Numpad 2 | N |
SQUARE | Numpad 4 | V |
PAD UP | UP | |
PAD DOWN | DOWN | |
PAD LEFT | LEFT | |
PAD RIGHT | RIGHT | |
OPTIONS | RETURN | |
BACK BUTTON / TOUCH PAD | SPACE | |
L1 | Q | |
R1 | U | |
L2 | E | |
R2 | O | |
L3 | X | |
R3 | M | |
# Main team

View File

@ -25,7 +25,7 @@ Once you are within the installer:
Beware, this requires you to create a Qt account. If you do not want to do this, please follow the MSYS2/MinGW compilation method instead.
1. Under the current, non beta version of Qt (at the time of writing 6.7.3), select the option `MSVC 2022 64-bit` or similar.
1. Under the current, non beta version of Qt (at the time of writing 6.7.3), select the option `MSVC 2022 64-bit` or similar, as well as `QT Multimedia`.
If you are on Windows on ARM / Qualcomm Snapdragon Elite X, select `MSVC 2022 ARM64` instead.
Go through the installation normally. If you know what you are doing, you may unselect individual components that eat up too much disk space.
@ -64,7 +64,7 @@ Go through the Git for Windows installation as normal
Your shadps4.exe will be in `C:\path\to\source\Build\x64-Clang-Release\`
To automatically populate the necessary files to run shadPS4.exe, run in a command prompt or terminal:
`C:\Qt\6.7.3\msvc2022_64\bin\windeployqt.exe "C:\path\to\shadps4.exe"`
`C:\Qt\6.7.3\msvc2022_64\bin\windeployqt6.exe "C:\path\to\shadps4.exe"`
(Change Qt path if you've installed it to non-default path)
## Option 2: MSYS2/MinGW

View File

@ -228,6 +228,16 @@ if (NOT TARGET stb::headers)
add_library(stb::headers ALIAS stb)
endif()
# cubeb
if (NOT TARGET cubeb::cubeb)
option(BUILD_TESTS "" OFF)
option(BUILD_TOOLS "" OFF)
option(BUNDLE_SPEEX "" ON)
option(USE_SANITIZERS "" OFF)
add_subdirectory(cubeb)
add_library(cubeb::cubeb ALIAS cubeb)
endif()
# Apple-only dependencies
if (APPLE)
# date

1
externals/cubeb vendored Submodule

@ -0,0 +1 @@
Subproject commit 9a9d034c51859a045a34f201334f612c51e6c19d

View File

@ -67,6 +67,7 @@ static int cursorHideTimeout = 5; // 5 seconds (default)
static bool separateupdatefolder = false;
static bool compatibilityData = false;
static bool checkCompatibilityOnStartup = false;
static std::string audioBackend = "cubeb";
// Gui
std::vector<std::filesystem::path> settings_install_dirs = {};
@ -239,6 +240,10 @@ bool getCheckCompatibilityOnStartup() {
return checkCompatibilityOnStartup;
}
std::string getAudioBackend() {
return audioBackend;
}
void setGpuId(s32 selectedGpuId) {
gpuId = selectedGpuId;
}
@ -371,6 +376,10 @@ void setCheckCompatibilityOnStartup(bool use) {
checkCompatibilityOnStartup = use;
}
void setAudioBackend(std::string backend) {
audioBackend = backend;
}
void setMainWindowGeometry(u32 x, u32 y, u32 w, u32 h) {
main_window_geometry_x = x;
main_window_geometry_y = y;
@ -623,6 +632,12 @@ void load(const std::filesystem::path& path) {
vkCrashDiagnostic = toml::find_or<bool>(vk, "crashDiagnostic", false);
}
if (data.contains("Audio")) {
const toml::value& audio = data.at("Audio");
audioBackend = toml::find_or<std::string>(audio, "backend", "cubeb");
}
if (data.contains("Debug")) {
const toml::value& debug = data.at("Debug");
@ -721,6 +736,7 @@ void save(const std::filesystem::path& path) {
data["Vulkan"]["rdocEnable"] = rdocEnable;
data["Vulkan"]["rdocMarkersEnable"] = vkMarkers;
data["Vulkan"]["crashDiagnostic"] = vkCrashDiagnostic;
data["Audio"]["backend"] = audioBackend;
data["Debug"]["DebugDump"] = isDebugDump;
data["Debug"]["CollectShader"] = isShaderDebug;
@ -824,6 +840,7 @@ void setDefaultValues() {
separateupdatefolder = false;
compatibilityData = false;
checkCompatibilityOnStartup = false;
audioBackend = "cubeb";
}
} // namespace Config

View File

@ -24,6 +24,7 @@ bool getEnableDiscordRPC();
bool getSeparateUpdateEnabled();
bool getCompatibilityEnabled();
bool getCheckCompatibilityOnStartup();
std::string getAudioBackend();
std::string getLogFilter();
std::string getLogType();
@ -75,6 +76,7 @@ void setSeparateUpdateEnabled(bool use);
void setGameInstallDirs(const std::vector<std::filesystem::path>& settings_install_dirs_config);
void setCompatibilityEnabled(bool use);
void setCheckCompatibilityOnStartup(bool use);
void setAudioBackend(std::string backend);
void setCursorState(s16 cursorState);
void setCursorHideTimeout(int newcursorHideTimeout);

374
src/common/ringbuffer.h Normal file
View File

@ -0,0 +1,374 @@
// SPDX-FileCopyrightText: Copyright 2016 Mozilla Foundation
// SPDX-License-Identifier: ISC
#pragma once
#include <algorithm>
#include <atomic>
#include <cstdint>
#include <memory>
#include <thread>
#include "common/assert.h"
/**
* Single producer single consumer lock-free and wait-free ring buffer.
*
* This data structure allows producing data from one thread, and consuming it
* on another thread, safely and without explicit synchronization. If used on
* two threads, this data structure uses atomics for thread safety. It is
* possible to disable the use of atomics at compile time and only use this data
* structure on one thread.
*
* The role for the producer and the consumer must be constant, i.e., the
* producer should always be on one thread and the consumer should always be on
* another thread.
*
* Some words about the inner workings of this class:
* - Capacity is fixed. Only one allocation is performed, in the constructor.
* When reading and writing, the return value of the method allows checking if
* the ring buffer is empty or full.
* - We always keep the read index at least one element ahead of the write
* index, so we can distinguish between an empty and a full ring buffer: an
* empty ring buffer is when the write index is at the same position as the
* read index. A full buffer is when the write index is exactly one position
* before the read index.
* - We synchronize updates to the read index after having read the data, and
* the write index after having written the data. This means that the each
* thread can only touch a portion of the buffer that is not touched by the
* other thread.
* - Callers are expected to provide buffers. When writing to the queue,
* elements are copied into the internal storage from the buffer passed in.
* When reading from the queue, the user is expected to provide a buffer.
* Because this is a ring buffer, data might not be contiguous in memory,
* providing an external buffer to copy into is an easy way to have linear
* data for further processing.
*/
template <typename T>
class RingBuffer {
public:
/**
* Constructor for a ring buffer.
*
* This performs an allocation, but is the only allocation that will happen
* for the life time of a `RingBuffer`.
*
* @param capacity The maximum number of element this ring buffer will hold.
*/
RingBuffer(int capacity)
/* One more element to distinguish from empty and full buffer. */
: capacity_(capacity + 1) {
ASSERT(storage_capacity() < std::numeric_limits<int>::max() / 2 &&
"buffer too large for the type of index used.");
ASSERT(capacity_ > 0);
data_.reset(new T[storage_capacity()]);
/* If this queue is using atomics, initializing those members as the last
* action in the constructor acts as a full barrier, and allow capacity() to
* be thread-safe. */
write_index_ = 0;
read_index_ = 0;
}
/**
* Push `count` zero or default constructed elements in the array.
*
* Only safely called on the producer thread.
*
* @param count The number of elements to enqueue.
* @return The number of element enqueued.
*/
int enqueue_default(int count) {
return enqueue(nullptr, count);
}
/**
* @brief Put an element in the queue
*
* Only safely called on the producer thread.
*
* @param element The element to put in the queue.
*
* @return 1 if the element was inserted, 0 otherwise.
*/
int enqueue(T& element) {
return enqueue(&element, 1);
}
/**
* Push `count` elements in the ring buffer.
*
* Only safely called on the producer thread.
*
* @param elements a pointer to a buffer containing at least `count` elements.
* If `elements` is nullptr, zero or default constructed elements are
* enqueued.
* @param count The number of elements to read from `elements`
* @return The number of elements successfully coped from `elements` and
* inserted into the ring buffer.
*/
int enqueue(T* elements, int count) {
#ifndef NDEBUG
assert_correct_thread(producer_id);
#endif
int wr_idx = write_index_.load(std::memory_order_relaxed);
int rd_idx = read_index_.load(std::memory_order_acquire);
if (full_internal(rd_idx, wr_idx)) {
return 0;
}
int to_write = std::min(available_write_internal(rd_idx, wr_idx), count);
/* First part, from the write index to the end of the array. */
int first_part = std::min(storage_capacity() - wr_idx, to_write);
/* Second part, from the beginning of the array */
int second_part = to_write - first_part;
if (elements) {
Copy(data_.get() + wr_idx, elements, first_part);
Copy(data_.get(), elements + first_part, second_part);
} else {
ConstructDefault(data_.get() + wr_idx, first_part);
ConstructDefault(data_.get(), second_part);
}
write_index_.store(increment_index(wr_idx, to_write), std::memory_order_release);
return to_write;
}
/**
* Retrieve at most `count` elements from the ring buffer, and copy them to
* `elements`, if non-null.
*
* Only safely called on the consumer side.
*
* @param elements A pointer to a buffer with space for at least `count`
* elements. If `elements` is `nullptr`, `count` element will be discarded.
* @param count The maximum number of elements to dequeue.
* @return The number of elements written to `elements`.
*/
int dequeue(T* elements, int count) {
#ifndef NDEBUG
assert_correct_thread(consumer_id);
#endif
int rd_idx = read_index_.load(std::memory_order_relaxed);
int wr_idx = write_index_.load(std::memory_order_acquire);
if (empty_internal(rd_idx, wr_idx)) {
return 0;
}
int to_read = std::min(available_read_internal(rd_idx, wr_idx), count);
int first_part = std::min(storage_capacity() - rd_idx, to_read);
int second_part = to_read - first_part;
if (elements) {
Copy(elements, data_.get() + rd_idx, first_part);
Copy(elements + first_part, data_.get(), second_part);
}
read_index_.store(increment_index(rd_idx, to_read), std::memory_order_release);
return to_read;
}
/**
* Get the number of available element for consuming.
*
* Only safely called on the consumer thread.
*
* @return The number of available elements for reading.
*/
int available_read() const {
#ifndef NDEBUG
assert_correct_thread(consumer_id);
#endif
return available_read_internal(read_index_.load(std::memory_order_relaxed),
write_index_.load(std::memory_order_acquire));
}
/**
* Get the number of available elements for consuming.
*
* Only safely called on the producer thread.
*
* @return The number of empty slots in the buffer, available for writing.
*/
int available_write() const {
#ifndef NDEBUG
assert_correct_thread(producer_id);
#endif
return available_write_internal(read_index_.load(std::memory_order_acquire),
write_index_.load(std::memory_order_relaxed));
}
/**
* Get the total capacity, for this ring buffer.
*
* Can be called safely on any thread.
*
* @return The maximum capacity of this ring buffer.
*/
int capacity() const {
return storage_capacity() - 1;
}
/**
* Reset the consumer and producer thread identifier, in case the thread are
* being changed. This has to be externally synchronized. This is no-op when
* asserts are disabled.
*/
void reset_thread_ids() {
#ifndef NDEBUG
consumer_id = producer_id = std::thread::id();
#endif
}
private:
/** Return true if the ring buffer is empty.
*
* @param read_index the read index to consider
* @param write_index the write index to consider
* @return true if the ring buffer is empty, false otherwise.
**/
bool empty_internal(int read_index, int write_index) const {
return write_index == read_index;
}
/** Return true if the ring buffer is full.
*
* This happens if the write index is exactly one element behind the read
* index.
*
* @param read_index the read index to consider
* @param write_index the write index to consider
* @return true if the ring buffer is full, false otherwise.
**/
bool full_internal(int read_index, int write_index) const {
return (write_index + 1) % storage_capacity() == read_index;
}
/**
* Return the size of the storage. It is one more than the number of elements
* that can be stored in the buffer.
*
* @return the number of elements that can be stored in the buffer.
*/
int storage_capacity() const {
return capacity_;
}
/**
* Returns the number of elements available for reading.
*
* @return the number of available elements for reading.
*/
int available_read_internal(int read_index, int write_index) const {
if (write_index >= read_index) {
return write_index - read_index;
} else {
return write_index + storage_capacity() - read_index;
}
}
/**
* Returns the number of empty elements, available for writing.
*
* @return the number of elements that can be written into the array.
*/
int available_write_internal(int read_index, int write_index) const {
/* We substract one element here to always keep at least one sample
* free in the buffer, to distinguish between full and empty array. */
int rv = read_index - write_index - 1;
if (write_index >= read_index) {
rv += storage_capacity();
}
return rv;
}
/**
* Increments an index, wrapping it around the storage.
*
* @param index a reference to the index to increment.
* @param increment the number by which `index` is incremented.
* @return the new index.
*/
int increment_index(int index, int increment) const {
ASSERT(increment >= 0);
return (index + increment) % storage_capacity();
}
/**
* @brief This allows checking that enqueue (resp. dequeue) are always called
* by the right thread.
*
* @param id the id of the thread that has called the calling method first.
*/
#ifndef NDEBUG
static void assert_correct_thread(std::thread::id& id) {
if (id == std::thread::id()) {
id = std::this_thread::get_id();
return;
}
ASSERT(id == std::this_thread::get_id());
}
#endif
/** Similar to memcpy, but accounts for the size of an element. */
template <typename CopyT>
void PodCopy(CopyT* destination, const CopyT* source, size_t count) {
static_assert(std::is_trivial<CopyT>::value, "Requires trivial type");
ASSERT(destination && source);
memcpy(destination, source, count * sizeof(CopyT));
}
/** Similar to a memset to zero, but accounts for the size of an element. */
template <typename ZeroT>
void PodZero(ZeroT* destination, size_t count) {
static_assert(std::is_trivial<ZeroT>::value, "Requires trivial type");
ASSERT(destination);
memset(destination, 0, count * sizeof(ZeroT));
}
template <typename CopyT, typename Trait>
void Copy(CopyT* destination, const CopyT* source, size_t count, Trait) {
for (size_t i = 0; i < count; i++) {
destination[i] = source[i];
}
}
template <typename CopyT>
void Copy(CopyT* destination, const CopyT* source, size_t count, std::true_type) {
PodCopy(destination, source, count);
}
/**
* This allows copying a number of elements from a `source` pointer to a
* `destination` pointer, using `memcpy` if it is safe to do so, or a loop that
* calls the constructors and destructors otherwise.
*/
template <typename CopyT>
void Copy(CopyT* destination, const T* source, size_t count) {
ASSERT(destination && source);
Copy(destination, source, count, typename std::is_trivial<CopyT>::type());
}
template <typename ConstructT, typename Trait>
void ConstructDefault(ConstructT* destination, size_t count, Trait) {
for (size_t i = 0; i < count; i++) {
destination[i] = ConstructT();
}
}
template <typename ConstructT>
void ConstructDefault(ConstructT* destination, size_t count, std::true_type) {
PodZero(destination, count);
}
/**
* This allows zeroing (using memset) or default-constructing a number of
* elements calling the constructors and destructors if necessary.
*/
template <typename ConstructT>
void ConstructDefault(ConstructT* destination, size_t count) {
ASSERT(destination);
ConstructDefault(destination, count, typename std::is_arithmetic<ConstructT>::type());
}
/** Index at which the oldest element is at, in samples. */
std::atomic<int> read_index_;
/** Index at which to write new elements. `write_index` is always at
* least one element ahead of `read_index_`. */
std::atomic<int> write_index_;
/** Maximum number of elements that can be stored in the ring buffer. */
const int capacity_;
/** Data storage */
std::unique_ptr<T[]> data_;
#ifndef NDEBUG
/** The id of the only thread that is allowed to read from the queue. */
mutable std::thread::id consumer_id;
/** The id of the only thread that is allowed to write from the queue. */
mutable std::thread::id producer_id;
#endif
};

View File

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

View File

@ -141,12 +141,9 @@ void Crypto::decryptEFSM(std::span<CryptoPP::byte, 16> NPcommID,
std::span<CryptoPP::byte, 16> efsmIv, std::span<CryptoPP::byte> ciphertext,
std::span<CryptoPP::byte> decrypted) {
std::vector<CryptoPP::byte> TrophyKey = {0x21, 0xF4, 0x1A, 0x6B, 0xAD, 0x8A, 0x1D, 0x3E,
0xCA, 0x7A, 0xD5, 0x86, 0xC1, 0x01, 0xB7, 0xA9};
std::vector<CryptoPP::byte> TrophyIV = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
// step 1: Encrypt NPcommID
CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption encrypt;
encrypt.SetKeyWithIV(TrophyKey.data(), TrophyKey.size(), TrophyIV.data());
std::vector<CryptoPP::byte> trpKey(16);

View File

@ -11,6 +11,7 @@
#include "libraries/kernel/time.h"
#include "libraries/system/msgdialog.h"
#include "video_core/amdgpu/pm4_cmds.h"
#include "video_core/renderer_vulkan/vk_pipeline_cache.h"
using namespace DebugStateType;
@ -168,8 +169,12 @@ void DebugStateImpl::PushRegsDump(uintptr_t base_addr, uintptr_t header_addr,
if ((*dump)->regs.stage_enable.IsStageEnabled(i)) {
auto stage = (*dump)->regs.ProgramForStage(i);
if (stage->address_lo != 0) {
const auto& info = AmdGpu::Liverpool::SearchBinaryInfo(stage->Address<u32*>());
auto code = stage->Code();
(*dump)->stages[i] = PipelineShaderProgramDump{
.name = Vulkan::PipelineCache::GetShaderName(Shader::StageFromIndex(i),
info.shader_hash),
.hash = info.shader_hash,
.user_data = *stage,
.code = std::vector<u32>{code.begin(), code.end()},
};
@ -191,7 +196,10 @@ void DebugStateImpl::PushRegsDumpCompute(uintptr_t base_addr, uintptr_t header_a
auto& cs = (*dump)->regs.cs_program;
cs = cs_state;
const auto& info = AmdGpu::Liverpool::SearchBinaryInfo(cs.Address<u32*>());
(*dump)->cs_data = PipelineComputerProgramDump{
.name = Vulkan::PipelineCache::GetShaderName(Shader::Stage::Compute, info.shader_hash),
.hash = info.shader_hash,
.cs_program = cs,
.code = std::vector<u32>{cs.Code().begin(), cs.Code().end()},
};

View File

@ -50,11 +50,15 @@ struct QueueDump {
};
struct PipelineShaderProgramDump {
std::string name;
u64 hash;
Vulkan::Liverpool::ShaderProgram user_data{};
std::vector<u32> code{};
};
struct PipelineComputerProgramDump {
std::string name;
u64 hash;
Vulkan::Liverpool::ComputeProgram cs_program{};
std::vector<u32> code{};
};

View File

@ -1174,7 +1174,7 @@ CmdListViewer::CmdListViewer(DebugStateType::FrameDump* _frame_dump,
}
}
void CmdListViewer::Draw(bool only_batches_view) {
void CmdListViewer::Draw(bool only_batches_view, CmdListFilter& filter) {
const auto& ctx = *GetCurrentContext();
if (batch_view.open) {
@ -1285,6 +1285,41 @@ void CmdListViewer::Draw(bool only_batches_view) {
}
auto& batch = std::get<BatchInfo>(event);
// filtering
{
bool remove = false;
if (filter.shader_name[0] != '\0') {
remove = true;
std::string_view shader_name{filter.shader_name};
const auto& data = frame_dump->regs.find(batch.command_addr);
if (data != frame_dump->regs.end()) {
DebugStateType::RegDump& dump = data->second;
if (dump.is_compute) {
if (dump.cs_data.name.contains(shader_name)) {
remove = false;
break;
}
} else {
for (int i = 0; i < DebugStateType::RegDump::MaxShaderStages; ++i) {
if (dump.regs.stage_enable.IsStageEnabled(i)) {
auto& stage = dump.stages[i];
if (stage.name.contains(shader_name)) {
remove = false;
break;
}
}
}
}
}
}
if (remove) {
continue;
}
}
auto const* pm4_hdr =
reinterpret_cast<PM4Header const*>(cmdb_addr + batch.start_addr);

View File

@ -35,6 +35,10 @@ void ParseDepthControl(u32 value, bool begin_table = true);
void ParseEqaa(u32 value, bool begin_table = true);
void ParseZInfo(u32 value, bool begin_table = true);
struct CmdListFilter {
char shader_name[128]{};
};
class CmdListViewer {
DebugStateType::FrameDump* frame_dump;
@ -70,7 +74,7 @@ public:
explicit CmdListViewer(DebugStateType::FrameDump* frame_dump, const std::vector<u32>& cmd_list,
uintptr_t base_addr = 0, std::string name = "");
void Draw(bool only_batches_view = false);
void Draw(bool only_batches_view, CmdListFilter& filter);
};
} // namespace Core::Devtools::Widget

View File

@ -117,7 +117,7 @@ static bool IsDrawCall(AmdGpu::PM4ItOpcode opcode) {
inline std::optional<std::string> exec_cli(const char* cli) {
std::array<char, 64> buffer{};
std::string output;
const auto f = popen(cli, "rt");
const auto f = popen(cli, "r");
if (!f) {
pclose(f);
return {};

View File

@ -132,6 +132,15 @@ void FrameDumpViewer::Draw() {
}
}
EndDisabled();
SameLine();
if (BeginMenu("Filter")) {
TextUnformatted("Shader name");
SameLine();
InputText("##filter_shader", filter.shader_name, sizeof(filter.shader_name));
ImGui::EndMenu();
}
TextEx("Submit num");
SameLine();
@ -187,7 +196,7 @@ void FrameDumpViewer::Draw() {
EndGroup();
}
if (is_showing && selected_cmd != -1) {
cmd_list_viewer[selected_cmd].Draw(is_collapsed);
cmd_list_viewer[selected_cmd].Draw(is_collapsed, filter);
}
End();
}

View File

@ -27,6 +27,8 @@ class FrameDumpViewer {
s32 selected_queue_num2;
s32 selected_cmd = -1;
CmdListFilter filter;
public:
bool is_open = true;

View File

@ -19,6 +19,57 @@ constexpr float BAR_HEIGHT_MULT = 1.25f;
constexpr float FRAME_GRAPH_PADDING_Y = 3.0f;
constexpr static float FRAME_GRAPH_HEIGHT = 50.0f;
void FrameGraph::DrawFrameGraph() {
// Frame graph - inspired by
// https://asawicki.info/news_1758_an_idea_for_visualization_of_frame_times
const float full_width = GetContentRegionAvail().x;
auto pos = GetCursorScreenPos();
const ImVec2 size{full_width, FRAME_GRAPH_HEIGHT + FRAME_GRAPH_PADDING_Y * 2.0f};
ItemSize(size);
if (!ItemAdd({pos, pos + size}, GetID("FrameGraph"))) {
return;
}
float target_dt = 1.0f / (TARGET_FPS * (float)Config::vblankDiv());
float cur_pos_x = pos.x + full_width;
pos.y += FRAME_GRAPH_PADDING_Y;
const float final_pos_y = pos.y + FRAME_GRAPH_HEIGHT;
auto& draw_list = *GetWindowDrawList();
draw_list.AddRectFilled({pos.x, pos.y - FRAME_GRAPH_PADDING_Y},
{pos.x + full_width, final_pos_y + FRAME_GRAPH_PADDING_Y},
IM_COL32(0x33, 0x33, 0x33, 0xFF));
draw_list.PushClipRect({pos.x, pos.y}, {pos.x + full_width, final_pos_y}, true);
for (u32 i = 0; i < FRAME_BUFFER_SIZE; ++i) {
const auto& frame_info = frame_list[(DebugState.GetFrameNum() - i) % FRAME_BUFFER_SIZE];
const float dt_factor = target_dt / frame_info.delta;
const float width = std::ceil(BAR_WIDTH_MULT / dt_factor);
const float height =
std::min(std::log2(BAR_HEIGHT_MULT / dt_factor) / 3.0f, 1.0f) * FRAME_GRAPH_HEIGHT;
ImU32 color;
if (dt_factor >= 0.95f) { // BLUE
color = IM_COL32(0x33, 0x33, 0xFF, 0xFF);
} else if (dt_factor >= 0.5f) { // GREEN <> YELLOW
float t = 1.0f - (dt_factor - 0.5f) * 2.0f;
int r = (int)(0xFF * t);
color = IM_COL32(r, 0xFF, 0, 0xFF);
} else { // YELLOW <> RED
float t = dt_factor * 2.0f;
int g = (int)(0xFF * t);
color = IM_COL32(0xFF, g, 0, 0xFF);
}
draw_list.AddRectFilled({cur_pos_x - width, final_pos_y - height}, {cur_pos_x, final_pos_y},
color);
cur_pos_x -= width;
if (cur_pos_x < width) {
break;
}
}
draw_list.PopClipRect();
}
void FrameGraph::Draw() {
if (!is_open) {
return;
@ -43,55 +94,9 @@ void FrameGraph::Draw() {
Text("Frame time: %.3f ms (%.1f FPS)", deltaTime, frameRate);
Text("Flip frame: %d Gnm submit frame: %d", DebugState.flip_frame_count.load(),
DebugState.gnm_frame_count.load());
SeparatorText("Frame graph");
const float full_width = GetContentRegionAvail().x;
// Frame graph - inspired by
// https://asawicki.info/news_1758_an_idea_for_visualization_of_frame_times
auto pos = GetCursorScreenPos();
const ImVec2 size{full_width, FRAME_GRAPH_HEIGHT + FRAME_GRAPH_PADDING_Y * 2.0f};
ItemSize(size);
if (!ItemAdd({pos, pos + size}, GetID("FrameGraph"))) {
return;
}
float target_dt = 1.0f / (TARGET_FPS * (float)Config::vblankDiv());
float cur_pos_x = pos.x + full_width;
pos.y += FRAME_GRAPH_PADDING_Y;
const float final_pos_y = pos.y + FRAME_GRAPH_HEIGHT;
draw_list.AddRectFilled({pos.x, pos.y - FRAME_GRAPH_PADDING_Y},
{pos.x + full_width, final_pos_y + FRAME_GRAPH_PADDING_Y},
IM_COL32(0x33, 0x33, 0x33, 0xFF));
draw_list.PushClipRect({pos.x, pos.y}, {pos.x + full_width, final_pos_y}, true);
for (u32 i = 0; i < FRAME_BUFFER_SIZE; ++i) {
const auto& frame_info = frame_list[(DebugState.GetFrameNum() - i) % FRAME_BUFFER_SIZE];
const float dt_factor = target_dt / frame_info.delta;
const float width = std::ceil(BAR_WIDTH_MULT / dt_factor);
const float height =
std::min(std::log2(BAR_HEIGHT_MULT / dt_factor) / 3.0f, 1.0f) * FRAME_GRAPH_HEIGHT;
ImU32 color;
if (dt_factor >= 0.95f) { // BLUE
color = IM_COL32(0x33, 0x33, 0xFF, 0xFF);
} else if (dt_factor >= 0.5f) { // GREEN <> YELLOW
float t = 1.0f - (dt_factor - 0.5f) * 2.0f;
int r = (int)(0xFF * t);
color = IM_COL32(r, 0xFF, 0, 0xFF);
} else { // YELLOW <> RED
float t = dt_factor * 2.0f;
int g = (int)(0xFF * t);
color = IM_COL32(0xFF, g, 0, 0xFF);
}
draw_list.AddRectFilled({cur_pos_x - width, final_pos_y - height},
{cur_pos_x, final_pos_y}, color);
cur_pos_x -= width;
if (cur_pos_x < width) {
break;
}
}
draw_list.PopClipRect();
DrawFrameGraph();
}
End();
}

View File

@ -16,6 +16,8 @@ class FrameGraph {
std::array<FrameInfo, FRAME_BUFFER_SIZE> frame_list{};
void DrawFrameGraph();
public:
bool is_open = true;

View File

@ -292,6 +292,17 @@ void RegView::Draw() {
EndMenuBar();
}
const char* shader_name = "_";
if (data.is_compute) {
shader_name = data.cs_data.name.c_str();
} else if (selected_shader >= 0) {
shader_name = data.stages[selected_shader].name.c_str();
}
TextUnformatted("Shader: ");
SameLine();
TextUnformatted(shader_name);
if (!data.is_compute &&
BeginChild("STAGES", {},
ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_AutoResizeY)) {

View File

@ -112,6 +112,10 @@ bool ShaderList::Selection::DrawShader(DebugStateType::ShaderDump& value) {
ReloadShader(value);
}
}
SameLine();
if (Button("Copy name")) {
SetClipboardText(value.name.c_str());
}
if (value.is_patched) {
if (BeginCombo("Shader type", showing_bin ? "SPIRV" : "GLSL",
@ -229,9 +233,16 @@ void ShaderList::Draw() {
return;
}
InputTextEx("##search_shader", "Search by name", search_box, sizeof(search_box), {},
ImGuiInputTextFlags_None);
auto width = GetContentRegionAvail().x;
int i = 0;
for (const auto& shader : DebugState.shader_dump_list) {
if (search_box[0] != '\0' && !shader.name.contains(search_box)) {
i++;
continue;
}
char name[128];
if (shader.is_patched) {
snprintf(name, sizeof(name), "%s (PATCH ON)", shader.name.c_str());

View File

@ -31,6 +31,8 @@ class ShaderList {
std::vector<Selection> open_shaders{};
char search_box[128]{};
public:
bool open = false;

View File

@ -12,6 +12,7 @@
#include <atomic>
#include <limits>
#include <memory>
#include <optional>
#include <semaphore>
#include <span>
#include <vector>

View File

@ -145,8 +145,10 @@ int PS4_SYSV_ABI sceAppContentDownloadDataFormat() {
return ORBIS_OK;
}
int PS4_SYSV_ABI sceAppContentDownloadDataGetAvailableSpaceKb() {
int PS4_SYSV_ABI sceAppContentDownloadDataGetAvailableSpaceKb(OrbisAppContentMountPoint* mountPoint,
u64* availableSpaceKb) {
LOG_ERROR(Lib_AppContent, "(STUBBED) called");
*availableSpaceKb = 1048576;
return ORBIS_OK;
}
@ -294,9 +296,9 @@ int PS4_SYSV_ABI sceAppContentTemporaryDataFormat() {
}
int PS4_SYSV_ABI sceAppContentTemporaryDataGetAvailableSpaceKb(
const OrbisAppContentMountPoint* mountPoint, size_t* availableSpaceKb) {
const OrbisAppContentMountPoint* mountPoint, u64* availableSpaceKb) {
LOG_ERROR(Lib_AppContent, "(STUBBED) called");
*availableSpaceKb = 1073741824;
*availableSpaceKb = 1048576;
return ORBIS_OK;
}

View File

@ -84,7 +84,8 @@ int PS4_SYSV_ABI sceAppContentDownload0Shrink();
int PS4_SYSV_ABI sceAppContentDownload1Expand();
int PS4_SYSV_ABI sceAppContentDownload1Shrink();
int PS4_SYSV_ABI sceAppContentDownloadDataFormat();
int PS4_SYSV_ABI sceAppContentDownloadDataGetAvailableSpaceKb();
int PS4_SYSV_ABI sceAppContentDownloadDataGetAvailableSpaceKb(OrbisAppContentMountPoint* mountPoint,
u64* availableSpaceKb);
int PS4_SYSV_ABI sceAppContentGetAddcontDownloadProgress();
int PS4_SYSV_ABI sceAppContentGetAddcontInfo(u32 service_label,
const OrbisNpUnifiedEntitlementLabel* entitlementLabel,
@ -105,7 +106,7 @@ int PS4_SYSV_ABI sceAppContentSmallSharedDataMount();
int PS4_SYSV_ABI sceAppContentSmallSharedDataUnmount();
int PS4_SYSV_ABI sceAppContentTemporaryDataFormat();
int PS4_SYSV_ABI sceAppContentTemporaryDataGetAvailableSpaceKb(
const OrbisAppContentMountPoint* mountPoint, size_t* availableSpaceKb);
const OrbisAppContentMountPoint* mountPoint, u64* availableSpaceKb);
int PS4_SYSV_ABI sceAppContentTemporaryDataMount();
int PS4_SYSV_ABI sceAppContentTemporaryDataMount2(OrbisAppContentTemporaryDataOption option,
OrbisAppContentMountPoint* mountPoint);

View File

@ -7,26 +7,15 @@
#include <magic_enum/magic_enum.hpp>
#include "common/assert.h"
#include "common/config.h"
#include "common/logging/log.h"
#include "core/libraries/audio/audioout.h"
#include "core/libraries/audio/audioout_backend.h"
#include "core/libraries/audio/audioout_error.h"
#include "core/libraries/audio/sdl_audio.h"
#include "core/libraries/libs.h"
namespace Libraries::AudioOut {
struct PortOut {
void* impl;
u32 samples_num;
u32 freq;
OrbisAudioOutParamFormat format;
OrbisAudioOutPort type;
int channels_num;
bool is_float;
std::array<int, 8> volume;
u8 sample_size;
bool is_open;
};
std::shared_mutex ports_mutex;
std::array<PortOut, SCE_AUDIO_OUT_NUM_PORTS> ports_out{};
@ -104,7 +93,7 @@ static bool IsFormatFloat(const OrbisAudioOutParamFormat format) {
}
}
static int GetFormatNumChannels(const OrbisAudioOutParamFormat format) {
static u8 GetFormatNumChannels(const OrbisAudioOutParamFormat format) {
switch (format) {
case OrbisAudioOutParamFormat::S16Mono:
case OrbisAudioOutParamFormat::FloatMono:
@ -187,13 +176,11 @@ int PS4_SYSV_ABI sceAudioOutClose(s32 handle) {
std::scoped_lock lock(ports_mutex);
auto& port = ports_out.at(handle - 1);
if (!port.is_open) {
if (!port.impl) {
return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT;
}
audio->Close(port.impl);
port.impl = nullptr;
port.is_open = false;
return ORBIS_OK;
}
@ -264,7 +251,7 @@ int PS4_SYSV_ABI sceAudioOutGetPortState(s32 handle, OrbisAudioOutPortState* sta
std::scoped_lock lock(ports_mutex);
const auto& port = ports_out.at(handle - 1);
if (!port.is_open) {
if (!port.impl) {
return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT;
}
@ -324,7 +311,16 @@ int PS4_SYSV_ABI sceAudioOutInit() {
if (audio != nullptr) {
return ORBIS_AUDIO_OUT_ERROR_ALREADY_INIT;
}
audio = std::make_unique<SDLAudioOut>();
const auto backend = Config::getAudioBackend();
if (backend == "cubeb") {
audio = std::make_unique<CubebAudioOut>();
} else if (backend == "sdl") {
audio = std::make_unique<SDLAudioOut>();
} else {
// Cubeb as a default fallback.
LOG_ERROR(Lib_AudioOut, "Invalid audio backend '{}', defaulting to cubeb.", backend);
audio = std::make_unique<CubebAudioOut>();
}
return ORBIS_OK;
}
@ -399,23 +395,25 @@ s32 PS4_SYSV_ABI sceAudioOutOpen(UserService::OrbisUserServiceUserId user_id,
}
std::scoped_lock lock{ports_mutex};
const auto port = std::ranges::find(ports_out, false, &PortOut::is_open);
const auto port =
std::ranges::find_if(ports_out, [&](const PortOut& p) { return p.impl == nullptr; });
if (port == ports_out.end()) {
LOG_ERROR(Lib_AudioOut, "Audio ports are full");
return ORBIS_AUDIO_OUT_ERROR_PORT_FULL;
}
port->is_open = true;
port->type = port_type;
port->samples_num = length;
port->freq = sample_rate;
port->format = format;
port->is_float = IsFormatFloat(format);
port->channels_num = GetFormatNumChannels(format);
port->sample_size = GetFormatSampleSize(format);
port->channels_num = GetFormatNumChannels(format);
port->samples_num = length;
port->frame_size = port->sample_size * port->channels_num;
port->buffer_size = port->frame_size * port->samples_num;
port->freq = sample_rate;
port->volume.fill(SCE_AUDIO_OUT_VOLUME_0DB);
port->impl = audio->Open(*port);
port->impl = audio->Open(port->is_float, port->channels_num, port->freq);
return std::distance(ports_out.begin(), port) + 1;
}
@ -424,7 +422,7 @@ int PS4_SYSV_ABI sceAudioOutOpenEx() {
return ORBIS_OK;
}
s32 PS4_SYSV_ABI sceAudioOutOutput(s32 handle, const void* ptr) {
s32 PS4_SYSV_ABI sceAudioOutOutput(s32 handle, void* ptr) {
if (handle < 1 || handle > SCE_AUDIO_OUT_NUM_PORTS) {
return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT;
}
@ -434,12 +432,11 @@ s32 PS4_SYSV_ABI sceAudioOutOutput(s32 handle, const void* ptr) {
}
auto& port = ports_out.at(handle - 1);
if (!port.is_open) {
if (!port.impl) {
return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT;
}
const size_t data_size = port.samples_num * port.sample_size * port.channels_num;
audio->Output(port.impl, ptr, data_size);
port.impl->Output(ptr, port.buffer_size);
return ORBIS_OK;
}
@ -548,7 +545,7 @@ s32 PS4_SYSV_ABI sceAudioOutSetVolume(s32 handle, s32 flag, s32* vol) {
std::scoped_lock lock(ports_mutex);
auto& port = ports_out.at(handle - 1);
if (!port.is_open) {
if (!port.impl) {
return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT;
}
@ -579,7 +576,7 @@ s32 PS4_SYSV_ABI sceAudioOutSetVolume(s32 handle, s32 flag, s32* vol) {
}
}
audio->SetVolume(port.impl, port.volume);
port.impl->SetVolume(port.volume);
return ORBIS_OK;
}

View File

@ -3,12 +3,15 @@
#pragma once
#include "common/bit_field.h"
#include <memory>
#include "common/bit_field.h"
#include "core/libraries/system/userservice.h"
namespace Libraries::AudioOut {
class PortBackend;
// Main up to 8 ports, BGM 1 port, voice up to 4 ports,
// personal up to 4 ports, padspk up to 5 ports, aux 1 port
constexpr int SCE_AUDIO_OUT_NUM_PORTS = 22;
@ -43,7 +46,7 @@ union OrbisAudioOutParamExtendedInformation {
struct OrbisAudioOutOutputParam {
s32 handle;
const void* ptr;
void* ptr;
};
struct OrbisAudioOutPortState {
@ -56,6 +59,21 @@ struct OrbisAudioOutPortState {
u64 reserved64[2];
};
struct PortOut {
std::unique_ptr<PortBackend> impl{};
OrbisAudioOutPort type;
OrbisAudioOutParamFormat format;
bool is_float;
u8 sample_size;
u8 channels_num;
u32 samples_num;
u32 frame_size;
u32 buffer_size;
u32 freq;
std::array<int, 8> volume;
};
int PS4_SYSV_ABI sceAudioOutDeviceIdOpen();
int PS4_SYSV_ABI sceAudioDeviceControlGet();
int PS4_SYSV_ABI sceAudioDeviceControlSet();
@ -94,7 +112,7 @@ s32 PS4_SYSV_ABI sceAudioOutOpen(UserService::OrbisUserServiceUserId user_id,
OrbisAudioOutPort port_type, s32 index, u32 length,
u32 sample_rate, OrbisAudioOutParamExtendedInformation param_type);
int PS4_SYSV_ABI sceAudioOutOpenEx();
s32 PS4_SYSV_ABI sceAudioOutOutput(s32 handle, const void* ptr);
s32 PS4_SYSV_ABI sceAudioOutOutput(s32 handle, void* ptr);
s32 PS4_SYSV_ABI sceAudioOutOutputs(OrbisAudioOutOutputParam* param, u32 num);
int PS4_SYSV_ABI sceAudioOutPtClose();
int PS4_SYSV_ABI sceAudioOutPtGetLastOutputTime();

View File

@ -3,17 +3,42 @@
#pragma once
typedef struct cubeb cubeb;
namespace Libraries::AudioOut {
struct PortOut;
class PortBackend {
public:
virtual ~PortBackend() = default;
virtual void Output(void* ptr, size_t size) = 0;
virtual void SetVolume(const std::array<int, 8>& ch_volumes) = 0;
};
class AudioOutBackend {
public:
AudioOutBackend() = default;
virtual ~AudioOutBackend() = default;
virtual void* Open(bool is_float, int num_channels, u32 sample_rate) = 0;
virtual void Close(void* impl) = 0;
virtual void Output(void* impl, const void* ptr, size_t size) = 0;
virtual void SetVolume(void* impl, std::array<int, 8> ch_volumes) = 0;
virtual std::unique_ptr<PortBackend> Open(PortOut& port) = 0;
};
class CubebAudioOut final : public AudioOutBackend {
public:
CubebAudioOut();
~CubebAudioOut() override;
std::unique_ptr<PortBackend> Open(PortOut& port) override;
private:
cubeb* ctx = nullptr;
};
class SDLAudioOut final : public AudioOutBackend {
public:
std::unique_ptr<PortBackend> Open(PortOut& port) override;
};
} // namespace Libraries::AudioOut

View File

@ -0,0 +1,163 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <condition_variable>
#include <mutex>
#include <cubeb/cubeb.h>
#include "common/logging/log.h"
#include "common/ringbuffer.h"
#include "core/libraries/audio/audioout.h"
#include "core/libraries/audio/audioout_backend.h"
namespace Libraries::AudioOut {
constexpr int AUDIO_STREAM_BUFFER_THRESHOLD = 65536; // Define constant for buffer threshold
class CubebPortBackend : public PortBackend {
public:
CubebPortBackend(cubeb* ctx, const PortOut& port)
: frame_size(port.frame_size), buffer(static_cast<int>(port.buffer_size) * 4) {
if (!ctx) {
return;
}
const auto get_channel_layout = [&port] -> cubeb_channel_layout {
switch (port.channels_num) {
case 1:
return CUBEB_LAYOUT_MONO;
case 2:
return CUBEB_LAYOUT_STEREO;
case 8:
return CUBEB_LAYOUT_3F4_LFE;
default:
UNREACHABLE();
}
};
cubeb_stream_params stream_params = {
.format = port.is_float ? CUBEB_SAMPLE_FLOAT32LE : CUBEB_SAMPLE_S16LE,
.rate = port.freq,
.channels = port.channels_num,
.layout = get_channel_layout(),
.prefs = CUBEB_STREAM_PREF_NONE,
};
u32 latency_frames = 512;
if (const auto ret = cubeb_get_min_latency(ctx, &stream_params, &latency_frames);
ret != CUBEB_OK) {
LOG_WARNING(Lib_AudioOut,
"Could not get minimum cubeb audio latency, falling back to default: {}",
ret);
}
char stream_name[64];
snprintf(stream_name, sizeof(stream_name), "shadPS4 stream %p", this);
if (const auto ret = cubeb_stream_init(ctx, &stream, stream_name, nullptr, nullptr, nullptr,
&stream_params, latency_frames, &DataCallback,
&StateCallback, this);
ret != CUBEB_OK) {
LOG_ERROR(Lib_AudioOut, "Failed to create cubeb stream: {}", ret);
return;
}
if (const auto ret = cubeb_stream_start(stream); ret != CUBEB_OK) {
LOG_ERROR(Lib_AudioOut, "Failed to start cubeb stream: {}", ret);
cubeb_stream_destroy(stream);
stream = nullptr;
return;
}
}
~CubebPortBackend() override {
if (!stream) {
return;
}
if (const auto ret = cubeb_stream_stop(stream); ret != CUBEB_OK) {
LOG_WARNING(Lib_AudioOut, "Failed to stop cubeb stream: {}", ret);
}
cubeb_stream_destroy(stream);
stream = nullptr;
}
void Output(void* ptr, size_t size) override {
if (!stream) {
return;
}
auto* data = static_cast<u8*>(ptr);
std::unique_lock lock{buffer_mutex};
buffer_cv.wait(lock, [&] { return buffer.available_write() >= size; });
buffer.enqueue(data, static_cast<int>(size));
}
void SetVolume(const std::array<int, 8>& ch_volumes) override {
if (!stream) {
return;
}
// Cubeb does not have per-channel volumes, for now just take the maximum of the channels.
const auto vol = *std::ranges::max_element(ch_volumes);
if (const auto ret =
cubeb_stream_set_volume(stream, static_cast<float>(vol) / SCE_AUDIO_OUT_VOLUME_0DB);
ret != CUBEB_OK) {
LOG_WARNING(Lib_AudioOut, "Failed to change cubeb stream volume: {}", ret);
}
}
private:
static long DataCallback(cubeb_stream* stream, void* user_data, const void* in, void* out,
long num_frames) {
auto* stream_data = static_cast<CubebPortBackend*>(user_data);
const auto out_data = static_cast<u8*>(out);
const auto requested_size = static_cast<int>(num_frames * stream_data->frame_size);
std::unique_lock lock{stream_data->buffer_mutex};
const auto dequeued_size = stream_data->buffer.dequeue(out_data, requested_size);
lock.unlock();
stream_data->buffer_cv.notify_one();
if (dequeued_size < requested_size) {
// Need to fill remaining space with silence.
std::memset(out_data + dequeued_size, 0, requested_size - dequeued_size);
}
return num_frames;
}
static void StateCallback(cubeb_stream* stream, void* user_data, cubeb_state state) {
switch (state) {
case CUBEB_STATE_STARTED:
LOG_INFO(Lib_AudioOut, "Cubeb stream started");
break;
case CUBEB_STATE_STOPPED:
LOG_INFO(Lib_AudioOut, "Cubeb stream stopped");
break;
case CUBEB_STATE_DRAINED:
LOG_INFO(Lib_AudioOut, "Cubeb stream drained");
break;
case CUBEB_STATE_ERROR:
LOG_ERROR(Lib_AudioOut, "Cubeb stream encountered an error");
break;
}
}
size_t frame_size;
RingBuffer<u8> buffer;
std::mutex buffer_mutex;
std::condition_variable buffer_cv;
cubeb_stream* stream{};
};
CubebAudioOut::CubebAudioOut() {
if (const auto ret = cubeb_init(&ctx, "shadPS4", nullptr); ret != CUBEB_OK) {
LOG_CRITICAL(Lib_AudioOut, "Failed to create cubeb context: {}", ret);
}
}
CubebAudioOut::~CubebAudioOut() {
if (!ctx) {
return;
}
cubeb_destroy(ctx);
ctx = nullptr;
}
std::unique_ptr<PortBackend> CubebAudioOut::Open(PortOut& port) {
return std::make_unique<CubebPortBackend>(ctx, port);
}
} // namespace Libraries::AudioOut

View File

@ -1,44 +1,76 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <thread>
#include <SDL3/SDL_audio.h>
#include <SDL3/SDL_init.h>
#include <SDL3/SDL_timer.h>
#include "common/assert.h"
#include "core/libraries/audio/sdl_audio.h"
#include "common/logging/log.h"
#include "core/libraries/audio/audioout.h"
#include "core/libraries/audio/audioout_backend.h"
namespace Libraries::AudioOut {
constexpr int AUDIO_STREAM_BUFFER_THRESHOLD = 65536; // Define constant for buffer threshold
void* SDLAudioOut::Open(bool is_float, int num_channels, u32 sample_rate) {
SDL_AudioSpec fmt;
SDL_zero(fmt);
fmt.format = is_float ? SDL_AUDIO_F32 : SDL_AUDIO_S16;
fmt.channels = num_channels;
fmt.freq = sample_rate;
auto* stream =
SDL_OpenAudioDeviceStream(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &fmt, nullptr, nullptr);
SDL_ResumeAudioStreamDevice(stream);
return stream;
}
void SDLAudioOut::Close(void* impl) {
SDL_DestroyAudioStream(static_cast<SDL_AudioStream*>(impl));
}
void SDLAudioOut::Output(void* impl, const void* ptr, size_t size) {
auto* stream = static_cast<SDL_AudioStream*>(impl);
SDL_PutAudioStreamData(stream, ptr, size);
while (SDL_GetAudioStreamAvailable(stream) > AUDIO_STREAM_BUFFER_THRESHOLD) {
SDL_Delay(0);
class SDLPortBackend : public PortBackend {
public:
explicit SDLPortBackend(const PortOut& port) {
const SDL_AudioSpec fmt = {
.format = port.is_float ? SDL_AUDIO_F32 : SDL_AUDIO_S16,
.channels = port.channels_num,
.freq = static_cast<int>(port.freq),
};
stream =
SDL_OpenAudioDeviceStream(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &fmt, nullptr, nullptr);
if (stream == nullptr) {
LOG_ERROR(Lib_AudioOut, "Failed to create SDL audio stream: {}", SDL_GetError());
return;
}
if (!SDL_ResumeAudioStreamDevice(stream)) {
LOG_ERROR(Lib_AudioOut, "Failed to resume SDL audio stream: {}", SDL_GetError());
SDL_DestroyAudioStream(stream);
stream = nullptr;
return;
}
}
}
void SDLAudioOut::SetVolume(void* impl, std::array<int, 8> ch_volumes) {
// Not yet implemented
~SDLPortBackend() override {
if (!stream) {
return;
}
SDL_DestroyAudioStream(stream);
stream = nullptr;
}
void Output(void* ptr, size_t size) override {
if (!stream) {
return;
}
SDL_PutAudioStreamData(stream, ptr, static_cast<int>(size));
while (SDL_GetAudioStreamAvailable(stream) > AUDIO_STREAM_BUFFER_THRESHOLD) {
// Yield to allow the stream to drain.
std::this_thread::yield();
}
}
void SetVolume(const std::array<int, 8>& ch_volumes) override {
if (!stream) {
return;
}
// SDL does not have per-channel volumes, for now just take the maximum of the channels.
const auto vol = *std::ranges::max_element(ch_volumes);
if (!SDL_SetAudioStreamGain(stream, static_cast<float>(vol) / SCE_AUDIO_OUT_VOLUME_0DB)) {
LOG_WARNING(Lib_AudioOut, "Failed to change SDL audio stream volume: {}",
SDL_GetError());
}
}
private:
SDL_AudioStream* stream;
};
std::unique_ptr<PortBackend> SDLAudioOut::Open(PortOut& port) {
return std::make_unique<SDLPortBackend>(port);
}
} // namespace Libraries::AudioOut

View File

@ -1,18 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include "core/libraries/audio/audioout_backend.h"
namespace Libraries::AudioOut {
class SDLAudioOut final : public AudioOutBackend {
public:
void* Open(bool is_float, int num_channels, u32 sample_rate) override;
void Close(void* impl) override;
void Output(void* impl, const void* ptr, size_t size) override;
void SetVolume(void* impl, std::array<int, 8> ch_volumes) override;
};
} // namespace Libraries::AudioOut

View File

@ -29,7 +29,7 @@ namespace Libraries::GnmDriver {
using namespace AmdGpu;
enum GnmEventIdents : u64 {
enum GnmEventType : u64 {
Compute0RelMem = 0x00,
Compute1RelMem = 0x01,
Compute2RelMem = 0x02,
@ -337,6 +337,12 @@ static inline u32* ClearContextState(u32* cmdbuf) {
return cmdbuf + ClearStateSequence.size();
}
static inline bool IsValidEventType(Platform::InterruptId id) {
return (static_cast<u32>(id) >= static_cast<u32>(Platform::InterruptId::Compute0RelMem) &&
static_cast<u32>(id) <= static_cast<u32>(Platform::InterruptId::Compute6RelMem)) ||
static_cast<u32>(id) == static_cast<u32>(Platform::InterruptId::GfxEop);
}
s32 PS4_SYSV_ABI sceGnmAddEqEvent(SceKernelEqueue eq, u64 id, void* udata) {
LOG_TRACE(Lib_GnmDriver, "called");
@ -347,8 +353,7 @@ s32 PS4_SYSV_ABI sceGnmAddEqEvent(SceKernelEqueue eq, u64 id, void* udata) {
EqueueEvent kernel_event{};
kernel_event.event.ident = id;
kernel_event.event.filter = SceKernelEvent::Filter::GraphicsCore;
// The library only sets EV_ADD but it is suspected the kernel driver forces EV_CLEAR
kernel_event.event.flags = SceKernelEvent::Flags::Clear;
kernel_event.event.flags = SceKernelEvent::Flags::Add;
kernel_event.event.fflags = 0;
kernel_event.event.data = id;
kernel_event.event.udata = udata;
@ -357,11 +362,15 @@ s32 PS4_SYSV_ABI sceGnmAddEqEvent(SceKernelEqueue eq, u64 id, void* udata) {
Platform::IrqC::Instance()->Register(
static_cast<Platform::InterruptId>(id),
[=](Platform::InterruptId irq) {
ASSERT_MSG(irq == static_cast<Platform::InterruptId>(id),
"An unexpected IRQ occured"); // We need to convert IRQ# to event id and do
// proper filtering in trigger function
eq->TriggerEvent(static_cast<GnmEventIdents>(id), SceKernelEvent::Filter::GraphicsCore,
nullptr);
ASSERT_MSG(irq == static_cast<Platform::InterruptId>(id), "An unexpected IRQ occured");
// We need to convert IRQ# to event id
if (!IsValidEventType(irq))
return;
// Event data is expected to be an event type as per sceGnmGetEqEventType.
eq->TriggerEvent(static_cast<GnmEventType>(id), SceKernelEvent::Filter::GraphicsCore,
reinterpret_cast<void*>(id));
},
eq);
return ORBIS_OK;
@ -476,7 +485,7 @@ s32 PS4_SYSV_ABI sceGnmDeleteEqEvent(SceKernelEqueue eq, u64 id) {
return ORBIS_KERNEL_ERROR_EBADF;
}
eq->RemoveEvent(id);
eq->RemoveEvent(id, SceKernelEvent::Filter::GraphicsCore);
Platform::IrqC::Instance()->Unregister(static_cast<Platform::InterruptId>(id), eq);
return ORBIS_OK;
@ -1000,9 +1009,13 @@ int PS4_SYSV_ABI sceGnmGetDebugTimestamp() {
return ORBIS_OK;
}
int PS4_SYSV_ABI sceGnmGetEqEventType() {
LOG_ERROR(Lib_GnmDriver, "(STUBBED) called");
return ORBIS_OK;
int PS4_SYSV_ABI sceGnmGetEqEventType(const SceKernelEvent* ev) {
LOG_TRACE(Lib_GnmDriver, "called");
auto data = sceKernelGetEventData(ev);
ASSERT(static_cast<GnmEventType>(data) == GnmEventType::GfxEop);
return data;
}
int PS4_SYSV_ABI sceGnmGetEqTimeStamp() {

View File

@ -85,7 +85,7 @@ int PS4_SYSV_ABI sceGnmGetCoredumpMode();
int PS4_SYSV_ABI sceGnmGetCoredumpProtectionFaultTimestamp();
int PS4_SYSV_ABI sceGnmGetDbgGcHandle();
int PS4_SYSV_ABI sceGnmGetDebugTimestamp();
int PS4_SYSV_ABI sceGnmGetEqEventType();
int PS4_SYSV_ABI sceGnmGetEqEventType(const SceKernelEvent* ev);
int PS4_SYSV_ABI sceGnmGetEqTimeStamp();
int PS4_SYSV_ABI sceGnmGetGpuBlockStatus();
u32 PS4_SYSV_ABI sceGnmGetGpuCoreClockFrequency();

View File

@ -12,6 +12,8 @@
namespace Libraries::Kernel {
// Events are uniquely identified by id and filter.
bool EqueueInternal::AddEvent(EqueueEvent& event) {
std::scoped_lock lock{m_mutex};
@ -27,12 +29,13 @@ bool EqueueInternal::AddEvent(EqueueEvent& event) {
return true;
}
bool EqueueInternal::RemoveEvent(u64 id) {
bool EqueueInternal::RemoveEvent(u64 id, s16 filter) {
bool has_found = false;
std::scoped_lock lock{m_mutex};
const auto& it =
std::ranges::find_if(m_events, [id](auto& ev) { return ev.event.ident == id; });
const auto& it = std::ranges::find_if(m_events, [id, filter](auto& ev) {
return ev.event.ident == id && ev.event.filter == filter;
});
if (it != m_events.cend()) {
m_events.erase(it);
has_found = true;
@ -68,7 +71,7 @@ int EqueueInternal::WaitForEvents(SceKernelEvent* ev, int num, u32 micros) {
if (ev->flags & SceKernelEvent::Flags::OneShot) {
for (auto ev_id = 0u; ev_id < count; ++ev_id) {
RemoveEvent(ev->ident);
RemoveEvent(ev->ident, ev->filter);
}
}
@ -94,8 +97,11 @@ int EqueueInternal::GetTriggeredEvents(SceKernelEvent* ev, int num) {
int count = 0;
for (auto& event : m_events) {
if (event.IsTriggered()) {
// Event should not trigger again
event.ResetTriggerState();
if (event.event.flags & SceKernelEvent::Flags::Clear) {
event.Reset();
event.Clear();
}
ev[count++] = event.event;
if (count == num) {
@ -334,7 +340,7 @@ int PS4_SYSV_ABI sceKernelDeleteUserEvent(SceKernelEqueue eq, int id) {
return ORBIS_KERNEL_ERROR_EBADF;
}
if (!eq->RemoveEvent(id)) {
if (!eq->RemoveEvent(id, SceKernelEvent::Filter::User)) {
return ORBIS_KERNEL_ERROR_ENOENT;
}
return ORBIS_OK;
@ -344,6 +350,10 @@ s16 PS4_SYSV_ABI sceKernelGetEventFilter(const SceKernelEvent* ev) {
return ev->filter;
}
u64 PS4_SYSV_ABI sceKernelGetEventData(const SceKernelEvent* ev) {
return ev->data;
}
void RegisterEventQueue(Core::Loader::SymbolsResolver* sym) {
LIB_FUNCTION("D0OdFMjp46I", "libkernel", 1, "libkernel", 1, 1, sceKernelCreateEqueue);
LIB_FUNCTION("jpFjmgAC5AE", "libkernel", 1, "libkernel", 1, 1, sceKernelDeleteEqueue);
@ -356,6 +366,7 @@ void RegisterEventQueue(Core::Loader::SymbolsResolver* sym) {
LIB_FUNCTION("LJDwdSNTnDg", "libkernel", 1, "libkernel", 1, 1, sceKernelDeleteUserEvent);
LIB_FUNCTION("mJ7aghmgvfc", "libkernel", 1, "libkernel", 1, 1, sceKernelGetEventId);
LIB_FUNCTION("23CPPI1tyBY", "libkernel", 1, "libkernel", 1, 1, sceKernelGetEventFilter);
LIB_FUNCTION("kwGyyjohI50", "libkernel", 1, "libkernel", 1, 1, sceKernelGetEventData);
}
} // namespace Libraries::Kernel

View File

@ -66,8 +66,11 @@ struct EqueueEvent {
std::chrono::steady_clock::time_point time_added;
std::unique_ptr<boost::asio::steady_timer> timer;
void Reset() {
void ResetTriggerState() {
is_triggered = false;
}
void Clear() {
event.fflags = 0;
event.data = 0;
}
@ -83,7 +86,7 @@ struct EqueueEvent {
}
bool operator==(const EqueueEvent& ev) const {
return ev.event.ident == event.ident;
return ev.event.ident == event.ident && ev.event.filter == event.filter;
}
private:
@ -99,7 +102,7 @@ public:
}
bool AddEvent(EqueueEvent& event);
bool RemoveEvent(u64 id);
bool RemoveEvent(u64 id, s16 filter);
int WaitForEvents(SceKernelEvent* ev, int num, u32 micros);
bool TriggerEvent(u64 ident, s16 filter, void* trigger_data);
int GetTriggeredEvents(SceKernelEvent* ev, int num);
@ -122,6 +125,8 @@ private:
using SceKernelUseconds = u32;
using SceKernelEqueue = EqueueInternal*;
u64 PS4_SYSV_ABI sceKernelGetEventData(const SceKernelEvent* ev);
void RegisterEventQueue(Core::Loader::SymbolsResolver* sym);
} // namespace Libraries::Kernel

View File

@ -244,8 +244,8 @@ int PS4_SYSV_ABI posix_pthread_create_name_np(PthreadT* thread, const PthreadAtt
new_thread->tid = ++TidCounter;
if (new_thread->attr.stackaddr_attr == 0) {
/* Enforce minimum stack size of 64 KB */
static constexpr size_t MinimumStack = 64_KB;
/* Enforce minimum stack size of 128 KB */
static constexpr size_t MinimumStack = 128_KB;
auto& stacksize = new_thread->attr.stacksize_attr;
stacksize = std::max(stacksize, MinimumStack);
}

View File

@ -101,13 +101,17 @@ PAddr MemoryManager::Allocate(PAddr search_start, PAddr search_end, size_t size,
auto dmem_area = FindDmemArea(search_start);
const auto is_suitable = [&] {
if (dmem_area == dmem_map.end()) {
return false;
}
const auto aligned_base = Common::AlignUp(dmem_area->second.base, alignment);
const auto alignment_size = aligned_base - dmem_area->second.base;
const auto remaining_size =
dmem_area->second.size >= alignment_size ? dmem_area->second.size - alignment_size : 0;
return dmem_area->second.is_free && remaining_size >= size;
};
while (!is_suitable() && dmem_area->second.GetEnd() <= search_end) {
while (dmem_area != dmem_map.end() && !is_suitable() &&
dmem_area->second.GetEnd() <= search_end) {
++dmem_area;
}
ASSERT_MSG(is_suitable(), "Unable to find free direct memory area: size = {:#x}", size);

View File

@ -311,8 +311,9 @@ void Emulator::LoadSystemModules(const std::filesystem::path& file, std::string
found_modules, [&](const auto& path) { return path.filename() == module_name; });
if (it != found_modules.end()) {
LOG_INFO(Loader, "Loading {}", it->string());
linker->LoadModule(*it);
continue;
if (linker->LoadModule(*it) != -1) {
continue;
}
}
if (init_func) {
LOG_INFO(Loader, "Can't Load {} switching to HLE", module_name);
@ -321,7 +322,7 @@ void Emulator::LoadSystemModules(const std::filesystem::path& file, std::string
LOG_INFO(Loader, "No HLE available for {} module", module_name);
}
}
if (std::filesystem::exists(sys_module_path / game_serial)) {
if (!game_serial.empty() && std::filesystem::exists(sys_module_path / game_serial)) {
for (const auto& entry :
std::filesystem::directory_iterator(sys_module_path / game_serial)) {
LOG_INFO(Loader, "Loading {} from game serial file {}", entry.path().string(),

View File

@ -213,9 +213,9 @@ void CheckUpdate::setupUI(const QString& downloadUrl, const QString& latestDate,
// Don't show changelog button if:
// The current version is a pre-release and the version to be downloaded is a release.
bool current_isRelease = currentRev.startsWith('v', Qt::CaseInsensitive);
bool latest_isRelease = latestRev.startsWith('v', Qt::CaseInsensitive);
if (!current_isRelease && latest_isRelease) {
bool current_isWIP = currentRev.endsWith("WIP", Qt::CaseInsensitive);
bool latest_isWIP = latestRev.endsWith("WIP", Qt::CaseInsensitive);
if (current_isWIP && !latest_isWIP) {
} else {
QTextEdit* textField = new QTextEdit(this);
textField->setReadOnly(true);

View File

@ -18,9 +18,10 @@ CompatibilityInfoClass::CompatibilityInfoClass()
};
CompatibilityInfoClass::~CompatibilityInfoClass() = default;
void CompatibilityInfoClass::UpdateCompatibilityDatabase(QWidget* parent) {
if (LoadCompatibilityFile())
return;
void CompatibilityInfoClass::UpdateCompatibilityDatabase(QWidget* parent, bool forced) {
if (!forced)
if (LoadCompatibilityFile())
return;
QNetworkReply* reply = FetchPage(1);
if (!WaitForReply(reply))
@ -45,7 +46,8 @@ void CompatibilityInfoClass::UpdateCompatibilityDatabase(QWidget* parent) {
QMessageBox::critical(parent, tr("Error"),
tr("Unable to update compatibility data! Try again later."));
// Try loading compatibility_file.json again
LoadCompatibilityFile();
if (!forced)
LoadCompatibilityFile();
return;
}

View File

@ -84,7 +84,7 @@ public:
CompatibilityInfoClass();
~CompatibilityInfoClass();
void UpdateCompatibilityDatabase(QWidget* parent = nullptr);
void UpdateCompatibilityDatabase(QWidget* parent = nullptr, bool forced = false);
bool LoadCompatibilityFile();
CompatibilityEntry GetCompatibilityInfo(const std::string& serial);
void ExtractCompatibilityInfo(QByteArray response);

View File

@ -3,9 +3,12 @@
#include "common/path_util.h"
#include "game_grid_frame.h"
#include "qt_gui/compatibility_info.h"
GameGridFrame::GameGridFrame(std::shared_ptr<GameInfoClass> game_info_get, QWidget* parent)
: QTableWidget(parent), m_game_info(game_info_get) {
GameGridFrame::GameGridFrame(std::shared_ptr<GameInfoClass> game_info_get,
std::shared_ptr<CompatibilityInfoClass> compat_info_get,
QWidget* parent)
: QTableWidget(parent), m_game_info(game_info_get), m_compat_info(compat_info_get) {
icon_size = Config::getIconSizeGrid();
windowWidth = parent->width();
this->setShowGrid(false);
@ -29,7 +32,7 @@ GameGridFrame::GameGridFrame(std::shared_ptr<GameInfoClass> game_info_get, QWidg
connect(this->horizontalScrollBar(), &QScrollBar::valueChanged, this,
&GameGridFrame::RefreshGridBackgroundImage);
connect(this, &QTableWidget::customContextMenuRequested, this, [=, this](const QPoint& pos) {
m_gui_context_menus.RequestGameMenu(pos, m_game_info->m_games, this, false);
m_gui_context_menus.RequestGameMenu(pos, m_game_info->m_games, m_compat_info, this, false);
});
}

View File

@ -10,6 +10,7 @@
#include "game_info.h"
#include "game_list_utils.h"
#include "gui_context_menus.h"
#include "qt_gui/compatibility_info.h"
class GameGridFrame : public QTableWidget {
Q_OBJECT
@ -29,11 +30,14 @@ private:
GameListUtils m_game_list_utils;
GuiContextMenus m_gui_context_menus;
std::shared_ptr<GameInfoClass> m_game_info;
std::shared_ptr<CompatibilityInfoClass> m_compat_info;
std::shared_ptr<QVector<GameInfo>> m_games_shared;
bool validCellSelected = false;
public:
explicit GameGridFrame(std::shared_ptr<GameInfoClass> game_info_get, QWidget* parent = nullptr);
explicit GameGridFrame(std::shared_ptr<GameInfoClass> game_info_get,
std::shared_ptr<CompatibilityInfoClass> compat_info_get,
QWidget* parent = nullptr);
void PopulateGameGrid(QVector<GameInfo> m_games, bool fromSearch);
bool IsValidCellSelected();

View File

@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include <QToolTip>
#include "common/config.h"
#include "common/logging/log.h"
#include "common/path_util.h"
#include "common/string_util.h"
@ -72,7 +73,7 @@ GameListFrame::GameListFrame(std::shared_ptr<GameInfoClass> game_info_get,
});
connect(this, &QTableWidget::customContextMenuRequested, this, [=, this](const QPoint& pos) {
m_gui_context_menus.RequestGameMenu(pos, m_game_info->m_games, this, true);
m_gui_context_menus.RequestGameMenu(pos, m_game_info->m_games, m_compat_info, this, true);
});
connect(this, &QTableWidget::cellClicked, this, [=, this](int row, int column) {
@ -80,11 +81,6 @@ GameListFrame::GameListFrame(std::shared_ptr<GameInfoClass> game_info_get,
QDesktopServices::openUrl(QUrl(m_game_info->m_games[row].compatibility.url));
}
});
// Do not show status column if it is not enabled
if (!Config::getCompatibilityEnabled()) {
this->setColumnHidden(2, true);
}
}
void GameListFrame::onCurrentCellChanged(int currentRow, int currentColumn, int previousRow,
@ -108,6 +104,8 @@ void GameListFrame::PlayBackgroundMusic(QTableWidgetItem* item) {
}
void GameListFrame::PopulateGameList() {
// Do not show status column if it is not enabled
this->setColumnHidden(2, !Config::getCompatibilityEnabled());
this->setRowCount(m_game_info->m_games.size());
ResizeIcons(icon_size);
@ -135,16 +133,16 @@ void GameListFrame::PopulateGameList() {
QString formattedPlayTime;
if (hours > 0) {
formattedPlayTime += QString("%1h ").arg(hours);
formattedPlayTime += QString("%1").arg(hours) + tr("h");
}
if (minutes > 0) {
formattedPlayTime += QString("%1m ").arg(minutes);
formattedPlayTime += QString("%1").arg(minutes) + tr("m");
}
formattedPlayTime = formattedPlayTime.trimmed();
m_game_info->m_games[i].play_time = playTime.toStdString();
if (formattedPlayTime.isEmpty()) {
SetTableItem(i, 8, QString("%1s").arg(seconds));
SetTableItem(i, 8, QString("%1").arg(seconds) + tr("s"));
} else {
SetTableItem(i, 8, formattedPlayTime);
}
@ -241,7 +239,7 @@ void GameListFrame::SetCompatibilityItem(int row, int column, CompatibilityEntry
break;
case CompatibilityStatus::Nothing:
color = QStringLiteral("#212121");
status_explanation = tr("Games does not initialize properly / crashes the emulator");
status_explanation = tr("Game does not initialize properly / crashes the emulator");
break;
case CompatibilityStatus::Boots:
color = QStringLiteral("#828282");

View File

@ -30,10 +30,11 @@ struct GameInfo {
CompatibilityEntry compatibility = CompatibilityEntry{CompatibilityStatus::Unknown};
};
class GameListUtils {
class GameListUtils : public QObject {
Q_OBJECT
public:
static QString FormatSize(qint64 size) {
static const QStringList suffixes = {"B", "KB", "MB", "GB", "TB"};
static const QStringList suffixes = {tr("B"), tr("KB"), tr("MB"), tr("GB"), tr("TB")};
int suffixIndex = 0;
double gameSize = static_cast<double>(size);

View File

@ -11,6 +11,9 @@
#include <QTreeWidgetItem>
#include "cheats_patches.h"
#include "common/config.h"
#include "common/version.h"
#include "compatibility_info.h"
#include "game_info.h"
#include "trophy_viewer.h"
@ -27,8 +30,9 @@
class GuiContextMenus : public QObject {
Q_OBJECT
public:
void RequestGameMenu(const QPoint& pos, QVector<GameInfo> m_games, QTableWidget* widget,
bool isList) {
void RequestGameMenu(const QPoint& pos, QVector<GameInfo> m_games,
std::shared_ptr<CompatibilityInfoClass> m_compat_info,
QTableWidget* widget, bool isList) {
QPoint global_pos = widget->viewport()->mapToGlobal(pos);
int itemID = 0;
if (isList) {
@ -91,6 +95,21 @@ public:
menu.addMenu(deleteMenu);
// Compatibility submenu.
QMenu* compatibilityMenu = new QMenu(tr("Compatibility..."), widget);
QAction* updateCompatibility = new QAction(tr("Update database"), widget);
QAction* viewCompatibilityReport = new QAction(tr("View report"), widget);
QAction* submitCompatibilityReport = new QAction(tr("Submit a report"), widget);
compatibilityMenu->addAction(updateCompatibility);
compatibilityMenu->addAction(viewCompatibilityReport);
compatibilityMenu->addAction(submitCompatibilityReport);
menu.addMenu(compatibilityMenu);
compatibilityMenu->setEnabled(Config::getCompatibilityEnabled());
viewCompatibilityReport->setEnabled(!m_games[itemID].compatibility.url.isEmpty());
// Show menu.
auto selected = menu.exec(global_pos);
if (!selected) {
@ -268,11 +287,11 @@ public:
#endif
QMessageBox::information(
nullptr, tr("Shortcut creation"),
QString(tr("Shortcut created successfully!\n %1")).arg(linkPath));
QString(tr("Shortcut created successfully!") + "\n%1").arg(linkPath));
} else {
QMessageBox::critical(
nullptr, tr("Error"),
QString(tr("Error creating shortcut!\n %1")).arg(linkPath));
QString(tr("Error creating shortcut!") + "\n%1").arg(linkPath));
}
} else {
QMessageBox::critical(nullptr, tr("Error"), tr("Failed to convert icon."));
@ -286,11 +305,11 @@ public:
#endif
QMessageBox::information(
nullptr, tr("Shortcut creation"),
QString(tr("Shortcut created successfully!\n %1")).arg(linkPath));
QString(tr("Shortcut created successfully!") + "\n%1").arg(linkPath));
} else {
QMessageBox::critical(
nullptr, tr("Error"),
QString(tr("Error creating shortcut!\n %1")).arg(linkPath));
QString(tr("Error creating shortcut!") + "\n%1").arg(linkPath));
}
}
}
@ -360,6 +379,31 @@ public:
}
}
}
if (selected == updateCompatibility) {
m_compat_info->UpdateCompatibilityDatabase(widget, true);
}
if (selected == viewCompatibilityReport) {
if (!m_games[itemID].compatibility.url.isEmpty())
QDesktopServices::openUrl(QUrl(m_games[itemID].compatibility.url));
}
if (selected == submitCompatibilityReport) {
QUrl url = QUrl("https://github.com/shadps4-emu/shadps4-game-compatibility/issues/new");
QUrlQuery query;
query.addQueryItem("template", QString("game_compatibility.yml"));
query.addQueryItem(
"title", QString("%1 - %2").arg(QString::fromStdString(m_games[itemID].serial),
QString::fromStdString(m_games[itemID].name)));
query.addQueryItem("game-name", QString::fromStdString(m_games[itemID].name));
query.addQueryItem("game-code", QString::fromStdString(m_games[itemID].serial));
query.addQueryItem("game-version", QString::fromStdString(m_games[itemID].version));
query.addQueryItem("emulator-version", QString(Common::VERSION));
url.setQuery(query);
QDesktopServices::openUrl(url);
}
}
int GetRowIndex(QTreeWidget* treeWidget, QTreeWidgetItem* item) {

View File

@ -75,8 +75,8 @@ bool MainWindow::Init() {
this->setStatusBar(statusBar.data());
// Update status bar
int numGames = m_game_info->m_games.size();
QString statusMessage =
"Games: " + QString::number(numGames) + " (" + QString::number(duration.count()) + "ms)";
QString statusMessage = tr("Games: ") + QString::number(numGames) + " (" +
QString::number(duration.count()) + "ms)";
statusBar->showMessage(statusMessage);
#ifdef ENABLE_DISCORD_RPC
@ -140,7 +140,7 @@ void MainWindow::CreateDockWindows() {
m_dock_widget.reset(new QDockWidget(tr("Game List"), this));
m_game_list_frame.reset(new GameListFrame(m_game_info, m_compat_info, this));
m_game_list_frame->setObjectName("gamelist");
m_game_grid_frame.reset(new GameGridFrame(m_game_info, this));
m_game_grid_frame.reset(new GameGridFrame(m_game_info, m_compat_info, this));
m_game_grid_frame->setObjectName("gamegridlist");
m_elf_viewer.reset(new ElfViewer(this));
m_elf_viewer->setObjectName("elflist");
@ -253,20 +253,26 @@ void MainWindow::CreateConnects() {
&MainWindow::StartGame);
connect(ui->configureAct, &QAction::triggered, this, [this]() {
auto settingsDialog = new SettingsDialog(m_physical_devices, this);
auto settingsDialog = new SettingsDialog(m_physical_devices, m_compat_info, this);
connect(settingsDialog, &SettingsDialog::LanguageChanged, this,
&MainWindow::OnLanguageChanged);
connect(settingsDialog, &SettingsDialog::CompatibilityChanged, this,
&MainWindow::RefreshGameTable);
settingsDialog->exec();
});
connect(ui->settingsButton, &QPushButton::clicked, this, [this]() {
auto settingsDialog = new SettingsDialog(m_physical_devices, this);
auto settingsDialog = new SettingsDialog(m_physical_devices, m_compat_info, this);
connect(settingsDialog, &SettingsDialog::LanguageChanged, this,
&MainWindow::OnLanguageChanged);
connect(settingsDialog, &SettingsDialog::CompatibilityChanged, this,
&MainWindow::RefreshGameTable);
settingsDialog->exec();
});

View File

@ -6,6 +6,8 @@
#include <QHoverEvent>
#include <common/version.h>
#include "common/config.h"
#include "qt_gui/compatibility_info.h"
#ifdef ENABLE_DISCORD_RPC
#include "common/discord_rpc_handler.h"
#endif
@ -54,7 +56,9 @@ QStringList languageNames = {"Arabic",
const QVector<int> languageIndexes = {21, 23, 14, 6, 18, 1, 12, 22, 2, 4, 25, 24, 29, 5, 0, 9,
15, 16, 17, 7, 26, 8, 11, 20, 3, 13, 27, 10, 19, 30, 28};
SettingsDialog::SettingsDialog(std::span<const QString> physical_devices, QWidget* parent)
SettingsDialog::SettingsDialog(std::span<const QString> physical_devices,
std::shared_ptr<CompatibilityInfoClass> m_compat_info,
QWidget* parent)
: QDialog(parent), ui(new Ui::SettingsDialog) {
ui->setupUi(this);
ui->tabWidgetSettings->setUsesScrollButtons(false);
@ -140,6 +144,16 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices, QWidge
ui->updaterGroupBox->setVisible(false);
ui->GUIgroupBox->setMaximumSize(265, 16777215);
#endif
connect(ui->updateCompatibilityButton, &QPushButton::clicked, this,
[this, parent, m_compat_info]() {
m_compat_info->UpdateCompatibilityDatabase(this, true);
emit CompatibilityChanged();
});
connect(ui->enableCompatibilityCheckBox, &QCheckBox::stateChanged, this, [this](int state) {
Config::setCompatibilityEnabled(state);
emit CompatibilityChanged();
});
}
// Input TAB
@ -195,6 +209,10 @@ SettingsDialog::SettingsDialog(std::span<const QString> physical_devices, QWidge
#endif
ui->GUIgroupBox->installEventFilter(this);
ui->disableTrophycheckBox->installEventFilter(this);
ui->enableCompatibilityCheckBox->installEventFilter(this);
ui->checkCompatibilityOnStartupCheckBox->installEventFilter(this);
ui->updateCompatibilityButton->installEventFilter(this);
ui->audioBackendComboBox->installEventFilter(this);
// Input
ui->hideCursorGroupBox->installEventFilter(this);
@ -286,6 +304,12 @@ void SettingsDialog::LoadValuesFromConfig() {
ui->vkSyncValidationCheckBox->setChecked(
toml::find_or<bool>(data, "Vulkan", "validation_sync", false));
ui->rdocCheckBox->setChecked(toml::find_or<bool>(data, "Vulkan", "rdocEnable", false));
ui->enableCompatibilityCheckBox->setChecked(
toml::find_or<bool>(data, "General", "compatibilityEnabled", false));
ui->checkCompatibilityOnStartupCheckBox->setChecked(
toml::find_or<bool>(data, "General", "checkCompatibilityOnStartup", false));
ui->audioBackendComboBox->setCurrentText(
QString::fromStdString(toml::find_or<std::string>(data, "Audio", "backend", "cubeb")));
#ifdef ENABLE_UPDATER
ui->updateCheckBox->setChecked(toml::find_or<bool>(data, "General", "autoUpdate", false));
@ -403,6 +427,14 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) {
text = tr("GUIgroupBox");
} else if (elementName == "disableTrophycheckBox") {
text = tr("disableTrophycheckBox");
} else if (elementName == "enableCompatibilityCheckBox") {
text = tr("enableCompatibilityCheckBox");
} else if (elementName == "checkCompatibilityOnStartupCheckBox") {
text = tr("checkCompatibilityOnStartupCheckBox");
} else if (elementName == "updateCompatibilityButton") {
text = tr("updateCompatibilityButton");
} else if (elementName == "audioBackendGroupBox") {
text = tr("audioBackendGroupBox");
}
// Input
@ -515,6 +547,9 @@ void SettingsDialog::UpdateSettings() {
Config::setRdocEnabled(ui->rdocCheckBox->isChecked());
Config::setAutoUpdate(ui->updateCheckBox->isChecked());
Config::setUpdateChannel(ui->updateComboBox->currentText().toStdString());
Config::setCompatibilityEnabled(ui->enableCompatibilityCheckBox->isChecked());
Config::setCheckCompatibilityOnStartup(ui->checkCompatibilityOnStartupCheckBox->isChecked());
Config::setAudioBackend(ui->audioBackendComboBox->currentText().toStdString());
#ifdef ENABLE_DISCORD_RPC
auto* rpc = Common::Singleton<DiscordRPCHandler::RPC>::Instance();

View File

@ -3,6 +3,7 @@
#pragma once
#include <memory>
#include <span>
#include <QDialog>
#include <QGroupBox>
@ -10,6 +11,7 @@
#include "common/config.h"
#include "common/path_util.h"
#include "qt_gui/compatibility_info.h"
namespace Ui {
class SettingsDialog;
@ -18,7 +20,9 @@ class SettingsDialog;
class SettingsDialog : public QDialog {
Q_OBJECT
public:
explicit SettingsDialog(std::span<const QString> physical_devices, QWidget* parent = nullptr);
explicit SettingsDialog(std::span<const QString> physical_devices,
std::shared_ptr<CompatibilityInfoClass> m_compat_info,
QWidget* parent = nullptr);
~SettingsDialog();
bool eventFilter(QObject* obj, QEvent* event) override;
@ -28,6 +32,7 @@ public:
signals:
void LanguageChanged(const std::string& locale);
void CompatibilityChanged();
private:
void LoadValuesFromConfig();

View File

@ -11,8 +11,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>854</width>
<height>660</height>
<width>950</width>
<height>780</height>
</rect>
</property>
<property name="sizePolicy">
@ -42,153 +42,42 @@
</property>
<layout class="QVBoxLayout" name="settingsDialogLayout">
<item>
<widget class="QScrollArea" name="scrollArea">
<widget class="QTabWidget" name="tabWidgetSettings">
<property name="enabled">
<bool>true</bool>
</property>
<property name="frameShape">
<enum>QFrame::Shape::NoFrame</enum>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="widgetResizable">
<bool>true</bool>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QTabWidget" name="tabWidgetSettings">
<property name="enabled">
<widget class="QScrollArea" name="generalTab">
<property name="widgetResizable">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>815</width>
<height>581</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="generalTab">
<attribute name="title">
<string>General</string>
</attribute>
<layout class="QVBoxLayout" name="generalTabVLayout" stretch="0,0">
<attribute name="title">
<string>General</string>
</attribute>
<widget class="QWidget" name="generalTabContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>822</width>
<height>487</height>
</rect>
</property>
<layout class="QVBoxLayout" name="generalTabVLayout" stretch="0">
<item>
<layout class="QHBoxLayout" name="generalTabHLayoutTop" stretch="1,1,1">
<item>
<layout class="QVBoxLayout" name="systemTabLayoutLeft">
<item>
<widget class="QGroupBox" name="SystemSettings">
<property name="title">
<string>System</string>
</property>
<layout class="QVBoxLayout" name="emuSettingsLayout">
<item>
<widget class="QGroupBox" name="consoleLanguageGroupBox">
<property name="title">
<string>Console Language</string>
</property>
<layout class="QVBoxLayout" name="settingsLayout">
<item>
<widget class="QComboBox" name="consoleLanguageComboBox"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="emulatorLanguageGroupBox">
<property name="title">
<string>Emulator Language</string>
</property>
<layout class="QVBoxLayout" name="langSettingsLayout">
<item>
<widget class="QComboBox" name="emulatorLanguageComboBox"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="emulatorTabLayoutMiddle">
<item>
<widget class="QGroupBox" name="emulatorSettingsGroupBox">
<property name="title">
<string>Emulator</string>
</property>
<layout class="QVBoxLayout" name="additionalSettingsVLayout">
<item>
<layout class="QVBoxLayout" name="emulatorverticalLayout">
<item>
<widget class="QCheckBox" name="fullscreenCheckBox">
<property name="text">
<string>Enable Fullscreen</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="separateUpdatesCheckBox">
<property name="text">
<string>Enable Separate Update Folder</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showSplashCheckBox">
<property name="text">
<string>Show Splash</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="discordRPCCheckbox">
<property name="text">
<string>Enable Discord Rich Presence</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="vLayoutUserName">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="hLayoutUserName">
<item>
<widget class="QGroupBox" name="userName">
<property name="title">
<string>Username</string>
</property>
<layout class="QVBoxLayout" name="userNameLayout">
<item>
<widget class="QLineEdit" name="userNameLineEdit"/>
</item>
</layout>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="2">
<layout class="QVBoxLayout" name="loggerTabLayoutRight">
<item>
<widget class="QGroupBox" name="loggerGroupBox">
@ -268,12 +157,145 @@
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="generalTabHLayout_2">
<item>
<item row="0" column="0">
<layout class="QVBoxLayout" name="systemTabLayoutLeft">
<item>
<widget class="QGroupBox" name="SystemSettings">
<property name="title">
<string>System</string>
</property>
<layout class="QVBoxLayout" name="emuSettingsLayout">
<item>
<widget class="QGroupBox" name="consoleLanguageGroupBox">
<property name="title">
<string>Console Language</string>
</property>
<layout class="QVBoxLayout" name="settingsLayout">
<item>
<widget class="QComboBox" name="consoleLanguageComboBox"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="emulatorLanguageGroupBox">
<property name="title">
<string>Emulator Language</string>
</property>
<layout class="QVBoxLayout" name="langSettingsLayout">
<item>
<widget class="QComboBox" name="emulatorLanguageComboBox"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item row="0" column="1">
<layout class="QVBoxLayout" name="emulatorTabLayoutMiddle">
<item>
<widget class="QGroupBox" name="emulatorSettingsGroupBox">
<property name="title">
<string>Emulator</string>
</property>
<layout class="QVBoxLayout" name="additionalSettingsVLayout">
<item>
<layout class="QVBoxLayout" name="emulatorverticalLayout">
<property name="spacing">
<number>10</number>
</property>
<item>
<widget class="QCheckBox" name="fullscreenCheckBox">
<property name="text">
<string>Enable Fullscreen</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="separateUpdatesCheckBox">
<property name="text">
<string>Enable Separate Update Folder</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showSplashCheckBox">
<property name="text">
<string>Show Splash</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="discordRPCCheckbox">
<property name="text">
<string>Enable Discord Rich Presence</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="vLayoutUserName">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="hLayoutUserName">
<item>
<widget class="QGroupBox" name="userName">
<property name="title">
<string>Username</string>
</property>
<layout class="QVBoxLayout" name="userNameLayout">
<item>
<widget class="QLineEdit" name="userNameLineEdit"/>
</item>
</layout>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="audioBackendGroupBox">
<property name="title">
<string>Audio Backend</string>
</property>
<layout class="QVBoxLayout" name="audioBackendBoxLayout">
<item>
<widget class="QComboBox" name="audioBackendComboBox">
<item>
<property name="text">
<string>cubeb</string>
</property>
</item>
<item>
<property name="text">
<string>sdl</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QVBoxLayout" name="updaterTabLayoutLeft">
<property name="spacing">
<number>-1</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SizeConstraint::SetDefaultConstraint</enum>
</property>
@ -289,7 +311,7 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item alignment="Qt::AlignmentFlag::AlignTop">
<item>
<widget class="QGroupBox" name="updaterGroupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
@ -299,7 +321,7 @@
</property>
<property name="minimumSize">
<size>
<width>275</width>
<width>0</width>
<height>0</height>
</size>
</property>
@ -314,7 +336,7 @@
</property>
<layout class="QVBoxLayout" name="UpdateLayout" stretch="0,0,0">
<property name="spacing">
<number>5</number>
<number>10</number>
</property>
<property name="topMargin">
<number>1</number>
@ -336,7 +358,7 @@
<property name="minimumSize">
<size>
<width>0</width>
<height>75</height>
<height>0</height>
</size>
</property>
<property name="maximumSize">
@ -397,8 +419,8 @@
</property>
<property name="minimumSize">
<size>
<width>197</width>
<height>28</height>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
@ -436,7 +458,7 @@
</item>
</layout>
</item>
<item>
<item row="1" column="1">
<layout class="QVBoxLayout" name="GUITabLayoutMiddle" stretch="0">
<item alignment="Qt::AlignmentFlag::AlignTop">
<widget class="QGroupBox" name="GUIgroupBox">
@ -469,6 +491,19 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="playBGMCheckBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Play title music</string>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="GUIMusicLayout">
<property name="topMargin">
@ -478,20 +513,7 @@
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="playBGMCheckBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Play title music</string>
</property>
</widget>
</item>
<item>
<spacer name="GUIverticalSpacer_2">
<spacer name="GUIverticalSpacer_3">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
@ -501,7 +523,7 @@
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>2</height>
<height>13</height>
</size>
</property>
</spacer>
@ -566,20 +588,76 @@
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="EmptyTabLayoutRight">
<item>
<spacer name="emptyHorizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
<item row="1" column="2">
<layout class="QVBoxLayout" name="CompatTabLayoutRight" stretch="0">
<item alignment="Qt::AlignmentFlag::AlignTop">
<widget class="QGroupBox" name="CompatgroupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeHint" stdset="0">
<property name="minimumSize">
<size>
<width>40</width>
<height>20</height>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
<property name="title">
<string>Game Compatibility</string>
</property>
<layout class="QVBoxLayout" name="CompatLayout">
<property name="spacing">
<number>10</number>
</property>
<property name="topMargin">
<number>1</number>
</property>
<property name="bottomMargin">
<number>11</number>
</property>
<item>
<widget class="QCheckBox" name="enableCompatibilityCheckBox">
<property name="text">
<string>Display Compatibility Data</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkCompatibilityOnStartupCheckBox">
<property name="text">
<string>Update Compatibility Database On Startup</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="updateCompatibilityButton">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Update Compatibility Database</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
@ -587,10 +665,23 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="inputTab">
<attribute name="title">
<string>Input</string>
</attribute>
</widget>
<widget class="QScrollArea" name="inputTab">
<property name="widgetResizable">
<bool>true</bool>
</property>
<attribute name="title">
<string>Input</string>
</attribute>
<widget class="QWidget" name="inputTabContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>396</width>
<height>222</height>
</rect>
</property>
<layout class="QVBoxLayout" name="inputTabVLayout" stretch="0,0">
<item>
<layout class="QHBoxLayout" name="inputTabHLayoutTop" stretch="1,1,1">
@ -699,8 +790,8 @@
</property>
<property name="minimumSize">
<size>
<width>80</width>
<height>30</height>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
@ -786,7 +877,7 @@
</property>
<property name="minimumSize">
<size>
<width>237</width>
<width>0</width>
<height>0</height>
</size>
</property>
@ -865,10 +956,23 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="grphicsTab">
<attribute name="title">
<string>Graphics</string>
</attribute>
</widget>
<widget class="QScrollArea" name="graphicsTab">
<property name="widgetResizable">
<bool>true</bool>
</property>
<attribute name="title">
<string>Graphics</string>
</attribute>
<widget class="QWidget" name="graphicsTabLayout">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>536</width>
<height>192</height>
</rect>
</property>
<layout class="QVBoxLayout" name="graphicsTabVLayout" stretch="0,0">
<item>
<layout class="QHBoxLayout" name="graphicsTabHLayout" stretch="1,1,1">
@ -1103,58 +1207,54 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="pathsTab">
<attribute name="title">
<string>Paths</string>
</attribute>
<layout class="QVBoxLayout" name="inputTabVLayout" stretch="0">
</widget>
<widget class="QScrollArea" name="pathsTab">
<property name="widgetResizable">
<bool>true</bool>
</property>
<attribute name="title">
<string>Paths</string>
</attribute>
<widget class="QWidget" name="pathsTabContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>146</width>
<height>215</height>
</rect>
</property>
<layout class="QVBoxLayout" name="pathsTabLayout" stretch="0">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<layout class="QHBoxLayout" name="pathsTabVLayout">
<item>
<widget class="QGroupBox" name="gameFoldersGroupBox">
<property name="title">
<string>Game Folders</string>
</property>
<widget class="QListWidget" name="gameFoldersListWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>20</y>
<width>401</width>
<height>331</height>
</rect>
</property>
</widget>
<widget class="QPushButton" name="addFolderButton">
<property name="geometry">
<rect>
<x>100</x>
<y>360</y>
<width>91</width>
<height>24</height>
</rect>
</property>
<property name="text">
<string>Add...</string>
</property>
</widget>
<widget class="QPushButton" name="removeFolderButton">
<property name="geometry">
<rect>
<x>199</x>
<y>360</y>
<width>91</width>
<height>24</height>
</rect>
</property>
<property name="text">
<string>Remove</string>
</property>
</widget>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="removeFolderButton">
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="addFolderButton">
<property name="text">
<string>Add...</string>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="gameFoldersListWidget"/>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
@ -1173,10 +1273,23 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="debugTab">
<attribute name="title">
<string>Debug</string>
</attribute>
</widget>
<widget class="QScrollArea" name="debugTab">
<property name="widgetResizable">
<bool>true</bool>
</property>
<attribute name="title">
<string>Debug</string>
</attribute>
<widget class="QWidget" name="debugTabContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>288</width>
<height>163</height>
</rect>
</property>
<layout class="QVBoxLayout" name="debugTabVLayout" stretch="0,1">
<item>
<layout class="QHBoxLayout" name="debugTabHLayout" stretch="1">

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>تم إنشاء الاختصار بنجاح!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>تم إنشاء الاختصار بنجاح!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>!\n %1 خطأ في إنشاء الاختصار</translation>
<source>Error creating shortcut!</source>
<translation>خطأ في إنشاء الاختصار</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>مهلة إخفاء المؤشر عند الخمول</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>إعدادات الواجهة</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>تشغيل موسيقى العنوان</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>الصوت</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>تشغيل موسيقى العنوان:\nإذا كانت اللعبة تدعم ذلك، قم بتمكين تشغيل موسيقى خاصة عند اختيار اللعبة في واجهة المستخدم.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>سلوك زر العودة:\nيضبط زر العودة في وحدة التحكم ليحاكي الضغط على الموضع المحدد على لوحة اللمس في PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>سيريال</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>فشل في إنشاء ملف سكريبت التحديث</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Shortcut created successfully!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Error creating shortcut!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Timeout for skjul markør ved inaktivitet</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>GUI-Indstillinger</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Afspil titelsang</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Lydstyrke</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Titelsmusikafspilning:\nHvis spillet understøtter det, aktiver speciel musik, når spillet vælges i brugergrænsefladen.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>Tilbageknap Adfærd:\nIndstiller controllerens tilbageknap til at efterligne tryk den angivne position PS4 berøringsflade.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Seriel</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Kunne ikke oprette opdateringsscriptfilen</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Verknüpfung erfolgreich erstellt!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Verknüpfung erfolgreich erstellt!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Fehler beim Erstellen der Verknüpfung!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Fehler beim Erstellen der Verknüpfung!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Inaktivitätszeitüberschreitung zum Ausblenden des Cursors</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>GUI-Einstellungen</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Titelmusik abspielen</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Lautstärke</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Wiedergabe der Titelmusik:\nWenn das Spiel dies unterstützt, wird beim Auswählen des Spiels in der Benutzeroberfläche spezielle Musik abgespielt.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</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>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Seriennummer</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Fehler beim Erstellen der Aktualisierungs-Skriptdatei</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Shortcut created successfully!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Error creating shortcut!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Χρόνος αδράνειας απόκρυψης δείκτη</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>Ρυθμίσεις GUI</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Αναπαραγωγή μουσικής τίτλου</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>ένταση</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Αναπαραγωγή Μουσικής Τίτλων:\nΕάν το παιχνίδι το υποστηρίζει, ενεργοποιεί ειδική μουσική κατά την επιλογή του παιχνιδιού από τη διεπαφή χρήστη.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>Συμπεριφορά Κουμπιού Επιστροφής:\nΟρίζει το κουμπί επιστροφής του ελεγκτή να προσομοιώνει το πάτημα της καθορισμένης θέσης στην οθόνη αφής PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Σειριακός αριθμός</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Αποτυχία δημιουργίας του αρχείου σεναρίου ενημέρωσης</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Shortcut created successfully!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Error creating shortcut!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Hide Cursor Idle Timeout</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>GUI Settings</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Play title music</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Volume</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1221,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1334,6 +1404,11 @@
<source>Serial</source>
<translation>Serial</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1369,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1498,4 +1618,32 @@
<translation>Failed to create the update script file</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>¡Acceso directo creado con éxito!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>¡Acceso directo creado con éxito!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>¡Error al crear el acceso directo!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>¡Error al crear el acceso directo!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Tiempo de espera para ocultar cursor inactivo</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>Configuraciones de la Interfaz</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Reproducir la música de apertura</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Volumen</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Reproducir Música del Título:\nSi un juego lo admite, habilita la reproducción de música especial al seleccionar el juego en la interfaz gráfica.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</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>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Numero de serie</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>No se pudo crear el archivo del script de actualización</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -62,7 +62,7 @@
<message>
<location filename="../install_dir_select.cpp" line="37"/>
<source>Select which directory you want to install to.</source>
<translation>Select which directory you want to install to.</translation>
<translation>محلی را که میخواهید در آن نصب شود، انتخاب کنید.</translation>
</message>
</context>
<context>
@ -98,7 +98,7 @@
<message>
<location filename="../gui_context_menus.h" line="39"/>
<source>Create Shortcut</source>
<translation>ساخت شورتکات</translation>
<translation>ایجاد میانبر</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="48"/>
@ -113,7 +113,7 @@
<message>
<location filename="../gui_context_menus.h" line="42"/>
<source>Trophy Viewer</source>
<translation>مشاهده تروفی ها</translation>
<translation>مشاهده جوایز</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
@ -158,32 +158,52 @@
<message>
<location filename="../gui_context_menus.h" line="72"/>
<source>Delete...</source>
<translation>Delete...</translation>
<translation>حذف...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="73"/>
<source>Delete Game</source>
<translation>Delete Game</translation>
<translation>حذف بازی</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="74"/>
<source>Delete Update</source>
<translation>Delete Update</translation>
<translation>حذف بهروزرسانی</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="75"/>
<source>Delete DLC</source>
<translation>Delete DLC</translation>
<translation>حذف محتوای اضافی (DLC)</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="173"/>
<source>Shortcut creation</source>
<translation>سازنده شورتکات</translation>
<translation>ایجاد میانبر</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="174"/>
<source>Shortcut created successfully!\n %1</source>
<translation>شورتکات با موفقیت ساخته شد! \n %1</translation>
<source>Shortcut created successfully!</source>
<translation>میانبر با موفقیت ساخته شد!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="177"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="178"/>
<source>Error creating shortcut!\n %1</source>
<translation>مشکلی در هنگام ساخت شورتکات بوجود آمد!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>مشکلی در هنگام ساخت میانبر بوجود آمد!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="253"/>
@ -203,27 +223,27 @@
<message>
<location filename="../gui_context_menus.h" line="299"/>
<source>Game</source>
<translation>Game</translation>
<translation>بازی</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="305"/>
<source>requiresEnableSeparateUpdateFolder_MSG</source>
<translation>This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it.</translation>
<translation>این قابلیت نیازمند فعالسازی گزینه تنظیمات «ایجاد پوشه جداگانه برای بهروزرسانی» است. در صورت تمایل به استفاده از این قابلیت، لطفاً آن را فعال کنید.</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="312"/>
<source>This game has no update to delete!</source>
<translation>This game has no update to delete!</translation>
<translation>این بازی بهروزرسانیای برای حذف ندارد!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="316"/>
<source>Update</source>
<translation>Update</translation>
<translation>بهروزرسانی</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="321"/>
<source>This game has no DLC to delete!</source>
<translation>This game has no DLC to delete!</translation>
<translation>این بازی محتوای اضافی (DLC) برای حذف ندارد!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="325"/>
@ -233,7 +253,7 @@
<message>
<location filename="../gui_context_menus.h" line="332"/>
<source>Delete %1</source>
<translation>Delete %1</translation>
<translation>حذف %1</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="333"/>
@ -331,7 +351,7 @@
<message>
<location filename="../main_window_ui.h" line="338"/>
<source>List View</source>
<translation>لیستی</translation>
<translation>نمایش لیست</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="340"/>
@ -341,7 +361,7 @@
<message>
<location filename="../main_window_ui.h" line="341"/>
<source>Elf Viewer</source>
<translation>Elf Viewer</translation>
<translation>مشاهده گر Elf</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="343"/>
@ -452,7 +472,7 @@
<message>
<location filename="../trophy_viewer.cpp" line="8"/>
<source>Trophy Viewer</source>
<translation>تروفی ها</translation>
<translation>مشاهده جوایز</translation>
</message>
</context>
<context>
@ -495,7 +515,7 @@
<message>
<location filename="../settings_dialog.ui" line="140"/>
<source>Enable Separate Update Folder</source>
<translation>Enable Separate Update Folder</translation>
<translation>فعالسازی پوشه جداگانه برای بهروزرسانی</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="129"/>
@ -552,10 +572,15 @@
<source>Hide Cursor Idle Timeout</source>
<translation>مخفی کردن زمان توقف مکان نما</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
<translation>کنترل کننده</translation>
<translation>دسته بازی</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="797"/>
@ -585,7 +610,7 @@
<message>
<location filename="../settings_dialog.ui" line="405"/>
<source>Vblank Divider</source>
<translation>Vblank Divider</translation>
<translation>تقسیمکننده Vblank</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="453"/>
@ -595,7 +620,7 @@
<message>
<location filename="../settings_dialog.ui" line="462"/>
<source>Enable Shaders Dumping</source>
<translation>Shaders Dumping فعال کردن</translation>
<translation>فعالسازی ذخیرهسازی شیدرها</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="469"/>
@ -625,7 +650,7 @@
<message>
<location filename="../settings_dialog.ui" line="517"/>
<source>Debug</source>
<translation>Debug</translation>
<translation>دیباگ</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="537"/>
@ -650,37 +675,67 @@
<message>
<location filename="../settings_dialog.ui" line="274"/>
<source>Update</source>
<translation>بروزرسانی</translation>
<translation>بهروزرسانی</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="286"/>
<source>Check for Updates at Startup</source>
<translation>بررسی بروزرسانی هنگام شروع</translation>
<translation>بررسی بهروزرسانیها در زمان راهاندازی</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="313"/>
<source>Update Channel</source>
<translation>کانال بروزرسانی</translation>
<translation>کانال بهروزرسانی</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="322"/>
<source>Check for Updates</source>
<translation>به روز رسانی را بررسی کنید</translation>
<translation>بررسی بهروزرسانیها</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="354"/>
<source>GUI Settings</source>
<translation>تنظیمات رابط کاربری</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>غیرفعال کردن نمایش جوایز</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>پخش موسیقی عنوان</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>بهروزرسانی پایگاه داده سازگاری هنگام راهاندازی</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>سازگاری بازی با سیستم</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>نمایش دادههای سازگاری</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>بهروزرسانی پایگاه داده سازگاری</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>صدا </translation>
<translation>صدا</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
@ -693,7 +748,7 @@
<message>
<location filename="../main_window.cpp" line="168"/>
<source> * Unsupported Vulkan Version</source>
<translation>شما پشتیبانی نمیشود Vulkan ورژن*</translation>
<translation>شما پشتیبانی نمیشود Vulkan ورژن *</translation>
</message>
<message>
<location filename="../main_window.cpp" line="326"/>
@ -841,7 +896,7 @@
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches for </source>
<translation>Cheats / Patches for ا</translation>
<translation> چیت / پچ برای </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
@ -861,7 +916,7 @@
<message>
<location filename="../cheats_patches.cpp" line="83"/>
<source>Version: </source>
<translation>ورژن: </translation>
<translation>نسخه: </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="87"/>
@ -886,7 +941,7 @@
<message>
<location filename="../cheats_patches.cpp" line="155"/>
<source>Delete File</source>
<translation>پاک کردن فایل</translation>
<translation>حذف فایل</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="169"/>
@ -1149,27 +1204,27 @@
<message>
<location filename="../settings_dialog.cpp" line="291"/>
<source>emulatorLanguageGroupBox</source>
<translation>Emulator Language:\nSets the language of the emulator's user interface.</translation>
<translation>زبان شبیهساز:\nزبان رابط کاربری شبیهساز را انتخاب میکند.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="293"/>
<source>fullscreenCheckBox</source>
<translation>Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key.</translation>
<translation>فعالسازی تمام صفحه:\nپنجره بازی را بهطور خودکار به حالت تمام صفحه در میآورد.\nبرای تغییر این حالت میتوانید کلید F11 را فشار دهید.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="293"/>
<source>separateUpdatesCheckBox</source>
<translation>Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.</translation>
<translation>فعالسازی پوشه جداگانه برای بهروزرسانی:\nامکان نصب بهروزرسانیهای بازی در یک پوشه جداگانه برای مدیریت راحتتر را فراهم میکند.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="295"/>
<source>showSplashCheckBox</source>
<translation>Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting.</translation>
<translation>نمایش صفحه شروع:\nصفحه شروع بازی (تصویری ویژه) را هنگام بارگذاری بازی نمایش میدهد.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="297"/>
<source>ps4proCheckBox</source>
<translation>Is PS4 Pro:\nMakes the emulator act as a PS4 PRO, which may enable special features in games that support it.</translation>
<translation>حالت PS4 Pro:\nشبیهساز را بهعنوان PS4 Pro شبیهسازی میکند که ممکن است ویژگیهای ویژهای را در بازیهای پشتیبانیشده فعال کند.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="438"/>
@ -1179,12 +1234,12 @@
<message>
<location filename="../settings_dialog.cpp" line="299"/>
<source>userName</source>
<translation>Username:\nSets the PS4's account username, which may be displayed by some games.</translation>
<translation>نام کاربری:\ام کاربری حساب PS4 را تنظیم میکند که ممکن است توسط برخی بازیها نمایش داده شود.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="301"/>
<source>logTypeGroupBox</source>
<translation>Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation.</translation>
<translation>نوع لاگ:\nتنظیم میکند که آیا خروجی پنجره لاگ برای بهبود عملکرد همگامسازی شود یا خیر. این ممکن است تأثیر منفی بر شبیهسازی داشته باشد.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="303"/>
@ -1194,12 +1249,17 @@
<message>
<location filename="../settings_dialog.cpp" line="305"/>
<source>updaterGroupBox</source>
<translation>Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable.</translation>
<translation>بهروزرسانی:\nانتشار: نسخه‌های رسمی که هر ماه منتشر میشوند و ممکن است بسیار قدیمی باشند، اما پایدارتر و تست شدهتر هستند.\nشبانه: نسخه‌های توسعهای که شامل جدیدترین ویژگیها و اصلاحات هستند، اما ممکن است دارای اشکال باشند و کمتر پایدار باشند.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="306"/>
<source>GUIgroupBox</source>
<translation>Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI.</translation>
<translation>پخش موسیقی عنوان:\nIدر صورتی که بازی از آن پشتیبانی کند، پخش موسیقی ویژه هنگام انتخاب بازی در رابط کاربری را فعال میکند.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>غیرفعال کردن نمایش جوایز:\nنمایش اعلانهای جوایز درون بازی را غیرفعال میکند. پیشرفت جوایز همچنان از طریق نمایشگر جوایز (کلیک راست روی بازی در پنجره اصلی) قابل پیگیری است..</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>رفتار دکمه برگشت:\nدکمه برگشت کنترلر را طوری تنظیم می کند که ضربه زدن روی موقعیت مشخص شده روی صفحه لمسی PS4 را شبیه سازی کند.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>نمایش دادههای سازگاری:\nاطلاعات سازگاری بازی را به صورت جدول نمایش میدهد. برای دریافت اطلاعات بهروز، گزینه "به‌روزرسانی سازگاری هنگام راه‌اندازی" را فعال کنید.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>بهروزرسانی سازگاری هنگام راهاندازی:\هطور خودکار پایگاه داده سازگاری را هنگام راهاندازی ShadPS4 بهروزرسانی میکند.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>بهروزرسانی پایگاه داده سازگاری:\ایگاه داده سازگاری را بلافاصله بهروزرسانی میکند.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1234,7 +1309,7 @@
<message>
<location filename="../settings_dialog.cpp" line="101"/>
<source>Touchpad Left</source>
<translation>پد لمسی سمت چپ</translation>
<translation>صفحه لمسی سمت چپ</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="102"/>
@ -1244,7 +1319,7 @@
<message>
<location filename="../settings_dialog.cpp" line="103"/>
<source>Touchpad Center</source>
<translation>مرکز تاچ پد</translation>
<translation>مرکز صفحه لمسی</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="104"/>
@ -1254,22 +1329,22 @@
<message>
<location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source>
<translation>Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it.</translation>
<translation>دستگاه گرافیکی:\nدر سیستمهای با چندین پردازنده گرافیکی، از فهرست کشویی، پردازنده گرافیکی که شبیهساز از آن استفاده میکند را انتخاب کنید، یا گزینه "انتخاب خودکار" را انتخاب کنید تا به طور خودکار تعیین شود.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="314"/>
<source>resolutionLayout</source>
<translation>Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution.</translation>
<translation>عرض/ارتفاع:\nاندازه پنجره شبیهساز را در هنگام راهاندازی تنظیم میکند، که در حین بازی قابل تغییر اندازه است.\nاین با وضوح داخل بازی متفاوت است.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="318"/>
<source>heightDivider</source>
<translation>Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change!</translation>
<translation>تقسیمکننده Vblank:\nمیزان فریم ریت که شبیهساز با آن بهروزرسانی میشود، در این عدد ضرب میشود. تغییر این مقدار ممکن است تأثیرات منفی داشته باشد، مانند افزایش سرعت بازی یا خراب شدن عملکردهای حیاتی بازی که انتظار تغییر آن را ندارند!</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="320"/>
<source>dumpShadersCheckBox</source>
<translation>Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render.</translation>
<translation>فعالسازی ذخیرهسازی شیدرها:\همنظور اشکالزدایی فنی، شیدرهای بازی را هنگام رندر شدن در یک پوشه ذخیره میکند.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="322"/>
@ -1294,7 +1369,7 @@
<message>
<location filename="../settings_dialog.cpp" line="329"/>
<source>debugDump</source>
<translation>Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory.</translation>
<translation>فعالسازی ذخیرهسازی دیباگ:\nنمادهای import و export و اطلاعات هدر فایل برنامه در حال اجرای PS4 را در یک پوشه ذخیره میکند.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="331"/>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>سریال</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>سازگاری</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1337,7 +1417,7 @@
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Firmware</source>
<translation>فریمور</translation>
<translation>فریمور</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="35"/>
@ -1362,7 +1442,52 @@
<message>
<location filename="../game_list_frame.cpp" line="108"/>
<source>Never Played</source>
<translation>Never Played</translation>
<translation>هرگز بازی نشده</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>سازگاری تست نشده است</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>بازی به درستی راهاندازی نمیشود / شبیهساز کرش میکند</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>بازی اجرا میشود، اما فقط یک صفحه خالی نمایش داده میشود</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>بازی تصویری نمایش میدهد، اما از منو فراتر نمیرود</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>بازی دارای اشکالات بحرانی یا عملکرد غیرقابل بازی است</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>بازی با عملکرد قابل قبول و بدون اشکالات عمده قابل بازی است.</translation>
</message>
</context>
<context>
@ -1370,7 +1495,7 @@
<message>
<location filename="../check_update.cpp" line="34"/>
<source>Auto Updater</source>
<translation>به روز رسانی خودکار</translation>
<translation>بهروزرسانی خودکار</translation>
</message>
<message>
<location filename="../check_update.cpp" line="51"/>
@ -1415,7 +1540,7 @@
<message>
<location filename="../check_update.cpp" line="187"/>
<source>Update Channel</source>
<translation>کانال بروزرسانی</translation>
<translation>کانال بهروزرسانی</translation>
</message>
<message>
<location filename="../check_update.cpp" line="177"/>
@ -1440,7 +1565,7 @@
<message>
<location filename="../check_update.cpp" line="198"/>
<source>Check for Updates at Startup</source>
<translation>بررسی بروزرسانی هنگام شروع</translation>
<translation>بررسی بهروزرسانی هنگام شروع</translation>
</message>
<message>
<location filename="../check_update.cpp" line="199"/>
@ -1493,4 +1618,32 @@
<translation>فایل اسکریپت به روز رسانی ایجاد نشد</translation>
</message>
</context>
</TS>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Shortcut created successfully!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Error creating shortcut!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Inaktiivisuuden aikaraja kursorin piilottamiselle</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>GUI-Asetukset</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Soita otsikkomusiikkia</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Äänenvoimakkuus</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Soita Otsikkomusiikkia:\nJos peli tukee sitä, ota käyttöön erityisen musiikin soittaminen pelin valinnan yhteydessä käyttöliittymässä.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>Takaisin-napin käyttäytyminen:\nAsettaa ohjaimen takaisin-napin jäljittelemään kosketusta PS4:n kosketuslevyn määritettyyn kohtaan.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Sarjanumero</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Päivitysskripttitiedoston luominen epäonnistui</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Supprimer DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Raccourci créé avec succès !\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Raccourci créé avec succès !</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Erreur lors de la création du raccourci !\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Erreur lors de la création du raccourci !</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Délai d'inactivité pour masquer le curseur</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>Paramètres de l'interface</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Lire la musique du titre</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Volume</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Jouer de la musique de titre:\nSi le jeu le prend en charge, cela active la musique spéciale lorsque vous sélectionnez le jeu dans l'interface utilisateur.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</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>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Série</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Jamais joué</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Échec de la création du fichier de script de mise à jour</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>DLC-k törlése</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="173"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="174"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Parancsikon sikeresen létrehozva!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Parancsikon sikeresen létrehozva!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="177"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="178"/>
<source>Error creating shortcut!\n %1</source>
<translation>Hiba a parancsikon létrehozásával!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Hiba a parancsikon létrehozásával!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="253"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Kurzor inaktivitási időtúllépés</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>GUI Beállítások</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Címzene lejátszása</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Hangerő</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Játék címzene lejátszása:\nHa a játék támogatja, engedélyezze egy speciális zene lejátszását, amikor a játékot kiválasztja a GUI-ban.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</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>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Sorozatszám</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>A frissítési szkript fájl létrehozása nem sikerült</translation>
</message>
</context>
</TS>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Shortcut created successfully!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Error creating shortcut!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Batas waktu sembunyikan kursor tidak aktif</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>Pengaturan GUI</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Putar musik judul</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Volume</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Putar Musik Judul Permainan:\nJika permainan mendukungnya, aktifkan pemutaran musik khusus saat memilih permainan di GUI.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>Perilaku Tombol Kembali:\nMengatur tombol kembali pada pengontrol untuk meniru ketukan di posisi yang ditentukan di touchpad PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Serial</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Gagal membuat file skrip pembaruan</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Elimina DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Scorciatoia creata con successo!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Scorciatoia creata con successo!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Errore nella creazione della scorciatoia!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Errore nella creazione della scorciatoia!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -208,7 +228,7 @@
<message>
<location filename="../gui_context_menus.h" line="305"/>
<source>requiresEnableSeparateUpdateFolder_MSG</source>
<translation>This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it.</translation>
<translation>Questa feature richiede che venga attivata l'opzione "Abilita Cartella Aggiornamenti Separata" per poter funzionare, per favore abilitala.</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="312"/>
@ -495,7 +515,7 @@
<message>
<location filename="../settings_dialog.ui" line="140"/>
<source>Enable Separate Update Folder</source>
<translation>Abilità Cartella Aggiornamenti Separata</translation>
<translation>Abilita Cartella Aggiornamenti Separata</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="129"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Timeout inattività per nascondere il cursore</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>Impostazioni GUI</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disabilita Notifica Trofei</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Riproduci musica del titolo</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Aggiorna Database Compatibilità all'Avvio</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Compatibilità Gioco</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Mostra Dati Compatibilità</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Aggiorna Database Compatibilità</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Volume</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Riproduci Musica del Titolo:\nSe un gioco lo supporta, attiva la riproduzione di musica speciale quando selezioni il gioco nell'interfaccia grafica.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</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>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Mostra Dati Compatibilità:\nMostra informazioni sulla compatibilità del gioco nella visualizzazione lista. Abilita "Aggiorna Compatiblità all'Avvio" per ottenere informazioni aggiornate.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Aggiorna Compatibilità all'Avvio:\nAggiorna automaticamente il database della compatibilità quando si avvia shadps4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Aggiorna Database Compatibilità:\nAggiorna immediatamente il database di compatibilità.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Seriale</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibilità</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1362,7 +1442,52 @@
<message>
<location filename="../game_list_frame.cpp" line="108"/>
<source>Never Played</source>
<translation>Never Played</translation>
<translation>Mai Giocato</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Nessuna informazione sulla compatibilità</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Il gioco non si avvia in modo corretto / forza chiusura dell'emulatore</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Il gioco si avvia, ma mostra solo una schermata nera</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Il gioco mostra immagini ma non va oltre il menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Il gioco ha problemi gravi di emulazione oppure framerate troppo basso</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Il gioco può essere completato con buone prestazioni e senza problemi gravi</translation>
</message>
</context>
<context>
@ -1493,4 +1618,32 @@
<translation>Impossibile creare il file di script di aggiornamento</translation>
</message>
</context>
</TS>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>GUI設定</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>:\nゲームがそれをサポートしている場合GUIでゲームを選択したときに特別な音楽を再生することを有効にします</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>:\nコントローラーの戻るボタンをPS4のタッチパッドの指定された位置をタッチするように設定します</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation></translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation></translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Shortcut created successfully!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Error creating shortcut!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Hide Cursor Idle Timeout</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>GUI Settings</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Play title music</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Serial</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Failed to create the update script file</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Shortcut created successfully!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Error creating shortcut!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Žymeklio paslėpimo neveikimo laikas</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>GUI Nustatymai</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Groti antraštės muziką</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Garsumas</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Groti antraščių muziką:\nJei žaidimas tai palaiko, įjungia specialios muzikos grojimą, kai pasirinkite žaidimą GUI.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>Atgal mygtuko elgesys:\nNustato valdiklio atgal mygtuką imituoti paspaudimą nurodytoje vietoje PS4 jutiklinėje plokštėje.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Serijinis numeris</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Nepavyko sukurti atnaujinimo scenarijaus failo</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -108,32 +108,32 @@
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>SFO Viewer</source>
<translation>SFO Viser</translation>
<translation>SFO viser</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="50"/>
<source>Trophy Viewer</source>
<translation>Trofé Viser</translation>
<translation>Trofé viser</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>Open Folder...</source>
<translation>Åpne Mappen...</translation>
<translation>Åpne mappen...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="50"/>
<source>Open Game Folder</source>
<translation>Åpne Spillmappen</translation>
<translation>Åpne spillmappen</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="51"/>
<source>Open Save Data Folder</source>
<translation>Åpne Lagrede Data-mappen</translation>
<translation>Åpne lagrede datamappen</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="52"/>
<source>Open Log Folder</source>
<translation>Åpne Loggmappen</translation>
<translation>Åpne loggmappen</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="59"/>
@ -143,17 +143,17 @@
<message>
<location filename="../gui_context_menus.h" line="60"/>
<source>Copy Name</source>
<translation>Kopier Navn</translation>
<translation>Kopier navn</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="61"/>
<source>Copy Serial</source>
<translation>Kopier Serienummer</translation>
<translation>Kopier serienummer</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="62"/>
<source>Copy All</source>
<translation>Kopier Alle</translation>
<translation>Kopier alle</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="72"/>
@ -163,18 +163,38 @@
<message>
<location filename="../gui_context_menus.h" line="73"/>
<source>Delete Game</source>
<translation>Slett Spill</translation>
<translation>Slett spill</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="74"/>
<source>Delete Update</source>
<translation>Slett Oppdatering</translation>
<translation>Slett oppdatering</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="75"/>
<source>Delete DLC</source>
<translation>Slett DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Snarvei opprettet!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Snarvei opprettet!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Feil ved opprettelse av snarvei!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Feil ved opprettelse av snarvei!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -251,12 +271,12 @@
<message>
<location filename="../main_window_ui.h" line="312"/>
<source>Install Packages (PKG)</source>
<translation>Installer Pakker (PKG)</translation>
<translation>Installer pakker (PKG)</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="313"/>
<source>Boot Game</source>
<translation>Start Spill</translation>
<translation>Start spill</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="308"/>
@ -281,7 +301,7 @@
<message>
<location filename="../main_window_ui.h" line="320"/>
<source>Recent Games</source>
<translation>Nylige Spill</translation>
<translation>Nylige spill</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="321"/>
@ -301,12 +321,12 @@
<message>
<location filename="../main_window_ui.h" line="330"/>
<source>Show Game List</source>
<translation>Vis Spill-listen</translation>
<translation>Vis spill-listen</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="332"/>
<source>Game List Refresh</source>
<translation>Oppdater Spill-listen</translation>
<translation>Oppdater spill-listen</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="333"/>
@ -351,17 +371,17 @@
<message>
<location filename="../main_window_ui.h" line="343"/>
<source>Download Cheats/Patches</source>
<translation>Last ned Juks /Programrettelse </translation>
<translation>Last ned juks/programrettelse</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="345"/>
<source>Dump Game List</source>
<translation>Dump Spill-liste</translation>
<translation>Dump spill-liste</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="346"/>
<source>PKG Viewer</source>
<translation>PKG Viser</translation>
<translation>PKG viser</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="348"/>
@ -381,12 +401,12 @@
<message>
<location filename="../main_window_ui.h" line="352"/>
<source>Game List Icons</source>
<translation>Spill-liste Ikoner</translation>
<translation>Spill-liste ikoner</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="354"/>
<source>Game List Mode</source>
<translation>Spill-liste Modus</translation>
<translation>Spill-liste modus</translation>
</message>
<message>
<location filename="../main_window_ui.h" line="355"/>
@ -444,7 +464,7 @@
<message>
<location filename="../pkg_viewer.cpp" line="32"/>
<source>Open Folder</source>
<translation>Åpne Mappe</translation>
<translation>Åpne mappe</translation>
</message>
</context>
<context>
@ -452,7 +472,7 @@
<message>
<location filename="../trophy_viewer.cpp" line="8"/>
<source>Trophy Viewer</source>
<translation>Trofé Viser</translation>
<translation>Trofé viser</translation>
</message>
</context>
<context>
@ -490,17 +510,17 @@
<message>
<location filename="../settings_dialog.ui" line="122"/>
<source>Enable Fullscreen</source>
<translation>Aktiver Fullskjerm</translation>
<translation>Aktiver fullskjerm</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="140"/>
<source>Enable Separate Update Folder</source>
<translation>Aktiver Seperat Oppdateringsmappe</translation>
<translation>Aktiver seperat oppdateringsmappe</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="129"/>
<source>Show Splash</source>
<translation>Vis Velkomstbilde</translation>
<translation>Vis velkomstbilde</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="136"/>
@ -525,12 +545,12 @@
<message>
<location filename="../settings_dialog.ui" line="199"/>
<source>Log Type</source>
<translation>Log Type</translation>
<translation>Logg type</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="235"/>
<source>Log Filter</source>
<translation>Log Filter</translation>
<translation>Logg filter</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="595"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Skjul musepeker ved inaktivitet</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -560,7 +585,7 @@
<message>
<location filename="../settings_dialog.ui" line="797"/>
<source>Back Button Behavior</source>
<translation>Tilbakeknapp Atferd</translation>
<translation>Tilbakeknapp atferd</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="272"/>
@ -585,7 +610,7 @@
<message>
<location filename="../settings_dialog.ui" line="405"/>
<source>Vblank Divider</source>
<translation>Vblank Skillelinje</translation>
<translation>Vblank skillelinje</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="453"/>
@ -595,7 +620,7 @@
<message>
<location filename="../settings_dialog.ui" line="462"/>
<source>Enable Shaders Dumping</source>
<translation>Aktiver Skyggelegger Dumping</translation>
<translation>Aktiver dumping av skyggelegger</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="469"/>
@ -630,22 +655,22 @@
<message>
<location filename="../settings_dialog.ui" line="537"/>
<source>Enable Debug Dumping</source>
<translation>Aktiver Feilretting Dumping</translation>
<translation>Aktiver dumping av feilretting</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="560"/>
<source>Enable Vulkan Validation Layers</source>
<translation>Aktiver Vulkan Valideringslag</translation>
<translation>Aktiver Vulkan valideringslag</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="567"/>
<source>Enable Vulkan Synchronization Validation</source>
<translation>Aktiver Vulkan Synkroniseringslag</translation>
<translation>Aktiver Vulkan synkroniseringslag</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="574"/>
<source>Enable RenderDoc Debugging</source>
<translation>Aktiver RenderDoc Feilretting</translation>
<translation>Aktiver RenderDoc feilretting</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="274"/>
@ -670,18 +695,48 @@
<message>
<location filename="../settings_dialog.ui" line="354"/>
<source>GUI Settings</source>
<translation>GUI-Innstillinger</translation>
<translation>GUI-innstillinger</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Deaktiver trofé hurtigmeny</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Spill tittelmusikk</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Oppdater kompatibilitets-database ved oppstart</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Spill kompatibilitet</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Vis kompatibilitets-data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Oppdater kompatibilitets-database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Volum</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -703,7 +758,7 @@
<message>
<location filename="../main_window.cpp" line="328"/>
<source>Download Patches For All Games</source>
<translation>Last ned oppdateringer for alle spill</translation>
<translation>Last ned programrettelser for alle spill</translation>
</message>
<message>
<location filename="../main_window.cpp" line="363"/>
@ -753,7 +808,7 @@
<message>
<location filename="../main_window.cpp" line="623"/>
<source>PKG Extraction</source>
<translation>PKG-ekstraksjon</translation>
<translation>PKG-utpakking</translation>
</message>
<message>
<location filename="../main_window.cpp" line="646"/>
@ -763,7 +818,7 @@
<message>
<location filename="../main_window.cpp" line="646"/>
<source>PKG and Game versions match: </source>
<translation>PKG- og spillversjoner stemmer overens: </translation>
<translation>PKG og spillversjoner stemmer overens: </translation>
</message>
<message>
<location filename="../main_window.cpp" line="647"/>
@ -788,7 +843,7 @@
<message>
<location filename="../main_window.cpp" line="673"/>
<source>DLC Installation</source>
<translation>DLC-installasjon</translation>
<translation>DLC installasjon</translation>
</message>
<message>
<location filename="../main_window.cpp" line="674"/>
@ -808,7 +863,7 @@
<message>
<location filename="../main_window.cpp" line="674"/>
<source>PKG is a patch, please install the game first!</source>
<translation>PKG er en oppdatering, vennligst installer spillet først!</translation>
<translation>PKG er en programrettelse, vennligst installer spillet først!</translation>
</message>
<message>
<location filename="../main_window.cpp" line="681"/>
@ -846,7 +901,7 @@
<message>
<location filename="../cheats_patches.cpp" line="50"/>
<source>defaultTextEdit_MSG</source>
<translation>Juks/programrettelse er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og klikke nedlastingsknappen.\nPå fanen programrettelse kan du laste ned alle programrettelser samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Juksene/Programrettelsene,\nvær vennlig å rapportere problemer til jukse/programrettelse utvikleren.\n\nHar du laget en ny juks? Besøk:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
<translation>Juks/programrettelse er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og klikke nedlastingsknappen.\nPå fanen programrettelse kan du laste ned alle programrettelser samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Juks/Programrettelse,\nvær vennlig å rapportere problemer til juks/programrettelse utvikleren.\n\nHar du laget en ny juks? Besøk:\nhttps://github.com/shadps4-emu/ps4_cheats</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="69"/>
@ -896,7 +951,7 @@
<message>
<location filename="../cheats_patches.cpp" line="170"/>
<source>You can delete the cheats you don't want after downloading them.</source>
<translation>Du kan slette juksene du ikke ønsker etter å ha lastet dem ned.</translation>
<translation>Du kan slette juks du ikke ønsker etter å ha lastet dem ned.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="178"/>
@ -911,7 +966,7 @@
<message>
<location filename="../cheats_patches.cpp" line="241"/>
<source>Download Patches</source>
<translation>Last ned programrettelse</translation>
<translation>Last ned programrettelser</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="248"/>
@ -921,7 +976,7 @@
<message>
<location filename="../cheats_patches.cpp" line="256"/>
<source>Cheats</source>
<translation>Jukser</translation>
<translation>Juks</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="257"/>
@ -976,7 +1031,7 @@
<message>
<location filename="../cheats_patches.cpp" line="470"/>
<source>Invalid Source</source>
<translation>Ugyldig Kilde</translation>
<translation>Ugyldig kilde</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="471"/>
@ -986,7 +1041,7 @@
<message>
<location filename="../cheats_patches.cpp" line="519"/>
<source>File Exists</source>
<translation>Filen Eksisterer</translation>
<translation>Filen eksisterer</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="520"/>
@ -1006,7 +1061,7 @@
<message>
<location filename="../cheats_patches.cpp" line="556"/>
<source>Cheats Not Found</source>
<translation>Fant ikke juksene</translation>
<translation>Fant ikke juks</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="556"/>
@ -1016,12 +1071,12 @@
<message>
<location filename="../cheats_patches.cpp" line="593"/>
<source>Cheats Downloaded Successfully</source>
<translation>Juksene ble lastet ned</translation>
<translation>Juks ble lastet ned</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="594"/>
<source>CheatsDownloadedSuccessfully_MSG</source>
<translation>Du har lastet ned jukser for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen.</translation>
<translation>Du har lastet ned juks for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="747"/>
@ -1041,7 +1096,7 @@
<message>
<location filename="../cheats_patches.cpp" line="763"/>
<source>DownloadComplete_MSG</source>
<translation>Programrettelser ble lastet ned! Alle programrettelsene tilgjengelige for alle spill har blitt lastet ned, det er ikke nødvendig å laste dem ned individuelt for hvert spill som skjer med jukser. Hvis programrettelsen ikke vises, kan det hende at den ikke finnes for den spesifikke serienummeret og versjonen av spillet.</translation>
<translation>Programrettelser ble lastet ned! Alle programrettelsene tilgjengelige for alle spill har blitt lastet ned, det er ikke nødvendig å laste dem ned individuelt for hvert spill som skjer med juks. Hvis programrettelsen ikke vises, kan det hende at den ikke finnes for den spesifikke serienummeret og versjonen av spillet.</translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="773"/>
@ -1111,7 +1166,7 @@
<message>
<location filename="../cheats_patches.cpp" line="1163"/>
<source>Can't apply cheats before the game is started</source>
<translation>Kan ikke bruke juksene før spillet er startet.</translation>
<translation>Kan ikke bruke juks før spillet er startet.</translation>
</message>
</context>
<context>
@ -1164,7 +1219,7 @@
<message>
<location filename="../settings_dialog.cpp" line="295"/>
<source>showSplashCheckBox</source>
<translation>Vis Velkomstbilde:\nViser spillets velkomstbilde (et spesialbilde) når spillet starter.</translation>
<translation>Vis velkomstbilde:\nViser spillets velkomstbilde (et spesialbilde) når spillet starter.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="297"/>
@ -1184,12 +1239,12 @@
<message>
<location filename="../settings_dialog.cpp" line="301"/>
<source>logTypeGroupBox</source>
<translation>Logtype:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for etterligneren.</translation>
<translation>Logg type:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for etterligneren.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="303"/>
<source>logFilter</source>
<translation>Loggfilter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det.</translation>
<translation>Logg filter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="305"/>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Spille tittelmusikk:\nHvis et spill støtter det, aktiveres det spesiell musikk når du velger spillet i menyen.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Deaktiver trofé hurtigmeny:\nDeaktiver trofévarsler i spillet. Trofé-fremgang kan fortsatt ved help av troféviseren (høyreklikk spillet i hovedvinduet).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>Atferd for tilbaketasten:\nSetter tilbaketasten kontrolleren til å imitere et trykk den angitte posisjonen PS4s berøringsplate.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Aktiver "Oppdater kompatibilitets-data ved oppstart" for oppdatert informasjon.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Oppdater kompatibilitets-data ved oppstart:\nOppdaterer kompatibilitets-databasen automatisk når shadPS4 starter.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Oppdater kompatibilitets-database:\nOppdater kompatibilitets-databasen .</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1254,7 +1329,7 @@
<message>
<location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source>
<translation>Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en etterligneren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å bestemme den automatisk.</translation>
<translation>Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en etterligneren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å velge automatisk.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="314"/>
@ -1264,12 +1339,12 @@
<message>
<location filename="../settings_dialog.cpp" line="318"/>
<source>heightDivider</source>
<translation>Vblank Skillelinje:\nBildehastigheten som etterligneren oppdaterer ved, multipliseres med dette tallet. Endring av dette kan ha negative effekter, som å øke hastigheten av spillet, eller ødelegge kritisk spillfunksjonalitet som ikke forventer at dette endres!</translation>
<translation>Vblank skillelinje:\nBildehastigheten som etterligneren oppdaterer ved, multipliseres med dette tallet. Endring av dette kan ha negative effekter, som å øke hastigheten av spillet, eller ødelegge kritisk spillfunksjonalitet som ikke forventer at dette endres!</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="320"/>
<source>dumpShadersCheckBox</source>
<translation>Aktiver skyggelegger-dumping:\nFor teknisk feilsøking lagrer skyggeleggene fra spillet i en mappe mens de gjengis.</translation>
<translation>Aktiver dumping av skyggelegger:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="322"/>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Serienummer</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Kompatibilitet</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1362,7 +1442,52 @@
<message>
<location filename="../game_list_frame.cpp" line="108"/>
<source>Never Played</source>
<translation>Never Played</translation>
<translation>Aldri spilt</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>kompatibilitet er utestet</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Spillet initialiseres ikke riktig / krasjer etterligneren</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Spillet starter, men viser bare en tom skjerm</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Spillet viser et bilde, men går ikke forbi menyen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Spillet har spillbrytende feil eller uspillbar ytelse</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Spillet kan fullføres med spillbar ytelse og ingen store feil</translation>
</message>
</context>
<context>
@ -1370,7 +1495,7 @@
<message>
<location filename="../check_update.cpp" line="34"/>
<source>Auto Updater</source>
<translation>Automatisk oppdaterering</translation>
<translation>Automatisk oppdatering</translation>
</message>
<message>
<location filename="../check_update.cpp" line="51"/>
@ -1385,7 +1510,7 @@
<message>
<location filename="../check_update.cpp" line="73"/>
<source>Failed to parse update information.</source>
<translation>Kunne ikke analysere oppdateringsinformasjonen.</translation>
<translation>Kunne ikke analysere oppdaterings-informasjonen.</translation>
</message>
<message>
<location filename="../check_update.cpp" line="89"/>
@ -1465,7 +1590,7 @@
<message>
<location filename="../check_update.cpp" line="310"/>
<source>Network error occurred while trying to access the URL</source>
<translation>Nettverksfeil oppstod mens du prøvde å tilgang til URL</translation>
<translation>Nettverksfeil oppstod mens vi prøvde å tilgang til URL</translation>
</message>
<message>
<location filename="../check_update.cpp" line="330"/>
@ -1493,4 +1618,32 @@
<translation>Kunne ikke opprette oppdateringsskriptfilen</translation>
</message>
</context>
</TS>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Shortcut created successfully!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Error creating shortcut!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Inactiviteit timeout voor het verbergen van de cursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>GUI-Instellingen</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Titelmuziek afspelen</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Volume</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Speel titelsong:\nAls een game dit ondersteunt, wordt speciale muziek afgespeeld wanneer je het spel in de GUI selecteert.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</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>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Serienummer</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Kon het update-scriptbestand niet maken</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Utworzenie skrótu zakończone pomyślnie!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Utworzenie skrótu zakończone pomyślnie!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Utworzenie skrótu zakończone niepowodzeniem!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Utworzenie skrótu zakończone niepowodzeniem!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Czas oczekiwania na ukrycie kursora przy bezczynności</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>Ustawienia Interfejsu</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Odtwórz muzykę tytułową</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Głośność</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Odtwórz muzykę tytułową:\nJeśli gra to obsługuje, aktywuje odtwarzanie specjalnej muzyki podczas wybierania gry w GUI.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>Zachowanie przycisku Wstecz:\nUstawia przycisk Wstecz kontrolera tak, aby emulował dotknięcie określonego miejsca na panelu dotykowym PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Numer seryjny</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Nie udało się utworzyć pliku skryptu aktualizacji</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Deletar DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibilidade...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Atualizar banco de dados</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>Ver status</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Enviar status</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Atalho criado com sucesso!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Atalho criado com sucesso!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Erro ao criar atalho!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Erro ao criar atalho!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Tempo de Inatividade para Ocultar Cursor</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>Configurações da Interface</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Desabilitar Pop-ups dos Troféus</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Reproduzir música de abertura</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Atualizar Compatibilidade ao Inicializar</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Compatibilidade dos Jogos</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Exibir Dados de Compatibilidade</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Atualizar Lista de Compatibilidade</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Volume</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Backend de Áudio</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Reproduzir música de abertura:\nSe o jogo suportar, ativa a reprodução de uma música especial ao selecionar o jogo na interface do menu.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Desabilitar pop-ups dos troféus:\nDesabilite notificações de troféus no jogo. O progresso do troféu ainda pode ser rastreado usando o Trophy Viewer (clique com o botão direito do mouse no jogo na janela principal).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</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>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos na janela principal.\nHabilitar "Atualizar Compatibilidade ao Inicializar" para obter informações atualizadas.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Atualizar Compatibilidade ao inicializar:\nAtualiza automaticamente o banco de dados de compatibilidade quando o SHADPS4 é iniciado.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Atualizar Lista de Compatibilidade:\nAtualizar imediatamente o banco de dados de compatibilidade.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Serial</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibilidade</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="36"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Nunca jogado</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibilidade não testada</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Jogo não inicializa corretamente / trava o emulador</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>O jogo inicializa, mas exibe apenas uma tela vazia</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Jogo exibe imagem mas não passa do menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>O jogo tem falhas que interrompem o jogo ou desempenho injogável</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>O jogo pode ser concluído com desempenho jogável e sem grandes falhas</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Falha ao criar o arquivo de script de atualização</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Shortcut created successfully!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Error creating shortcut!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Timeout pentru ascunderea cursorului inactiv</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>Setări GUI</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Redă muzica titlului</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Volum</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Redă muzica titlului:\nDacă un joc o suportă, activează redarea muzicii speciale când selectezi jocul în GUI.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>Comportamentul butonului înapoi:\nSetează butonul înapoi al controlerului imite atingerea poziției specificate pe touchpad-ul PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Serie</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Nu s-a putut crea fișierul script de actualizare</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -118,7 +118,7 @@
<message>
<location filename="../gui_context_menus.h" line="49"/>
<source>Open Folder...</source>
<translation>Открыть Папку...</translation>
<translation>Открыть папку...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="50"/>
@ -128,12 +128,12 @@
<message>
<location filename="../gui_context_menus.h" line="51"/>
<source>Open Save Data Folder</source>
<translation>Открыть Папку Сохранений</translation>
<translation>Открыть папку сохранений</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="52"/>
<source>Open Log Folder</source>
<translation>Открыть Папку Логов</translation>
<translation>Открыть папку логов</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="59"/>
@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Удалить DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Совместимость...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Обновить базу данных</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>Посмотреть отчет</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Отправить отчет</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Ярлык создан успешно!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Ярлык создан успешно!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Ошибка создания ярлыка!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Ошибка создания ярлыка!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -452,7 +472,7 @@
<message>
<location filename="../trophy_viewer.cpp" line="8"/>
<source>Trophy Viewer</source>
<translation>Трофеи</translation>
<translation>Просмотр трофеев</translation>
</message>
</context>
<context>
@ -550,7 +570,12 @@
<message>
<location filename="../settings_dialog.ui" line="668"/>
<source>Hide Cursor Idle Timeout</source>
<translation>Тайм-аут скрытия курсора при бездействии</translation>
<translation>Время скрытия курсора при бездействии</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>сек</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>Интерфейс</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Отключить уведомления о трофеях</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Играть заглавную музыку</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Обновлять базу совместимости при запуске</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Совместимость игр</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Показывать данные совместимости</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Обновить базу совместимости</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Громкость</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Звуковая Подсистема</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -738,7 +793,7 @@
<message>
<location filename="../main_window.cpp" line="594"/>
<source>ELF files (*.bin *.elf *.oelf)</source>
<translation>Файл ELF (*.bin *.elf *.oelf)</translation>
<translation>Файлы ELF (*.bin *.elf *.oelf)</translation>
</message>
<message>
<location filename="../main_window.cpp" line="600"/>
@ -793,7 +848,7 @@
<message>
<location filename="../main_window.cpp" line="674"/>
<source>Would you like to install DLC: %1?</source>
<translation>Вы хотите установить DLC: %1??</translation>
<translation>Вы хотите установить DLC: %1?</translation>
</message>
<message>
<location filename="../main_window.cpp" line="688"/>
@ -841,7 +896,7 @@
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches for </source>
<translation>Cheats / Patches for </translation>
<translation>Читы и патчи для </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
@ -1164,7 +1219,7 @@
<message>
<location filename="../settings_dialog.cpp" line="295"/>
<source>showSplashCheckBox</source>
<translation>Показывать заставку:\nОтображает заставку игры (специальное изображение) во время запуска игры.</translation>
<translation>Показывать заставку:\nОтображает заставку игры (специальное изображение) во время запуска.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="297"/>
@ -1201,10 +1256,15 @@
<source>GUIgroupBox</source>
<translation>Играть заглавную музыку:\nВключает воспроизведение специальной музыки при выборе игры в списке, если она это поддерживает.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Отключить уведомления о трофеях:\nОтключает внутриигровые уведомления о трофеях. Прогресс трофеев по прежнему можно отслеживать в меню Просмотр трофеев (правая кнопка мыши по игре в главном окне).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
<translation>Скрывать курсор:\nВыберите, когда курсор исчезнет:\nНикогда: Вы всегда будете видеть мышь.\ри бездействии: Установите время, через которое курсор исчезнет при бездействии.\nВсегда: Вы никогда не будете видеть мышь.</translation>
<translation>Скрывать курсор:\nВыберите, когда курсор будет скрыт:\nНикогда: Вы всегда будете видеть курсор.\ри бездействии: Установите время, через которое курсор будет скрыт при бездействии.\nВсегда: Курсор всегда будет скрыт.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="452"/>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>Поведение кнопки «Назад»:\nНастраивает кнопку «Назад» контроллера на эмуляцию нажатия на указанную область на сенсорной панели контроллера PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Показывать данные совместимости:\оказывает информацию о совместимости игр в таблице. Включите «Обновлять базу совместимости при запуске» для получения актуальной информации.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Обновлять базу совместимости при запуске:\nАвтоматически обновлять базу данных совместимости при запуске shadPS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Обновить базу совместимости:\nНемедленно обновить базу данных совместимости.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1254,7 +1329,7 @@
<message>
<location filename="../settings_dialog.cpp" line="312"/>
<source>graphicsAdapterGroupBox</source>
<translation>Графическое устройство:\nВ системах с несколькими GPU выберите GPU, который будет использовать эмулятор из выпадающего списка,\nили выберите "Auto Select", чтобы определить его автоматически.</translation>
<translation>Графическое устройство:\nВ системах с несколькими GPU выберите GPU, который будет использовать эмулятор.\nВыберите "Auto Select", чтобы определить его автоматически.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="314"/>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Серийный номер</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Совместимость</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1362,7 +1442,52 @@
<message>
<location filename="../game_list_frame.cpp" line="108"/>
<source>Never Played</source>
<translation>Never Played</translation>
<translation>Вы не играли</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>ч</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>м</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>с</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Совместимость не проверена</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Игра не иницализируется правильно / крашит эмулятор</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Игра запускается, но показывает только пустой экран</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Игра показывает картинку, но не проходит дальше меню</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Игра имеет ломающие игру глюки или плохую производительность</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Игра может быть пройдена с хорошей производительностью и без серьезных сбоев</translation>
</message>
</context>
<context>
@ -1445,7 +1570,7 @@
<message>
<location filename="../check_update.cpp" line="199"/>
<source>Update</source>
<translation>Обновиться</translation>
<translation>Обновить</translation>
</message>
<message>
<location filename="../check_update.cpp" line="200"/>
@ -1493,4 +1618,32 @@
<translation>Не удалось создать файл скрипта обновления</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>Б</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>КБ</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>МБ</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>ГБ</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>ТБ</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Fshi DLC-</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Shkurtorja u krijua me sukses!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Shkurtorja u krijua me sukses!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Gabim krijimin e shkurtores!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Gabim krijimin e shkurtores!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Koha për fshehjen e kursorit joaktiv</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>Cilësimet e GUI</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Çaktivizo njoftimet për Trofetë</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Luaj muzikën e titullit</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Përditëso bazën e dhënave përputhshmërisë gjatë nisjes</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Përputhshmëria e lojës</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Shfaq dhënat e përputhshmërisë</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Përditëso bazën e dhënave përputhshmërisë</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Vëllimi i zërit</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -841,7 +896,7 @@
<message>
<location filename="../cheats_patches.cpp" line="44"/>
<source>Cheats / Patches for </source>
<translation>Cheats / Patches for </translation>
<translation>Mashtrime / Arna r </translation>
</message>
<message>
<location filename="../cheats_patches.cpp" line="50"/>
@ -1159,7 +1214,7 @@
<message>
<location filename="../settings_dialog.cpp" line="293"/>
<source>separateUpdatesCheckBox</source>
<translation>Aktivizo dosjen e ndarë përditësimit:\nAktivizon instalimin e përditësimeve lojërave dosje veçanta për menaxhim lehtë.</translation>
<translation>Aktivizo dosjen e ndarë përditësimit:\nAktivizon instalimin e përditësimeve lojërave dosje veçanta për menaxhim lehtë.\nKjo mund krijohet manualisht duke shtuar përditësimin e shpaketuar dosjen e lojës me emrin "CUSA00000-UPDATE" ku ID-ja CUSA përputhet me ID- e lojës.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="295"/>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Luaj muzikën e titullit:\nNëse një lojë e mbështet, aktivizohet luajtja e muzikës veçantë kur zgjidhësh lojën GUI.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Çaktivizo njoftimet për Trofetë:\nÇaktivizo njoftimet për trofetë gjatë lojës. Përparimi i trofeve mund ndiqet duke përdorur Shikuesin e Trofeve (kliko me djathtën mbi lojën dritaren kryesore).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>Sjellja e butonit mbrapa:\nLejon përcaktohet se cilën pjesë tastierës prekëse do imitojë një prekje butoni mprapa.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Shfaq dhënat e përputhshmërisë:\nShfaq informacionin e përputhshmërisë lojës formë tabele. Aktivizo 'Përditëso përputhshmërinë gjatë nisjes' për marrë informacion përditësuar.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Përditëso përputhshmërinë gjatë nisjes:\nPërditëson automatikisht bazën e dhënave përputhshmërisë kur shadPS4 niset.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Përditëso bazën e dhënave përputhshmërisë:\nPërditëso menjëherë bazën e dhënave përputhshmërisë.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Seriku</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Përputhshmëria</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1362,7 +1442,52 @@
<message>
<location filename="../game_list_frame.cpp" line="108"/>
<source>Never Played</source>
<translation>Never Played</translation>
<translation>Nuk është luajtur kurrë</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Përputhshmëria nuk është e testuar</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Loja nuk niset siç duhet / rrëzon emulatorin</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Loja niset, por shfaq vetëm një ekran zbrazët</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Loja shfaq një imazh, por nuk kalon përtej menysë</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Loja ka probleme kritike ose performancë papërshtatshme për lojë</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Loja mund përfundohet me performancë luajtshme dhe pa probleme mëdha</translation>
</message>
</context>
<context>
@ -1493,4 +1618,32 @@
<translation>Krijimi i skedarit skript përditësimit dështoi</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Kısayol başarıyla oluşturuldu!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Kısayol başarıyla oluşturuldu!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Kısayol oluşturulurken hata oluştu!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Kısayol oluşturulurken hata oluştu!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>İmleç İçin Hareketsizlik Zaman ımı</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>GUI Ayarları</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Başlık müziğini çal</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Ses seviyesi</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Başlık Müziklerini Çal:\nEğer bir oyun bunu destekliyorsa, GUI'de oyunu seçtiğinizde özel müziklerin çalmasını etkinleştirir.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>Geri düğmesi davranışı:\nKontrol cihazındaki geri düğmesini, PS4'ün dokunmatik panelindeki belirlenen noktaya dokunmak için ayarlar.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Seri Numarası</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Güncelleme betiği dosyası oluşturulamadı</translation>
</message>
</context>
</TS>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Видалити DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Ярлик створений успішно!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Ярлик створений успішно!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Помилка при створенні ярлика!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Помилка при створенні ярлика!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Тайм-аут приховування курсора при бездіяльності</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>Інтерфейс</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Програвати заголовну музику</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Гучність</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Грати заголовну музику:\nВмикає відтворення спеціальної музики під час вибору гри в списку, якщо вона це підтримує.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>Поведінка кнопки «Назад»:\nНалаштовує кнопку «Назад» контролера на емуляцію натискання на зазначену область на сенсорній панелі контролера PS4.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Серійний номер</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Не вдалося створити файл скрипта оновлення</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Shortcut created successfully!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Error creating shortcut!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation>Thời gian chờ n con trỏ</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation>Cài đt GUI</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation>Phát nhạc tiêu đ</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation>Âm lượng</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>Phát nhạc tiêu đ trò chơi:\nNếu một trò chơi hỗ trợ điều này, hãy kích hoạt phát nhạc đc biệt khi bạn chọn trò chơi trong GUI.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</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>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation>Số seri</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation>Không thể tạo tệp kịch bản cập nhật</translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>:\n如果游戏支持</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>:\n设置控制器的返回按钮以模拟在 PS4 </translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation></translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation></translation>
</message>
</context>
</TS>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -175,6 +175,26 @@
<source>Delete DLC</source>
<translation>Delete DLC</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="99"/>
<source>Compatibility...</source>
<translation>Compatibility...</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="100"/>
<source>Update database</source>
<translation>Update database</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="101"/>
<source>View report</source>
<translation>View report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="102"/>
<source>Submit a report</source>
<translation>Submit a report</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="195"/>
<source>Shortcut creation</source>
@ -182,8 +202,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="196"/>
<source>Shortcut created successfully!\n %1</source>
<translation>Shortcut created successfully!\n %1</translation>
<source>Shortcut created successfully!</source>
<translation>Shortcut created successfully!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="199"/>
@ -192,8 +212,8 @@
</message>
<message>
<location filename="../gui_context_menus.h" line="200"/>
<source>Error creating shortcut!\n %1</source>
<translation>Error creating shortcut!\n %1</translation>
<source>Error creating shortcut!</source>
<translation>Error creating shortcut!</translation>
</message>
<message>
<location filename="../gui_context_menus.h" line="275"/>
@ -552,6 +572,11 @@
<source>Hide Cursor Idle Timeout</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="816"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="767"/>
<source>Controller</source>
@ -672,16 +697,46 @@
<source>GUI Settings</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="475"/>
<source>Disable Trophy Pop-ups</source>
<translation>Disable Trophy Pop-ups</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="375"/>
<source>Play title music</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database On Startup</source>
<translation>Update Compatibility Database On Startup</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Game Compatibility</source>
<translation>Game Compatibility</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Display Compatibility Data</source>
<translation>Display Compatibility Data</translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Update Compatibility Database</source>
<translation>Update Compatibility Database</translation>
</message>
<message>
<location filename="../settings_dialog.ui" line="394"/>
<source>Volume</source>
<translation></translation>
</message>
<message>
<location filename="../settings_dialog.ui"/>
<source>Audio Backend</source>
<translation>Audio Backend</translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -1201,6 +1256,11 @@
<source>GUIgroupBox</source>
<translation>:\n如果遊戲支持GUI中選擇遊戲時播放特殊音樂</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="267"/>
<source>disableTrophycheckBox</source>
<translation>Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window).</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="450"/>
<source>hideCursorGroupBox</source>
@ -1216,6 +1276,21 @@
<source>backButtonBehaviorGroupBox</source>
<translation>:\n設定控制器的返回按鈕模擬在 PS4 </translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>enableCompatibilityCheckBox</source>
<translation>Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>checkCompatibilityOnStartupCheckBox</source>
<translation>Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp"/>
<source>updateCompatibilityButton</source>
<translation>Update Compatibility Database:\nImmediately update the compatibility database.</translation>
</message>
<message>
<location filename="../settings_dialog.cpp" line="70"/>
<source>Never</source>
@ -1329,6 +1404,11 @@
<source>Serial</source>
<translation></translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility</source>
<translation>Compatibility</translation>
</message>
<message>
<location filename="../game_list_frame.cpp" line="34"/>
<source>Region</source>
@ -1364,6 +1444,51 @@
<source>Never Played</source>
<translation>Never Played</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>h</source>
<translation>h</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>m</source>
<translation>m</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>s</source>
<translation>s</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Compatibility is untested</source>
<translation>Compatibility is untested</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game does not initialize properly / crashes the emulator</source>
<translation>Game does not initialize properly / crashes the emulator</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game boots, but only displays a blank screen</source>
<translation>Game boots, but only displays a blank screen</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game displays an image but does not go past the menu</source>
<translation>Game displays an image but does not go past the menu</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game has game-breaking glitches or unplayable performance</source>
<translation>Game has game-breaking glitches or unplayable performance</translation>
</message>
<message>
<location filename="../game_list_frame.cpp"/>
<source>Game can be completed with playable performance and no major glitches</source>
<translation>Game can be completed with playable performance and no major glitches</translation>
</message>
</context>
<context>
<name>CheckUpdate</name>
@ -1493,4 +1618,32 @@
<translation></translation>
</message>
</context>
<context>
<name>GameListUtils</name>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>KB</source>
<translation>KB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>GB</source>
<translation>GB</translation>
</message>
<message>
<location filename="../game_list_utils.h" line="34"/>
<source>TB</source>
<translation>TB</translation>
</message>
</context>
</TS>

View File

@ -24,6 +24,7 @@ static constexpr spv::ExecutionMode GetInputPrimitiveType(AmdGpu::PrimitiveType
case AmdGpu::PrimitiveType::PointList:
return spv::ExecutionMode::InputPoints;
case AmdGpu::PrimitiveType::LineList:
case AmdGpu::PrimitiveType::LineStrip:
return spv::ExecutionMode::InputLines;
case AmdGpu::PrimitiveType::TriangleList:
case AmdGpu::PrimitiveType::TriangleStrip:

View File

@ -304,10 +304,12 @@ Id EmitBitFieldSExtract(EmitContext& ctx, IR::Inst* inst, Id base, Id offset, Id
Id EmitBitFieldUExtract(EmitContext& ctx, IR::Inst* inst, Id base, Id offset, Id count);
Id EmitBitReverse32(EmitContext& ctx, Id value);
Id EmitBitCount32(EmitContext& ctx, Id value);
Id EmitBitCount64(EmitContext& ctx, Id value);
Id EmitBitwiseNot32(EmitContext& ctx, Id value);
Id EmitFindSMsb32(EmitContext& ctx, Id value);
Id EmitFindUMsb32(EmitContext& ctx, Id value);
Id EmitFindILsb32(EmitContext& ctx, Id value);
Id EmitFindILsb64(EmitContext& ctx, Id value);
Id EmitSMin32(EmitContext& ctx, Id a, Id b);
Id EmitUMin32(EmitContext& ctx, Id a, Id b);
Id EmitSMax32(EmitContext& ctx, Id a, Id b);
@ -318,7 +320,8 @@ Id EmitSLessThan32(EmitContext& ctx, Id lhs, Id rhs);
Id EmitSLessThan64(EmitContext& ctx, Id lhs, Id rhs);
Id EmitULessThan32(EmitContext& ctx, Id lhs, Id rhs);
Id EmitULessThan64(EmitContext& ctx, Id lhs, Id rhs);
Id EmitIEqual(EmitContext& ctx, Id lhs, Id rhs);
Id EmitIEqual32(EmitContext& ctx, Id lhs, Id rhs);
Id EmitIEqual64(EmitContext& ctx, Id lhs, Id rhs);
Id EmitSLessThanEqual(EmitContext& ctx, Id lhs, Id rhs);
Id EmitULessThanEqual(EmitContext& ctx, Id lhs, Id rhs);
Id EmitSGreaterThan(EmitContext& ctx, Id lhs, Id rhs);

View File

@ -201,6 +201,10 @@ Id EmitBitCount32(EmitContext& ctx, Id value) {
return ctx.OpBitCount(ctx.U32[1], value);
}
Id EmitBitCount64(EmitContext& ctx, Id value) {
return ctx.OpBitCount(ctx.U64, value);
}
Id EmitBitwiseNot32(EmitContext& ctx, Id value) {
return ctx.OpNot(ctx.U32[1], value);
}
@ -217,6 +221,10 @@ Id EmitFindILsb32(EmitContext& ctx, Id value) {
return ctx.OpFindILsb(ctx.U32[1], value);
}
Id EmitFindILsb64(EmitContext& ctx, Id value) {
return ctx.OpFindILsb(ctx.U64, value);
}
Id EmitSMin32(EmitContext& ctx, Id a, Id b) {
return ctx.OpSMin(ctx.U32[1], a, b);
}
@ -277,7 +285,11 @@ Id EmitULessThan64(EmitContext& ctx, Id lhs, Id rhs) {
return ctx.OpULessThan(ctx.U1[1], lhs, rhs);
}
Id EmitIEqual(EmitContext& ctx, Id lhs, Id rhs) {
Id EmitIEqual32(EmitContext& ctx, Id lhs, Id rhs) {
return ctx.OpIEqual(ctx.U1[1], lhs, rhs);
}
Id EmitIEqual64(EmitContext& ctx, Id lhs, Id rhs) {
return ctx.OpIEqual(ctx.U1[1], lhs, rhs);
}

View File

@ -43,6 +43,7 @@ static constexpr u32 NumVertices(AmdGpu::PrimitiveType type) {
case AmdGpu::PrimitiveType::PointList:
return 1u;
case AmdGpu::PrimitiveType::LineList:
case AmdGpu::PrimitiveType::LineStrip:
return 2u;
case AmdGpu::PrimitiveType::TriangleList:
case AmdGpu::PrimitiveType::TriangleStrip:

View File

@ -3565,8 +3565,8 @@ constexpr std::array<InstFormat, 112> InstructionFormatMIMG = {{
{InstClass::VectorMemImgSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Float32,
ScalarType::Float32},
// 64 = IMAGE_GATHER4
{InstClass::VectorMemImgSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Undefined,
ScalarType::Undefined},
{InstClass::VectorMemImgSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32,
ScalarType::Float32},
// 65 = IMAGE_GATHER4_CL
{InstClass::VectorMemImgSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Undefined,
ScalarType::Undefined},
@ -3603,10 +3603,10 @@ constexpr std::array<InstFormat, 112> InstructionFormatMIMG = {{
ScalarType::Undefined},
// 79 = IMAGE_GATHER4_C_LZ
{InstClass::VectorMemImgSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32,
ScalarType::Uint32},
ScalarType::Float32},
// 80 = IMAGE_GATHER4_O
{InstClass::VectorMemImgSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Undefined,
ScalarType::Undefined},
{InstClass::VectorMemImgSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32,
ScalarType::Float32},
// 81 = IMAGE_GATHER4_CL_O
{InstClass::VectorMemImgSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Undefined,
ScalarType::Undefined},

View File

@ -100,8 +100,12 @@ void Translator::EmitScalarAlu(const GcnInst& inst) {
return S_BREV_B32(inst);
case Opcode::S_BCNT1_I32_B32:
return S_BCNT1_I32_B32(inst);
case Opcode::S_BCNT1_I32_B64:
return S_BCNT1_I32_B64(inst);
case Opcode::S_FF1_I32_B32:
return S_FF1_I32_B32(inst);
case Opcode::S_FF1_I32_B64:
return S_FF1_I32_B64(inst);
case Opcode::S_AND_SAVEEXEC_B64:
return S_SAVEEXEC_B64(NegateMode::None, false, inst);
case Opcode::S_ORN2_SAVEEXEC_B64:
@ -585,12 +589,25 @@ void Translator::S_BCNT1_I32_B32(const GcnInst& inst) {
ir.SetScc(ir.INotEqual(result, ir.Imm32(0)));
}
void Translator::S_BCNT1_I32_B64(const GcnInst& inst) {
const IR::U32 result = ir.BitCount(GetSrc64(inst.src[0]));
SetDst(inst.dst[0], result);
ir.SetScc(ir.INotEqual(result, ir.Imm32(0)));
}
void Translator::S_FF1_I32_B32(const GcnInst& inst) {
const IR::U32 src0{GetSrc(inst.src[0])};
const IR::U32 result{ir.Select(ir.IEqual(src0, ir.Imm32(0U)), ir.Imm32(-1), ir.FindILsb(src0))};
SetDst(inst.dst[0], result);
}
void Translator::S_FF1_I32_B64(const GcnInst& inst) {
const IR::U64 src0{GetSrc64(inst.src[0])};
const IR::U32 result{
ir.Select(ir.IEqual(src0, ir.Imm64(u64(0))), ir.Imm32(-1), ir.FindILsb(src0))};
SetDst(inst.dst[0], result);
}
void Translator::S_SAVEEXEC_B64(NegateMode negate, bool is_or, const GcnInst& inst) {
// This instruction normally operates on 64-bit data (EXEC, VCC, SGPRs)
// However here we flatten it to 1-bit EXEC and 1-bit VCC. For the destination

View File

@ -111,7 +111,9 @@ public:
void S_NOT_B64(const GcnInst& inst);
void S_BREV_B32(const GcnInst& inst);
void S_BCNT1_I32_B32(const GcnInst& inst);
void S_BCNT1_I32_B64(const GcnInst& inst);
void S_FF1_I32_B32(const GcnInst& inst);
void S_FF1_I32_B64(const GcnInst& inst);
void S_GETPC_B64(u32 pc, const GcnInst& inst);
void S_SAVEEXEC_B64(NegateMode negate, bool is_or, const GcnInst& inst);
void S_ABS_I32(const GcnInst& inst);

View File

@ -144,8 +144,10 @@ void Translator::EmitVectorMemory(const GcnInst& inst) {
return IMAGE_SAMPLE(inst);
// Image gather operations
case Opcode::IMAGE_GATHER4:
case Opcode::IMAGE_GATHER4_LZ:
case Opcode::IMAGE_GATHER4_C:
case Opcode::IMAGE_GATHER4_O:
case Opcode::IMAGE_GATHER4_C_O:
case Opcode::IMAGE_GATHER4_C_LZ:
case Opcode::IMAGE_GATHER4_LZ_O:

View File

@ -1273,8 +1273,15 @@ U32 IREmitter::BitReverse(const U32& value) {
return Inst<U32>(Opcode::BitReverse32, value);
}
U32 IREmitter::BitCount(const U32& value) {
return Inst<U32>(Opcode::BitCount32, value);
U32 IREmitter::BitCount(const U32U64& value) {
switch (value.Type()) {
case Type::U32:
return Inst<U32>(Opcode::BitCount32, value);
case Type::U64:
return Inst<U32>(Opcode::BitCount64, value);
default:
ThrowInvalidType(value.Type());
}
}
U32 IREmitter::BitwiseNot(const U32& value) {
@ -1289,8 +1296,15 @@ U32 IREmitter::FindUMsb(const U32& value) {
return Inst<U32>(Opcode::FindUMsb32, value);
}
U32 IREmitter::FindILsb(const U32& value) {
return Inst<U32>(Opcode::FindILsb32, value);
U32 IREmitter::FindILsb(const U32U64& value) {
switch (value.Type()) {
case Type::U32:
return Inst<U32>(Opcode::FindILsb32, value);
case Type::U64:
return Inst<U32>(Opcode::FindILsb64, value);
default:
ThrowInvalidType(value.Type());
}
}
U32 IREmitter::SMin(const U32& a, const U32& b) {
@ -1345,7 +1359,9 @@ U1 IREmitter::IEqual(const U32U64& lhs, const U32U64& rhs) {
}
switch (lhs.Type()) {
case Type::U32:
return Inst<U1>(Opcode::IEqual, lhs, rhs);
return Inst<U1>(Opcode::IEqual32, lhs, rhs);
case Type::U64:
return Inst<U1>(Opcode::IEqual64, lhs, rhs);
default:
ThrowInvalidType(lhs.Type());
}

View File

@ -229,12 +229,12 @@ public:
[[nodiscard]] U32 BitFieldExtract(const U32& base, const U32& offset, const U32& count,
bool is_signed = false);
[[nodiscard]] U32 BitReverse(const U32& value);
[[nodiscard]] U32 BitCount(const U32& value);
[[nodiscard]] U32 BitCount(const U32U64& value);
[[nodiscard]] U32 BitwiseNot(const U32& value);
[[nodiscard]] U32 FindSMsb(const U32& value);
[[nodiscard]] U32 FindUMsb(const U32& value);
[[nodiscard]] U32 FindILsb(const U32& value);
[[nodiscard]] U32 FindILsb(const U32U64& value);
[[nodiscard]] U32 SMin(const U32& a, const U32& b);
[[nodiscard]] U32 UMin(const U32& a, const U32& b);
[[nodiscard]] U32 IMin(const U32& a, const U32& b, bool is_signed);

View File

@ -284,11 +284,13 @@ OPCODE(BitFieldSExtract, U32, U32,
OPCODE(BitFieldUExtract, U32, U32, U32, U32, )
OPCODE(BitReverse32, U32, U32, )
OPCODE(BitCount32, U32, U32, )
OPCODE(BitCount64, U32, U64, )
OPCODE(BitwiseNot32, U32, U32, )
OPCODE(FindSMsb32, U32, U32, )
OPCODE(FindUMsb32, U32, U32, )
OPCODE(FindILsb32, U32, U32, )
OPCODE(FindILsb64, U32, U64, )
OPCODE(SMin32, U32, U32, U32, )
OPCODE(UMin32, U32, U32, U32, )
OPCODE(SMax32, U32, U32, U32, )
@ -299,7 +301,8 @@ OPCODE(SLessThan32, U1, U32,
OPCODE(SLessThan64, U1, U64, U64, )
OPCODE(ULessThan32, U1, U32, U32, )
OPCODE(ULessThan64, U1, U64, U64, )
OPCODE(IEqual, U1, U32, U32, )
OPCODE(IEqual32, U1, U32, U32, )
OPCODE(IEqual64, U1, U64, U64, )
OPCODE(SLessThanEqual, U1, U32, U32, )
OPCODE(ULessThanEqual, U1, U32, U32, )
OPCODE(SGreaterThan, U1, U32, U32, )

View File

@ -391,9 +391,12 @@ void ConstantPropagation(IR::Block& block, IR::Inst& inst) {
case IR::Opcode::UGreaterThanEqual:
FoldWhenAllImmediates(inst, [](u32 a, u32 b) { return a >= b; });
return;
case IR::Opcode::IEqual:
case IR::Opcode::IEqual32:
FoldWhenAllImmediates(inst, [](u32 a, u32 b) { return a == b; });
return;
case IR::Opcode::IEqual64:
FoldWhenAllImmediates(inst, [](u64 a, u64 b) { return a == b; });
return;
case IR::Opcode::INotEqual:
FoldWhenAllImmediates(inst, [](u32 a, u32 b) { return a != b; });
return;

View File

@ -249,7 +249,7 @@ std::pair<const IR::Inst*, bool> TryDisableAnisoLod0(const IR::Inst* inst) {
// Select should be based on zero check
const auto* prod0 = inst->Arg(0).InstRecursive();
if (prod0->GetOpcode() != IR::Opcode::IEqual ||
if (prod0->GetOpcode() != IR::Opcode::IEqual32 ||
!(prod0->Arg(1).IsImmediate() && prod0->Arg(1).U32() == 0u)) {
return not_found;
}

View File

@ -364,6 +364,16 @@ enum class Filter : u64 {
AnisoLinear = 3,
};
constexpr bool IsAnisoFilter(const Filter filter) {
switch (filter) {
case Filter::AnisoPoint:
case Filter::AnisoLinear:
return true;
default:
return false;
}
}
enum class MipFilter : u64 {
None = 0,
Point = 1,
@ -435,6 +445,23 @@ struct Sampler {
float MaxLod() const noexcept {
return static_cast<float>(max_lod.Value()) / 256.0f;
}
float MaxAniso() const {
switch (max_aniso) {
case AnisoRatio::One:
return 1.0f;
case AnisoRatio::Two:
return 2.0f;
case AnisoRatio::Four:
return 4.0f;
case AnisoRatio::Eight:
return 8.0f;
case AnisoRatio::Sixteen:
return 16.0f;
default:
UNREACHABLE();
}
}
};
} // namespace AmdGpu

View File

@ -133,37 +133,23 @@ GraphicsPipeline::GraphicsPipeline(
.sampleShadingEnable = false,
};
const vk::Viewport viewport = {
.x = 0.0f,
.y = 0.0f,
.width = 1.0f,
.height = 1.0f,
.minDepth = 0.0f,
.maxDepth = 1.0f,
};
const vk::Rect2D scissor = {
.offset = {0, 0},
.extent = {1, 1},
};
const vk::PipelineViewportDepthClipControlCreateInfoEXT clip_control = {
.negativeOneToOne = key.clip_space == Liverpool::ClipSpace::MinusWToW,
};
const vk::PipelineViewportStateCreateInfo viewport_info = {
.pNext = instance.IsDepthClipControlSupported() ? &clip_control : nullptr,
.viewportCount = 1,
.pViewports = &viewport,
.scissorCount = 1,
.pScissors = &scissor,
};
boost::container::static_vector<vk::DynamicState, 14> dynamic_states = {
vk::DynamicState::eViewport, vk::DynamicState::eScissor,
vk::DynamicState::eBlendConstants, vk::DynamicState::eDepthBounds,
vk::DynamicState::eDepthBias, vk::DynamicState::eStencilReference,
vk::DynamicState::eStencilCompareMask, vk::DynamicState::eStencilWriteMask,
vk::DynamicState::eViewportWithCountEXT,
vk::DynamicState::eScissorWithCountEXT,
vk::DynamicState::eBlendConstants,
vk::DynamicState::eDepthBounds,
vk::DynamicState::eDepthBias,
vk::DynamicState::eStencilReference,
vk::DynamicState::eStencilCompareMask,
vk::DynamicState::eStencilWriteMask,
vk::DynamicState::eStencilOpEXT,
};

View File

@ -249,6 +249,11 @@ public:
return properties.limits.maxSamplerLodBias;
}
/// Returns the maximum sampler anisotropy.
float MaxSamplerAnisotropy() const {
return properties.limits.maxSamplerAnisotropy;
}
/// Returns the maximum number of push descriptors.
u32 MaxPushDescriptors() const {
return push_descriptor_props.maxPushDescriptors;

View File

@ -497,7 +497,7 @@ vk::ShaderModule PipelineCache::CompileModule(Shader::Info& info, Shader::Runtim
module = CompileSPV(spv, instance.GetDevice());
}
const auto name = fmt::format("{}_{:#018x}_{}", info.stage, info.pgm_hash, perm_idx);
const auto name = GetShaderName(info.stage, info.pgm_hash, perm_idx);
Vulkan::SetObjectName(instance.GetDevice(), module, name);
if (Config::collectShadersForDebug()) {
DebugState.CollectShader(name, info.l_stage, module, spv, code,
@ -572,6 +572,14 @@ std::optional<vk::ShaderModule> PipelineCache::ReplaceShader(vk::ShaderModule mo
return new_module;
}
std::string PipelineCache::GetShaderName(Shader::Stage stage, u64 hash,
std::optional<size_t> perm) {
if (perm) {
return fmt::format("{}_{:#018x}_{}", stage, hash, *perm);
}
return fmt::format("{}_{:#018x}", stage, hash);
}
void PipelineCache::DumpShader(std::span<const u32> code, u64 hash, Shader::Stage stage,
size_t perm_idx, std::string_view ext) {
if (!Config::dumpShaders()) {
@ -583,7 +591,7 @@ void PipelineCache::DumpShader(std::span<const u32> code, u64 hash, Shader::Stag
if (!std::filesystem::exists(dump_dir)) {
std::filesystem::create_directories(dump_dir);
}
const auto filename = fmt::format("{}_{:#018x}_{}.{}", stage, hash, perm_idx, ext);
const auto filename = fmt::format("{}.{}", GetShaderName(stage, hash, perm_idx), ext);
const auto file = IOFile{dump_dir / filename, FileAccessMode::Write};
file.WriteSpan(code);
}
@ -597,7 +605,7 @@ std::optional<std::vector<u32>> PipelineCache::GetShaderPatch(u64 hash, Shader::
if (!std::filesystem::exists(patch_dir)) {
std::filesystem::create_directories(patch_dir);
}
const auto filename = fmt::format("{}_{:#018x}_{}.{}", stage, hash, perm_idx, ext);
const auto filename = fmt::format("{}.{}", GetShaderName(stage, hash, perm_idx), ext);
const auto filepath = patch_dir / filename;
if (!std::filesystem::exists(filepath)) {
return {};

View File

@ -65,6 +65,9 @@ public:
std::optional<vk::ShaderModule> ReplaceShader(vk::ShaderModule module,
std::span<const u32> spv_code);
static std::string GetShaderName(Shader::Stage stage, u64 hash,
std::optional<size_t> perm = {});
private:
bool RefreshGraphicsKey();
bool RefreshComputeKey();

View File

@ -137,6 +137,7 @@ std::vector<const char*> GetInstanceExtensions(Frontend::WindowSystemType window
// Add the windowing system specific extension
std::vector<const char*> extensions;
extensions.reserve(7);
extensions.push_back(VK_EXT_LAYER_SETTINGS_EXTENSION_NAME);
switch (window_type) {
case Frontend::WindowSystemType::Headless:
@ -347,6 +348,17 @@ vk::UniqueInstance CreateInstance(Frontend::WindowSystemType window_type, bool e
.valueCount = 1,
.pValues = &enable_force_barriers,
},
#ifdef __APPLE__
// MoltenVK debug mode turns on additional device loss error details, so
// use the crash diagnostic setting as an indicator of whether to turn it on.
vk::LayerSettingEXT{
.pLayerName = "MoltenVK",
.pSettingName = "MVK_CONFIG_DEBUG",
.type = vk::LayerSettingTypeEXT::eBool32,
.valueCount = 1,
.pValues = &enable_crash_diagnostic,
}
#endif
};
vk::StructureChain<vk::InstanceCreateInfo, vk::LayerSettingsCreateInfoEXT> instance_ci_chain = {

View File

@ -1019,17 +1019,44 @@ void Rasterizer::UpdateDynamicState(const GraphicsPipeline& pipeline) {
}
void Rasterizer::UpdateViewportScissorState() {
auto& regs = liverpool->regs;
const auto& regs = liverpool->regs;
const auto combined_scissor_value_tl = [](s16 scr, s16 win, s16 gen, s16 win_offset) {
return std::max({scr, s16(win + win_offset), s16(gen + win_offset)});
};
const auto combined_scissor_value_br = [](s16 scr, s16 win, s16 gen, s16 win_offset) {
return std::min({scr, s16(win + win_offset), s16(gen + win_offset)});
};
const bool enable_offset = !regs.window_scissor.window_offset_disable.Value();
Liverpool::Scissor scsr{};
scsr.top_left_x = combined_scissor_value_tl(
regs.screen_scissor.top_left_x, s16(regs.window_scissor.top_left_x.Value()),
s16(regs.generic_scissor.top_left_x.Value()),
enable_offset ? regs.window_offset.window_x_offset : 0);
scsr.top_left_y = combined_scissor_value_tl(
regs.screen_scissor.top_left_y, s16(regs.window_scissor.top_left_y.Value()),
s16(regs.generic_scissor.top_left_y.Value()),
enable_offset ? regs.window_offset.window_y_offset : 0);
scsr.bottom_right_x = combined_scissor_value_br(
regs.screen_scissor.bottom_right_x, regs.window_scissor.bottom_right_x,
regs.generic_scissor.bottom_right_x,
enable_offset ? regs.window_offset.window_x_offset : 0);
scsr.bottom_right_y = combined_scissor_value_br(
regs.screen_scissor.bottom_right_y, regs.window_scissor.bottom_right_y,
regs.generic_scissor.bottom_right_y,
enable_offset ? regs.window_offset.window_y_offset : 0);
boost::container::static_vector<vk::Viewport, Liverpool::NumViewports> viewports;
boost::container::static_vector<vk::Rect2D, Liverpool::NumViewports> scissors;
const auto& vp_ctl = regs.viewport_control;
const float reduce_z =
instance.IsDepthClipControlSupported() &&
regs.clipper_control.clip_space == AmdGpu::Liverpool::ClipSpace::MinusWToW
? 1.0f
: 0.0f;
const auto vp_ctl = regs.viewport_control;
for (u32 i = 0; i < Liverpool::NumViewports; i++) {
const auto& vp = regs.viewports[i];
const auto& vp_d = regs.viewport_depths[i];
@ -1050,53 +1077,17 @@ void Rasterizer::UpdateViewportScissorState() {
.minDepth = zoffset - zscale * reduce_z,
.maxDepth = zscale + zoffset,
});
}
const bool enable_offset = !regs.window_scissor.window_offset_disable.Value();
Liverpool::Scissor scsr{};
const auto combined_scissor_value_tl = [](s16 scr, s16 win, s16 gen, s16 win_offset) {
return std::max({scr, s16(win + win_offset), s16(gen + win_offset)});
};
scsr.top_left_x = combined_scissor_value_tl(
regs.screen_scissor.top_left_x, s16(regs.window_scissor.top_left_x.Value()),
s16(regs.generic_scissor.top_left_x.Value()),
enable_offset ? regs.window_offset.window_x_offset : 0);
scsr.top_left_y = combined_scissor_value_tl(
regs.screen_scissor.top_left_y, s16(regs.window_scissor.top_left_y.Value()),
s16(regs.generic_scissor.top_left_y.Value()),
enable_offset ? regs.window_offset.window_y_offset : 0);
const auto combined_scissor_value_br = [](s16 scr, s16 win, s16 gen, s16 win_offset) {
return std::min({scr, s16(win + win_offset), s16(gen + win_offset)});
};
scsr.bottom_right_x = combined_scissor_value_br(
regs.screen_scissor.bottom_right_x, regs.window_scissor.bottom_right_x,
regs.generic_scissor.bottom_right_x,
enable_offset ? regs.window_offset.window_x_offset : 0);
scsr.bottom_right_y = combined_scissor_value_br(
regs.screen_scissor.bottom_right_y, regs.window_scissor.bottom_right_y,
regs.generic_scissor.bottom_right_y,
enable_offset ? regs.window_offset.window_y_offset : 0);
for (u32 idx = 0; idx < Liverpool::NumViewports; idx++) {
if (regs.viewports[idx].xscale == 0) {
// Scissor and viewport counts should be equal.
continue;
}
auto vp_scsr = scsr;
if (regs.mode_control.vport_scissor_enable) {
vp_scsr.top_left_x =
std::max(vp_scsr.top_left_x, s16(regs.viewport_scissors[idx].top_left_x.Value()));
std::max(vp_scsr.top_left_x, s16(regs.viewport_scissors[i].top_left_x.Value()));
vp_scsr.top_left_y =
std::max(vp_scsr.top_left_y, s16(regs.viewport_scissors[idx].top_left_y.Value()));
std::max(vp_scsr.top_left_y, s16(regs.viewport_scissors[i].top_left_y.Value()));
vp_scsr.bottom_right_x =
std::min(vp_scsr.bottom_right_x, regs.viewport_scissors[idx].bottom_right_x);
std::min(vp_scsr.bottom_right_x, regs.viewport_scissors[i].bottom_right_x);
vp_scsr.bottom_right_y =
std::min(vp_scsr.bottom_right_y, regs.viewport_scissors[idx].bottom_right_y);
std::min(vp_scsr.bottom_right_y, regs.viewport_scissors[i].bottom_right_y);
}
scissors.push_back({
.offset = {vp_scsr.top_left_x, vp_scsr.top_left_y},
@ -1104,9 +1095,27 @@ void Rasterizer::UpdateViewportScissorState() {
});
}
if (viewports.empty()) {
// Vulkan requires providing at least one viewport.
constexpr vk::Viewport empty_viewport = {
.x = 0.0f,
.y = 0.0f,
.width = 1.0f,
.height = 1.0f,
.minDepth = 0.0f,
.maxDepth = 1.0f,
};
constexpr vk::Rect2D empty_scissor = {
.offset = {0, 0},
.extent = {1, 1},
};
viewports.push_back(empty_viewport);
scissors.push_back(empty_scissor);
}
const auto cmdbuf = scheduler.CommandBuffer();
cmdbuf.setViewport(0, viewports);
cmdbuf.setScissor(0, scissors);
cmdbuf.setViewportWithCountEXT(viewports);
cmdbuf.setScissorWithCountEXT(scissors);
}
void Rasterizer::ScopeMarkerBegin(const std::string_view& str) {

View File

@ -1,6 +1,8 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <algorithm>
#include "video_core/amdgpu/resource.h"
#include "video_core/renderer_vulkan/liverpool_to_vk.h"
#include "video_core/renderer_vulkan/vk_instance.h"
#include "video_core/texture_cache/sampler.h"
@ -12,6 +14,11 @@ Sampler::Sampler(const Vulkan::Instance& instance, const AmdGpu::Sampler& sample
LOG_WARNING(Render_Vulkan, "Texture requires gamma correction");
}
using namespace Vulkan;
const bool anisotropyEnable = instance.IsAnisotropicFilteringSupported() &&
(AmdGpu::IsAnisoFilter(sampler.xy_mag_filter) ||
AmdGpu::IsAnisoFilter(sampler.xy_min_filter));
const float maxAnisotropy =
std::clamp(sampler.MaxAniso(), 1.0f, instance.MaxSamplerAnisotropy());
const vk::SamplerCreateInfo sampler_ci = {
.magFilter = LiverpoolToVK::Filter(sampler.xy_mag_filter),
.minFilter = LiverpoolToVK::Filter(sampler.xy_min_filter),
@ -20,6 +27,8 @@ Sampler::Sampler(const Vulkan::Instance& instance, const AmdGpu::Sampler& sample
.addressModeV = LiverpoolToVK::ClampMode(sampler.clamp_y),
.addressModeW = LiverpoolToVK::ClampMode(sampler.clamp_z),
.mipLodBias = std::min(sampler.LodBias(), instance.MaxSamplerLodBias()),
.anisotropyEnable = anisotropyEnable,
.maxAnisotropy = maxAnisotropy,
.compareEnable = sampler.depth_compare_func != AmdGpu::DepthCompare::Never,
.compareOp = LiverpoolToVK::DepthCompare(sampler.depth_compare_func),
.minLod = sampler.MinLod(),

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