Compare commits

...

2 Commits

Author SHA1 Message Date
TheTechnician27
b01359e06f Tools: Port refraction's bulk compression script to Python 2024-12-28 12:09:19 -05:00
PCSX2 Bot
905f9431a5 [ci skip] Qt: Update Base Translation. 2024-12-28 11:30:16 -05:00
2 changed files with 537 additions and 94 deletions

420
bin/utils/bulk_compression.py Executable file
View File

@@ -0,0 +1,420 @@
#!/usr/bin/env python3
# PCSX2 - PS2 Emulator for PCs
# Copyright (C) 2024 PCSX2 Dev Team
#
# PCSX2 is free software: you can redistribute it and/or modify it under the terms
# of the GNU General Public License as published by the Free Software Found-
# ation, either version 3 of the License, or (at your option) any later version.
#
# PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
# PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with PCSX2.
# If not, see <https://www.gnu.org/licenses/>.
import sys
import os
import re
from subprocess import Popen, PIPE
from os.path import exists
gamecount = [0]
# =================================================================================================
def deletionChoice(source_extension): # Choose to delete source files
yesno = {
"n" : 0,
"no" : 0,
"y" : 1,
"yes" : 1,
}
print("╟-------------------------------------------------------------------------------╢")
print(f"║ Do you want to delete the original {source_extension.upper()} files as they are converted?")
choice = input("║ Type Y or N then press ENTER: ").lower()
if (not choice in yesno):
exitInvalidOption()
return (yesno[choice])
# -------------------------------------------------------------------------------------------------
def blockSizeChoice(is_cd, decompressing): # Choose block size
if (decompressing):
return 0
sizes = {
"1" : 16384,
"2" : 131072,
"3" : 262144,
} if not is_cd else {
"1": 17136,
"2": 132192,
"3": 264384,
}
print("╟-------------------------------------------------------------------------------╢")
print("║ Please pick the block size you would like to use:")
print("")
print("║ 1 - 16 kB (bigger files, faster access/less CPU, choose this if unsure)")
print("║ 2 - 128 kB (balanced)")
print("║ 3 - 256 kB (smaller files, slower access/more CPU)")
print("")
blocksize = input("║ Type the number corresponding to your selection then press ENTER: ")
if (not blocksize in sizes):
exitInvalidOption()
return (sizes[blocksize])
# =================================================================================================
def checkSuccess(compressing, fname, extension, error_code): # Ensure file created properly
target_fname = f"{fname}.{extension}"
if (error_code):
print("╠===============================================================================╣")
if (compressing):
print(f"║ Compression to {extension.upper()} failed for the following:{(37 - len(extension)) * ' '}")
else:
print(f"║ Extraction to {extension.upper()} failed for the following:{(38 - len(extension)) * ' '}")
print(f"{target_fname}{(77 - len(target_fname)) * ' '}")
print("╚===============================================================================╝")
sys.exit(1)
print(f"{target_fname} created.{(69 - len(target_fname)) * ' '}")
# -------------------------------------------------------------------------------------------------
def checkProgramMissing(program):
if (sys.platform.startswith('win32') and exists(f"./{program}.exe")):
return # Windows
else: # Linux, macOS
from shutil import which
if (which(program) is not None):
return
print("╠===============================================================================╗")
print(f"{program} failed, {program} is missing.{(39 - (len(program) * 2)) * ' '}")
print("╚===============================================================================╝")
sys.exit(1)
# -------------------------------------------------------------------------------------------------
def checkBinCueMismatch(bin_files, cue_files): # Ensure all bins and cues match
if (len(bin_files) != len(cue_files)): # Ensure numerical parity
exitBinCueMismatch()
for fname in bin_files: # Ensure filename parity
if (f"{fname[:-4]}.cue" not in cue_files):
exitBinCueMismatch()
# -------------------------------------------------------------------------------------------------
def checkDuplicates(source_files, target_extensions, crash_protection_type=0):
dupe_options = {
"s" : 0,
"skip" : 0,
"o" : 1,
"overwrite" : 1,
}
dupe_files = []
dupe_names = []
target_files = []
for extension in target_extensions:
target_files[len(target_files):] = returnFilteredPwdContents(extension)
for fname in source_files:
for extension in target_extensions:
target_fname = f"{fname[:-4]}.{extension}"
if (target_fname in target_files):
dupe_files.append(target_fname)
match crash_protection_type:
case 0:
pass
case 1: # Skip any dupe files no matter what
[dupe_names.append(fname[:-4]) for fname in dupe_files if fname[:-4] not in dupe_names]
return dupe_names
case 2: # Only skip if intermediate .iso present
[dupe_names.append(fname[:-4]) for fname in dupe_files if fname[:-4] not in dupe_names and fname[-4:] == ".iso"]
case _:
pass
if (not dupe_files):
return dupe_names
print("╟-------------------------------------------------------------------------------╢")
print("║ The following files were found which would be overwritten:")
for fname in dupe_files:
print(f"║ - {fname}")
print("")
print("║ You may choose to OVERWRITE or SKIP all of these.")
if (crash_protection_type == 2):
print("║ NOTE: chdman cannot overwrite .cso files. These will be skipped regardless.")
choice = input("║ Press 'O' to overwrite or 'S' to skip and press ENTER: ").lower()
if (choice in dupe_options):
if (not dupe_options[choice]): # Skip
[dupe_names.append(fname[:-4]) for fname in dupe_files if fname[:-4] not in dupe_names]
return dupe_names
else:
exitInvalidOption()
# =================================================================================================
def printInitialStatus(decompressing, target_fname):
if (gamecount[0] != 0):
print("╟-------------------------------------------------------------------------------╢")
gamecount[0] += 1
if (decompressing):
print(f"║ Extracting to {target_fname}... ({gamecount[0]}){(58 - len(target_fname) - len(str(gamecount[0]))) * ' '}")
else:
print(f"║ Compressing to {target_fname}... ({gamecount[0]}){(57 - len(target_fname) - len(str(gamecount[0]))) * ' '}")
# -------------------------------------------------------------------------------------------------
def printSkip(target_fname):
if (gamecount[0] != 0):
print("╟-------------------------------------------------------------------------------╢")
gamecount[0] += 1
print(f"║ Skipping creation of {target_fname}{(57 - len(target_fname)) * ' '}")
# =================================================================================================
def createCommandList(mode, source_fname, target_fname, blocksize=0):
match mode:
case 1:
return [["maxcso", f"--block={blocksize}", source_fname]]
case 2:
return [["chdman", "createraw", "-us", "2048", "-hs", f"{blocksize}", "-f", "-i", source_fname, "-o", target_fname]]
case 3:
return [["chdman", "createcd", "-hs", f"{blocksize}", "-i", source_fname, "-o", f"{source_fname[:-4]}.chd"]]
case 4:
return [["maxcso", "--decompress", source_fname],
["chdman", "createraw", "-us", "2048", "-hs", f"{blocksize}", "-f", "-i", f"{source_fname[:-4]}.iso", "-o", f"{source_fname[:-4]}.chd"]]
case 5:
return [["chdman", "extractraw", "-i", source_fname, "-o", f"{source_fname[:-4]}.iso"],
["maxcso", f"--block={blocksize}", f"{source_fname[:-4]}.iso"]]
case 6:
return [["chdman", "extractraw", "-i", source_fname, "-o", target_fname]]
case 7:
return [["chdman", "extractcd", "-i", source_fname, "-o", target_fname]]
case 8:
return [["maxcso", "--decompress", source_fname]]
case _:
print("You have somehow chosen an invalid mode, and this was not correctly caught by the program.\nPlease report this as a bug.")
sys.exit(1)
# =================================================================================================
def returnFilteredPwdContents(file_extension): # Get files in pwd with extension
extension_pattern = r".*\." + file_extension.lower()
extension_reg = re.compile(extension_pattern)
return [fname for fname in os.listdir('.') if extension_reg.match(fname)]
# -------------------------------------------------------------------------------------------------
def deleteFile(fname): # Delete a file in pwd
print(f"║ Deleting {fname}...{(66 - len(fname)) * ' '}")
os.remove(f"./{fname}")
# =================================================================================================
def exitInvalidOption():
print("╠===============================================================================╗")
print("║ Invalid option. ║")
print("╚===============================================================================╝")
sys.exit(1)
# -------------------------------------------------------------------------------------------------
def exitBinCueMismatch():
print("╠===============================================================================╗")
print("║ All BIN files must have a matching CUE. ║")
print("╚===============================================================================╝")
sys.exit(1)
# =================================================================================================
# /////////////////////////////////////////////////////////////////////////////////////////////////
# =================================================================================================
options = { # Options listings
1 : "Convert ISO to CSO",
2 : "Convert ISO to CHD",
3 : "Convert CUE/BIN to CHD",
4 : "Convert CSO to CHD",
5 : "Convert DVD CHD to CSO",
6 : "Extract DVD CHD to ISO",
7 : "Extract CD CHD to CUE/BIN",
8 : "Extract CSO to ISO",
9 : "Exit script",
}
# -------------------------------------------------------------------------------------------------
sources = { # Source file extensions
1 : "iso",
2 : "iso",
3 : "cue/bin",
4 : "cso",
5 : "chd",
6 : "chd",
7 : "chd",
8 : "cso",
}
# -------------------------------------------------------------------------------------------------
targets = { # Target file extensions
1 : ["cso"],
2 : ["chd"],
3 : ["chd"],
4 : ["iso", "chd"],
5 : ["iso", "cso"],
6 : ["iso"],
7 : ["cue", "bin"],
8 : ["iso"],
}
# # -------------------------------------------------------------------------------------------------
reqs = { # Selection dependencies
1 : ["maxcso"],
2 : ["chdman"],
3 : ["chdman"],
4 : ["maxcso", "chdman"],
5 : ["maxcso", "chdman"],
6 : ["chdman"],
7 : ["chdman"],
8 : ["maxcso"],
}
# -------------------------------------------------------------------------------------------------
print("╔===============================================================================╗")
print("║ CSO/CHD/ISO/CUEBIN Conversion by Refraction, RedDevilus and TheTechnician27 ║")
print("║ (Version Jul 16 2024) ║")
print("╠===============================================================================╣")
print("║ ║")
print("║ PLEASE NOTE: This will affect all files in this folder! ║")
print("║ Be sure to run this from the same directory as the files you wish to convert. ║")
print("║ ║")
for number, message in options.items():
print("", number, " - ", message, f"{(70 - len(message)) * ' '}")
print("║ ║")
print("╠===============================================================================╝")
#print("║")
mode = input("║ Type the number corresponding to your selection then press ENTER: ")
# -------------------------------------------------------------------------------------------------
try:
mode = int(mode)
except ValueError:
exitInvalidOption()
# -------------------------------------------------------------------------------------------------
if (mode < 9 and mode > 0):
for program in reqs[mode]: # Check for dependencies
checkProgramMissing(program)
delete = deletionChoice(sources[mode]) # Choose to delete source files
blocksize = blockSizeChoice(mode == 3, mode > 5) # Choose block size if compressing
match mode:
case 3:
bin_files = returnFilteredPwdContents("bin") # Get all BIN files in pwd
source_files = returnFilteredPwdContents("cue") # Get all CUE files in pwd
checkBinCueMismatch(bin_files, source_files)
dupe_list = checkDuplicates(source_files, targets[mode], 1)
case 5:
source_files = returnFilteredPwdContents(sources[mode]) # Get source files in pwd
dupe_list = checkDuplicates(source_files, targets[mode], 2)
case 6:
source_files = returnFilteredPwdContents(sources[mode]) # Get source files in pwd
dupe_list = checkDuplicates(source_files, targets[mode], 1)
case _:
source_files = returnFilteredPwdContents(sources[mode]) # Get source files in pwd
dupe_list = checkDuplicates(source_files, targets[mode])
print("╠===============================================================================╗")
# ---------------------------------------------------------------------------------------------
for fname in source_files:
target_fname = f"{fname[:-4]}.{targets[mode][0]}"
commands = createCommandList(mode, fname, target_fname, blocksize)
if (fname[:-4] in dupe_list):
printSkip(target_fname)
continue
printInitialStatus(mode > 5, f"{fname[:-4]}.{targets[mode][-1]}")
for step, command in enumerate (commands):
process = Popen(commands[step], stdout=PIPE, stderr=PIPE) # Execute process
stdout, stderr = process.communicate() # Suppress output
checkSuccess(mode < 6, fname[:-4], # Ensure target creation
targets[mode][step], process.returncode)
if (step == 1): # Delete intermediate file
deleteFile(f"{fname[:-4]}.iso")
if (delete): # Delete source requested
deleteFile(fname)
if (mode == 3):
deleteFile(f"{fname[:-4]}.bin")
# ===== EXIT SCRIPT ===============================================================================
elif (mode == 9):
print("╠===============================================================================╗")
print("║ Goodbye! :) ║")
print("╚===============================================================================╝")
sys.exit(0)
# ===== EXIT SCRIPT WITH ERROR ====================================================================
else:
exitInvalidOption()
# -------------------------------------------------------------------------------------------------
print("╠===============================================================================╣")
print("║ Process complete! ║")
print("╚===============================================================================╝")
sys.exit(0)

