Compare commits

...
11 Commits
Author SHA1 Message Date
Stenzek 19cf29e5cf CI/Linux: Push to Flathub beta 2023-06-27 01:50:15 +10:00
refractionpcsx2 d51d51b3cc Memcard: Stop Folder memcards double reindexing 2023-06-26 14:45:50 +01:00
refractionpcsx2 c40e132284 SIO/MCD: hugely improved memcard swapping + reinsertion 2023-06-26 14:45:50 +01:00
Connor McLaughlin f8f54bd892 Qt: Adjust cache folder help text 2023-06-26 20:40:18 +10:00
Stenzek 5302cdcf2b Qt: Remove renderer title from top group box
Save a little vertical space.
2023-06-26 17:52:39 +10:00
Stenzek 8fe9282bd9 Qt: De-duplicate AppIcon 2023-06-26 17:52:39 +10:00
refractionpcsx2 07ed213b1f GameDB: Add blending for Clannad and Clover Heart's VNs 2023-06-25 17:08:22 +01:00
JordanTheToasterandrefractionpcsx2 8a1b8d2091 GameDB: Add missing WRC 3 serial
God help me.
2023-06-25 15:30:36 +01:00
IlDucciandConnor McLaughlin 034ef5692c Qt: Updating language names
Correcting or expanding language names for both variants of Spanish and Portuguese.
2023-06-25 21:14:46 +10:00
Stenzek b9b9405c35 Qt: Hook up current translations 2023-06-25 16:45:37 +10:00
JordanTheToasterandrefractionpcsx2 ca8d4f9ff0 GameDB: Add missing WRC II Fixes
Adds missing demos and fixes to fix SPS on demos.
2023-06-25 04:09:43 +01:00
30 changed files with 573 additions and 349 deletions
+8 -2
View File
@@ -84,7 +84,7 @@ jobs:
build-bundle: true
verbose: true
mirror-screenshots-url: https://dl.flathub.org/repo/screenshots
branch: stable
branch: beta
cache: true
restore-cache: true
cache-key: ${{ inputs.os }} ${{ inputs.platform }} ${{ inputs.compiler }} ${{ inputs.detail }} flatpak ${{ hashFiles('.github/workflows/scripts/linux/flatpak/**/*.json') }}
@@ -93,4 +93,10 @@ jobs:
run: |
ostree commit --repo=repo --canonical-permissions --branch=screenshots/x86_64 .github/workflows/scripts/linux/flatpak/screenshots
# TODO: Push to flathub
- name: Push to Flathub
if: inputs.publish == true
uses: flatpak/flatpak-github-actions/flat-manager@v6.1
with:
flat-manager-url: https://hub.flathub.org/
repository: beta
token: ${{ secrets.FLATHUB_BETA_TOKEN }}
@@ -287,7 +287,7 @@ Plugins = ../lib/plugins
EOF
echo "Copy desktop/icon..."
cp "$PCSX2DIR/pcsx2/Resources/AppIcon64.png" "$OUTDIR/PCSX2.png"
cp "$PCSX2DIR/bin/resources/icons/AppIconLarge.png" "$OUTDIR/PCSX2.png"
cp "$SCRIPTDIR/pcsx2-qt.desktop" "$OUTDIR/PCSX2.desktop"
cp "$SCRIPTDIR/AppRun-qt" "$OUTDIR/AppRun"
@@ -8,12 +8,21 @@ set -e
ARCH=x86_64
KDE_BRANCH=6.5
BRANCH=22.08
FLAT_MANAGER_CLIENT_DIR="$HOME/.local/bin"
# Build packages.
# Build packages. Mostly needed for flat-manager-client.
declare -a BUILD_PACKAGES=(
"flatpak"
"flatpak-builder"
"appstream-util"
"python3-aiohttp"
"python3-tenacity"
"python3-gi"
"gobject-introspection"
"libappstream-glib8"
"libappstream-glib-dev"
"libappstream-dev"
"gir1.2-ostree-1.0"
)
# Flatpak runtimes and SDKs.
@@ -36,3 +45,10 @@ sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub
echo "Will install the following packages for building - ${FLATPAK_PACKAGES[*]}"
retry_command sudo flatpak -y install "${FLATPAK_PACKAGES[@]}"
echo "Downloading flat-manager-client"
mkdir -p "$FLAT_MANAGER_CLIENT_DIR"
pushd "$FLAT_MANAGER_CLIENT_DIR"
aria2c -Z "https://raw.githubusercontent.com/flatpak/flat-manager/master/flat-manager-client"
chmod +x flat-manager-client
echo "$FLAT_MANAGER_CLIENT_DIR" >> $GITHUB_PATH
popd
+38 -5
View File
@@ -2025,6 +2025,13 @@ SCED-51262:
SCED-51279:
name: "Official PlayStation 2 Magazine Demo 25"
region: "PAL-M5"
SCED-51305:
name: "WRC II Extreme [Press Kit]"
region: "PAL-E"
gameFixes:
- XGKickHack # Fixes SPS.
gsHWFixes:
halfPixelOffset: 1 # Fixes texture misalignment.
SCED-51319:
name: "Official PlayStation 2 Magazine Demo 27" # German
region: "PAL-E-G"
@@ -2160,6 +2167,13 @@ SCED-51573:
SCED-51575:
name: "Official PlayStation 2 Magazine Demo 40" # German
region: "PAL-E-G"
SCED-51632:
name: "WRC II Extreme [Special Demo]"
region: "PAL-E"
gameFixes:
- XGKickHack # Fixes SPS.
gsHWFixes:
halfPixelOffset: 1 # Fixes texture misalignment.
SCED-51657:
name: "Official PlayStation Magazine Demo 33"
region: "PAL-Unk"
@@ -2275,9 +2289,17 @@ SCED-52092:
SCED-52120:
name: "Official PlayStation 2 Magazine Demo 55" # German
region: "PAL-E-G"
SCED-52137:
name: "WRC 3 [Demo]"
region: "PAL-E"
gameFixes:
- XGKickHack # Fixes SPS.
gsHWFixes:
roundSprite: 2 # Correct misaligned font, better aligns car shadow.
autoFlush: 2 # Fixes sun luminosity.
SCED-52141:
name: "WRC 3 [Demo]"
region: "NTSC-J"
region: "PAL-E"
compat: 5
gameFixes:
- XGKickHack # Fixes SPS.
@@ -29948,6 +29970,8 @@ SLPM-65284:
region: "NTSC-J"
gameFixes:
- XGKickHack # Fixes SPS.
gsHWFixes:
halfPixelOffset: 1 # Fixes texture misalignment.
SLPM-65285:
name: "Love Hina Gorgeous [First Limited Edition]"
region: "NTSC-J"
@@ -30889,6 +30913,8 @@ SLPM-65573:
region: "NTSC-J"
gameFixes:
- XGKickHack # Fixes SPS.
gsHWFixes:
halfPixelOffset: 1 # Fixes texture misalignment.
SLPM-65574:
name: "Silent Hill 4 - The Room"
region: "NTSC-J"
@@ -32957,8 +32983,10 @@ SLPM-66136:
name: "SuperLite 2000 Vol. 34 - Akai Ito"
region: "NTSC-J"
SLPM-66137:
name: "Clover Heart's Looking for Happiness [The Best]"
name: "Clover Heart's - Looking for Happiness [The Best]"
region: "NTSC-J"
gsHWFixes:
minimumBlendingLevel: 4 # Fixes transparancy.
SLPM-66138:
name: "Desire [Best Version]"
region: "NTSC-J"
@@ -33650,7 +33678,8 @@ SLPM-66302:
name: "Clannad"
region: "NTSC-J"
gsHWFixes:
cpuCLUTRender: 1 # Fixes colours.
gpuTargetCLUT: 1 # Fixes colours.
minimumBlendingLevel: 4 # Fixes transparancy.
SLPM-66307:
name: "Sengoku Musou 2"
region: "NTSC-J"
@@ -39816,11 +39845,15 @@ SLPS-25389:
name: "Gundam Seed - Never Ending Tomorrow"
region: "NTSC-J"
SLPS-25390:
name: "Clover's Heart - Looking for Happiness [Limited Edition]"
name: "Clover Heart's - Looking for Happiness [Limited Edition]"
region: "NTSC-J"
gsHWFixes:
minimumBlendingLevel: 4 # Fixes transparancy.
SLPS-25391:
name: "Clover's Heart - Looking for Happiness"
name: "Clover Heart's - Looking for Happiness"
region: "NTSC-J"
gsHWFixes:
minimumBlendingLevel: 4 # Fixes transparancy.
SLPS-25392:
name: "Desire"
region: "NTSC-J"
+1 -3
View File
@@ -177,9 +177,7 @@ if(USE_ACHIEVEMENTS)
)
endif()
set(TS_FILES
Translations/pcsx2-qt_en.ts
)
file(GLOB TS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/Translations/*.ts)
target_precompile_headers(pcsx2-qt PRIVATE PrecompiledHeader.h)
-1
View File
@@ -183,7 +183,6 @@ void MainWindow::setupAdditionalUi()
{
const bool show_advanced_settings = QtHost::ShouldShowAdvancedSettings();
setWindowIcon(QIcon(QStringLiteral("%1/icons/AppIconLarge.png").arg(QtHost::GetResourcesBasePath())));
makeIconsMasks(menuBar());
m_ui.menuDebug->menuAction()->setVisible(show_advanced_settings);
+13 -8
View File
@@ -16,6 +16,11 @@
<property name="windowTitle">
<string>PCSX2</string>
</property>
<property name="windowIcon">
<iconset>
<normalon>:/icons/AppIcon64.png</normalon>
</iconset>
</property>
<widget class="QStackedWidget" name="mainContainer"/>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
@@ -126,10 +131,10 @@
<property name="title">
<string>Switch Renderer</string>
</property>
<property name="icon">
<iconset theme="brush-line">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="icon">
<iconset theme="brush-line">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
<addaction name="menuDebugSwitchRenderer"/>
<addaction name="separator"/>
@@ -484,12 +489,12 @@
</property>
</action>
<action name="actionAbout">
<property name="text">
<string>&amp;About PCSX2...</string>
</property>
<property name="icon">
<iconset resource="resources/resources.qrc">
<normaloff>:/icons/AppIcon.png</normaloff>:/icons/AppIcon.png</iconset>
<normaloff>:/icons/AppIcon64.png</normaloff>:/icons/AppIcon64.png</iconset>
</property>
<property name="text">
<string>&amp;About PCSX2...</string>
</property>
</action>
<action name="actionChangeDisc">
+1 -1
View File
@@ -59,7 +59,7 @@
<item row="0" column="0" colspan="4">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Used for storing shaders, gzip indices, and game list data.</string>
<string>Used for storing shaders, game list, and achievement data.</string>
</property>
</widget>
</item>
+2 -2
View File
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>720</width>
<height>492</height>
<height>463</height>
</rect>
</property>
<property name="windowTitle">
@@ -29,7 +29,7 @@
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Renderer</string>
<string/>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
+2 -2
View File
@@ -169,10 +169,10 @@ void SetupWizardDialog::confirmCancel()
void SetupWizardDialog::setupUi()
{
setWindowIcon(QIcon(QStringLiteral("%1/icons/AppIconLarge.png").arg(QtHost::GetResourcesBasePath())));
m_ui.setupUi(this);
m_ui.logo->setPixmap(QPixmap(QStringLiteral("%1/icons/AppIconLarge.png").arg(QtHost::GetResourcesBasePath())));
m_ui.pages->setCurrentIndex(0);
m_page_labels[Page_Language] = m_ui.labelLanguage;
+12 -4
View File
@@ -13,6 +13,11 @@
<property name="windowTitle">
<string>PCSX2 Setup Wizard</string>
</property>
<property name="windowIcon">
<iconset>
<normalon>:/icons/AppIcon64.png</normalon>
</iconset>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="horizontalSpacing">
<number>10</number>
@@ -20,7 +25,7 @@
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label">
<widget class="QLabel" name="logo">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -33,12 +38,15 @@
<height>128</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>128</width>
<height>128</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="resources/resources.qrc">:/icons/AppIcon.png</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
+180 -78
View File
@@ -17,6 +17,7 @@
#include "QtHost.h"
#include "common/Assertions.h"
#include "common/Console.h"
#include "common/StringUtil.h"
@@ -40,9 +41,20 @@
namespace QtHost
{
static const ImWchar* GetGlyphRangesJapanese();
static const ImWchar* GetGlyphRangesChinese();
static std::string GetFontPath(const char* name);
struct GlyphInfo
{
const char* language;
const char* windows_font_name;
const char* linux_font_name;
const char* mac_font_name;
const char16_t* used_glyphs;
};
static std::string GetFontPath(const GlyphInfo* gi);
static void UpdateGlyphRanges(const std::string_view& language);
static const GlyphInfo* GetGlyphInfo(const std::string_view& language);
static std::vector<ImWchar> s_glyph_ranges;
} // namespace QtHost
static std::vector<QTranslator*> s_translators;
@@ -60,7 +72,7 @@ void QtHost::InstallTranslator()
QString::fromStdString(Host::GetBaseStringSettingValue("UI", "Language", GetDefaultLanguage()));
// Install the base qt translation first.
const QString base_dir = QStringLiteral("%1/translations").arg(qApp->applicationDirPath());
const QString base_dir = QStringLiteral("%1/translations").arg(qApp->applicationDirPath());
QString base_path = QStringLiteral("%1/qt_%2.qm").arg(base_dir).arg(language);
bool has_base_ts = QFile::exists(base_path);
if (!has_base_ts)
@@ -90,65 +102,67 @@ void QtHost::InstallTranslator()
}
const QString path = QStringLiteral("%1/pcsx2-qt_%3.qm").arg(base_dir).arg(language);
if (!QFile::exists(path))
QTranslator* translator = nullptr;
if (QFile::exists(path))
{
translator = new QTranslator(qApp);
if (translator->load(path))
{
Console.WriteLn(
Color_StrongYellow, "Loaded translation file for language %s", language.toUtf8().constData());
}
else
{
QMessageBox::warning(nullptr, QStringLiteral("Translation Error"),
QStringLiteral("Failed to load translation file for language '%1':\n%2").arg(language).arg(path));
delete translator;
translator = nullptr;
}
}
else
{
#ifdef PCSX2_DEVBUILD
// For now, until we're sure this works on all platforms, we won't block users from starting if they're missing.
QMessageBox::warning(nullptr, QStringLiteral("Translation Error"),
QStringLiteral("Failed to find translation file for language '%1':\n%2").arg(language).arg(path));
#endif
return;
}
QTranslator* translator = new QTranslator(qApp);
if (!translator->load(path))
if (translator)
{
QMessageBox::warning(nullptr, QStringLiteral("Translation Error"),
QStringLiteral("Failed to load translation file for language '%1':\n%2").arg(language).arg(path));
delete translator;
return;
qApp->installTranslator(translator);
s_translators.push_back(translator);
}
Console.WriteLn(Color_StrongYellow, "Loaded translation file for language %s", language.toUtf8().constData());
qApp->installTranslator(translator);
s_translators.push_back(translator);
UpdateGlyphRanges(language.toStdString());
#ifdef _WIN32
if (language == QStringLiteral("ja"))
{
ImGuiManager::SetFontPath(GetFontPath("msgothic.ttc"));
ImGuiManager::SetFontRange(GetGlyphRangesJapanese());
}
else if (language == QStringLiteral("zh-cn"))
{
ImGuiManager::SetFontPath(GetFontPath("msyh.ttc"));
ImGuiManager::SetFontRange(GetGlyphRangesChinese());
}
#endif
// Clear translation cache after installing translators, to prevent races.
Host::ClearTranslationCache();
}
static std::string QtHost::GetFontPath(const char* name)
static std::string QtHost::GetFontPath(const GlyphInfo* gi)
{
std::string font_path;
#ifdef _WIN32
PWSTR folder_path;
if (FAILED(SHGetKnownFolderPath(FOLDERID_Fonts, 0, nullptr, &folder_path)))
return fmt::format("C:\\Windows\\Fonts\\%s", name);
if (gi->windows_font_name)
{
PWSTR folder_path;
if (SUCCEEDED(SHGetKnownFolderPath(FOLDERID_Fonts, 0, nullptr, &folder_path)))
{
font_path = StringUtil::WideStringToUTF8String(folder_path);
CoTaskMemFree(folder_path);
font_path += "\\";
font_path += gi->windows_font_name;
}
else
{
font_path = fmt::format("C:\\Windows\\Fonts\\%s", gi->windows_font_name);
}
}
#endif
std::string font_path(StringUtil::WideStringToUTF8String(folder_path));
CoTaskMemFree(folder_path);
font_path += "\\";
font_path += name;
return font_path;
#else
return name;
#endif
}
std::vector<std::pair<QString, QString>> QtHost::GetAvailableLanguageList()
{
return {
{QStringLiteral("English"), QStringLiteral("en")},
};
}
const char* QtHost::GetDefaultLanguage()
@@ -173,46 +187,134 @@ s32 Host::Internal::GetTranslatedStringImpl(
return static_cast<s32>(translated_size);
}
static const ImWchar* QtHost::GetGlyphRangesJapanese()
std::vector<std::pair<QString, QString>> QtHost::GetAvailableLanguageList()
{
// clang-format off
// auto update by generate_update_glyph_ranges.py with pcsx2-qt_ja.ts
static const char16_t chars[] = u"、。あいかがきこさしすずせたってでとなにのはべまみらりるれをんァィイェエカキクグゲシジスセタダチッデトドバパフブプボポミムメモャュョラリルレロンー一中了今件体使信入出制効動取口可変始定実度強後得態択挿易更有本検無状獲用画的索終績能自行覧解設読起送速選開除難面高";
const int chars_length = sizeof(chars) / sizeof(chars[0]);
// clang-format on
static ImWchar base_ranges[] = {
0x0020, 0x007E, // Basic Latin
return {
{QStringLiteral("Afrikaans (af-ZA)"), QStringLiteral("af-ZA")},
{QStringLiteral("عربي (ar-SA)"), QStringLiteral("ar-SA")},
{QStringLiteral("Català (ca-ES)"), QStringLiteral("ca-ES")},
{QStringLiteral("Čeština (cs-CZ)"), QStringLiteral("cs-CZ")},
{QStringLiteral("Dansk (da-DK)"), QStringLiteral("da-DK")},
{QStringLiteral("Deutsch (de-DE)"), QStringLiteral("de-DE")},
{QStringLiteral("Ελληνικά (el-GR)"), QStringLiteral("el-GR")},
{QStringLiteral("English (en)"), QStringLiteral("en")},
{QStringLiteral("Español (Hispanoamérica) (es-419)"), QStringLiteral("es-419")},
{QStringLiteral("Español (España) (es-ES)"), QStringLiteral("es-ES")},
{QStringLiteral("فارسی (fa-IR)"), QStringLiteral("fa-IR")},
{QStringLiteral("Suomi (fi-FI)"), QStringLiteral("fi-FI")},
{QStringLiteral("Français (fr-FR)"), QStringLiteral("fr-FR")},
{QStringLiteral("עִבְרִית (he-IL)"), QStringLiteral("he-IL")},
{QStringLiteral("Magyar (hu-HU)"), QStringLiteral("hu-HU")},
{QStringLiteral("Bahasa Indonesia (in-ID)"), QStringLiteral("id-ID")},
{QStringLiteral("Italiano (it-IT)"), QStringLiteral("it-IT")},
{QStringLiteral("日本語 (ja-JP)"), QStringLiteral("ja-JP")},
{QStringLiteral("한국어 (ko-KR)"), QStringLiteral("ko-KR")},
{QStringLiteral("Nederlands (nl-NL)"), QStringLiteral("nl-NL")},
{QStringLiteral("Norsk (nl-NL)"), QStringLiteral("no-NO")},
{QStringLiteral("Polski (pl-PL)"), QStringLiteral("pl-PL")},
{QStringLiteral("Português (Brasil) (pt-BR)"), QStringLiteral("pt-BR")},
{QStringLiteral("Português (Portugal) (pt-PT)"), QStringLiteral("pt-PT")},
{QStringLiteral("Limba română (ro-RO)"), QStringLiteral("ro-RO")},
{QStringLiteral("Русский (ru-RU)"), QStringLiteral("ru-RU")},
{QStringLiteral("Српски језик (sr-SP)"), QStringLiteral("sr-SP")},
{QStringLiteral("Svenska (sv-SE)"), QStringLiteral("sv-SE")},
{QStringLiteral("Türkçe (tr-TR)"), QStringLiteral("tr-TR")},
{QStringLiteral("Українська мова (uk-UA)"), QStringLiteral("uk-UA")},
{QStringLiteral("Tiếng Việt (vi-VN)"), QStringLiteral("vi-VN")},
{QStringLiteral("简体中文 (zh-CN)"), QStringLiteral("zh-CN")},
{QStringLiteral("繁體中文 (zh-TW)"), QStringLiteral("zh-TW")},
};
const int base_length = sizeof(base_ranges) / sizeof(base_ranges[0]);
static ImWchar full_ranges[base_length + chars_length * 2 + 1] = {0};
memcpy(full_ranges, base_ranges, sizeof(base_ranges));
for (int i = 0; i < chars_length; i++)
{
full_ranges[base_length + i * 2] = full_ranges[base_length + i * 2 + 1] = chars[i];
}
return full_ranges;
}
static const ImWchar* QtHost::GetGlyphRangesChinese()
static constexpr const ImWchar s_base_latin_range[] = {
0x0020, 0x00FF, // Basic Latin + Latin Supplement
};
static constexpr const ImWchar s_central_european_ranges[] = {
0x0100, 0x017F, // Central European diacritics
};
void QtHost::UpdateGlyphRanges(const std::string_view& language)
{
// clang-format off
// auto update by generate_update_glyph_ranges.py with pcsx2-qt_zh-cn.ts
static const char16_t chars[] = u"";
const int chars_length = sizeof(chars) / sizeof(chars[0]);
// clang-format on
const GlyphInfo* gi = GetGlyphInfo(language);
static ImWchar base_ranges[] = {
0x0020, 0x007E, // Basic Latin
};
const int base_length = sizeof(base_ranges) / sizeof(base_ranges[0]);
std::string font_path;
s_glyph_ranges.clear();
static ImWchar full_ranges[base_length + chars_length * 2 + 1] = {0};
memcpy(full_ranges, base_ranges, sizeof(base_ranges));
for (int i = 0; i < chars_length; i++)
// Base Latin range is always included.
s_glyph_ranges.insert(s_glyph_ranges.begin(), std::begin(s_base_latin_range), std::end(s_base_latin_range));
if (gi)
{
full_ranges[base_length + i * 2] = full_ranges[base_length + i * 2 + 1] = chars[i];
if (gi->used_glyphs)
{
const char16_t* ptr = gi->used_glyphs;
while (*ptr != 0)
{
// Always should be in pairs.
pxAssert(ptr[0] != 0 && ptr[1] != 0);
s_glyph_ranges.push_back(*(ptr++));
s_glyph_ranges.push_back(*(ptr++));
}
}
font_path = GetFontPath(gi);
}
return full_ranges;
// If we don't have any specific glyph range, assume Central European, except if English, then keep the size down.
if ((!gi || !gi->used_glyphs) && language != "en")
{
s_glyph_ranges.insert(
s_glyph_ranges.begin(), std::begin(s_central_european_ranges), std::end(s_central_european_ranges));
}
// List terminator.
s_glyph_ranges.push_back(0);
s_glyph_ranges.push_back(0);
ImGuiManager::SetFontPath(std::move(font_path));
ImGuiManager::SetFontRange(s_glyph_ranges.data());
}
// clang-format off
static constexpr const char16_t s_cyrillic_ranges[] = {
/* Cyrillic + Cyrillic Supplement */ 0x0400, 0x052F, /* Extended-A */ 0x2DE0, 0x2DFF, /* Extended-B */ 0xA640, 0xA69F, 0, 0
};
static constexpr const QtHost::GlyphInfo s_glyph_info[] = {
// Cyrillic languages
{ "ru-RU", nullptr, nullptr, nullptr, s_cyrillic_ranges },
{ "sr-SP", nullptr, nullptr, nullptr, s_cyrillic_ranges },
{ "uk-UA", nullptr, nullptr, nullptr, s_cyrillic_ranges },
{
"ja-JP", "msgothic.ttc", nullptr, nullptr,
// auto update by update_glyph_ranges.py with pcsx2-qt_ja-JP.ts
u"​​□□△△◯◯✕✕、。〜〜ああいいううええおきくぐここささしすせせそそただっつてにのはびびへべほほまみめもややよれわわをんァイウコサソタチッツテニネパビロワワンンーー一一上下不不中中丸丸了了互互今今他他代代仮仮作作使使保保信信修修倍倍値値停停備備像像入入全全公公内内再再出出切切別別利利制制削削副副割割力力加加効効動動勧勧化化十十南南参参反収取取古古可台右右合合同名向向回回固固国国在在報報場場境境壊壊変変外外大大失失奨奨始始字存完完定定実実左左帰帰常常幅幅度度式式張張形形待待後後御御性性情情想想意意感感態態成成投投択択拡拡推推提提換換敗敗数数整整新新方方既既日日明明時時更更書書替最有有期期本本果果検検標標橙橙機機止正毎毎比比況況注注消消港港湾湾準準無無照照状状率率現現璧璧環環生生用用画画異異的的直直知知確確示示種種稿稿空空索索終終緑緑編編績績能能自自般般行行表表製製複複視視覧覧解解言言設設認認語語読読赤赤起起跡跡転転軸軸込込近近追追送送通通速速進進遅遅遊遊適適選選部部長長閉閉開開関関防防限限除除隅隅集集青青非非面面韓韓音音類類香香高高黄黄++??"
},
{
"ko-KR", "malgun.ttf", nullptr, nullptr,
// auto update by update_glyph_ranges.py with pcsx2-qt_ko-KR.ts
u""
},
{
"zh-CN", "msyh.ttc", nullptr, nullptr,
// auto update by update_glyph_ranges.py with pcsx2-qt_zh-CN.ts
u"‘’□□△△○○、。一丁三下不与且且世世丢丢两两个个中中丰丰串串为主么义之之乎乎乐乐乘乘也也了了事二于于互互亚些交交产产享享亮亮亲亲人人什什仅仅介介仍从他他代以们们件价任任份份伍伍休休优优会会传传估估伸伸似似但但位住佑佑体体何何余余作作佣佣佳佳使使例例供供侧侧便便俄俄保保信信修修倍倍值值倾倾假假偏偏做做停停储储像像儿儿允允元元充充先光克克免免入入全全六六兰共关关兵典兼兼内内册再写写冲决况况净净准准减减几几出击函函刀刀刃刃分切列列则则创创删删利利别别到到制刷刹刹前前剪剪副副力力功务动助势势勿勿包包化化匹区十十升升半半协协单单南南占卡卫卫印印即即压压原原去去参参及及双反发发取变叠叠口古另另只只可台右右号号各各合吉同后向向吗吗否否含含启启呈呈告告员员味味命命和和哈哈响响哪哪唤唤商商善善器器四四回回因因团团围围国图圈圈在在地地场场址址均均坏坐块块坛坛垂垂型型域域基基堆堆堪堪塔塔填填增增士士声声处处备备复复外外多多够够大大天太失失头头夹夹奇奇奏奏套套奥奥奶奶好好如如始始威威娱娱婴婴媒媒子子字存它它安安完完宏宏官官定定宝实害害家家容容宽宽宿宿寄寄密密富富寸对导导封封射射将将小小少少尔尔尚尚尝尝就就尺尺尼尾局局层层屏屏展展属属崩崩工左巨巨差差己已巴巴希希带帧帮帮常常幅幅幕幕平平并并幸幸序序库底度度延延建建开开异弃弊弊式式引引张张弹强归当录录形形彩彩影影径待很很得得循循微微德德心心必忆志志忙忙快快忽忽态态性性怪怪恢恢息息您您悬悬情情惑惑惯惯意意感感慢慢戏我或或战战截截戳戳户户所扁手手打打托托执执扩扩扫扬扳扳找找技技抑抑抖抗护护拆拆拉拉拍拍拒拒拟拟拦拦择择括括拳拳持持指指按按挑挑挡挡挪挪振振捕捕损损换换据据掌掌排排接接控掩描提插插握握搜搜摇摇撕撕撤撤播播操擎支支收收改改放放故故效效敏敏散散数数整整文文断断斯新方方旋旋无无日日旧旧时时明明易易星映是是显显晕晕普普晰晰暂暂暗暗曲曲更更替最有有服服期期未未本本机机权权杆杆束束条条来来板板极极果果柄柄某某染染查查栅栅标栈栏栏校校样根格格框框案案档档桥桥检检棕棕榜榜模模橙橙次次欧欧止步死死殊殊段段每每比比毫毫水水求求汇汇没没油油法法波波注注泻泻洲洲活活流流浅浅测测浏浏浪浪浮浮海海消消深深混混添添清清港港渲渲游游湖湖湾湾溃溃源源溢溢滑滑满满滤滤演演澳澳激激灰灰灵灵点点烈烈热热焦焦然然煞煞照照片版牌牌牙牙特特状状狂狂独独狼狼猎猎猩猩率率王王玩玩环现班班理理瑞瑞甚甚生生用用由甲电电画画畅畅界界留留略略疤疤登登白百的的皇皇盖盘目目直直相相省省看看真眠着着知知短短石石码码破破础础硬硬确确碌碌磁磁示示神神禁禁离离种种秒秒积称移移程程稍稍稳稳空空突突窗窗立立站站端端符符第第等等筛筛签签简简算算管管类类粉粉粘粘精精糊糊系系素素索索紫紫纠纠红红级级纯纯纳纳纹纹线线组组细终经经绑绑结结绕绕绘给络绝统统继继绪绪续续维维绿缀缓缓编编缩缩网网罗罗置置美美翻翻考考者者而而耗耗耳耳联联肩肩胖胖能能腊腊自自至致舍舍良良色色节节芬芬英英范范荐荐荷荷莱莱获获菜菜萄萄著著葡葡蓝蓝藏藏虑虑虚虚融融行行衡衡补补表表被被裁裂装装西西要要覆覆观观规规视视览觉角角解解触触言言警警计计认认让让议议记记许许论论设访证证诊诊译译试试询询该详语语误误说说请诸读读调调谍谍豹豹负负败账质质贴贴费费赛赛起起超超越越足足跟跟跨跨路路跳跳踏踏踪踪身身车车轨轨转转轮软轴轴轻轻载载较较辅辅辑辑输输辨辨边边达达过过运近还这进进连迟述述追追退适选选逐逐递递通通速造遇遇道道避避那那部部都都配配醒醒采采释释里重量量针针钮钮铁铁铺铺链链销锁锐锐错错键锯镜镜长长门门闭问闲闲间间队队防防阴阴附附陆陆降降限限除除险险随隐隔隔隙隙障障雄雄集集零零雾雾需需震震静静非非靠靠面面韩韩音音顶顶项须顿顿预预频频题题颜额风风饱饱馈馈首首香香马马驱驱验验高高鬼鬼魂魂魔魔麦麦黄黄黑黑默默鼓鼓鼠鼠齐齐齿齿,,??"
},
{
"zh-TW", "msyh.ttc", nullptr, nullptr,
// auto update by update_glyph_ranges.py with pcsx2-qt_zh-TW.ts
u""
},
};
// clang-format on
const QtHost::GlyphInfo* QtHost::GetGlyphInfo(const std::string_view& language)
{
for (const GlyphInfo& it : s_glyph_info)
{
if (language == it.language)
return &it;
}
return nullptr;
}
@@ -1,44 +0,0 @@
#!/usr/bin/env python3
import sys
import os
import re
import xml.etree.ElementTree as ET
src_path = os.path.join(os.path.dirname(__file__), "..", "Translations.cpp")
def parse_xml(path):
translations = ""
tree = ET.parse(path)
root = tree.getroot()
for node in root.findall("context/message/translation"):
if node.text:
translations += node.text
chars = list(set([ord(ch) for ch in translations if ord(ch) >= 0x2000]))
chars.sort()
chars = "".join([chr(ch) for ch in chars])
return chars
def update_src_file(ts_file, chars):
ts_name = os.path.basename(ts_file)
pattern = re.compile('(// auto update.*' + ts_name + '.*\n[^"]+")[^"]*(".*)')
with open(src_path, "r", encoding="utf-8") as f:
original = f.read()
update = pattern.sub("\\1" + chars + "\\2", original)
if original != update:
with open(src_path, "w", encoding="utf-8") as f:
f.write(update)
print("Updated character list.")
else:
print("Character list is unchanged.")
if __name__ == "__main__":
if len(sys.argv) < 2:
print(f"usage: {sys.argv[0]} <pcsx2-qt_*.ts path>")
sys.exit(1)
chars = parse_xml(sys.argv[1])
#print(chars)
print(f"{len(chars)} character(s) detected.")
update_src_file(sys.argv[1], chars)
+124 -129
View File
@@ -3673,42 +3673,42 @@ Achievements: %5 (%6)
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="437"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="431"/>
<source>Saving screenshot to &apos;{}&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="449"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="443"/>
<source>Saved screenshot to &apos;{}&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="456"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="450"/>
<source>Failed to save screenshot to &apos;{}&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="527"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="521"/>
<source>Host GPU device encountered an error and was recovered. This may have broken rendering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="631"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="625"/>
<source>CAS is not available, your graphics driver does not support the required functionality.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="706"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="700"/>
<source>Saving {0} GS dump {1} to &apos;{2}&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="727"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="721"/>
<source>Failed to render/download screenshot.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="738"/>
<location filename="../../pcsx2/GS/Renderers/Common/GSRenderer.cpp" line="732"/>
<source>Saved GS dump to &apos;{}&apos;.</source>
<translation type="unfinished"></translation>
</message>
@@ -3728,7 +3728,7 @@ Achievements: %5 (%6)
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp" line="2952"/>
<location filename="../../pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp" line="2942"/>
<source>Spin GPU During Readbacks is enabled, but calibrated timestamps are unavailable. This might be really slow.</source>
<translation type="unfinished"></translation>
</message>
@@ -6695,272 +6695,272 @@ Swap chain: see Microsoft&apos;s Terminology Portal.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="47"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="48"/>
<source>Target speed set to {:.0f}%.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="65"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="66"/>
<source>Volume: Muted</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="70"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="71"/>
<source>Volume: {}%</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="105"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="106"/>
<source>Save slot {} selected (last save: {}).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="111"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="112"/>
<source>Save slot {} selected (no save yet).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="123"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="124"/>
<source>No save state found in slot {}.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="137"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="143"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="148"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="155"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="159"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="164"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="173"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="181"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="189"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="206"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="211"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="216"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="221"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="226"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="231"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="235"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="240"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="245"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="138"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="144"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="149"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="156"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="160"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="165"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="174"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="182"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="190"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="207"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="212"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="217"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="222"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="227"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="232"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="236"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="241"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="246"/>
<source>System</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="137"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="138"/>
<source>Open Pause Menu</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="144"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="145"/>
<source>Open Achievements List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="149"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="150"/>
<source>Open Leaderboards List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="155"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="156"/>
<source>Toggle Pause</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="159"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="160"/>
<source>Toggle Fullscreen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="164"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="165"/>
<source>Toggle Frame Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="174"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="175"/>
<source>Toggle Turbo / Fast Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="181"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="182"/>
<source>Toggle Slow Motion</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="190"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="191"/>
<source>Turbo / Fast Forward (Hold)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="206"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="207"/>
<source>Increase Target Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="211"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="212"/>
<source>Decrease Target Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="216"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="217"/>
<source>Increase Volume</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="221"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="222"/>
<source>Decrease Volume</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="226"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="227"/>
<source>Toggle Mute</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="231"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="232"/>
<source>Frame Advance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="235"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="236"/>
<source>Shut Down Virtual Machine</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="240"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="241"/>
<source>Reset Virtual Machine</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="246"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="247"/>
<source>Toggle Input Recording Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="251"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="256"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="261"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="266"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="252"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="257"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="262"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="267"/>
<source>Save States</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="252"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="253"/>
<source>Select Previous Save Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="257"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="258"/>
<source>Select Next Save Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="262"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="263"/>
<source>Save State To Selected Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="267"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="268"/>
<source>Load State From Selected Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="282"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="283"/>
<source>Save State To Slot 1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="283"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="284"/>
<source>Load State From Slot 1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="284"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="285"/>
<source>Save State To Slot 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="285"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="286"/>
<source>Load State From Slot 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="286"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="287"/>
<source>Save State To Slot 3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="287"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="288"/>
<source>Load State From Slot 3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="288"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="289"/>
<source>Save State To Slot 4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="289"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="290"/>
<source>Load State From Slot 4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="290"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="291"/>
<source>Save State To Slot 5</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="291"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="292"/>
<source>Load State From Slot 5</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="292"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="293"/>
<source>Save State To Slot 6</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="293"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="294"/>
<source>Load State From Slot 6</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="294"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="295"/>
<source>Save State To Slot 7</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="295"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="296"/>
<source>Load State From Slot 7</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="296"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="297"/>
<source>Save State To Slot 8</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="297"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="298"/>
<source>Load State From Slot 8</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="298"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="299"/>
<source>Save State To Slot 9</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="299"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="300"/>
<source>Load State From Slot 9</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="300"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="301"/>
<source>Save State To Slot 10</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="301"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="302"/>
<source>Load State From Slot 10</source>
<translation type="unfinished"></translation>
</message>
@@ -8324,18 +8324,13 @@ The saves will not be recoverable.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Sio.cpp" line="212"/>
<source>Memory Card in port %d / slot %d reinserted</source>
<location filename="../../pcsx2/Sio.cpp" line="912"/>
<source>Memory card in port {} / slot {} reinserted</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Sio.cpp" line="594"/>
<source>Memory Card in port {} / slot {} reinserted.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Sio.cpp" line="934"/>
<source>Force ejecting all Memory Cards.</source>
<location filename="../../pcsx2/Sio.cpp" line="938"/>
<source>Force ejecting all Memory Cards. Reinserting in 1 second.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -10861,207 +10856,207 @@ The URL was: %1</source>
<context>
<name>VMManager</name>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1549"/>
<location filename="../../pcsx2/VMManager.cpp" line="1538"/>
<source>Failed to back up old save state {}.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1572"/>
<location filename="../../pcsx2/VMManager.cpp" line="1561"/>
<source>Failed to save save state: {}.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1589"/>
<location filename="../../pcsx2/VMManager.cpp" line="1578"/>
<source>State saved to slot {}.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1596"/>
<location filename="../../pcsx2/VMManager.cpp" line="1585"/>
<source>Failed to save save state to slot {}.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1683"/>
<location filename="../../pcsx2/VMManager.cpp" line="1672"/>
<source>There is no save state in slot {}.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1696"/>
<location filename="../../pcsx2/VMManager.cpp" line="1685"/>
<source>Loading state from slot {}...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1713"/>
<location filename="../../pcsx2/VMManager.cpp" line="1702"/>
<source>Saving state to slot {}...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1775"/>
<location filename="../../pcsx2/VMManager.cpp" line="1764"/>
<source>Disc removed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1781"/>
<location filename="../../pcsx2/VMManager.cpp" line="1770"/>
<source>Disc changed to &apos;{}&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1788"/>
<location filename="../../pcsx2/VMManager.cpp" line="1777"/>
<source>Failed to open new disc image &apos;{}&apos;. Reverting to old image.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1796"/>
<location filename="../../pcsx2/VMManager.cpp" line="1785"/>
<source>Failed to switch back to old disc image. Removing disc.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2228"/>
<location filename="../../pcsx2/VMManager.cpp" line="2216"/>
<source>Cheats have been disabled due to achievements hardcore mode.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2282"/>
<location filename="../../pcsx2/VMManager.cpp" line="2270"/>
<source>Fast CDVD is enabled, this may break games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2286"/>
<location filename="../../pcsx2/VMManager.cpp" line="2274"/>
<source>Cycle rate/skip is not at default, this may crash or make games run too slow.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2291"/>
<location filename="../../pcsx2/VMManager.cpp" line="2279"/>
<source>Audio is using async mix, expect desynchronization in FMVs.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2294"/>
<location filename="../../pcsx2/VMManager.cpp" line="2282"/>
<source>Upscale multiplier is below native, this will break rendering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2298"/>
<location filename="../../pcsx2/VMManager.cpp" line="2286"/>
<source>Mipmapping is not set to automatic. This may break rendering in some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2303"/>
<location filename="../../pcsx2/VMManager.cpp" line="2291"/>
<source>Texture filtering is not set to Bilinear (PS2). This will break rendering in some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2309"/>
<location filename="../../pcsx2/VMManager.cpp" line="2297"/>
<source>Trilinear filtering is not set to automatic. This may break rendering in some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2315"/>
<location filename="../../pcsx2/VMManager.cpp" line="2303"/>
<source>Blending is below basic, this may break effects in some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2320"/>
<location filename="../../pcsx2/VMManager.cpp" line="2308"/>
<source>Hardware Download Mode is not set to Accurate, this may break rendering in some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2326"/>
<location filename="../../pcsx2/VMManager.cpp" line="2314"/>
<source>EE FPU Round Mode is not set to default, this may break some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2332"/>
<location filename="../../pcsx2/VMManager.cpp" line="2320"/>
<source>EE FPU Clamp Mode is not set to default, this may break some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2338"/>
<location filename="../../pcsx2/VMManager.cpp" line="2326"/>
<source>VU Round Mode is not set to default, this may break some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2345"/>
<location filename="../../pcsx2/VMManager.cpp" line="2333"/>
<source>VU Clamp Mode is not set to default, this may break some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2350"/>
<location filename="../../pcsx2/VMManager.cpp" line="2338"/>
<source>Game Fixes are not enabled. Compatibility with some games may be affected.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2355"/>
<location filename="../../pcsx2/VMManager.cpp" line="2343"/>
<source>Compatibility Patches are not enabled. Compatibility with some games may be affected.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2359"/>
<location filename="../../pcsx2/VMManager.cpp" line="2347"/>
<source>Frame rate for NTSC is not default. This may break some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2361"/>
<location filename="../../pcsx2/VMManager.cpp" line="2349"/>
<source>Frame rate for PAL is not default. This may break some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2380"/>
<location filename="../../pcsx2/VMManager.cpp" line="2368"/>
<source>EE Recompiler is not enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2385"/>
<location filename="../../pcsx2/VMManager.cpp" line="2373"/>
<source>VU0 Recompiler is not enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2390"/>
<location filename="../../pcsx2/VMManager.cpp" line="2378"/>
<source>VU1 Recompiler is not enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2395"/>
<location filename="../../pcsx2/VMManager.cpp" line="2383"/>
<source>IOP Recompiler is not enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2400"/>
<location filename="../../pcsx2/VMManager.cpp" line="2388"/>
<source>EE Cache is enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2405"/>
<location filename="../../pcsx2/VMManager.cpp" line="2393"/>
<source>EE Wait Loop Detection is not enabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2410"/>
<location filename="../../pcsx2/VMManager.cpp" line="2398"/>
<source>INTC Spin Detection is not enabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2415"/>
<location filename="../../pcsx2/VMManager.cpp" line="2403"/>
<source>Instant VU1 is disabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2420"/>
<location filename="../../pcsx2/VMManager.cpp" line="2408"/>
<source>mVU Flag Hack is not enabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2425"/>
<location filename="../../pcsx2/VMManager.cpp" line="2413"/>
<source>GPU Palette Conversion is enabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2430"/>
<location filename="../../pcsx2/VMManager.cpp" line="2418"/>
<source>Texture Preloading is not Full, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2435"/>
<location filename="../../pcsx2/VMManager.cpp" line="2423"/>
<source>Estimate texture region is enabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
@@ -0,0 +1,69 @@
#!/usr/bin/env python3
import os
import re
import xml.etree.ElementTree as ET
languages_to_update = [
"ja-JP",
"ko-KR",
"zh-CN",
"zh-TW"
]
src_path = os.path.join(os.path.dirname(__file__), "..", "Translations.cpp")
ts_dir = os.path.join(os.path.dirname(__file__))
def parse_xml(path):
tree = ET.parse(path)
root = tree.getroot()
translations = ""
for node in root.findall("context/message/translation"):
if node.text:
translations += node.text
ords = list(set([ord(ch) for ch in translations if ord(ch) >= 0x2000]))
if len(ords) == 0:
return ""
# Try to organize it into ranges
ords.sort()
ord_pairs = []
start_ord = None
last_ord = None
for nord in ords:
if start_ord is not None and nord == (last_ord + 1):
last_ord = nord
continue
if start_ord is not None:
ord_pairs.append(start_ord)
ord_pairs.append(last_ord)
start_ord = nord
last_ord = nord
if start_ord is not None:
ord_pairs.append(start_ord)
ord_pairs.append(last_ord)
chars = "".join([chr(ch) for ch in ord_pairs])
return chars
def update_src_file(ts_file, chars):
ts_name = os.path.basename(ts_file)
pattern = re.compile('(// auto update.*' + ts_name + '.*\n[^"]+")[^"]*(".*)')
with open(src_path, "r", encoding="utf-8") as f:
original = f.read()
update = pattern.sub("\\1" + chars + "\\2", original)
if original != update:
with open(src_path, "w", encoding="utf-8") as f:
f.write(update)
print(f"Updated character list for {ts_file}.")
else:
print(f"Character list is unchanged for {ts_file}.")
if __name__ == "__main__":
for language in languages_to_update:
ts_file = os.path.join(ts_dir, f"pcsx2-qt_{language}.ts")
chars = parse_xml(ts_file)
print(f"{language}: {len(chars)} character(s) detected.")
update_src_file(ts_file, chars)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

