mirror of
https://github.com/mihawk-99/PS5_RetroArch.git
synced 2026-10-18 23:09:29 -05:00
Games: delete a game from the WebUI, with its disc tracks and its playlist entries
A game added twice (a CHD and an ISO of one disc) could not be removed from the library (issue 57). The game sheet's Files tab has a Delete game button, which calls POST /api/library/delete: the game's file (inside the content folder or a USB or extended drive only, as game_files allows), the files a .cue, .gdi or .m3u names in its own folder, and its entries in every playlist. Its details and media, keyed by its name, go only with the last copy of that name; an archive that holds other games is refused, with nothing changed. Saves and savestates stay. New texts in all 15 languages. Test: python3 -m unittest tests.test_scraper (15 OK; test_delete_game: the ISO goes and the CHD keeps the shared details, the last copy takes them, a cue's tracks go but a name outside its folder stays, a two-game archive is refused, a file outside content answers 404); tools/webui-strings.py --check: 821 strings, 0 problems. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
1 parent
67b7fed0ac
commit
1f4c78317a
21 files changed
+301
No files matched your search
@@ -2915,6 +2915,41 @@ bool edit_game(const std::string &system, const std::string &key, const std::str
|
||||
return false;
|
||||
}
|
||||
|
||||
bool forget_game(const std::string &system, const std::string &key, const std::string &path,
|
||||
std::string &why)
|
||||
{
|
||||
if (!safe_part(system) || !safe_part(key))
|
||||
{
|
||||
why = "Choose a game in the library.";
|
||||
return false;
|
||||
}
|
||||
std::lock_guard<std::mutex> guard(metadata_lock);
|
||||
const std::string file = path.substr(0, path.find('#'));
|
||||
bool shared_name = false;
|
||||
for (const auto &game : load_games())
|
||||
if (game.path != path)
|
||||
{
|
||||
if (game.path.substr(0, game.path.find('#')) == file)
|
||||
{
|
||||
why = "This archive holds other games too, so it was not deleted.";
|
||||
return false;
|
||||
}
|
||||
shared_name = shared_name || (game.system == system && game.key == key);
|
||||
}
|
||||
if (!edit_playlist_entries(path, [](Json &) { return false; }))
|
||||
{
|
||||
why = "A playlist could not be updated. Check console storage; nothing was deleted.";
|
||||
return false;
|
||||
}
|
||||
if (shared_name)
|
||||
return true; // the other copy keeps the shared details and media
|
||||
for (const auto &kind : kind_catalog)
|
||||
for (const char *ext : {".png", ".jpg", ".jpeg", ".webp", ".gif", ".mp4", ".webm", ".pdf"})
|
||||
unlink((library_root() + '/' + system + '/' + kind.folder + '/' + key + ext).c_str());
|
||||
unlink(meta_path(system, key).c_str());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool upload_target(const std::string &system, const std::string &key, const std::string &kind,
|
||||
const std::string &type, std::string &temporary, std::string &destination,
|
||||
std::string &why)
|
||||
|
||||
@@ -91,6 +91,11 @@ bool game_identity(const std::string &system, const std::string &game, const std
|
||||
std::string &core);
|
||||
bool edit_game(const std::string &system, const std::string &game, const std::string &body,
|
||||
std::string &why);
|
||||
/* A game file the WebUI is deleting (issue 57): its entries leave every playlist, and its
|
||||
* details and media go too unless another file of the same name (an ISO beside a CHD)
|
||||
* still uses them. The caller deletes the file itself afterwards. */
|
||||
bool forget_game(const std::string &system, const std::string &game, const std::string &path,
|
||||
std::string &why);
|
||||
/* A media file the user uploads for a game: where to write it (a hidden file beside its
|
||||
* final name); false with why for a type the frontends cannot show. Once committed,
|
||||
* uploaded() makes it the kind's only file and marks it the user's: no scrape replaces it. */
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <algorithm>
|
||||
#include <atomic>
|
||||
#include <arpa/inet.h>
|
||||
#include <cctype>
|
||||
#include <cerrno>
|
||||
#include <climits>
|
||||
#include <cmath>
|
||||
@@ -1439,6 +1440,72 @@ std::string game_files_json(const GameFiles &g)
|
||||
",\"stateFolder\":" + quote(g.state_folder) + ",\"stem\":" + quote(g.stem) +
|
||||
",\"core\":" + quote(g.core) + ",\"warning\":" + quote(g.why) + '}';
|
||||
}
|
||||
// The files a disc image names beside it: a .cue's or .gdi's tracks, an .m3u's discs and
|
||||
// their tracks, inside the image's own folder, so a deleted game leaves none behind.
|
||||
void disc_files(const std::string &image, std::vector<std::string> &out, int depth = 0)
|
||||
{
|
||||
const auto dot = image.find_last_of('.');
|
||||
std::string ext = dot == std::string::npos ? "" : image.substr(dot + 1);
|
||||
for (auto &ch : ext)
|
||||
ch = char(std::tolower((unsigned char)ch));
|
||||
if (depth > 2 || (ext != "cue" && ext != "gdi" && ext != "m3u"))
|
||||
return;
|
||||
const std::string folder = image.substr(0, image.find_last_of('/'));
|
||||
const std::string text = read_file(image, 1 << 20);
|
||||
size_t start = 0;
|
||||
for (int line_number = 0; start < text.size(); ++line_number)
|
||||
{
|
||||
size_t end = text.find('\n', start);
|
||||
if (end == std::string::npos)
|
||||
end = text.size();
|
||||
std::string line = text.substr(start, end - start);
|
||||
start = end + 1;
|
||||
while (!line.empty() && (line.back() == '\r' || line.back() == ' ' || line.back() == '\t'))
|
||||
line.pop_back();
|
||||
line.erase(0, line.find_first_not_of(" \t"));
|
||||
std::string name;
|
||||
if (ext == "m3u")
|
||||
name = line.empty() || line[0] == '#' ? "" : line;
|
||||
else
|
||||
{
|
||||
// .cue: FILE "track.bin" BINARY; .gdi: <n> <lba> <type> <size> <file> <offset>
|
||||
// after a first line holding the track count.
|
||||
size_t at = 0;
|
||||
if (ext == "cue")
|
||||
{
|
||||
if (line.compare(0, 5, "FILE ") != 0)
|
||||
continue;
|
||||
at = 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (line_number == 0)
|
||||
continue;
|
||||
for (int field = 0; field < 4 && at != std::string::npos; ++field)
|
||||
at = line.find_first_not_of(" \t", line.find_first_of(" \t", at));
|
||||
if (at == std::string::npos)
|
||||
continue;
|
||||
}
|
||||
if (at < line.size() && line[at] == '"')
|
||||
{
|
||||
const size_t close = line.find('"', at + 1);
|
||||
if (close != std::string::npos)
|
||||
name = line.substr(at + 1, close - at - 1);
|
||||
}
|
||||
else if (at < line.size())
|
||||
name = line.substr(at, line.find_first_of(" \t", at) - at);
|
||||
}
|
||||
if (name.empty() || name[0] == '/' || name.find("..") != std::string::npos)
|
||||
continue;
|
||||
const std::string path = folder + '/' + name;
|
||||
struct stat st{};
|
||||
if (std::find(out.begin(), out.end(), path) != out.end() || !game_safe_path(path) ||
|
||||
stat(path.c_str(), &st) != 0 || !S_ISREG(st.st_mode))
|
||||
continue;
|
||||
out.push_back(path);
|
||||
disc_files(path, out, depth + 1);
|
||||
}
|
||||
}
|
||||
bool game_file_target(MHD_Connection *c, const GameFiles &g, bool writing, std::string &target)
|
||||
{
|
||||
const std::string kind = arg(c, "kind"), selected = arg(c, "file");
|
||||
@@ -1808,6 +1875,30 @@ MHD_Result scraper_route(MHD_Connection *c, const std::string &url, const std::s
|
||||
r.temporary.clear();
|
||||
return respond(c, 201, "{\"stored\":true}");
|
||||
}
|
||||
// A game deleted from Games (issue 57): its file (an archive, or a disc image with the
|
||||
// tracks and discs it names), its playlist entries, and the details and media no
|
||||
// other copy uses. Only inside the content folder or a USB or extended drive.
|
||||
if (method == "POST" && url == "/api/library/delete")
|
||||
{
|
||||
GameFiles game;
|
||||
if (!game_files(c, game))
|
||||
return error(c, 404, game.why.c_str());
|
||||
const std::string path = arg(c, "path");
|
||||
std::vector<std::string> files{game.rom};
|
||||
if (path.find('#') == std::string::npos)
|
||||
disc_files(game.rom, files);
|
||||
if (!ps5_scraper::forget_game(arg(c, "system"), arg(c, "game"), path, why))
|
||||
return error(c, 409, why.c_str());
|
||||
unsigned left = 0;
|
||||
for (const auto &file : files)
|
||||
if (unlink(file.c_str()) != 0 && errno != ENOENT)
|
||||
++left;
|
||||
if (left)
|
||||
return error(c, 500,
|
||||
"The game left the library, but some of its files could not be deleted. "
|
||||
"Check console storage.");
|
||||
return respond(c, 200, "{\"deleted\":" + std::to_string(files.size()) + "}");
|
||||
}
|
||||
if (method == "POST" && url == "/api/library/game")
|
||||
return ps5_scraper::edit_game(arg(c, "system"), arg(c, "game"), r.body, why)
|
||||
? respond(c, 200, ps5_scraper::game_json(arg(c, "system"), arg(c, "game")))
|
||||
|
||||
@@ -544,6 +544,64 @@ class Scraper(unittest.TestCase):
|
||||
self.assertEqual(self.request('POST', '/api/library/game?' + query, json.dumps(metadata).encode())[0], 400)
|
||||
self.assertEqual(rom.read_bytes(), b'replacement')
|
||||
|
||||
def test_delete_game(self):
|
||||
"""Issue 57: a game deleted from Games takes its file, the tracks its disc file
|
||||
names and its playlist entries; details and media go only with the last copy of
|
||||
that name; an archive holding other games, or a name outside its folder, stays."""
|
||||
(self.root / 'info/snes9x_libretro.info').write_text(
|
||||
'display_name = "Snes9x"\ncorename = "Snes9x"\ndatabase = "' + DB + '"\nsupported_extensions = "sfc|smc|zip|cue|iso|chd"\n')
|
||||
folder = self.root / 'content/SNES'
|
||||
folder.mkdir(parents=True, exist_ok=True)
|
||||
games = dict(self.games, **{'Disc Game': '/app0/content/SNES/Disc Game.cue', 'Twin CHD': '/app0/content/SNES/Twin.chd',
|
||||
'Twin ISO': '/app0/content/SNES/Twin.iso', 'Pack A': '/app0/content/SNES/Pack.zip#a.sfc',
|
||||
'Pack B': '/app0/content/SNES/Pack.zip#b.sfc'})
|
||||
self.write_playlist(games)
|
||||
for path in games.values():
|
||||
(self.root / path.removeprefix('/app0/').split('#')[0]).write_bytes(b'backup')
|
||||
(folder / 'Disc Game.cue').write_text('FILE "Disc Game (Track 1).bin" BINARY\n TRACK 01 MODE2/2352\n'
|
||||
'FILE "Disc Game (Track 2).bin" BINARY\n TRACK 02 AUDIO\n'
|
||||
'FILE "../../config/keep.cfg" BINARY\n')
|
||||
tracks = [folder / 'Disc Game (Track 1).bin', folder / 'Disc Game (Track 2).bin']
|
||||
for track in tracks:
|
||||
track.write_bytes(b'track')
|
||||
keep = self.root / 'config/keep.cfg'
|
||||
keep.write_text('outside the content folder')
|
||||
meta = self.root / 'library/snes/metadata/Twin.meta'
|
||||
cover = self.root / 'library/snes/covers/Twin.png'
|
||||
for path in (meta, cover):
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
path.write_bytes(b'shared')
|
||||
|
||||
def delete(path):
|
||||
library = json.loads(self.request('GET', '/api/library')[1])
|
||||
system, game = next((s['id'], g) for s in library['systems'] for g in s['games'] if g['path'] == path)
|
||||
return self.request('POST', '/api/library/delete?' + urllib.parse.urlencode({'system': system, 'game': game['key'], 'path': path}))
|
||||
|
||||
def listed():
|
||||
return {item['path'] for item in json.loads((self.root / f'playlists/{DB}.lpl').read_text())['items']}
|
||||
|
||||
status, body = delete(games['Twin ISO'])
|
||||
self.assertEqual(status, 200, body)
|
||||
self.assertFalse((folder / 'Twin.iso').exists())
|
||||
self.assertTrue((folder / 'Twin.chd').exists() and meta.exists() and cover.exists())
|
||||
self.assertNotIn(games['Twin ISO'], listed())
|
||||
self.assertIn(games['Twin CHD'], listed())
|
||||
self.assertEqual(delete(games['Twin CHD'])[0], 200)
|
||||
self.assertFalse(meta.exists() or cover.exists())
|
||||
|
||||
self.assertEqual(delete(games['Disc Game'])[0], 200)
|
||||
self.assertFalse((folder / 'Disc Game.cue').exists() or any(t.exists() for t in tracks))
|
||||
self.assertTrue(keep.exists())
|
||||
|
||||
status, body = delete(games['Pack A'])
|
||||
self.assertEqual(status, 409, body)
|
||||
self.assertTrue((folder / 'Pack.zip').exists())
|
||||
self.assertTrue({games['Pack A'], games['Pack B']} <= listed())
|
||||
query = urllib.parse.urlencode({'system': 'snes', 'game': 'keep', 'path': '/app0/config/keep.cfg'})
|
||||
self.assertEqual(self.request('POST', '/api/library/delete?' + query)[0], 404)
|
||||
self.assertTrue(keep.exists())
|
||||
self.assertEqual(listed(), set(games.values()) - {games['Twin ISO'], games['Twin CHD'], games['Disc Game']})
|
||||
|
||||
def test_games_page_in_a_browser(self):
|
||||
playwright = next((str(p) for p in (Path.home() / '.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules/playwright-core',
|
||||
Path('/usr/lib/chatgpt/resources/cua_node/lib/node_modules/playwright-core')) if p.exists()),
|
||||
|
||||
@@ -1122,6 +1122,22 @@ async function loadSheetFiles() {
|
||||
});
|
||||
actions.append(upload, download, input); group.append(select, destination, preview, slotLabel, actions, status); box.append(group);
|
||||
}
|
||||
// Deleting a game (issue 57): the backup and the tracks its disc file names, and its
|
||||
// place in RetroArch and EmulationStation; saves and savestates stay.
|
||||
const removal = element('section', undefined, 'sheet-file-group'), removeActions = element('div', undefined, 'sheet-actions');
|
||||
const remove = element('button', 'Delete game…', 'secondary'), removeStatus = element('p', '', 'sheet-status');
|
||||
remove.type = 'button'; removeStatus.setAttribute('role', 'status'); removeActions.append(remove);
|
||||
removal.append(element('h4', 'Delete game'), element('p', 'Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.', 'muted sheet-hint'), removeActions, removeStatus);
|
||||
remove.addEventListener('click', async () => {
|
||||
if (sheetBusy || !confirm(i18n.t(`Delete ${data.rom.name} from your PS5?`) + '\n\n' + i18n.t('This cannot be undone. Export the backup first if you need a copy.'))) return;
|
||||
sheetBusy = true; remove.disabled = true;
|
||||
try {
|
||||
await api(`/api/library/delete?${sheetQuery(context)}`, { method: 'POST' });
|
||||
sheetBusy = false; $('#game-sheet').close(); announce(`${gameName(context.game)} deleted.`); await loadGames();
|
||||
} catch (error) { removeStatus.textContent = error.message; removeStatus.classList.add('inline-error'); }
|
||||
finally { sheetBusy = false; remove.disabled = false; }
|
||||
});
|
||||
box.append(removal);
|
||||
box.append(element('p', 'File transfers preserve bytes; they do not convert save formats. Cores with private save directories and multi-file disc sets may need the Content browser or FTP.', 'muted sheet-hint'));
|
||||
} catch (error) { if (sheetGame === context) box.replaceChildren(element('p', error.message, 'inline-error')); }
|
||||
}
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "Aktuell: {0}",
|
||||
"Dark": "Dunkel",
|
||||
"Delete": "Löschen",
|
||||
"Delete game": "Spiel löschen",
|
||||
"Delete game…": "Spiel löschen…",
|
||||
"Delete the tile {0}?": "Kachel {0} löschen?",
|
||||
"Delete {0} from your PS5?": "{0} von deiner PS5 löschen?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "Löscht diese Sicherung von deiner PS5, samt den Track-Dateien ihrer Disc, und entfernt sie aus RetroArch und EmulationStation. Spielstände und Savestates bleiben erhalten. Schließe das Spiel vorher auf der Konsole.",
|
||||
"Descending": "Absteigend",
|
||||
"Description": "Beschreibung",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "Beschreibung, Entwickler, Publisher, Erscheinungsdatum, Genre, Spieler und Bewertung, angezeigt in EmulationStation und hier bei jedem Spiel.",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "Der Upload ist fehlgeschlagen ({0}). Versuche es erneut.",
|
||||
"These cores run most games without them.": "Diese Cores starten die meisten Spiele auch ohne sie.",
|
||||
"This PC → PS5": "Dieser PC → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "Das kann nicht rückgängig gemacht werden. Exportiere die Sicherung vorher, wenn du eine Kopie brauchst.",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "Dieser Core liefert die verfügbaren Optionen, aber keine Erklärung zu dieser Option. Behalte den aktuellen Wert, außer du weißt, welche Änderung du brauchst.",
|
||||
"This folder is empty. Upload files here to get started.": "Dieser Ordner ist leer. Lade hier Dateien hoch, um zu beginnen.",
|
||||
"This picture could not be drawn. Choose another one.": "Dieses Bild konnte nicht gezeichnet werden. Wähle ein anderes.",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "nichts fehlt, was es hat",
|
||||
"or click to browse": "oder zum Suchen klicken",
|
||||
"{0} additional {1} available in Advanced.": "{0} weitere {1} unter Erweitert.",
|
||||
"{0} deleted.": "{0} gelöscht.",
|
||||
"{0} does not offer {1}.": "{0} bietet kein {1}.",
|
||||
"{0} file": "{0} Datei",
|
||||
"{0} files · {1}": "{0} Dateien · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "Actual: {0}",
|
||||
"Dark": "Oscuro",
|
||||
"Delete": "Eliminar",
|
||||
"Delete game": "Eliminar juego",
|
||||
"Delete game…": "Eliminar juego…",
|
||||
"Delete the tile {0}?": "¿Eliminar el icono {0}?",
|
||||
"Delete {0} from your PS5?": "¿Eliminar {0} de tu PS5?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "Elimina esta copia de seguridad de tu PS5, junto con los archivos de pistas de su disco, y la quita de RetroArch y EmulationStation. Las partidas guardadas y los savestates se conservan. Cierra antes el juego en la consola.",
|
||||
"Descending": "Descendente",
|
||||
"Description": "Descripción",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "Descripción, desarrollador, editor, fecha de lanzamiento, género, jugadores y valoración, mostrados en EmulationStation y en cada juego aquí.",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "La subida falló ({0}). Inténtalo de nuevo.",
|
||||
"These cores run most games without them.": "Estos núcleos ejecutan la mayoría de los juegos sin ellos.",
|
||||
"This PC → PS5": "Este PC → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "Esto no se puede deshacer. Exporta antes la copia de seguridad si necesitas conservarla.",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "Este núcleo ofrece las opciones disponibles pero ninguna explicación para esta opción. Mantén su valor actual salvo que sepas qué cambio necesitas.",
|
||||
"This folder is empty. Upload files here to get started.": "Esta carpeta está vacía. Sube archivos aquí para empezar.",
|
||||
"This picture could not be drawn. Choose another one.": "No se pudo dibujar esta imagen. Elige otra.",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "no falta nada de lo que ofrece",
|
||||
"or click to browse": "o haz clic para explorar",
|
||||
"{0} additional {1} available in Advanced.": "{0} {1} adicionales en Avanzado.",
|
||||
"{0} deleted.": "{0} eliminado.",
|
||||
"{0} does not offer {1}.": "{0} no ofrece {1}.",
|
||||
"{0} file": "{0} archivo",
|
||||
"{0} files · {1}": "{0} archivos · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "Actuel : {0}",
|
||||
"Dark": "Sombre",
|
||||
"Delete": "Supprimer",
|
||||
"Delete game": "Supprimer le jeu",
|
||||
"Delete game…": "Supprimer le jeu…",
|
||||
"Delete the tile {0}?": "Supprimer la vignette {0} ?",
|
||||
"Delete {0} from your PS5?": "Supprimer {0} de votre PS5 ?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "Supprime cette sauvegarde de votre PS5, avec les fichiers de pistes de son disque, et la retire de RetroArch et d’EmulationStation. Les sauvegardes et les savestates sont conservés. Fermez d’abord le jeu sur la console.",
|
||||
"Descending": "Décroissant",
|
||||
"Description": "Description",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "Description, développeur, éditeur, date de sortie, genre, joueurs et note, affichés dans EmulationStation et sur chaque jeu ici.",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "L’envoi a échoué ({0}). Réessayez.",
|
||||
"These cores run most games without them.": "Ces cœurs lancent la plupart des jeux sans eux.",
|
||||
"This PC → PS5": "Ce PC → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "Cette action est irréversible. Exportez d’abord la sauvegarde si vous voulez en garder une copie.",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "Ce cœur fournit les choix disponibles mais aucune explication pour cette option. Gardez sa valeur actuelle sauf si vous savez quelle modification il vous faut.",
|
||||
"This folder is empty. Upload files here to get started.": "Ce dossier est vide. Envoyez des fichiers ici pour commencer.",
|
||||
"This picture could not be drawn. Choose another one.": "Cette image n’a pas pu être dessinée. Choisissez-en une autre.",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "rien de ce qu’elle propose ne manque",
|
||||
"or click to browse": "ou cliquez pour parcourir",
|
||||
"{0} additional {1} available in Advanced.": "{0} {1} supplémentaire(s) dans Avancé.",
|
||||
"{0} deleted.": "{0} supprimé.",
|
||||
"{0} does not offer {1}.": "{0} ne propose pas {1}.",
|
||||
"{0} file": "{0} fichier",
|
||||
"{0} files · {1}": "{0} fichiers · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "Saat ini: {0}",
|
||||
"Dark": "Gelap",
|
||||
"Delete": "Hapus",
|
||||
"Delete game": "Hapus game",
|
||||
"Delete game…": "Hapus game…",
|
||||
"Delete the tile {0}?": "Hapus ikon {0}?",
|
||||
"Delete {0} from your PS5?": "Hapus {0} dari PS5 Anda?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "Menghapus cadangan ini dari PS5 Anda, beserta file trek disknya, dan menghapusnya dari RetroArch dan EmulationStation. Simpanan dan savestate tetap disimpan. Tutup dulu game-nya di konsol.",
|
||||
"Descending": "Turun",
|
||||
"Description": "Deskripsi",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "Deskripsi, pengembang, penerbit, tanggal rilis, genre, pemain, dan rating, ditampilkan di EmulationStation dan di setiap game di sini.",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "Unggahan gagal ({0}). Coba lagi.",
|
||||
"These cores run most games without them.": "Core ini menjalankan sebagian besar game tanpanya.",
|
||||
"This PC → PS5": "PC ini → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "Tindakan ini tidak dapat dibatalkan. Ekspor cadangannya dulu jika Anda memerlukan salinan.",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "Core ini menyediakan pilihan yang tersedia tetapi tanpa penjelasan untuk opsi ini. Pertahankan nilai saat ini kecuali Anda tahu perubahan yang diperlukan.",
|
||||
"This folder is empty. Upload files here to get started.": "Folder ini kosong. Unggah berkas ke sini untuk memulai.",
|
||||
"This picture could not be drawn. Choose another one.": "Gambar ini tidak dapat digambar. Pilih gambar lain.",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "tidak ada yang kurang dari yang dimilikinya",
|
||||
"or click to browse": "atau klik untuk menelusuri",
|
||||
"{0} additional {1} available in Advanced.": "{0} {1} tambahan tersedia di Lanjutan.",
|
||||
"{0} deleted.": "{0} dihapus.",
|
||||
"{0} does not offer {1}.": "{0} tidak menyediakan {1}.",
|
||||
"{0} file": "Berkas {0}",
|
||||
"{0} files · {1}": "{0} berkas · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "Attuale: {0}",
|
||||
"Dark": "Scuro",
|
||||
"Delete": "Elimina",
|
||||
"Delete game": "Elimina gioco",
|
||||
"Delete game…": "Elimina gioco…",
|
||||
"Delete the tile {0}?": "Eliminare il riquadro {0}?",
|
||||
"Delete {0} from your PS5?": "Eliminare {0} dalla tua PS5?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "Elimina questo backup dalla tua PS5, insieme ai file delle tracce del suo disco, e lo rimuove da RetroArch ed EmulationStation. I salvataggi e i savestate restano. Chiudi prima il gioco sulla console.",
|
||||
"Descending": "Decrescente",
|
||||
"Description": "Descrizione",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "Descrizione, sviluppatore, editore, data di uscita, genere, giocatori e valutazione, mostrati in EmulationStation e su ogni gioco qui.",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "Il caricamento non è riuscito ({0}). Riprova.",
|
||||
"These cores run most games without them.": "Questi core avviano la maggior parte dei giochi anche senza.",
|
||||
"This PC → PS5": "Questo PC → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "L’operazione non può essere annullata. Esporta prima il backup se ti serve una copia.",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "Questo core fornisce le scelte disponibili ma nessuna spiegazione per questa opzione. Mantieni il valore attuale salvo che tu sappia quale modifica ti serve.",
|
||||
"This folder is empty. Upload files here to get started.": "Questa cartella è vuota. Carica qui dei file per iniziare.",
|
||||
"This picture could not be drawn. Choose another one.": "Impossibile disegnare questa immagine. Scegline un'altra.",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "non manca nulla di ciò che offre",
|
||||
"or click to browse": "o fai clic per sfogliare",
|
||||
"{0} additional {1} available in Advanced.": "{0} {1} aggiuntivi in Avanzate.",
|
||||
"{0} deleted.": "{0} eliminato.",
|
||||
"{0} does not offer {1}.": "{0} non offre {1}.",
|
||||
"{0} file": "{0} file",
|
||||
"{0} files · {1}": "{0} file · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "現在:{0}",
|
||||
"Dark": "ダーク",
|
||||
"Delete": "削除",
|
||||
"Delete game": "ゲームを削除",
|
||||
"Delete game…": "ゲームを削除…",
|
||||
"Delete the tile {0}?": "アイコン {0} を削除しますか?",
|
||||
"Delete {0} from your PS5?": "PS5 から {0} を削除しますか?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "このバックアップを、ディスクのトラックファイルとともに PS5 から削除し、RetroArch と EmulationStation からも取り除きます。セーブデータとステートセーブは残ります。先に本体でゲームを終了してください。",
|
||||
"Descending": "降順",
|
||||
"Description": "説明",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "説明、開発元、発売元、発売日、ジャンル、プレイ人数、評価。EmulationStation とここの各ゲームに表示されます。",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "アップロードに失敗しました({0})。もう一度お試しください。",
|
||||
"These cores run most games without them.": "これらのコアは、それがなくてもほとんどのゲームを実行できます。",
|
||||
"This PC → PS5": "この PC → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "この操作は元に戻せません。コピーが必要な場合は、先にバックアップをエクスポートしてください。",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "このコアは選択肢を提供していますが、このオプションの説明はありません。必要な変更がわかっている場合を除き、現在の値のままにしてください。",
|
||||
"This folder is empty. Upload files here to get started.": "このフォルダは空です。ここにファイルをアップロードして始めましょう。",
|
||||
"This picture could not be drawn. Choose another one.": "この画像を描画できませんでした。別の画像を選んでください。",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "提供されるものに不足なし",
|
||||
"or click to browse": "またはクリックして選択",
|
||||
"{0} additional {1} available in Advanced.": "ほかに {0} 件の{1}が「詳細」にあります。",
|
||||
"{0} deleted.": "{0} を削除しました。",
|
||||
"{0} does not offer {1}.": "{0} は {1} を提供していません。",
|
||||
"{0} file": "{0} ファイル",
|
||||
"{0} files · {1}": "{0} ファイル · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "현재: {0}",
|
||||
"Dark": "어둡게",
|
||||
"Delete": "삭제",
|
||||
"Delete game": "게임 삭제",
|
||||
"Delete game…": "게임 삭제…",
|
||||
"Delete the tile {0}?": "아이콘 {0}을(를) 삭제할까요?",
|
||||
"Delete {0} from your PS5?": "PS5에서 {0}을(를) 삭제할까요?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "이 백업을 디스크의 트랙 파일과 함께 PS5에서 삭제하고 RetroArch와 EmulationStation에서도 제거합니다. 저장 파일과 세이브 스테이트는 유지됩니다. 먼저 본체에서 게임을 종료하세요.",
|
||||
"Descending": "내림차순",
|
||||
"Description": "설명",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "설명, 개발사, 배급사, 출시일, 장르, 플레이어 수, 평점. EmulationStation과 여기의 각 게임에 표시됩니다.",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "업로드에 실패했습니다({0}). 다시 시도하세요.",
|
||||
"These cores run most games without them.": "이 코어들은 그것 없이도 대부분의 게임을 실행합니다.",
|
||||
"This PC → PS5": "이 PC → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "이 작업은 되돌릴 수 없습니다. 사본이 필요하면 먼저 백업을 내보내세요.",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "이 코어는 선택지를 제공하지만 이 옵션에 대한 설명은 없습니다. 필요한 변경을 알고 있지 않다면 현재 값을 유지하세요.",
|
||||
"This folder is empty. Upload files here to get started.": "이 폴더는 비어 있습니다. 여기에 파일을 업로드해 시작하세요.",
|
||||
"This picture could not be drawn. Choose another one.": "이 이미지를 그릴 수 없습니다. 다른 이미지를 선택하세요.",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "제공하는 것 중 빠진 것 없음",
|
||||
"or click to browse": "또는 클릭해 찾아보기",
|
||||
"{0} additional {1} available in Advanced.": "고급에 {1} {0}개 더 있음.",
|
||||
"{0} deleted.": "{0}을(를) 삭제했습니다.",
|
||||
"{0} does not offer {1}.": "{0}은(는) {1}을(를) 제공하지 않습니다.",
|
||||
"{0} file": "{0} 파일",
|
||||
"{0} files · {1}": "파일 {0}개 · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "Huidig: {0}",
|
||||
"Dark": "Donker",
|
||||
"Delete": "Verwijderen",
|
||||
"Delete game": "Game verwijderen",
|
||||
"Delete game…": "Game verwijderen…",
|
||||
"Delete the tile {0}?": "Tegel {0} verwijderen?",
|
||||
"Delete {0} from your PS5?": "{0} van je PS5 verwijderen?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "Verwijdert deze back-up van je PS5, samen met de trackbestanden van de disc, en haalt hem uit RetroArch en EmulationStation. Opslagbestanden en savestates blijven bewaard. Sluit de game eerst af op de console.",
|
||||
"Descending": "Aflopend",
|
||||
"Description": "Beschrijving",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "Beschrijving, ontwikkelaar, uitgever, releasedatum, genre, spelers en beoordeling, getoond in EmulationStation en bij elke game hier.",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "De upload is mislukt ({0}). Probeer het opnieuw.",
|
||||
"These cores run most games without them.": "Deze cores draaien de meeste games ook zonder.",
|
||||
"This PC → PS5": "Deze pc → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "Dit kan niet ongedaan worden gemaakt. Exporteer de back-up eerst als je een kopie nodig hebt.",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "Deze core biedt de beschikbare keuzes maar geen uitleg voor deze optie. Houd de huidige waarde aan tenzij je weet welke wijziging je nodig hebt.",
|
||||
"This folder is empty. Upload files here to get started.": "Deze map is leeg. Upload hier bestanden om te beginnen.",
|
||||
"This picture could not be drawn. Choose another one.": "Deze afbeelding kon niet worden getekend. Kies een andere.",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "er ontbreekt niets van wat het heeft",
|
||||
"or click to browse": "of klik om te bladeren",
|
||||
"{0} additional {1} available in Advanced.": "Nog {0} extra {1} in Geavanceerd.",
|
||||
"{0} deleted.": "{0} verwijderd.",
|
||||
"{0} does not offer {1}.": "{0} biedt geen {1}.",
|
||||
"{0} file": "{0}-bestand",
|
||||
"{0} files · {1}": "{0} bestanden · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "Obecnie: {0}",
|
||||
"Dark": "Ciemny",
|
||||
"Delete": "Usuń",
|
||||
"Delete game": "Usuń grę",
|
||||
"Delete game…": "Usuń grę…",
|
||||
"Delete the tile {0}?": "Usunąć kafelek {0}?",
|
||||
"Delete {0} from your PS5?": "Usunąć {0} z PS5?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "Usuwa tę kopię zapasową z PS5 razem z plikami ścieżek jej płyty oraz usuwa ją z RetroArch i EmulationStation. Zapisy i stany gry zostają. Najpierw zamknij grę na konsoli.",
|
||||
"Descending": "Malejąco",
|
||||
"Description": "Opis",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "Opis, twórca, wydawca, data wydania, gatunek, liczba graczy i ocena — wyświetlane w EmulationStation i przy każdej grze tutaj.",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "Wysyłanie nie powiodło się ({0}). Spróbuj ponownie.",
|
||||
"These cores run most games without them.": "Te rdzenie uruchamiają większość gier bez nich.",
|
||||
"This PC → PS5": "Ten komputer → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "Tej operacji nie można cofnąć. Jeśli potrzebujesz kopii, najpierw wyeksportuj kopię zapasową.",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "Ten rdzeń podaje dostępne opcje, ale nie wyjaśnia tej opcji. Zachowaj bieżącą wartość, chyba że wiesz, jakiej zmiany potrzebujesz.",
|
||||
"This folder is empty. Upload files here to get started.": "Ten folder jest pusty. Wyślij tu pliki, aby zacząć.",
|
||||
"This picture could not be drawn. Choose another one.": "Nie udało się narysować tego obrazu. Wybierz inny.",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "nie brakuje niczego, co oferuje",
|
||||
"or click to browse": "lub kliknij, aby przeglądać",
|
||||
"{0} additional {1} available in Advanced.": "Dodatkowe: {0} {1} w Zaawansowanych.",
|
||||
"{0} deleted.": "Usunięto {0}.",
|
||||
"{0} does not offer {1}.": "{0} nie oferuje: {1}.",
|
||||
"{0} file": "Plik {0}",
|
||||
"{0} files · {1}": "Pliki: {0} · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "Atual: {0}",
|
||||
"Dark": "Escuro",
|
||||
"Delete": "Excluir",
|
||||
"Delete game": "Excluir jogo",
|
||||
"Delete game…": "Excluir jogo…",
|
||||
"Delete the tile {0}?": "Excluir o ícone {0}?",
|
||||
"Delete {0} from your PS5?": "Excluir {0} do seu PS5?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "Exclui este backup do seu PS5, junto com os arquivos de faixas do disco, e o remove do RetroArch e do EmulationStation. Os saves e os savestates são mantidos. Feche o jogo no console antes.",
|
||||
"Descending": "Decrescente",
|
||||
"Description": "Descrição",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "Descrição, desenvolvedora, editora, data de lançamento, gênero, jogadores e avaliação, mostrados no EmulationStation e em cada jogo aqui.",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "O envio falhou ({0}). Tente de novo.",
|
||||
"These cores run most games without them.": "Esses cores rodam a maioria dos jogos sem eles.",
|
||||
"This PC → PS5": "Este PC → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "Isso não pode ser desfeito. Exporte o backup antes se precisar de uma cópia.",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "Este core fornece as opções disponíveis, mas nenhuma explicação para esta opção. Mantenha o valor atual, a menos que saiba qual mudança precisa.",
|
||||
"This folder is empty. Upload files here to get started.": "Esta pasta está vazia. Envie arquivos aqui para começar.",
|
||||
"This picture could not be drawn. Choose another one.": "Não foi possível desenhar esta imagem. Escolha outra.",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "não falta nada que ele tenha",
|
||||
"or click to browse": "ou clique para procurar",
|
||||
"{0} additional {1} available in Advanced.": "{0} {1} extras disponíveis em Avançado.",
|
||||
"{0} deleted.": "{0} excluído.",
|
||||
"{0} does not offer {1}.": "{0} não oferece {1}.",
|
||||
"{0} file": "{0} arquivo",
|
||||
"{0} files · {1}": "{0} arquivos · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "Сейчас: {0}",
|
||||
"Dark": "Тёмная",
|
||||
"Delete": "Удалить",
|
||||
"Delete game": "Удалить игру",
|
||||
"Delete game…": "Удалить игру…",
|
||||
"Delete the tile {0}?": "Удалить плитку {0}?",
|
||||
"Delete {0} from your PS5?": "Удалить {0} с PS5?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "Удаляет эту резервную копию с PS5 вместе с файлами дорожек её диска и убирает её из RetroArch и EmulationStation. Сохранения и сохранённые состояния остаются. Сначала закройте игру на консоли.",
|
||||
"Descending": "По убыванию",
|
||||
"Description": "Описание",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "Описание, разработчик, издатель, дата выхода, жанр, игроки и рейтинг — показываются в EmulationStation и у каждой игры здесь.",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "Отправка не удалась ({0}). Повторите попытку.",
|
||||
"These cores run most games without them.": "Эти ядра запускают большинство игр и без них.",
|
||||
"This PC → PS5": "Этот ПК → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "Это действие нельзя отменить. Если нужна копия, сначала экспортируйте резервную копию.",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "Это ядро предоставляет варианты, но не объясняет этот параметр. Оставьте текущее значение, если не знаете, какое изменение вам нужно.",
|
||||
"This folder is empty. Upload files here to get started.": "Эта папка пуста. Отправьте сюда файлы, чтобы начать.",
|
||||
"This picture could not be drawn. Choose another one.": "Не удалось нарисовать это изображение. Выберите другое.",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "ничего из того, что у него есть, не отсутствует",
|
||||
"or click to browse": "или нажмите для выбора",
|
||||
"{0} additional {1} available in Advanced.": "Ещё {0} {1} в разделе «Расширенные».",
|
||||
"{0} deleted.": "{0}: удалено.",
|
||||
"{0} does not offer {1}.": "{0} не предлагает {1}.",
|
||||
"{0} file": "Файл {0}",
|
||||
"{0} files · {1}": "Файлов: {0} · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}",
|
||||
"Dark",
|
||||
"Delete",
|
||||
"Delete game",
|
||||
"Delete game…",
|
||||
"Delete the tile {0}?",
|
||||
"Delete {0} from your PS5?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.",
|
||||
"Descending",
|
||||
"Description",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.",
|
||||
"These cores run most games without them.",
|
||||
"This PC → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.",
|
||||
"This folder is empty. Upload files here to get started.",
|
||||
"This picture could not be drawn. Choose another one.",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has",
|
||||
"or click to browse",
|
||||
"{0} additional {1} available in Advanced.",
|
||||
"{0} deleted.",
|
||||
"{0} does not offer {1}.",
|
||||
"{0} file",
|
||||
"{0} files · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "Geçerli: {0}",
|
||||
"Dark": "Koyu",
|
||||
"Delete": "Sil",
|
||||
"Delete game": "Oyunu sil",
|
||||
"Delete game…": "Oyunu sil…",
|
||||
"Delete the tile {0}?": "{0} simgesi silinsin mi?",
|
||||
"Delete {0} from your PS5?": "{0} PS5’inizden silinsin mi?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "Bu yedeği, diskinin parça dosyalarıyla birlikte PS5’inizden siler ve RetroArch ile EmulationStation’dan kaldırır. Kayıtlar ve durum kayıtları korunur. Önce oyunu konsolda kapatın.",
|
||||
"Descending": "Azalan",
|
||||
"Description": "Açıklama",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "Açıklama, geliştirici, yayıncı, çıkış tarihi, tür, oyuncu sayısı ve puan; EmulationStation'da ve buradaki her oyunda gösterilir.",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "Yükleme başarısız oldu ({0}). Tekrar deneyin.",
|
||||
"These cores run most games without them.": "Bu çekirdekler çoğu oyunu onlar olmadan da çalıştırır.",
|
||||
"This PC → PS5": "Bu PC → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "Bu işlem geri alınamaz. Bir kopyaya ihtiyacınız varsa önce yedeği dışa aktarın.",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "Bu çekirdek mevcut seçenekleri sunuyor ama bu seçenek için açıklama vermiyor. Hangi değişikliğe ihtiyacınız olduğunu bilmiyorsanız geçerli değeri koruyun.",
|
||||
"This folder is empty. Upload files here to get started.": "Bu klasör boş. Başlamak için buraya dosya yükleyin.",
|
||||
"This picture could not be drawn. Choose another one.": "Bu görsel çizilemedi. Başka bir görsel seçin.",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "sunduklarından eksik yok",
|
||||
"or click to browse": "veya göz atmak için tıklayın",
|
||||
"{0} additional {1} available in Advanced.": "Gelişmiş'te {0} ek {1} var.",
|
||||
"{0} deleted.": "{0} silindi.",
|
||||
"{0} does not offer {1}.": "{0}, {1} sunmuyor.",
|
||||
"{0} file": "{0} dosyası",
|
||||
"{0} files · {1}": "{0} dosya · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "Hiện tại: {0}",
|
||||
"Dark": "Tối",
|
||||
"Delete": "Xóa",
|
||||
"Delete game": "Xóa trò chơi",
|
||||
"Delete game…": "Xóa trò chơi…",
|
||||
"Delete the tile {0}?": "Xóa biểu tượng {0}?",
|
||||
"Delete {0} from your PS5?": "Xóa {0} khỏi PS5 của bạn?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "Xóa bản sao lưu này khỏi PS5 của bạn, cùng các tệp track của đĩa, và gỡ nó khỏi RetroArch và EmulationStation. Dữ liệu lưu và savestate vẫn được giữ. Hãy đóng trò chơi trên máy trước.",
|
||||
"Descending": "Giảm dần",
|
||||
"Description": "Mô tả",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "Mô tả, nhà phát triển, nhà phát hành, ngày phát hành, thể loại, số người chơi và đánh giá, hiển thị trong EmulationStation và trên từng trò chơi ở đây.",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "Tải lên thất bại ({0}). Hãy thử lại.",
|
||||
"These cores run most games without them.": "Các core này chạy hầu hết trò chơi mà không cần chúng.",
|
||||
"This PC → PS5": "PC này → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "Không thể hoàn tác thao tác này. Hãy xuất bản sao lưu trước nếu bạn cần một bản sao.",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "Core này cung cấp các lựa chọn nhưng không giải thích tùy chọn này. Giữ giá trị hiện tại trừ khi bạn biết mình cần thay đổi gì.",
|
||||
"This folder is empty. Upload files here to get started.": "Thư mục này trống. Tải tệp lên đây để bắt đầu.",
|
||||
"This picture could not be drawn. Choose another one.": "Không thể vẽ hình này. Hãy chọn hình khác.",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "không thiếu gì mà nó có",
|
||||
"or click to browse": "hoặc nhấn để duyệt",
|
||||
"{0} additional {1} available in Advanced.": "Còn {0} {1} trong Nâng cao.",
|
||||
"{0} deleted.": "Đã xóa {0}.",
|
||||
"{0} does not offer {1}.": "{0} không cung cấp {1}.",
|
||||
"{0} file": "Tệp {0}",
|
||||
"{0} files · {1}": "{0} tệp · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "当前:{0}",
|
||||
"Dark": "深色",
|
||||
"Delete": "删除",
|
||||
"Delete game": "删除游戏",
|
||||
"Delete game…": "删除游戏…",
|
||||
"Delete the tile {0}?": "删除图标 {0}?",
|
||||
"Delete {0} from your PS5?": "要从 PS5 删除 {0} 吗?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "从 PS5 删除此备份及其光盘的音轨文件,并将其从 RetroArch 和 EmulationStation 中移除。存档和即时存档会保留。请先在主机上关闭游戏。",
|
||||
"Descending": "降序",
|
||||
"Description": "简介",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "简介、开发商、发行商、发行日期、类型、玩家人数和评分,显示在 EmulationStation 和这里的每个游戏中。",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "上传失败({0})。请重试。",
|
||||
"These cores run most games without them.": "这些核心在没有它们的情况下也能运行大多数游戏。",
|
||||
"This PC → PS5": "这台电脑 → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "此操作无法撤销。如需保留副本,请先导出备份。",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "此核心提供了可选值,但没有对此选项的说明。除非你知道需要怎样的更改,否则请保持当前值。",
|
||||
"This folder is empty. Upload files here to get started.": "此文件夹为空。上传文件到这里即可开始。",
|
||||
"This picture could not be drawn. Choose another one.": "无法绘制这张图片。请选择另一张。",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "它提供的内容没有缺失",
|
||||
"or click to browse": "或点击浏览",
|
||||
"{0} additional {1} available in Advanced.": "“高级”中还有 {0} 个{1}。",
|
||||
"{0} deleted.": "已删除 {0}。",
|
||||
"{0} does not offer {1}.": "{0} 不提供{1}。",
|
||||
"{0} file": "{0} 文件",
|
||||
"{0} files · {1}": "{0} 个文件 · {1}",
|
||||
|
||||
@@ -169,7 +169,11 @@
|
||||
"Current: {0}": "目前:{0}",
|
||||
"Dark": "深色",
|
||||
"Delete": "刪除",
|
||||
"Delete game": "刪除遊戲",
|
||||
"Delete game…": "刪除遊戲…",
|
||||
"Delete the tile {0}?": "刪除圖示 {0}?",
|
||||
"Delete {0} from your PS5?": "要從 PS5 刪除 {0} 嗎?",
|
||||
"Deletes this backup from your PS5, with its disc’s track files, and removes it from RetroArch and EmulationStation. Saves and savestates are kept. Close the game on the console first.": "從 PS5 刪除此備份及其光碟的音軌檔案,並將其從 RetroArch 和 EmulationStation 中移除。存檔和即時存檔會保留。請先在主機上關閉遊戲。",
|
||||
"Descending": "遞減",
|
||||
"Description": "簡介",
|
||||
"Description, developer, publisher, release date, genre, players and rating, shown in EmulationStation and on each game here.": "簡介、開發商、發行商、發行日期、類型、玩家人數與評分,顯示在 EmulationStation 與這裡的每個遊戲中。",
|
||||
@@ -681,6 +685,7 @@
|
||||
"The upload failed ({0}). Try again.": "上傳失敗({0})。請重試。",
|
||||
"These cores run most games without them.": "這些核心在沒有它們的情況下也能執行大多數遊戲。",
|
||||
"This PC → PS5": "這台電腦 → PS5",
|
||||
"This cannot be undone. Export the backup first if you need a copy.": "此操作無法復原。如需保留副本,請先匯出備份。",
|
||||
"This core provides the available choices but no explanation for this option. Keep its current value unless you know the change you need.": "此核心提供了可選值,但沒有此選項的說明。除非你知道需要怎樣的變更,否則請保持目前的值。",
|
||||
"This folder is empty. Upload files here to get started.": "此資料夾是空的。上傳檔案到這裡即可開始。",
|
||||
"This picture could not be drawn. Choose another one.": "無法繪製這張圖片。請選擇另一張。",
|
||||
@@ -781,6 +786,7 @@
|
||||
"nothing missing it has": "它提供的內容沒有缺漏",
|
||||
"or click to browse": "或點選瀏覽",
|
||||
"{0} additional {1} available in Advanced.": "「進階」中還有 {0} 個{1}。",
|
||||
"{0} deleted.": "已刪除 {0}。",
|
||||
"{0} does not offer {1}.": "{0} 不提供{1}。",
|
||||
"{0} file": "{0} 檔案",
|
||||
"{0} files · {1}": "{0} 個檔案 · {1}",
|
||||
|
||||
Reference in new issue
Block a user