View File

@@ -3229,29 +3229,34 @@ Not Configured/Buttons configured</extracomment>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.ui" line="119"/>
<source>Delete Profile</source>
<source>Rename Profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.ui" line="129"/>
<source>Mapping Settings</source>
<source>Delete Profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.ui" line="139"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="209"/>
<source>Mapping Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.ui" line="149"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="252"/>
<source>Restore Defaults</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="91"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="105"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="118"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="92"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="106"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="119"/>
<source>Create Input Profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="92"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="93"/>
<source>Custom input profiles are used to override the Shared input profile for specific games.
To apply a custom input profile to a game, go to its Game Properties, then change the &apos;Input Profile&apos; on the Summary tab.
@@ -3259,40 +3264,43 @@ Enter the name for the new input profile:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="101"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="146"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="192"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="529"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="102"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="147"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="193"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="199"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="235"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="573"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="101"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="102"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="193"/>
<source>A profile with the name &apos;%1&apos; already exists.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="106"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="107"/>
<source>Do you want to copy all bindings from the currently-selected profile to the new profile? Selecting No will create a completely empty profile.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="119"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="120"/>
<source>Do you want to copy the current hotkey bindings from global settings to the new input profile?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="146"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="147"/>
<source>Failed to save the new profile to &apos;%1&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="156"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="157"/>
<source>Load Input Profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="157"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="158"/>
<source>Are you sure you want to load the input profile named &apos;%1&apos;?
All current global bindings will be removed, and the profile bindings loaded.
@@ -3301,24 +3309,39 @@ You cannot undo this action.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="181"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="182"/>
<source>Rename Input Profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="183"/>
<source>Enter the new name for the input profile:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="199"/>
<source>Failed to rename &apos;%1&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="224"/>
<source>Delete Input Profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="182"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="225"/>
<source>Are you sure you want to delete the input profile named &apos;%1&apos;?
You cannot undo this action.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="192"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="235"/>
<source>Failed to delete &apos;%1&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="210"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="253"/>
<source>Are you sure you want to restore the default controller configuration?
All shared bindings and configuration will be lost, but your input profiles will remain.
@@ -3327,46 +3350,46 @@ You cannot undo this action.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="385"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="428"/>
<source>Global Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="418"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="473"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="461"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="517"/>
<source>Controller Port %1%2
%3</source>
<extracomment>Controller Port is an official term from Sony. Find the official translation for your language inside the console&apos;s manual.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="420"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="475"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="463"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="519"/>
<source>Controller Port %1
%2</source>
<extracomment>Controller Port is an official term from Sony. Find the official translation for your language inside the console&apos;s manual.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="436"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="493"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="479"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="537"/>
<source>USB Port %1
%2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="446"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="489"/>
<source>Hotkeys</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="507"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="551"/>
<source>Shared</source>
<extracomment>&quot;Shared&quot; refers here to the shared input profile.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="529"/>
<location filename="../Settings/ControllerSettingsWindow.cpp" line="573"/>
<source>The input profile named &apos;%1&apos; cannot be found.</source>
<translation type="unfinished"></translation>
</message>
@@ -18423,7 +18446,7 @@ Ejecting {3} and replacing it with {2}.</source>
<context>
<name>SaveState</name>
<message>
<location filename="../../pcsx2/SaveState.cpp" line="1099"/>
<location filename="../../pcsx2/SaveState.cpp" line="1100"/>
<source>This save state is outdated and is no longer compatible with the current version of PCSX2.
If you have any unsaved progress on this save state, you can download the compatible version (PCSX2 {}) from pcsx2.net, load the save state, and save your progress to the memory card.</source>
@@ -21613,42 +21636,42 @@ Scanning recursively takes more time, but will identify files in subdirectories.
<context>
<name>VMManager</name>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1852"/>
<location filename="../../pcsx2/VMManager.cpp" line="1856"/>
<source>Failed to back up old save state {}.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1837"/>
<location filename="../../pcsx2/VMManager.cpp" line="1841"/>
<source>Failed to save save state: {}.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1022"/>
<location filename="../../pcsx2/VMManager.cpp" line="1026"/>
<source>PS2 BIOS ({})</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1083"/>
<location filename="../../pcsx2/VMManager.cpp" line="1087"/>
<source>Unknown Game</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1246"/>
<location filename="../../pcsx2/VMManager.cpp" line="1250"/>
<source>CDVD precaching was cancelled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1252"/>
<location filename="../../pcsx2/VMManager.cpp" line="1256"/>
<source>CDVD precaching failed: {}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1345"/>
<location filename="../../pcsx2/VMManager.cpp" line="1349"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1346"/>
<location filename="../../pcsx2/VMManager.cpp" line="1350"/>
<source>PCSX2 requires a PS2 BIOS in order to run.
For legal reasons, you *must* obtain a BIOS from an actual PS2 unit that you own (borrowing doesn&apos;t count).
@@ -21659,270 +21682,270 @@ Please consult the FAQs and Guides for further instructions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1437"/>
<location filename="../../pcsx2/VMManager.cpp" line="1441"/>
<source>Resuming state</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1442"/>
<location filename="../../pcsx2/VMManager.cpp" line="1446"/>
<source>Boot and Debug</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1810"/>
<location filename="../../pcsx2/VMManager.cpp" line="1814"/>
<source>Failed to load save state</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1885"/>
<location filename="../../pcsx2/VMManager.cpp" line="1889"/>
<source>State saved to slot {}.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1892"/>
<location filename="../../pcsx2/VMManager.cpp" line="1896"/>
<source>Failed to save save state to slot {}.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1960"/>
<location filename="../../pcsx2/VMManager.cpp" line="1997"/>
<location filename="../../pcsx2/VMManager.cpp" line="1964"/>
<location filename="../../pcsx2/VMManager.cpp" line="2001"/>
<source>Loading state</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1971"/>
<location filename="../../pcsx2/VMManager.cpp" line="1975"/>
<source>Failed to load state (Memory card is busy)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="1990"/>
<location filename="../../pcsx2/VMManager.cpp" line="1994"/>
<source>There is no save state in slot {}.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2008"/>
<location filename="../../pcsx2/VMManager.cpp" line="2012"/>
<source>Failed to load state from slot {} (Memory card is busy)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2014"/>
<location filename="../../pcsx2/VMManager.cpp" line="2018"/>
<source>Loading state from slot {}...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2023"/>
<location filename="../../pcsx2/VMManager.cpp" line="2027"/>
<source>Failed to save state (Memory card is busy)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2040"/>
<location filename="../../pcsx2/VMManager.cpp" line="2044"/>
<source>Failed to save state to slot {} (Memory card is busy)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2047"/>
<location filename="../../pcsx2/VMManager.cpp" line="2051"/>
<source>Saving state to slot {}...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2213"/>
<location filename="../../pcsx2/VMManager.cpp" line="2217"/>
<source>Frame advancing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2241"/>
<location filename="../../pcsx2/VMManager.cpp" line="2245"/>
<source>Disc removed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2247"/>
<location filename="../../pcsx2/VMManager.cpp" line="2251"/>
<source>Disc changed to &apos;{}&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2256"/>
<location filename="../../pcsx2/VMManager.cpp" line="2260"/>
<source>Failed to open new disc image &apos;{}&apos;. Reverting to old image.
Error was: {}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2265"/>
<location filename="../../pcsx2/VMManager.cpp" line="2269"/>
<source>Failed to switch back to old disc image. Removing disc.
Error was: {}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3048"/>
<location filename="../../pcsx2/VMManager.cpp" line="3052"/>
<source>Cheats have been disabled due to achievements hardcore mode.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3101"/>
<location filename="../../pcsx2/VMManager.cpp" line="3105"/>
<source>Fast CDVD is enabled, this may break games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3105"/>
<location filename="../../pcsx2/VMManager.cpp" line="3109"/>
<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="3115"/>
<location filename="../../pcsx2/VMManager.cpp" line="3119"/>
<source>Upscale multiplier is below native, this will break rendering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3155"/>
<location filename="../../pcsx2/VMManager.cpp" line="3159"/>
<source>Mipmapping is disabled. This may break rendering in some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3164"/>
<location filename="../../pcsx2/VMManager.cpp" line="3168"/>
<source>Renderer is not set to Automatic. This may cause performance problems and graphical issues.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3170"/>
<location filename="../../pcsx2/VMManager.cpp" line="3174"/>
<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="3633"/>
<location filename="../../pcsx2/VMManager.cpp" line="3637"/>
<source>No Game Running</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3120"/>
<location filename="../../pcsx2/VMManager.cpp" line="3124"/>
<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="3125"/>
<location filename="../../pcsx2/VMManager.cpp" line="3129"/>
<source>Blending Accuracy is below Basic, this may break effects in some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3130"/>
<location filename="../../pcsx2/VMManager.cpp" line="3134"/>
<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="3176"/>
<location filename="../../pcsx2/VMManager.cpp" line="3180"/>
<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="3182"/>
<location filename="../../pcsx2/VMManager.cpp" line="3186"/>
<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="3187"/>
<location filename="../../pcsx2/VMManager.cpp" line="3191"/>
<source>VU0 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="3192"/>
<location filename="../../pcsx2/VMManager.cpp" line="3196"/>
<source>VU1 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="3199"/>
<location filename="../../pcsx2/VMManager.cpp" line="3203"/>
<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="3204"/>
<location filename="../../pcsx2/VMManager.cpp" line="3208"/>
<source>128MB RAM is enabled. Compatibility with some games may be affected.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3209"/>
<location filename="../../pcsx2/VMManager.cpp" line="3213"/>
<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="3214"/>
<location filename="../../pcsx2/VMManager.cpp" line="3218"/>
<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="3218"/>
<location filename="../../pcsx2/VMManager.cpp" line="3222"/>
<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="3220"/>
<location filename="../../pcsx2/VMManager.cpp" line="3224"/>
<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="3239"/>
<location filename="../../pcsx2/VMManager.cpp" line="3243"/>
<source>EE Recompiler is not enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3244"/>
<location filename="../../pcsx2/VMManager.cpp" line="3248"/>
<source>VU0 Recompiler is not enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3249"/>
<location filename="../../pcsx2/VMManager.cpp" line="3253"/>
<source>VU1 Recompiler is not enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3254"/>
<location filename="../../pcsx2/VMManager.cpp" line="3258"/>
<source>IOP Recompiler is not enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3259"/>
<location filename="../../pcsx2/VMManager.cpp" line="3263"/>
<source>EE Cache is enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3264"/>
<location filename="../../pcsx2/VMManager.cpp" line="3268"/>
<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="3269"/>
<location filename="../../pcsx2/VMManager.cpp" line="3273"/>
<source>INTC Spin Detection is not enabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3272"/>
<location filename="../../pcsx2/VMManager.cpp" line="3276"/>
<source>Fastmem is not enabled, this will reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3276"/>
<location filename="../../pcsx2/VMManager.cpp" line="3280"/>
<source>Instant VU1 is disabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3281"/>
<location filename="../../pcsx2/VMManager.cpp" line="3285"/>
<source>mVU Flag Hack is not enabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3135"/>
<location filename="../../pcsx2/VMManager.cpp" line="3139"/>
<source>GPU Palette Conversion is enabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3140"/>
<location filename="../../pcsx2/VMManager.cpp" line="3144"/>
<source>Texture Preloading is not Full, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3145"/>
<location filename="../../pcsx2/VMManager.cpp" line="3149"/>
<source>Estimate texture region is enabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3150"/>
<location filename="../../pcsx2/VMManager.cpp" line="3154"/>
<source>Texture dumping is enabled, this will continually dump textures to disk.</source>
<translation type="unfinished"></translation>
</message>