+1 -1
View File
@@ -1,6 +1,6 @@
<RCC>
<qresource>
<file>icons/AppIcon.png</file>
<file>icons/AppIcon64.png</file>
<file>icons/applications-system-24.png</file>
<file>icons/black/index.theme</file>
<file>icons/black/svg/arrow-left-right-line.svg</file>
+2
View File
@@ -19,6 +19,7 @@
#include "IopHw.h"
#include "IopDma.h"
#include "VMManager.h"
#include "Sio.h"
#include <cctype>
#include <ctime>
@@ -1528,6 +1529,7 @@ void cdvdVsync()
cdvd.RTCcount = 0;
cdvdUpdateTrayState();
AutoEject::CountDownTicks();
cdvd.RTC.second++;
if (cdvd.RTC.second < 60)
+8
View File
@@ -143,6 +143,14 @@ std::string Host::TranslateToString(const std::string_view& context, const std::
return std::string(TranslateToStringView(context, msg));
}
void Host::ClearTranslationCache()
{
s_translation_string_mutex.lock();
s_translation_string_map.clear();
s_translation_string_cache_pos = 0;
s_translation_string_mutex.unlock();
}
void Host::ReportFormattedErrorAsync(const std::string_view& title, const char* format, ...)
{
std::va_list ap;
+2 -4
View File
@@ -63,10 +63,8 @@ namespace Host
/// Returns a localized version of the specified string within the specified context.
std::string TranslateToString(const std::string_view& context, const std::string_view& msg);
/// Returns a localized version of the specified string, after formatting.
template<typename... T>
std::string TranslateAndFmt(const std::string_view& context, const std::string_view& format, T&&... args);
/// Clears the translation cache. All previously used strings should be considered invalid.
void ClearTranslationCache();
/// Adds OSD messages, duration is in seconds.
void AddOSDMessage(std::string message, float duration = 2.0f);
+36 -14
View File
@@ -24,6 +24,7 @@
#include "MemoryCardFile.h"
#include "MemoryCardFolder.h"
#include "Sio.h"
#include "System.h"
#include "Config.h"
@@ -292,14 +293,11 @@ void FileMemoryCard::Open()
cont = true;
}
if (EmuConfig.Mcd[slot].Type != MemoryCardType::File)
{
str = "[is not memcard file]";
if (EmuConfig.Mcd[slot].Type == MemoryCardType::File)
Console.WriteLn(cont ? Color_Gray : Color_Green, fmt::format("McdSlot {} [File]: {}", slot, str));
else
cont = true;
}
Console.WriteLn(cont ? Color_Gray : Color_Green, "McdSlot %u [File]: %.*s", slot,
static_cast<int>(str.size()), str.data());
if (cont)
continue;
@@ -622,11 +620,8 @@ uint FileMcd_ConvertToSlot(uint port, uint slot)
return slot + 4; // multitap 2
}
void FileMcd_EmuOpen()
void FileMcd_SetType()
{
if(FileMcd_Open)
return;
FileMcd_Open = true;
// detect inserted memory card types
for (uint slot = 0; slot < 8; ++slot)
{
@@ -645,6 +640,14 @@ void FileMcd_EmuOpen()
EmuConfig.Mcd[slot].Type = type;
}
}
}
void FileMcd_EmuOpen()
{
if(FileMcd_Open)
return;
FileMcd_Open = true;
Mcd::impl.Open();
Mcd::implFolder.SetFiltering(EmuConfig.McdFolderAutoManage);
@@ -660,6 +663,20 @@ void FileMcd_EmuClose()
Mcd::impl.Close();
}
void FileMcd_CancelEject()
{
AutoEject::ClearAll();
}
void FileMcd_Reopen(std::string new_serial)
{
Console.WriteLn("Reopening memory cards...");
FileMcd_EmuClose();
FileMcd_SetType();
sioSetGameSerial(new_serial);
FileMcd_EmuOpen();
}
s32 FileMcd_IsPresent(uint port, uint slot)
{
const uint combinedSlot = FileMcd_ConvertToSlot(port, slot);
@@ -776,20 +793,25 @@ void FileMcd_NextFrame(uint port, uint slot)
}
}
bool FileMcd_ReIndex(uint port, uint slot, const std::string& filter)
int FileMcd_ReIndex(uint port, uint slot, const std::string& filter)
{
const uint combinedSlot = FileMcd_ConvertToSlot(port, slot);
const int combinedSlot = FileMcd_ConvertToSlot(port, slot);
switch (EmuConfig.Mcd[combinedSlot].Type)
{
//case MemoryCardType::File:
// return Mcd::impl.ReIndex( combinedSlot, filter );
// break;
case MemoryCardType::Folder:
return Mcd::implFolder.ReIndex(combinedSlot, EmuConfig.McdFolderAutoManage, filter);
if (!Mcd::implFolder.ReIndex(combinedSlot, EmuConfig.McdFolderAutoManage, filter))
return -1;
break;
default:
return false;
return -1;
break;
}
return combinedSlot;
}
// --------------------------------------------------------------------------------------
+4 -1
View File
@@ -45,8 +45,11 @@ extern bool FileMcd_IsMultitapSlot(uint slot);
extern std::string FileMcd_GetDefaultName(uint slot);
uint FileMcd_ConvertToSlot(uint port, uint slot);
void FileMcd_SetType();
void FileMcd_EmuOpen();
void FileMcd_EmuClose();
void FileMcd_CancelEject();
void FileMcd_Reopen(std::string new_serial);
s32 FileMcd_IsPresent(uint port, uint slot);
void FileMcd_GetSizeInfo(uint port, uint slot, McdSizeInfo* outways);
bool FileMcd_IsPSX(uint port, uint slot);
@@ -55,7 +58,7 @@ s32 FileMcd_Save(uint port, uint slot, const u8* src, u32 adr, int size);
s32 FileMcd_EraseBlock(uint port, uint slot, u32 adr);
u64 FileMcd_GetCRC(uint port, uint slot);
void FileMcd_NextFrame(uint port, uint slot);
bool FileMcd_ReIndex(uint port, uint slot, const std::string& filter);
int FileMcd_ReIndex(uint port, uint slot, const std::string& filter);
std::vector<AvailableMcdInfo> FileMcd_GetAvailableCards(bool include_in_use_cards);
std::optional<AvailableMcdInfo> FileMcd_GetCardInfo(const std::string_view& name);
+3
View File
@@ -234,6 +234,7 @@ void FolderMemoryCard::Close(bool flush)
m_oldDataCache.clear();
m_lastAccessedFile.CloseAll();
m_fileMetadataQuickAccess.clear();
m_isEnabled = false;
}
bool FolderMemoryCard::ReIndex(bool enableFiltering, const std::string& filter)
@@ -2394,5 +2395,7 @@ bool FolderMemoryCardAggregator::ReIndex(uint slot, const bool enableFiltering,
return true;
}
SetFiltering(enableFiltering);
m_lastKnownFilter = filter;
return false;
}
-1
View File
@@ -1373,7 +1373,6 @@ Pcsx2Config::Pcsx2Config()
{
Mcd[slot].Enabled = !FileMcd_IsMultitapSlot(slot); // enables main 2 slots
Mcd[slot].Filename = FileMcd_GetDefaultName(slot);
// Folder memory card is autodetected later.
Mcd[slot].Type = MemoryCardType::File;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

+27 -23
View File
@@ -204,15 +204,6 @@ void Sio0::SetTxData(u8 value)
if (mcd->autoEjectTicks)
{
SetRxData(0x00);
mcd->autoEjectTicks--;
if (mcd->autoEjectTicks == 0)
{
Host::AddKeyedOSDMessage(fmt::format("AutoEjectSlotClear{}{}", port, slot),
fmt::format(TRANSLATE_SV("MemoryCard", "Memory Card in port %d / slot %d reinserted"),
port + 1, slot + 1),
Host::OSD_INFO_DURATION);
}
return;
}
@@ -585,16 +576,6 @@ void Sio2::Memcard()
fifoOut.push_back(0x00);
}
mcd->autoEjectTicks--;
if (mcd->autoEjectTicks == 0)
{
Host::AddKeyedOSDMessage(fmt::format("AutoEjectSlotClear{}{}", port, slot),
fmt::format(
TRANSLATE_SV("MemoryCard", "Memory Card in port {} / slot {} reinserted."), port + 1, slot + 1),
Host::OSD_INFO_DURATION);
}
return;
}
@@ -833,7 +814,8 @@ void sioNextFrame() {
void sioSetGameSerial( const std::string& serial ) {
for ( uint port = 0; port < 2; ++port ) {
for ( uint slot = 0; slot < 4; ++slot ) {
if ( mcds[port][slot].ReIndex( serial ) ) {
if ( int index = mcds[port][slot].ReIndex( serial ) >= 0 ) {
Console.WriteLn("Ejecting Memory Card %u (port %u slot %u) due to source change. Reinsert in 1 second.", index, port, slot);
AutoEject::Set( port, slot );
}
}
@@ -915,11 +897,33 @@ bool sioPortAndSlotIsMultitap(u32 port, u32 slot)
return (slot != 0);
}
void AutoEject::CountDownTicks()
{
bool reinserted = false;
for (size_t port = 0; port < SIO::PORTS; port++)
{
for (size_t slot = 0; slot < SIO::SLOTS; slot++)
{
if (mcds[port][slot].autoEjectTicks > 0)
{
if (--mcds[port][slot].autoEjectTicks == 0)
{
Host::AddKeyedOSDMessage(fmt::format("AutoEjectSlotClear{}{}", port, slot),
fmt::format(TRANSLATE_SV("MemoryCard", "Memory card in port {} / slot {} reinserted"),
port + 1, slot + 1),
Host::OSD_INFO_DURATION);
}
}
}
}
}
void AutoEject::Set(size_t port, size_t slot)
{
if (EmuConfig.McdEnableEjection)
if (EmuConfig.McdEnableEjection && mcds[port][slot].autoEjectTicks == 0)
{
mcds[port][slot].autoEjectTicks = 60;
mcds[port][slot].autoEjectTicks = 1; // 1 second is enough.
mcds[port][slot].term = 0x55; // Reset terminator to default (0x55), forces the PS2 to recheck the memcard.
}
}
@@ -931,7 +935,7 @@ void AutoEject::Clear(size_t port, size_t slot)
void AutoEject::SetAll()
{
Host::AddIconOSDMessage("AutoEjectAllSet", ICON_FA_SD_CARD,
TRANSLATE_SV("MemoryCard", "Force ejecting all Memory Cards."), Host::OSD_INFO_DURATION);
TRANSLATE_SV("MemoryCard", "Force ejecting all Memory Cards. Reinserting in 1 second."), Host::OSD_INFO_DURATION);
for (size_t port = 0; port < SIO::PORTS; port++)
{
+2 -1
View File
@@ -99,7 +99,7 @@ struct _mcd
FileMcd_NextFrame( port, slot );
}
bool ReIndex(const std::string& filter) {
int ReIndex(const std::string& filter) {
return FileMcd_ReIndex(port, slot, filter);
}
};
@@ -243,6 +243,7 @@ extern void sioSetGameSerial(const std::string& serial);
namespace AutoEject
{
extern void CountDownTicks();
extern void Set(size_t port, size_t slot);
extern void Clear(size_t port, size_t slot);
extern void SetAll();
+20 -23
View File
@@ -627,9 +627,16 @@ void VMManager::Internal::UpdateEmuFolders()
if (EmuFolders::MemoryCards != old_memcards_directory)
{
FileMcd_EmuClose();
FileMcd_EmuOpen();
std::string memcardFilters = "";
if (const GameDatabaseSchema::GameEntry* game = GameDatabase::findGame(s_disc_serial))
{
memcardFilters = game->memcardFiltersAsString();
}
AutoEject::SetAll();
if(!GSDumpReplayer::IsReplayingDump())
FileMcd_Reopen(memcardFilters.empty() ? s_disc_serial : memcardFilters);
}
if (EmuFolders::Textures != old_textures_directory)
@@ -882,13 +889,6 @@ void VMManager::UpdateDiscDetails(bool booting)
Console.WriteLn(Color_StrongGreen, fmt::format(" Version: {}", s_disc_version));
Console.WriteLn(Color_StrongGreen, fmt::format(" CRC: {:08X}", s_disc_crc));
sioSetGameSerial(memcardFilters.empty() ? s_disc_serial : memcardFilters);
// If we don't reset the timer here, when using folder memcards the reindex will cause an eject,
// which a bunch of games don't like since they access the memory card on boot.
if (booting)
AutoEject::ClearAll();
UpdateGameSettingsLayer();
ApplySettings();
@@ -903,6 +903,9 @@ void VMManager::UpdateDiscDetails(bool booting)
Achievements::GameChanged(s_disc_crc, s_current_crc);
ReloadPINE();
UpdateDiscordPresence(Achievements::GetRichPresenceString());
if (!GSDumpReplayer::IsReplayingDump())
FileMcd_Reopen(memcardFilters.empty() ? s_disc_serial : memcardFilters);
}
void VMManager::ClearDiscDetails()
@@ -1145,17 +1148,11 @@ bool VMManager::Initialize(VMBootParameters boot_params)
}
ScopedGuard close_cdvd(&DoCDVDclose);
// Must be before updating serial because of folder memcards.
if (!GSDumpReplayer::IsReplayingDump())
{
Console.WriteLn("Opening Memory cards...");
FileMcd_EmuOpen();
}
ScopedGuard close_memcards(&FileMcd_EmuClose);
// Figure out which game we're running! This also loads game settings.
UpdateDiscDetails(true);
ScopedGuard close_memcards(&FileMcd_EmuClose);
// Read fast boot setting late so it can be overridden per-game.
// ELFs must be fast booted, and GS dumps are never fast booted.
s_fast_boot_requested =
@@ -1958,7 +1955,9 @@ void VMManager::Internal::EntryPointCompilingOnCPUThread()
HandleELFChange(true);
Patch::ApplyLoadedPatches(Patch::PPT_ONCE_ON_LOAD);
// If the config changes at this point, it's a reset, so the game doesn't currently know about the memcard
// so there's no need to leave the eject running.
FileMcd_CancelEject();
// Toss all the recs, we're going to be executing new code.
SysClearExecutionCache();
}
@@ -2113,9 +2112,6 @@ void VMManager::CheckForMemoryCardConfigChanges(const Pcsx2Config& old_config)
Console.WriteLn("Updating memory card configuration");
FileMcd_EmuClose();
FileMcd_EmuOpen();
// force card eject when files change
for (u32 port = 0; port < 2; port++)
{
@@ -2130,7 +2126,6 @@ void VMManager::CheckForMemoryCardConfigChanges(const Pcsx2Config& old_config)
}
}
}
// force reindexing, mc folder code is janky
std::string sioSerial;
{
@@ -2140,7 +2135,9 @@ void VMManager::CheckForMemoryCardConfigChanges(const Pcsx2Config& old_config)
if (sioSerial.empty())
sioSerial = s_disc_serial;
}
sioSetGameSerial(sioSerial);
if (!GSDumpReplayer::IsReplayingDump())
FileMcd_Reopen(sioSerial);
}
void VMManager::CheckForMiscConfigChanges(const Pcsx2Config& old_config)