Merge pull request #2710 from Slabak007/Console-Locale

Console locale
This commit is contained in:
Georges-Antoine Assi
2025-11-21 12:36:58 -05:00
committed by GitHub
22 changed files with 759 additions and 59 deletions

View File

@@ -7,6 +7,7 @@ import {
useTemplateRef,
watch,
} from "vue";
import { useI18n } from "vue-i18n";
import {
collectionElementRegistry,
smartCollectionElementRegistry,
@@ -20,6 +21,7 @@ import {
EXTENSION_REGEX,
} from "@/utils/covers";
const { t } = useI18n();
const props = defineProps<{
collection: CollectionType;
index: number;
@@ -229,7 +231,7 @@ onMounted(() => {
class="text-xs opacity-90"
:style="{ color: 'var(--console-collection-card-text)' }"
>
{{ collection.rom_count || 0 }} games
{{ t("console.games-n", collection.rom_count || 0) }}
</div>
</div>
</div>

View File

@@ -1,5 +1,6 @@
<script setup lang="ts">
import { computed, onMounted, onUnmounted, ref } from "vue";
import { useI18n } from "vue-i18n";
import ArrowKeysIcon from "./icons/ArrowKeysIcon.vue";
import DPadIcon from "./icons/DPadIcon.vue";
import FaceButtons from "./icons/FaceButtons.vue";
@@ -24,6 +25,7 @@ const props = withDefaults(defineProps<Props>(), {
isModal: false,
});
const { t } = useI18n();
const hasController = ref(false);
let rafId = 0;
@@ -83,54 +85,78 @@ onUnmounted(() => {
<template v-if="hasController">
<div v-if="showNavigation" class="flex items-center gap-2">
<DPadIcon class="w-8 h-8 opacity-80" :modal="isModal" />
<span class="font-medium tracking-wide">Navigation</span>
<span class="font-medium tracking-wide">{{
t("console.nav-navigation")
}}</span>
</div>
<div v-if="showSelect" class="flex items-center gap-2">
<FaceButtons highlight="south" :modal="isModal" />
<span class="font-medium tracking-wide">Select</span>
<span class="font-medium tracking-wide">{{
t("console.nav-select")
}}</span>
</div>
<div v-if="showBack" class="flex items-center gap-2">
<FaceButtons highlight="east" :modal="isModal" />
<span class="font-medium tracking-wide">Back</span>
<span class="font-medium tracking-wide">{{
t("console.nav-back")
}}</span>
</div>
<div v-if="showToggleFavorite" class="flex items-center gap-2">
<FaceButtons highlight="north" :modal="isModal" />
<span class="font-medium tracking-wide">Favorite</span>
<span class="font-medium tracking-wide">{{
t("console.nav-favorite")
}}</span>
</div>
<div v-if="showMenu" class="flex items-center gap-2">
<FaceButtons highlight="west" :modal="isModal" />
<span class="font-medium tracking-wide">Menu</span>
<span class="font-medium tracking-wide">{{
t("console.nav-menu")
}}</span>
</div>
<div v-if="showDelete" class="flex items-center gap-2">
<FaceButtons highlight="west" :modal="isModal" />
<span class="font-medium tracking-wide">Delete</span>
<span class="font-medium tracking-wide">{{
t("console.nav-delete")
}}</span>
</div>
</template>
<!-- Keyboard Mode -->
<template v-else>
<div v-if="showNavigation" class="flex items-center gap-2">
<ArrowKeysIcon :modal="isModal" />
<span class="font-medium tracking-wide">Navigation</span>
<span class="font-medium tracking-wide">{{
t("console.nav-navigation")
}}</span>
</div>
<div v-if="showSelect" class="flex items-center gap-2">
<span class="keycap" :style="keycapStyles">Enter</span>
<span class="font-medium tracking-wide">Select</span>
<span class="font-medium tracking-wide">{{
t("console.nav-select")
}}</span>
</div>
<div v-if="showBack" class="flex items-center gap-2">
<span class="keycap" :style="keycapStyles">Bkspc</span>
<span class="font-medium tracking-wide">Back</span>
<span class="font-medium tracking-wide">{{
t("console.nav-back")
}}</span>
</div>
<div v-if="showToggleFavorite" class="flex items-center gap-2">
<span class="keycap" :style="keycapStyles">F</span>
<span class="font-medium tracking-wide">Favorite</span>
<span class="font-medium tracking-wide">{{
t("console.nav-favorite")
}}</span>
</div>
<div v-if="showMenu" class="flex items-center gap-2">
<span class="keycap" :style="keycapStyles">X</span>
<span class="font-medium tracking-wide">Menu</span>
<span class="font-medium tracking-wide">{{
t("console.nav-menu")
}}</span>
</div>
<div v-if="showDelete" class="flex items-center gap-2">
<span class="keycap" :style="keycapStyles">X</span>
<span class="font-medium tracking-wide">Delete</span>
<span class="font-medium tracking-wide">{{
t("console.nav-delete")
}}</span>
</div>
</template>
</div>

View File

@@ -1,11 +1,13 @@
<script setup lang="ts">
import { ref, computed, onMounted, onUnmounted } from "vue";
import { useI18n } from "vue-i18n";
import NavigationText from "@/console/components/NavigationText.vue";
import { useConsoleTheme } from "@/console/composables/useConsoleTheme";
import { useInputScope } from "@/console/composables/useInputScope";
import type { InputAction } from "@/console/input/actions";
import { getSfxEnabled, setSfxEnabled } from "@/console/utils/sfx";
const { t } = useI18n();
const props = defineProps<{
modelValue: boolean;
}>();
@@ -18,10 +20,10 @@ const themeStore = useConsoleTheme();
const { subscribe } = useInputScope();
const selectedOption = ref(0);
const options = [
{ label: "Theme", type: "theme" as const },
{ label: "Sound Effects", type: "sfx" as const },
];
const options = computed(() => [
{ label: "console.theme", type: "theme" as const },
{ label: "console.sound-effects", type: "sfx" as const },
]);
const themeOptions = [
{ value: "default", label: "Default" },
@@ -56,14 +58,15 @@ function handleAction(action: InputAction): boolean {
return true;
case "moveUp":
selectedOption.value =
(selectedOption.value - 1 + options.length) % options.length;
(selectedOption.value - 1 + options.value.length) %
options.value.length;
return true;
case "moveDown":
selectedOption.value = (selectedOption.value + 1) % options.length;
selectedOption.value = (selectedOption.value + 1) % options.value.length;
return true;
case "moveLeft":
case "moveRight": {
const currentOption = options[selectedOption.value];
const currentOption = options.value[selectedOption.value];
if (currentOption.type === "theme") {
const currentIndex = themeOptions.findIndex(
(t) => t.value === selectedTheme.value,
@@ -116,7 +119,7 @@ function getCurrentThemeLabel(): string {
<template #default>
<div class="lightbox-header">
<h2 class="text-h6" :style="{ color: 'var(--console-modal-text)' }">
Console Settings
{{ t("console.console-settings") }}
</h2>
<v-btn
icon="mdi-close"
@@ -136,7 +139,7 @@ function getCurrentThemeLabel(): string {
:class="{ 'settings-item-selected': selectedOption === index }"
>
<div class="settings-label">
{{ option.label }}
{{ t(option.label) }}
</div>
<div class="settings-value">
<template v-if="option.type === 'theme'">
@@ -150,7 +153,7 @@ function getCurrentThemeLabel(): string {
<div class="sfx-toggle">
<span class="sfx-indicator"></span>
<span class="sfx-status">{{
sfxEnabled ? "Enabled" : "Disabled"
sfxEnabled ? t("console.enabled") : t("console.disabled")
}}</span>
<span class="sfx-indicator"></span>
</div>

View File

@@ -1,11 +1,13 @@
<script setup lang="ts">
import { computed, onMounted, useTemplateRef } from "vue";
import { useI18n } from "vue-i18n";
import FallbackSystemCard from "@/console/components/FallbackSystemCard.vue";
import { systemElementRegistry } from "@/console/composables/useElementRegistry";
import { useThemeAssets } from "@/console/composables/useThemeAssets";
import { getPlatformTheme } from "@/console/constants/platforms";
import type { Platform } from "@/stores/platforms";
const { t } = useI18n();
const props = defineProps<{
platform: Platform;
index: number;
@@ -88,7 +90,7 @@ const theme = computed(() => {
class="text-sm text-center font-medium"
:style="{ color: 'var(--console-system-card-text)' }"
>
{{ platform.rom_count || 0 }} games
{{ t("console.games-n", platform.rom_count || 0) }}
</div>
</div>
</button>

View File

@@ -9,6 +9,7 @@ import {
nextTick,
useTemplateRef,
} from "vue";
import { useI18n } from "vue-i18n";
import { useRoute, useRouter } from "vue-router";
import type { DetailedRomSchema } from "@/__generated__/models/DetailedRomSchema";
import BackButton from "@/console/components/BackButton.vue";
@@ -43,6 +44,7 @@ const romsStore = storeRoms();
const heartbeatStore = storeHeartbeat();
const route = useRoute();
const router = useRouter();
const { t } = useI18n();
const rom = ref<DetailedRomSchema | null>(null);
const playerState = ref<PlayerState>("loading");
@@ -632,7 +634,7 @@ onUnmounted(() => {
@click="play()"
>
<span class="text-lg md:text-xl"></span>
Play
{{ t("console.game-play") }}
</button>
<button
class="px-5 md:px-6 py-3 md:py-4 rounded-lg font-semibold transition-all"
@@ -649,7 +651,7 @@ onUnmounted(() => {
}"
@click="openDetails()"
>
Details
{{ t("console.game-detail") }}
</button>
</div>
@@ -658,7 +660,7 @@ onUnmounted(() => {
class="text-[10px] uppercase tracking-wider font-semibold mb-2"
:style="{ color: 'var(--console-game-section-header)' }"
>
SAVE STATES
{{ t("console.save-states") }}
</h3>
<div
ref="save-states-ref"
@@ -732,7 +734,7 @@ onUnmounted(() => {
class="text-xs md:text-sm font-semibold uppercase tracking-wide"
:style="{ color: 'var(--console-game-section-header)' }"
>
Screenshots
{{ t("console.screenshots") }}
</h3>
<div
ref="screenshots-ref"
@@ -850,7 +852,7 @@ onUnmounted(() => {
<template #default>
<div class="lightbox-header">
<h2 class="text-h6" :style="{ color: 'var(--console-modal-text)' }">
Details
{{ t("console.game-detail") }}
</h2>
<v-btn
icon="mdi-close"
@@ -958,7 +960,7 @@ onUnmounted(() => {
class="text-xs font-semibold mb-1 uppercase tracking-wide"
:style="{ color: 'var(--console-modal-text-secondary)' }"
>
File Size
{{ t("console.detail-size") }}
</div>
<div
class="text-sm md:text-base leading-6 break-words"
@@ -979,7 +981,7 @@ onUnmounted(() => {
class="text-xs font-semibold mb-1 uppercase tracking-wide"
:style="{ color: 'var(--console-modal-text-secondary)' }"
>
File
{{ t("console.detail-file") }}
</div>
<div
class="text-sm md:text-base leading-6 break-words"

View File

@@ -9,6 +9,7 @@ import {
useTemplateRef,
onBeforeMount,
} from "vue";
import { useI18n } from "vue-i18n";
import { useRouter } from "vue-router";
import RIsotipo from "@/components/common/RIsotipo.vue";
import useFavoriteToggle from "@/composables/useFavoriteToggle";
@@ -36,6 +37,7 @@ import storePlatforms from "@/stores/platforms";
import storeRoms from "@/stores/roms";
import type { SimpleRom } from "@/stores/roms";
const { t } = useI18n();
const router = useRouter();
const platformsStore = storePlatforms();
const { allPlatforms, fetchingPlatforms } = storeToRefs(platformsStore);
@@ -712,7 +714,7 @@ onUnmounted(() => {
class="font-bold text-[28px] drop-shadow-xl"
:style="{ color: 'var(--console-home-title-text)' }"
>
Console
{{ t("console.console") }}
</div>
</div>
@@ -721,7 +723,7 @@ onUnmounted(() => {
class="text-center mt-16"
:style="{ color: 'var(--console-loading-text)' }"
>
Loading platforms
{{ t("console.loading-platforms") }}
</div>
<div
v-else-if="errorMessage"
@@ -736,7 +738,7 @@ onUnmounted(() => {
class="text-xl font-bold text-fg0 mb-3 drop-shadow pl-8 pr-8"
:style="{ color: 'var(--console-home-category-text)' }"
>
Platforms
{{ t("console.platforms") }}
</h2>
<div class="relative h-[220px]">
<button
@@ -792,7 +794,7 @@ onUnmounted(() => {
class="text-xl font-bold text-fg0 mb-3 drop-shadow pl-8 pr-8"
:style="{ color: 'var(--console-home-category-text)' }"
>
Recently Played
{{ t("console.recently-played") }}
</h2>
<div class="relative h-[400px]">
<button
@@ -853,7 +855,7 @@ onUnmounted(() => {
class="text-xl font-bold text-fg0 mb-3 drop-shadow pl-8 pr-8"
:style="{ color: 'var(--console-home-category-text)' }"
>
Collections
{{ t("console.collections") }}
</h2>
<div class="relative h-[400px]">
<button
@@ -912,7 +914,7 @@ onUnmounted(() => {
class="text-xl font-bold text-fg0 mb-3 drop-shadow pl-8 pr-8"
:style="{ color: 'var(--console-home-category-text)' }"
>
Smart Collections
{{ t("console.smart-collections") }}
</h2>
<div class="relative h-[400px]">
<button
@@ -972,7 +974,7 @@ onUnmounted(() => {
class="text-xl font-bold text-fg0 mb-3 drop-shadow pl-8 pr-8"
:style="{ color: 'var(--console-home-category-text)' }"
>
Virtual Collections
{{ t("console.virtual-collections") }}
</h2>
<div class="relative h-[400px]">
<button
@@ -1036,7 +1038,7 @@ onUnmounted(() => {
'border-[var(--console-home-control-button-focus-border)] bg-[var(--console-home-control-button-focus-border)]/15 shadow-[0_0_0_2px_var(--console-home-control-button-focus-border),_0_0_18px_-4px_var(--console-home-control-button-focus-border)] -translate-y-0.5':
navigationMode === 'controls' && controlIndex === 0,
}"
title="Exit Console Mode (F1)"
:title="t('console.exit-console-mode') + ' (F1)'"
@click="exitConsoleMode"
>
<v-icon size="small">mdi-power</v-icon>
@@ -1052,7 +1054,7 @@ onUnmounted(() => {
'border-[var(--console-home-control-button-focus-border)] bg-[var(--console-home-control-button-focus-border)]/15 shadow-[0_0_0_2px_var(--console-home-control-button-focus-border),_0_0_18px_-4px_var(--console-home-control-button-focus-border)] -translate-y-0.5':
navigationMode === 'controls' && controlIndex === 1,
}"
title="Fullscreen (F11)"
:title="t('console.fullscreen') + ' (F11)'"
@click="toggleFullscreen"
>
<v-icon size="small">mdi-fullscreen</v-icon>
@@ -1068,7 +1070,7 @@ onUnmounted(() => {
'border-[var(--console-home-control-button-focus-border)] bg-[var(--console-home-control-button-focus-border)]/15 shadow-[0_0_0_2px_var(--console-home-control-button-focus-border),_0_0_18px_-4px_var(--console-home-control-button-focus-border)] -translate-y-0.5':
navigationMode === 'controls' && controlIndex === 2,
}"
title="Settings"
:title="t('console.settings')"
@click="showSettings = true"
>
<v-icon size="small">mdi-cog</v-icon>

View File

@@ -1,7 +1,15 @@
<script setup lang="ts">
import { useLocalStorage } from "@vueuse/core";
import { storeToRefs } from "pinia";
import { onMounted, onBeforeUnmount, ref, watch, nextTick } from "vue";
import {
computed,
onMounted,
onBeforeUnmount,
ref,
watch,
nextTick,
} from "vue";
import { useI18n } from "vue-i18n";
import { useRoute, useRouter } from "vue-router";
import type { DetailedRomSchema } from "@/__generated__/models/DetailedRomSchema";
import NavigationText from "@/console/components/NavigationText.vue";
@@ -20,6 +28,7 @@ import {
getDownloadPath,
} from "@/utils";
const { t } = useI18n();
const createPlayerStorage = (romId: number, platformSlug: string) => ({
initialSaveId: useLocalStorage(
`player:${romId}:initial_save_id`,
@@ -60,15 +69,23 @@ const loaderStatus = ref<
let pausedByPrompt = false;
const exitOptions = [
{ id: "save", label: "Save & Exit", desc: "Save current state, then quit" },
const exitOptions = computed(() => [
{
id: "save",
label: "console.game-exit-save",
desc: "console.game-exit-save-desc",
},
{
id: "nosave",
label: "Exit Without Saving",
desc: "Leave immediately, progress since last save state is lost",
label: "console.game-exit-nosave",
desc: "console.game-exit-nosave-desc",
},
{ id: "cancel", label: "Cancel", desc: "Return to the game" },
];
{
id: "cancel",
label: "console.game-exit-cancel",
desc: "console.game-exit-cancel-desc",
},
]);
const { subscribe } = useInputScope();
let exitScopeOff: (() => void) | null = null;
@@ -111,7 +128,7 @@ function handleExitAction(action: string) {
return true;
}
if (action === "confirm") {
activateExitOption(exitOptions[focusedExitIndex.value].id);
activateExitOption(exitOptions.value[focusedExitIndex.value].id);
return true;
}
if (action === "back") {
@@ -222,7 +239,7 @@ function activateExitOption(id: string) {
}
function moveExitFocus(delta: number) {
const total = exitOptions.length;
const total = exitOptions.value.length;
focusedExitIndex.value = (focusedExitIndex.value + delta + total) % total;
}
@@ -285,7 +302,7 @@ function attachGamepadExit(options?: { windowMs?: number }) {
}
} else {
if (edge(BTN.A))
activateExitOption(exitOptions[focusedExitIndex.value].id);
activateExitOption(exitOptions.value[focusedExitIndex.value].id);
if (edge(BTN.B)) cancelExit();
}
for (let i = 0; i < pad.buttons.length; i++) {
@@ -693,13 +710,15 @@ onBeforeUnmount(() => {
<template
v-if="loaderStatus === 'idle' || loaderStatus === 'loading-local'"
>
Loading emulator
{{ t("console.emulator-loading") }}
</template>
<template v-else-if="loaderStatus === 'loading-cdn'">
Loading emulator (CDN)
{{ t("console.emulator-cdn") }}
</template>
<template v-else-if="loaderStatus === 'failed'">
<div class="text-red-300 font-medium">Failed to load emulator</div>
<div class="text-red-300 font-medium">
{{ t("console.emulator-failed") }}
</div>
<div class="mt-1 text-[11px] max-w-xs leading-snug break-words">
{{ loaderError }}
</div>
@@ -715,7 +734,7 @@ onBeforeUnmount(() => {
}"
class="absolute top-3 left-1/2 -translate-x-1/2 backdrop-blur px-3 py-1 rounded text-xs border"
>
Press Start + Select (or Backspace) to exit
{{ t("console.exit-game") }}
</div>
<!-- Exit Prompt Modal -->
@@ -737,7 +756,7 @@ onBeforeUnmount(() => {
:style="{ color: 'var(--console-modal-text)' }"
class="text-xl font-bold tracking-wide drop-shadow"
>
Exit Game
{{ t("console.game-exit") }}
</h2>
<button
:disabled="savingState"
@@ -788,13 +807,13 @@ onBeforeUnmount(() => {
}"
class="font-semibold text-sm tracking-wide"
>
{{ opt.label }}
{{ t(opt.label) }}
<span
v-if="opt.id === 'save' && savingState"
:style="{ color: 'var(--console-play-save-status-text)' }"
class="ml-2 text-[10px] font-medium tracking-wide animate-pulse"
>
SAVING
{{ t("console.game-saving") }}
</span>
</div>
<div
@@ -802,7 +821,7 @@ onBeforeUnmount(() => {
:style="{ color: 'var(--console-modal-text-secondary)' }"
class="text-xs mt-0.5 opacity-50"
>
{{ opt.desc }}
{{ t(opt.desc) }}
</div>
</div>
<div

View File

@@ -0,0 +1,43 @@
{
"collections": "Kolekce",
"console": "Konzole",
"console-settings": "Nastavení konzole",
"default": "Výchozí",
"detail-file": "Soubor",
"detail-size": "Velikost souboru",
"disabled": "Zakázáno",
"emulator-cdn": "Načítání emulátoru (CDN)…",
"emulator-failed": "Nepodařilo se načíst emulátor",
"emulator-loading": "Načítání emulátoru…",
"enabled": "Povoleno",
"exit-console-mode": "Ukončit režim konzole",
"exit-game": "Stiskni Start + Select (nebo Backspace) pro ukončení",
"fullscreen": "Celá obrazovka",
"game-detail": "Detaily",
"game-exit": "Ukončit hru",
"game-exit-cancel": "Zrušit",
"game-exit-cancel-desc": "Vrátit se zpět do hry",
"game-exit-nosave": "Ukončit bez uložení",
"game-exit-nosave-desc": "Okamžitě ukončí, postup od posledního uložení bude ztracen",
"game-exit-save": "Uložit a ukončit",
"game-exit-save-desc": "Uloží aktuální stav a ukončí hru",
"game-play": "Hrát",
"game-saving": "UKLÁDÁM…",
"games-n": "{n} her | {n} hra | {n} hry | {n} her",
"loading-platforms": "Načítání platforem…",
"nav-back": "Zpět",
"nav-delete": "Smazat",
"nav-favorite": "Oblíbené",
"nav-menu": "Menu",
"nav-navigation": "Navigace",
"nav-select": "Vybrat",
"platforms": "Platformy",
"recently-played": "Nedávno hrané",
"save-states": "ULOŽENÉ STAVY",
"screenshots": "Snímky obrazovky",
"settings": "Nastavení",
"smart-collections": "Chytré kolekce",
"sound-effects": "Zvukové efekty",
"theme": "Téma",
"virtual-collections": "Automaticky vytvořené kolekce"
}

View File

@@ -0,0 +1,43 @@
{
"collections": "Sammlungen",
"console": "Konsole",
"console-settings": "Konsolen-Einstellungen",
"default": "Standard",
"detail-file": "Datei",
"detail-size": "Dateigröße",
"disabled": "Deaktiviert",
"emulator-cdn": "Lade Emulator (CDN)…",
"emulator-failed": "Fehler beim Laden des Emulators",
"emulator-loading": "Lade Emulator…",
"enabled": "Aktiviert",
"exit-console-mode": "Konsolenmodus verlassen",
"exit-game": "Drücke Start + Select (oder Rücktaste) zum Beenden",
"fullscreen": "Vollbild",
"game-detail": "Details",
"game-exit": "Spiel beenden",
"game-exit-cancel": "Abbrechen",
"game-exit-cancel-desc": "Zum Spiel zurückkehren",
"game-exit-nosave": "Beenden ohne Speichern",
"game-exit-nosave-desc": "Sofort verlassen, Fortschritt seit letztem Speicherstand geht verloren",
"game-exit-save": "Speichern & Beenden",
"game-exit-save-desc": "Aktuellen Zustand speichern und beenden",
"game-play": "Spielen",
"game-saving": "SPEICHERE…",
"games-n": "{n} Spiel | {n} Spiele",
"loading-platforms": "Lade Plattformen…",
"nav-back": "Zurück",
"nav-delete": "Löschen",
"nav-favorite": "Favorit",
"nav-menu": "Menü",
"nav-navigation": "Navigation",
"nav-select": "Auswählen",
"platforms": "Plattformen",
"recently-played": "Zuletzt gespielt",
"save-states": "SPEICHERSTÄNDE",
"screenshots": "Bildschirmfotos",
"settings": "Einstellungen",
"smart-collections": "Intelligente Sammlungen",
"sound-effects": "Soundeffekte",
"theme": "Design",
"virtual-collections": "Automatisch generierte Sammlungen"
}

View File

@@ -0,0 +1,43 @@
{
"collections": "Collections",
"console": "Console",
"console-settings": "Console Settings",
"default": "Default",
"detail-file": "File",
"detail-size": "File Size",
"disabled": "Disabled",
"emulator-cdn": "Loading emulator (CDN)…",
"emulator-failed": "Failed to load emulator",
"emulator-loading": "Loading emulator…",
"enabled": "Enabled",
"exit-console-mode": "Exit Console Mode",
"exit-game": "Press Start + Select (or Backspace) to exit",
"fullscreen": "Fullscreen",
"game-detail": "Details",
"game-exit": "Exit Game",
"game-exit-cancel": "Cancel",
"game-exit-cancel-desc": "Return to the game",
"game-exit-nosave": "Exit Without Saving",
"game-exit-nosave-desc": "Leave immediately, progress since last save state is lost",
"game-exit-save": "Save & Exit",
"game-exit-save-desc": "Save current state, then quit",
"game-play": "Play",
"game-saving": "SAVING…",
"games-n": "{n} game | {n} games",
"loading-platforms": "Loading Platforms…",
"nav-back": "Back",
"nav-delete": "Delete",
"nav-favorite": "Favourite",
"nav-menu": "Menu",
"nav-navigation": "Navigation",
"nav-select": "Select",
"platforms": "Platforms",
"recently-played": "Recently Played",
"save-states": "SAVE STATES",
"screenshots": "Screenshots",
"settings": "Settings",
"smart-collections": "Smart Collections",
"sound-effects": "Sound Effects",
"theme": "Theme",
"virtual-collections": "Autogenerated Collections"
}

View File

@@ -0,0 +1,43 @@
{
"collections": "Collections",
"console": "Console",
"console-settings": "Console Settings",
"default": "Default",
"detail-file": "File",
"detail-size": "File Size",
"disabled": "Disabled",
"emulator-cdn": "Loading emulator (CDN)…",
"emulator-failed": "Failed to load emulator",
"emulator-loading": "Loading emulator…",
"enabled": "Enabled",
"exit-console-mode": "Exit Console Mode",
"exit-game": "Press Start + Select (or Backspace) to exit",
"fullscreen": "Fullscreen",
"game-detail": "Details",
"game-exit": "Exit Game",
"game-exit-cancel": "Cancel",
"game-exit-cancel-desc": "Return to the game",
"game-exit-nosave": "Exit Without Saving",
"game-exit-nosave-desc": "Leave immediately, progress since last save state is lost",
"game-exit-save": "Save & Exit",
"game-exit-save-desc": "Save current state, then quit",
"game-play": "Play",
"game-saving": "SAVING…",
"games-n": "{n} game | {n} games",
"loading-platforms": "Loading Platforms…",
"nav-back": "Back",
"nav-delete": "Delete",
"nav-favorite": "Favorite",
"nav-menu": "Menu",
"nav-navigation": "Navigation",
"nav-select": "Select",
"platforms": "Platforms",
"recently-played": "Recently Played",
"save-states": "SAVE STATES",
"screenshots": "Screenshots",
"settings": "Settings",
"smart-collections": "Smart Collections",
"sound-effects": "Sound Effects",
"theme": "Theme",
"virtual-collections": "Autogenerated Collections"
}

View File

@@ -0,0 +1,43 @@
{
"collections": "Colecciones",
"console": "Consola",
"console-settings": "Configuración de la consola",
"default": "Predeterminado",
"detail-file": "Archivo",
"detail-size": "Tamaño del archivo",
"disabled": "Desactivado",
"emulator-cdn": "Cargando emulador (CDN)…",
"emulator-failed": "Error al cargar el emulador",
"emulator-loading": "Cargando emulador…",
"enabled": "Activado",
"exit-console-mode": "Salir del modo consola",
"exit-game": "Presiona Start + Select (o Retroceso) para salir",
"fullscreen": "Pantalla completa",
"game-detail": "Detalles",
"game-exit": "Salir del juego",
"game-exit-cancel": "Cancelar",
"game-exit-cancel-desc": "Volver al juego",
"game-exit-nosave": "Salir sin guardar",
"game-exit-nosave-desc": "Salir inmediatamente, se perderá el progreso desde el último estado guardado",
"game-exit-save": "Guardar y salir",
"game-exit-save-desc": "Guardar estado actual y salir",
"game-play": "Jugar",
"game-saving": "GUARDANDO…",
"games-n": "{n} juego | {n} juegos",
"loading-platforms": "Cargando plataformas…",
"nav-back": "Atrás",
"nav-delete": "Eliminar",
"nav-favorite": "Favorito",
"nav-menu": "Menú",
"nav-navigation": "Navegación",
"nav-select": "Seleccionar",
"platforms": "Plataformas",
"recently-played": "Jugado recientemente",
"save-states": "ESTADOS GUARDADOS",
"screenshots": "Capturas de pantalla",
"settings": "Configuración",
"smart-collections": "Colecciones inteligentes",
"sound-effects": "Efectos de sonido",
"theme": "Tema",
"virtual-collections": "Colecciones autogeneradas"
}

View File

@@ -0,0 +1,43 @@
{
"collections": "Collections",
"console": "Console",
"console-settings": "Paramètres de la console",
"default": "Par défaut",
"detail-file": "Fichier",
"detail-size": "Taille du fichier",
"disabled": "Désactivé",
"emulator-cdn": "Chargement de l'émulateur (CDN)…",
"emulator-failed": "Échec du chargement de l'émulateur",
"emulator-loading": "Chargement de l'émulateur…",
"enabled": "Activé",
"exit-console-mode": "Quitter le mode console",
"exit-game": "Appuyez sur Start + Select (ou Retour arrière) pour quitter",
"fullscreen": "Plein écran",
"game-detail": "Détails",
"game-exit": "Quitter le jeu",
"game-exit-cancel": "Annuler",
"game-exit-cancel-desc": "Revenir au jeu",
"game-exit-nosave": "Quitter sans sauvegarder",
"game-exit-nosave-desc": "Quitter immédiatement, la progression depuis le dernier état sauvegardé sera perdue",
"game-exit-save": "Sauvegarder et quitter",
"game-exit-save-desc": "Sauvegarder l'état actuel, puis quitter",
"game-play": "Jouer",
"game-saving": "SAUVEGARDE…",
"games-n": "{n} jeu | {n} jeux",
"loading-platforms": "Chargement des plateformes…",
"nav-back": "Retour",
"nav-delete": "Supprimer",
"nav-favorite": "Favori",
"nav-menu": "Menu",
"nav-navigation": "Navigation",
"nav-select": "Sélectionner",
"platforms": "Plateformes",
"recently-played": "Récemment joués",
"save-states": "ÉTATS SAUVEGARDÉS",
"screenshots": "Captures d'écran",
"settings": "Paramètres",
"smart-collections": "Collections intelligentes",
"sound-effects": "Effets sonores",
"theme": "Thème",
"virtual-collections": "Collections auto-générées"
}

View File

@@ -0,0 +1,42 @@
{
"collections": "Collezioni",
"console": "Console",
"console-settings": "Impostazioni della console",
"default": "Predefinito",
"detail-file": "File",
"detail-size": "Dimensione file",
"disabled": "Disabilitato",
"emulator-cdn": "Caricamento emulatore (CDN)...",
"emulator-failed": "Impossibile caricare l'emulatore",
"emulator-loading": "Caricamento emulatore...",
"enabled": "Abilitato",
"exit-console-mode": "Esci dalla modalit'a console",
"exit-game": "Premi Start + Select (o Backspace) per uscire",
"fullscreen": "Schermo intero",
"game-detail": "Dettagli",
"game-exit": "Esci dal gioco",
"game-exit-cancel": "Annulla",
"game-exit-cancel-desc": "Ritorna al gioco",
"game-exit-nosave": "Esci senza salvare",
"game-exit-nosave-desc": "Esci immediatamente, i progressi dall'ultimo stato salvato andranno persi",
"game-exit-save": "Salva ed esci",
"game-exit-save-desc": "Salva lo stato corrente, quindi esci",
"game-play": "Gioca",
"games-n": "{n} gioco | {n} giochi",
"loading-platforms": "Caricamento piattaforme...",
"nav-back": "Indietro",
"nav-delete": "Elimina",
"nav-favorite": "Preferito",
"nav-menu": "Menu",
"nav-navigation": "Navigazione",
"nav-select": "Seleziona",
"platforms": "Piattaforme",
"recently-played": "Giocati di recente",
"save-states": "SALVATAGGI",
"screenshots": "Screenshot",
"settings": "Impostazioni",
"smart-collections": "Collezioni intelligenti",
"sound-effects": "Effetti sonori",
"theme": "Tema",
"virtual-collections": "Collezioni autogenerate"
}

View File

@@ -0,0 +1,43 @@
{
"collections": "コレクション",
"console": "コンソール",
"console-settings": "コンソール設定",
"default": "デフォルト",
"detail-file": "ファイル",
"detail-size": "ファイルサイズ",
"disabled": "無効",
"emulator-cdn": "エミュレータを読み込み中 (CDN)…",
"emulator-failed": "エミュレータの読み込みに失敗しました",
"emulator-loading": "エミュレータを読み込み中…",
"enabled": "有効",
"exit-console-mode": "コンソールモードを終了",
"exit-game": "Start + Select (または Backspace) を押して終了",
"fullscreen": "フルスクリーン",
"game-detail": "詳細",
"game-exit": "ゲームを終了",
"game-exit-cancel": "キャンセル",
"game-exit-cancel-desc": "ゲームに戻る",
"game-exit-nosave": "保存せずに終了",
"game-exit-nosave-desc": "すぐに終了します。最後のセーブ状態以降の進行状況は失われます",
"game-exit-save": "保存して終了",
"game-exit-save-desc": "現在の状態を保存して終了",
"game-play": "プレイ",
"game-saving": "保存中…",
"games-n": "{n} 個のゲーム",
"loading-platforms": "プラットフォームを読み込み中…",
"nav-back": "戻る",
"nav-delete": "削除",
"nav-favorite": "お気に入り",
"nav-menu": "メニュー",
"nav-navigation": "ナビゲーション",
"nav-select": "選択",
"platforms": "プラットフォーム",
"recently-played": "最近プレイしたゲーム",
"save-states": "セーブ状態",
"screenshots": "スクリーンショット",
"settings": "設定",
"smart-collections": "スマートコレクション",
"sound-effects": "効果音",
"theme": "テーマ",
"virtual-collections": "自動生成コレクション"
}

View File

@@ -0,0 +1,43 @@
{
"collections": "컬렉션",
"console": "콘솔",
"console-settings": "콘솔 설정",
"default": "기본값",
"detail-file": "파일",
"detail-size": "파일 크기",
"disabled": "비활성화됨",
"emulator-cdn": "에뮬레이터 로드 중 (CDN)…",
"emulator-failed": "에뮬레이터 로드 실패",
"emulator-loading": "에뮬레이터 로드 중…",
"enabled": "활성화됨",
"exit-console-mode": "콘솔 모드 종료",
"exit-game": "시작 + 선택 (또는 백스페이스) 키를 눌러 종료",
"fullscreen": "전체 화면",
"game-detail": "세부 정보",
"game-exit": "게임 종료",
"game-exit-cancel": "취소",
"game-exit-cancel-desc": "게임으로 돌아가기",
"game-exit-nosave": "저장하지 않고 종료",
"game-exit-nosave-desc": "즉시 종료, 마지막 세이브 이후 진행 상황은 손실됨",
"game-exit-save": "저장 및 종료",
"game-exit-save-desc": "현재 상태 저장 후 종료",
"game-play": "재생",
"game-saving": "저장 중…",
"games-n": "{n} 게임",
"loading-platforms": "플랫폼 로드 중…",
"nav-back": "뒤로",
"nav-delete": "삭제",
"nav-favorite": "즐겨찾기",
"nav-menu": "메뉴",
"nav-navigation": "내비게이션",
"nav-select": "선택",
"platforms": "플랫폼",
"recently-played": "최근 플레이함",
"save-states": "세이브 상태",
"screenshots": "스크린샷",
"settings": "설정",
"smart-collections": "스마트 컬렉션",
"sound-effects": "음향 효과",
"theme": "테마",
"virtual-collections": "자동 생성 컬렉션"
}

View File

@@ -0,0 +1,43 @@
{
"collections": "Kolekcje",
"console": "Konsola",
"console-settings": "Ustawienia konsoli",
"default": "Domyślne",
"detail-file": "Plik",
"detail-size": "Rozmiar pliku",
"disabled": "Wyłączone",
"emulator-cdn": "Ładowanie emulatora (CDN)...",
"emulator-failed": "Nie udało się załadować emulatora",
"emulator-loading": "Ładowanie emulatora...",
"enabled": "Włączone",
"exit-console-mode": "Opuść tryb konsoli",
"exit-game": "Naciśnij Start + Select (lub Backspace), aby wyjść",
"fullscreen": "Pełny ekran",
"game-detail": "Szczegóły",
"game-exit": "Zakończ grę",
"game-exit-cancel": "Anuluj",
"game-exit-cancel-desc": "Wróć do gry",
"game-exit-nosave": "Zakończ bez zapisywania",
"game-exit-nosave-desc": "Wyjdź natychmiast, postęp od ostatniego zapisu zostanie utracony",
"game-exit-save": "Zapisz i zakończ",
"game-exit-save-desc": "Zapisz bieżący stan, a następnie zakończ",
"game-play": "Graj",
"game-saving": "ZAPISYWANIE...",
"games-n": "{n} gra | {n} gry | {n} gier",
"loading-platforms": "Ładowanie platform...",
"nav-back": "Wstecz",
"nav-delete": "Usuń",
"nav-favorite": "Ulubione",
"nav-menu": "Menu",
"nav-navigation": "Nawigacja",
"nav-select": "Wybierz",
"platforms": "Platformy",
"recently-played": "Ostatnio grane",
"save-states": "ZAPISANE STANY",
"screenshots": "Zrzuty ekranu",
"settings": "Ustawienia",
"smart-collections": "Inteligentne kolekcje",
"sound-effects": "Efekty dźwiękowe",
"theme": "Motyw",
"virtual-collections": "Automatycznie generowane kolekcje"
}

View File

@@ -0,0 +1,43 @@
{
"collections": "Coleções",
"console": "Console",
"console-settings": "Configurações do Console",
"default": "Padrão",
"detail-file": "Arquivo",
"detail-size": "Tamanho do Arquivo",
"disabled": "Desativado",
"emulator-cdn": "Carregando emulador (CDN)...",
"emulator-failed": "Falha ao carregar emulador",
"emulator-loading": "Carregando emulador...",
"enabled": "Ativado",
"exit-console-mode": "Sair do Modo Console",
"exit-game": "Pressione Start + Select (ou Backspace) para sair",
"fullscreen": "Tela Cheia",
"game-detail": "Detalhes",
"game-exit": "Sair do Jogo",
"game-exit-cancel": "Cancelar",
"game-exit-cancel-desc": "Voltar ao jogo",
"game-exit-nosave": "Sair Sem Salvar",
"game-exit-nosave-desc": "Sair imediatamente, o progresso desde o último estado salvo será perdido",
"game-exit-save": "Salvar e Sair",
"game-exit-save-desc": "Salvar estado atual e sair",
"game-play": "Jogar",
"game-saving": "SALVANDO...",
"games-n": "{n} jogo | {n} jogos",
"loading-platforms": "Carregando Plataformas...",
"nav-back": "Voltar",
"nav-delete": "Excluir",
"nav-favorite": "Favorito",
"nav-menu": "Menu",
"nav-navigation": "Navegação",
"nav-select": "Selecionar",
"platforms": "Plataformas",
"recently-played": "Jogados Recentemente",
"save-states": "ESTADOS SALVOS",
"screenshots": "Capturas de Tela",
"settings": "Configurações",
"smart-collections": "Coleções Inteligentes",
"sound-effects": "Efeitos Sonoros",
"theme": "Tema",
"virtual-collections": "Coleções Geradas Automaticamente"
}

View File

@@ -0,0 +1,43 @@
{
"collections": "Colecții",
"console": "Consolă",
"console-settings": "Setări consolă",
"default": "Implicit",
"detail-file": "Fișier",
"detail-size": "Dimensiune fișier",
"disabled": "Dezactivat",
"emulator-cdn": "Se încarcă emulatorul (CDN)...",
"emulator-failed": "Încărcarea emulatorului a eșuat",
"emulator-loading": "Se încarcă emulatorul...",
"enabled": "Activat",
"exit-console-mode": "Ieși din modul consolă",
"exit-game": "Apasă Start + Select (sau Backspace) pentru a ieși",
"fullscreen": "Ecran complet",
"game-detail": "Detalii",
"game-exit": "Ieși din joc",
"game-exit-cancel": "Anulează",
"game-exit-cancel-desc": "Revino la joc",
"game-exit-nosave": "Ieși fără a salva",
"game-exit-nosave-desc": "Ieși imediat, progresul de la ultima salvare se va pierde",
"game-exit-save": "Salvează și ieși",
"game-exit-save-desc": "Salvează starea curentă, apoi ieși",
"game-play": "Joacă",
"game-saving": "SE SALVEAZĂ...",
"games-n": "{n} joc | {n} jocuri",
"loading-platforms": "Se încarcă platformele...",
"nav-back": "Înapoi",
"nav-delete": "Șterge",
"nav-favorite": "Favorit",
"nav-menu": "Meniu",
"nav-navigation": "Navigare",
"nav-select": "Selectează",
"platforms": "Platforme",
"recently-played": "Jucate recent",
"save-states": "STĂRI SALVATE",
"screenshots": "Screenshot-uri",
"settings": "Setări",
"smart-collections": "Colecții inteligente",
"sound-effects": "Efecte sonore",
"theme": "Temă",
"virtual-collections": "Colecții generate automat"
}

View File

@@ -0,0 +1,43 @@
{
"collections": "Коллекции",
"console": "Консоль",
"console-settings": "Настройки консоли",
"default": "По умолчанию",
"detail-file": "Файл",
"detail-size": "Размер файла",
"disabled": "Отключено",
"emulator-cdn": "Загрузка эмулятора (CDN)...",
"emulator-failed": "Не удалось загрузить эмулятор",
"emulator-loading": "Загрузка эмулятора...",
"enabled": "Включено",
"exit-console-mode": "Выйти из режима консоли",
"exit-game": "Нажмите Start + Select (или Backspace) для выхода",
"fullscreen": "Полноэкранный режим",
"game-detail": "Детали",
"game-exit": "Выйти из игры",
"game-exit-cancel": "Отмена",
"game-exit-cancel-desc": "Вернуться в игру",
"game-exit-nosave": "Выйти без сохранения",
"game-exit-nosave-desc": "Выйти немедленно, прогресс с момента последнего сохранения будет утерян",
"game-exit-save": "Сохранить и выйти",
"game-exit-save-desc": "Сохранить текущее состояние и выйти",
"game-play": "Играть",
"game-saving": "СОХРАНЕНИЕ...",
"games-n": "{n} игра | {n} игры | {n} игр",
"loading-platforms": "Загрузка платформ...",
"nav-back": "Назад",
"nav-delete": "Удалить",
"nav-favorite": "Избранное",
"nav-menu": "Меню",
"nav-navigation": "Навигация",
"nav-select": "Выбрать",
"platforms": "Платформы",
"recently-played": "Недавно сыгранное",
"save-states": "СОХРАНЕННЫЕ СОСТОЯНИЯ",
"screenshots": "Скриншоты",
"settings": "Настройки",
"smart-collections": "Умные коллекции",
"sound-effects": "Звуковые эффекты",
"theme": "Тема",
"virtual-collections": "Автосгенерированные коллекции"
}

View File

@@ -0,0 +1,43 @@
{
"collections": "合集",
"console": "主机",
"console-settings": "主机设置",
"default": "默认",
"detail-file": "文件",
"detail-size": "文件大小",
"disabled": "已禁用",
"emulator-cdn": "正在加载模拟器 (CDN)…",
"emulator-failed": "模拟器加载失败",
"emulator-loading": "正在加载模拟器…",
"enabled": "已启用",
"exit-console-mode": "退出主机模式",
"exit-game": "按开始+选择 (或退格键) 退出",
"fullscreen": "全屏",
"game-detail": "详情",
"game-exit": "退出游戏",
"game-exit-cancel": "取消",
"game-exit-cancel-desc": "返回游戏",
"game-exit-nosave": "退出不保存",
"game-exit-nosave-desc": "立即退出,自上次存档以来的进度将会丢失",
"game-exit-save": "保存并退出",
"game-exit-save-desc": "保存当前状态,然后退出",
"game-play": "游玩",
"game-saving": "正在保存…",
"games-n": "{n} 个游戏",
"loading-platforms": "正在加载平台…",
"nav-back": "返回",
"nav-delete": "删除",
"nav-favorite": "收藏",
"nav-menu": "菜单",
"nav-navigation": "导航",
"nav-select": "选择",
"platforms": "平台",
"recently-played": "最近游玩",
"save-states": "存档状态",
"screenshots": "截图",
"settings": "设置",
"smart-collections": "智能合集",
"sound-effects": "音效",
"theme": "主题",
"virtual-collections": "自动创建合集"
}

View File

@@ -0,0 +1,43 @@
{
"collections": "收藏集",
"console": "主機",
"console-settings": "主機設定",
"default": "預設",
"detail-file": "檔案",
"detail-size": "檔案大小",
"disabled": "已停用",
"emulator-cdn": "正在載入模擬器 (CDN)…",
"emulator-failed": "模擬器載入失敗",
"emulator-loading": "正在載入模擬器…",
"enabled": "已啟用",
"exit-console-mode": "離開主機模式",
"exit-game": "按開始+選擇 (或退格鍵) 離開",
"fullscreen": "全螢幕",
"game-detail": "詳細資料",
"game-exit": "離開遊戲",
"game-exit-cancel": "取消",
"game-exit-cancel-desc": "返回遊戲",
"game-exit-nosave": "退出但不儲存",
"game-exit-nosave-desc": "立即離開,自上次存檔以來的進度將會遺失",
"game-exit-save": "儲存並退出",
"game-exit-save-desc": "儲存目前狀態,然後退出",
"game-play": "遊玩",
"game-saving": "正在儲存…",
"games-n": "{n} 個遊戲",
"loading-platforms": "正在載入平台…",
"nav-back": "返回",
"nav-delete": "刪除",
"nav-favorite": "我的最愛",
"nav-menu": "選單",
"nav-navigation": "導覽",
"nav-select": "選擇",
"platforms": "平台",
"recently-played": "最近遊玩過的遊戲",
"save-states": "存檔狀態",
"screenshots": "螢幕截圖",
"settings": "設定",
"smart-collections": "智慧收藏集",
"sound-effects": "音效",
"theme": "主題",
"virtual-collections": "自動產生的收藏集"
}