Add localization support for setup and settings in multiple languages

- Created new setup.json files for English (en_US), Spanish (es_ES), French (fr_FR), Hungarian (hu_HU), Italian (it_IT), Japanese (ja_JP), Korean (ko_KR), Polish (pl_PL), Portuguese (pt_BR), Romanian (ro_RO), Russian (ru_RU), Simplified Chinese (zh_CN), and Traditional Chinese (zh_TW).
- Updated settings.json files to include new password-related messages in Spanish, French, Hungarian, Italian, Japanese, Korean, Polish, Portuguese, Romanian, and Russian.
- Refactored Setup.vue to utilize localization for various user prompts and messages related to folder structure and platform selection.
This commit is contained in:
zurdi
2025-12-23 11:18:03 +00:00
parent 6270279714
commit 91051323eb
34 changed files with 582 additions and 68 deletions

View File

@@ -268,14 +268,6 @@ async def create_setup_platforms(request: Request, platform_slugs: list[str]):
- message: success or error message
"""
# Check authentication - only allow public access if no admin users
admin_users = db_user_handler.get_admin_users()
if len(admin_users) > 0:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Setup endpoints only accessible during initial setup",
)
if not platform_slugs:
return {
"success": True,
@@ -302,7 +294,6 @@ async def create_setup_platforms(request: Request, platform_slugs: list[str]):
await fs_platform_handler.add_platform(fs_slug=fs_slug)
created_count += 1
except PlatformAlreadyExistsException:
# Platform already exists, skip
continue
except (PermissionError, OSError) as e:
failed_platforms.append(f"{fs_slug}: {str(e)}")

View File

@@ -94,5 +94,8 @@
"update": "Aktualizovat",
"username": "Uživatelské jméno",
"virtual-collection-type": "Typ virtuální kolekce (způsob seskupování ROM)",
"watcher": "Sledovač"
"watcher": "Sledovač",
"passwords-must-match": "Hesla se musí shodovat",
"repeat-password": "Opakujte heslo",
"repeat-password-required": "Je vyžadováno opakování hesla"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "Vytvořit administrátorského uživatele",
"available-platforms": "Dostupné platformy",
"cancel": "Zrušit",
"check-metadata-step": "Zkontrolovat zdroje metadat",
"confirm-create-platforms": "RomM vytvoří strukturu {structure} ({pattern}) s {count} platforma{plural}. Pokračovat?",
"confirm-no-platforms": "Nebyla detekována žádná struktura složek a nebyly vybrány žádné platformy. Budete muset vytvořit strukturu složek ručně. Pokračovat?",
"confirm-no-structure": "Nebyla detekována žádná struktura složek. RomM vytvoří strukturu A (roms/{platform}) s {count} platforma{plural}. Pokračovat?",
"continue": "Pokračovat",
"detected-platforms": "Detekované platformy",
"deselect-all": "Zrušit výběr všech",
"finish": "Dokončit",
"folder-structure": "Struktura složek",
"game": "hra",
"games": "hry",
"library-structure-step": "Nastavit strukturu knihovny",
"metadata-missing": "Chybí nebo je neplatný API klíč",
"next": "Další",
"no-structure-detected": "Nebyla detekována žádná struktura - bude vytvořena struktura A",
"platform": "platforma",
"platforms": "platformy",
"previous": "předchozí",
"select-all": "Vybrat vše",
"select-platforms": "Vyberte platformy k vytvoření",
"selected": "vybráno",
"structure-a-detected": "Detekována struktura A",
"structure-b-detected": "Detekována struktura B"
}

View File

@@ -94,5 +94,8 @@
"update": "Aktualisieren",
"username": "Benutzername",
"virtual-collection-type": "Typ der automatisch generierten Sammlung (ROM-Gruppierungsmethode)",
"watcher": "Überwacher"
"watcher": "Überwacher",
"passwords-must-match": "Passwörter müssen übereinstimmen",
"repeat-password": "Passwort wiederholen",
"repeat-password-required": "Passwortwiederholung erforderlich"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "Administrator-Benutzer erstellen",
"available-platforms": "Verfügbare Plattformen",
"cancel": "Abbrechen",
"check-metadata-step": "Metadatenquellen überprüfen",
"confirm-create-platforms": "RomM erstellt Struktur {structure} ({pattern}) mit {count} Plattform{plural}. Fortfahren?",
"confirm-no-platforms": "Keine Ordnerstruktur erkannt und keine Plattformen ausgewählt. Sie müssen die Ordnerstruktur manuell erstellen. Fortfahren?",
"confirm-no-structure": "Keine Ordnerstruktur erkannt. RomM erstellt Struktur A (roms/{platform}) mit {count} Plattform{plural}. Fortfahren?",
"continue": "Fortfahren",
"detected-platforms": "Erkannte Plattformen",
"deselect-all": "Alle abwählen",
"finish": "Fertig",
"folder-structure": "Ordnerstruktur",
"game": "Spiel",
"games": "Spiele",
"library-structure-step": "Bibliotheksstruktur einrichten",
"metadata-missing": "API-Schlüssel fehlt oder ist ungültig",
"next": "Weiter",
"no-structure-detected": "Keine Struktur erkannt - Struktur A wird erstellt",
"platform": "Plattform",
"platforms": "Plattformen",
"previous": "zurück",
"select-all": "Alle auswählen",
"select-platforms": "Plattformen zum Erstellen auswählen",
"selected": "ausgewählt",
"structure-a-detected": "Struktur A erkannt",
"structure-b-detected": "Struktur B erkannt"
}

View File

@@ -94,5 +94,8 @@
"update": "Update",
"username": "Username",
"virtual-collection-type": "Virtual collection type (ROM grouping method)",
"watcher": "Watcher"
"watcher": "Watcher",
"passwords-must-match": "Passwords must match",
"repeat-password": "Repeat password",
"repeat-password-required": "Repeat password is required"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "Create an admin user",
"available-platforms": "Available Platforms",
"cancel": "Cancel",
"check-metadata-step": "Check metadata sources",
"confirm-create-platforms": "RomM will create Structure {structure} ({pattern}) with {count} platform{plural}. Continue?",
"confirm-no-platforms": "No folder structure detected and no platforms selected. You will need to create the folder structure manually. Continue?",
"confirm-no-structure": "No folder structure detected. RomM will create Structure A (roms/{platform}) with {count} platform{plural}. Continue?",
"continue": "Continue",
"detected-platforms": "Detected Platforms",
"deselect-all": "Deselect All",
"finish": "Finish",
"folder-structure": "Folder structure",
"game": "game",
"games": "games",
"library-structure-step": "Setup library structure",
"metadata-missing": "API key missing or invalid",
"next": "Next",
"no-structure-detected": "No structure detected - Structure A will be created",
"platform": "platform",
"platforms": "platforms",
"previous": "previous",
"select-all": "Select All",
"select-platforms": "Select Platforms to Create",
"selected": "selected",
"structure-a-detected": "Structure A detected",
"structure-b-detected": "Structure B detected"
}

View File

@@ -41,6 +41,7 @@
"no-tasks-in-history": "No tasks in history",
"password": "Password",
"password-placeholder": "Leave empty to keep current password",
"passwords-must-match": "Passwords must match",
"platform-version": "Platform version",
"platforms-bindings": "Platforms bindings",
"platforms-drawer": "Platforms menu",
@@ -51,6 +52,8 @@
"recently-added-as-grid": "Recently added roms as grid",
"recently-added-as-grid-desc": "View recently added rom cards as a grid at the home page",
"removed": "Removed",
"repeat-password": "Repeat password",
"repeat-password-required": "Repeat password is required",
"role": "Role",
"romm-platform": "RomM platform",
"running": "Running",

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "Create an admin user",
"available-platforms": "Available Platforms",
"cancel": "Cancel",
"check-metadata-step": "Check metadata sources",
"confirm-create-platforms": "RomM will create Structure {structure} ({pattern}) with {count} platform{plural}. Continue?",
"confirm-no-platforms": "No folder structure detected and no platforms selected. You will need to create the folder structure manually. Continue?",
"confirm-no-structure": "No folder structure detected. RomM will create Structure A (roms/{platform}) with {count} platform{plural}. Continue?",
"continue": "Continue",
"detected-platforms": "Detected Platforms",
"deselect-all": "Deselect All",
"finish": "Finish",
"folder-structure": "Folder structure",
"game": "game",
"games": "games",
"library-structure-step": "Setup library structure",
"metadata-missing": "API key missing or invalid",
"next": "Next",
"no-structure-detected": "No structure detected - Structure A will be created",
"platform": "platform",
"platforms": "platforms",
"previous": "previous",
"select-all": "Select All",
"select-platforms": "Select Platforms to Create",
"selected": "selected",
"structure-a-detected": "Structure A detected",
"structure-b-detected": "Structure B detected"
}

View File

@@ -94,5 +94,8 @@
"update": "Actualizar",
"username": "Nombre de usuario",
"virtual-collection-type": "Tipo de colección virtual (método de agrupación de ROM)",
"watcher": "Vigilante"
"watcher": "Vigilante",
"passwords-must-match": "Las contraseñas deben coincidir",
"repeat-password": "Repetir contraseña",
"repeat-password-required": "Se requiere repetir la contraseña"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "Crear un usuario administrador",
"available-platforms": "Plataformas disponibles",
"cancel": "Cancelar",
"check-metadata-step": "Comprobar fuentes de metadatos",
"confirm-create-platforms": "RomM creará la estructura {structure} ({pattern}) con {count} plataforma{plural}. ¿Continuar?",
"confirm-no-platforms": "No se detectó estructura de carpetas y no se seleccionaron plataformas. Necesitará crear la estructura de carpetas manualmente. ¿Continuar?",
"confirm-no-structure": "No se detectó estructura de carpetas. RomM creará la estructura A (roms/{platform}) con {count} plataforma{plural}. ¿Continuar?",
"continue": "Continuar",
"detected-platforms": "Plataformas detectadas",
"deselect-all": "Deseleccionar todo",
"finish": "Finalizar",
"folder-structure": "Estructura de carpetas",
"game": "juego",
"games": "juegos",
"library-structure-step": "Configurar estructura de biblioteca",
"metadata-missing": "Falta clave API o es inválida",
"next": "Siguiente",
"no-structure-detected": "No se detectó estructura - se creará la estructura A",
"platform": "plataforma",
"platforms": "plataformas",
"previous": "anterior",
"select-all": "Seleccionar todo",
"select-platforms": "Seleccionar plataformas a crear",
"selected": "seleccionado",
"structure-a-detected": "Estructura A detectada",
"structure-b-detected": "Estructura B detectada"
}

View File

@@ -94,5 +94,8 @@
"update": "Mettre à jour",
"username": "Nom d'utilisateur",
"virtual-collection-type": "Type de collection virtuelle (méthode de regroupement des roms)",
"watcher": "Surveilleur"
"watcher": "Surveilleur",
"passwords-must-match": "Les mots de passe doivent correspondre",
"repeat-password": "Répéter le mot de passe",
"repeat-password-required": "La répétition du mot de passe est requise"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "Créer un utilisateur administrateur",
"available-platforms": "Plateformes disponibles",
"cancel": "Annuler",
"check-metadata-step": "Vérifier les sources de métadonnées",
"confirm-create-platforms": "RomM créera la structure {structure} ({pattern}) avec {count} plateforme{plural}. Continuer?",
"confirm-no-platforms": "Aucune structure de dossiers détectée et aucune plateforme sélectionnée. Vous devrez créer la structure de dossiers manuellement. Continuer?",
"confirm-no-structure": "Aucune structure de dossiers détectée. RomM créera la structure A (roms/{platform}) avec {count} plateforme{plural}. Continuer?",
"continue": "Continuer",
"detected-platforms": "Plateformes détectées",
"deselect-all": "Tout désélectionner",
"finish": "Terminer",
"folder-structure": "Structure des dossiers",
"game": "jeu",
"games": "jeux",
"library-structure-step": "Configurer la structure de la bibliothèque",
"metadata-missing": "Clé API manquante ou invalide",
"next": "Suivant",
"no-structure-detected": "Aucune structure détectée - la structure A sera créée",
"platform": "plateforme",
"platforms": "plateformes",
"previous": "précédent",
"select-all": "Tout sélectionner",
"select-platforms": "Sélectionner les plateformes à créer",
"selected": "sélectionné",
"structure-a-detected": "Structure A détectée",
"structure-b-detected": "Structure B détectée"
}

View File

@@ -94,5 +94,8 @@
"update": "Frissítés",
"username": "Felhasználónév",
"virtual-collection-type": "Virtuális gyűjtemény típusa (ROM csoportosítási mód)",
"watcher": "Figyelő"
"watcher": "Figyelő",
"passwords-must-match": "A jelszavaknak egyezniük kell",
"repeat-password": "Jelszó ismétlése",
"repeat-password-required": "A jelszó ismétlése kötelező"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "Rendszergazda felhasználó létrehozása",
"available-platforms": "Elérhető platformok",
"cancel": "Mégse",
"check-metadata-step": "Metaadat források ellenőrzése",
"confirm-create-platforms": "RomM létrehozza a(z) {structure} struktúrát ({pattern}) {count} platform{plural}. Folytatás?",
"confirm-no-platforms": "Nem található mappastruktúra és nincsenek kiválasztott platformok. Kézzel kell létrehoznia a mappastruktúrát. Folytatás?",
"confirm-no-structure": "Nem található mappastruktúra. RomM létrehozza az A struktúrát (roms/{platform}) {count} platform{plural}. Folytatás?",
"continue": "Folytatás",
"detected-platforms": "Észlelt platformok",
"deselect-all": "Összes kijelölés törlése",
"finish": "Befejezés",
"folder-structure": "Mappastruktúra",
"game": "játék",
"games": "játékok",
"library-structure-step": "Könyvtárstruktúra beállítása",
"metadata-missing": "API kulcs hiányzik vagy érvénytelen",
"next": "Következő",
"no-structure-detected": "Nem található struktúra - A struktúra lesz létrehozva",
"platform": "platform",
"platforms": "platformok",
"previous": "előző",
"select-all": "Összes kijelölése",
"select-platforms": "Létrehozandó platformok kiválasztása",
"selected": "kiválasztva",
"structure-a-detected": "A struktúra észlelve",
"structure-b-detected": "B struktúra észlelve"
}

View File

@@ -94,5 +94,8 @@
"update": "Aggiorna",
"username": "Nome utente",
"virtual-collection-type": "Tipo di collezione virtuale (Metodo di raggruppamento delle rom)",
"watcher": "Monitor"
"watcher": "Monitor",
"passwords-must-match": "Le password devono corrispondere",
"repeat-password": "Ripeti password",
"repeat-password-required": "È richiesta la ripetizione della password"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "Crea un utente amministratore",
"available-platforms": "Piattaforme disponibili",
"cancel": "Annulla",
"check-metadata-step": "Controlla le fonti dei metadati",
"confirm-create-platforms": "RomM creerà la struttura {structure} ({pattern}) con {count} piattaforma{plural}. Continuare?",
"confirm-no-platforms": "Nessuna struttura di cartelle rilevata e nessuna piattaforma selezionata. Dovrai creare manualmente la struttura delle cartelle. Continuare?",
"confirm-no-structure": "Nessuna struttura di cartelle rilevata. RomM creerà la struttura A (roms/{platform}) con {count} piattaforma{plural}. Continuare?",
"continue": "Continua",
"detected-platforms": "Piattaforme rilevate",
"deselect-all": "Deseleziona tutto",
"finish": "Fine",
"folder-structure": "Struttura delle cartelle",
"game": "gioco",
"games": "giochi",
"library-structure-step": "Configura la struttura della libreria",
"metadata-missing": "Chiave API mancante o non valida",
"next": "Avanti",
"no-structure-detected": "Nessuna struttura rilevata - verrà creata la struttura A",
"platform": "piattaforma",
"platforms": "piattaforme",
"previous": "precedente",
"select-all": "Seleziona tutto",
"select-platforms": "Seleziona piattaforme da creare",
"selected": "selezionato",
"structure-a-detected": "Struttura A rilevata",
"structure-b-detected": "Struttura B rilevata"
}

View File

@@ -94,5 +94,8 @@
"update": "更新",
"username": "ユーザ名",
"virtual-collection-type": "バーチャルコレクションタイプ (romのグループ化方法)",
"watcher": "ウォッチャー"
"watcher": "ウォッチャー",
"passwords-must-match": "パスワードが一致しません",
"repeat-password": "パスワードを再入力",
"repeat-password-required": "パスワードの再入力が必要です"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "管理者ユーザーを作成",
"available-platforms": "利用可能なプラットフォーム",
"cancel": "キャンセル",
"check-metadata-step": "メタデータソースを確認",
"confirm-create-platforms": "RomMは構造{structure}{pattern})を{count}プラットフォーム{plural}で作成します。続行しますか?",
"confirm-no-platforms": "フォルダ構造が検出されず、プラットフォームも選択されていません。フォルダ構造を手動で作成する必要があります。続行しますか?",
"confirm-no-structure": "フォルダ構造が検出されませんでした。RomMは構造Aroms/{platform})を{count}プラットフォーム{plural}で作成します。続行しますか?",
"continue": "続行",
"detected-platforms": "検出されたプラットフォーム",
"deselect-all": "すべて選択解除",
"finish": "完了",
"folder-structure": "フォルダ構造",
"game": "ゲーム",
"games": "ゲーム",
"library-structure-step": "ライブラリ構造を設定",
"metadata-missing": "APIキーがないか無効です",
"next": "次へ",
"no-structure-detected": "構造が検出されませんでした - 構造Aが作成されます",
"platform": "プラットフォーム",
"platforms": "プラットフォーム",
"previous": "前へ",
"select-all": "すべて選択",
"select-platforms": "作成するプラットフォームを選択",
"selected": "選択済み",
"structure-a-detected": "構造Aが検出されました",
"structure-b-detected": "構造Bが検出されました"
}

View File

@@ -94,5 +94,8 @@
"update": "업데이트",
"username": "아이디",
"virtual-collection-type": "자동 생성된 모음집 유형(롬 그룹화 방법)",
"watcher": "감시자"
"watcher": "감시자",
"passwords-must-match": "비밀번호가 일치해야 합니다",
"repeat-password": "비밀번호 재입력",
"repeat-password-required": "비밀번호 재입력이 필요합니다"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "관리자 사용자 생성",
"available-platforms": "사용 가능한 플랫폼",
"cancel": "취소",
"check-metadata-step": "메타데이터 소스 확인",
"confirm-create-platforms": "RomM이 구조 {structure}({pattern})를 {count}개 플랫폼{plural}으로 생성합니다. 계속하시겠습니까?",
"confirm-no-platforms": "폴더 구조가 감지되지 않았고 플랫폼도 선택되지 않았습니다. 폴더 구조를 수동으로 생성해야 합니다. 계속하시겠습니까?",
"confirm-no-structure": "폴더 구조가 감지되지 않았습니다. RomM이 구조 A(roms/{platform})를 {count}개 플랫폼{plural}으로 생성합니다. 계속하시겠습니까?",
"continue": "계속",
"detected-platforms": "감지된 플랫폼",
"deselect-all": "모두 선택 해제",
"finish": "완료",
"folder-structure": "폴더 구조",
"game": "게임",
"games": "게임",
"library-structure-step": "라이브러리 구조 설정",
"metadata-missing": "API 키가 없거나 유효하지 않음",
"next": "다음",
"no-structure-detected": "구조가 감지되지 않음 - 구조 A가 생성됩니다",
"platform": "플랫폼",
"platforms": "플랫폼",
"previous": "이전",
"select-all": "모두 선택",
"select-platforms": "생성할 플랫폼 선택",
"selected": "선택됨",
"structure-a-detected": "구조 A가 감지됨",
"structure-b-detected": "구조 B가 감지됨"
}

View File

@@ -94,5 +94,8 @@
"update": "Aktualizuj",
"username": "Nazwa użytkownika",
"virtual-collection-type": "Typ automatycznej kolekcji (metoda grupowania ROM-ów)",
"watcher": "Monitor"
"watcher": "Monitor",
"passwords-must-match": "Hasła muszą się zgadzać",
"repeat-password": "Powtórz hasło",
"repeat-password-required": "Wymagane jest powtórzenie hasła"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "Utwórz użytkownika administratora",
"available-platforms": "Dostępne platformy",
"cancel": "Anuluj",
"check-metadata-step": "Sprawdź źródła metadanych",
"confirm-create-platforms": "RomM utworzy strukturę {structure} ({pattern}) z {count} platforma{plural}. Kontynuować?",
"confirm-no-platforms": "Nie wykryto struktury folderów i nie wybrano żadnych platform. Będziesz musiał ręcznie utworzyć strukturę folderów. Kontynuować?",
"confirm-no-structure": "Nie wykryto struktury folderów. RomM utworzy strukturę A (roms/{platform}) z {count} platforma{plural}. Kontynuować?",
"continue": "Kontynuuj",
"detected-platforms": "Wykryte platformy",
"deselect-all": "Odznacz wszystkie",
"finish": "Zakończ",
"folder-structure": "Struktura folderów",
"game": "gra",
"games": "gry",
"library-structure-step": "Skonfiguruj strukturę biblioteki",
"metadata-missing": "Brak klucza API lub jest nieprawidłowy",
"next": "Dalej",
"no-structure-detected": "Nie wykryto struktury - zostanie utworzona struktura A",
"platform": "platforma",
"platforms": "platformy",
"previous": "wstecz",
"select-all": "Zaznacz wszystkie",
"select-platforms": "Wybierz platformy do utworzenia",
"selected": "wybrano",
"structure-a-detected": "Wykryto strukturę A",
"structure-b-detected": "Wykryto strukturę B"
}

View File

@@ -94,5 +94,8 @@
"update": "Atualizar",
"username": "Nome de usuário",
"virtual-collection-type": "Tipo de coleção virtual (método de agrupamento de ROM)",
"watcher": "Monitor"
"watcher": "Monitor",
"passwords-must-match": "As senhas devem coincidir",
"repeat-password": "Repetir senha",
"repeat-password-required": "É necessário repetir a senha"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "Criar um usuário administrador",
"available-platforms": "Plataformas disponíveis",
"cancel": "Cancelar",
"check-metadata-step": "Verificar fontes de metadados",
"confirm-create-platforms": "RomM criará a estrutura {structure} ({pattern}) com {count} plataforma{plural}. Continuar?",
"confirm-no-platforms": "Nenhuma estrutura de pasta detectada e nenhuma plataforma selecionada. Você precisará criar a estrutura de pastas manualmente. Continuar?",
"confirm-no-structure": "Nenhuma estrutura de pasta detectada. RomM criará a estrutura A (roms/{platform}) com {count} plataforma{plural}. Continuar?",
"continue": "Continuar",
"detected-platforms": "Plataformas detectadas",
"deselect-all": "Desselecionar tudo",
"finish": "Finalizar",
"folder-structure": "Estrutura de pastas",
"game": "jogo",
"games": "jogos",
"library-structure-step": "Configurar estrutura da biblioteca",
"metadata-missing": "Chave de API ausente ou inválida",
"next": "Próximo",
"no-structure-detected": "Nenhuma estrutura detectada - a estrutura A será criada",
"platform": "plataforma",
"platforms": "plataformas",
"previous": "anterior",
"select-all": "Selecionar tudo",
"select-platforms": "Selecionar plataformas para criar",
"selected": "selecionado",
"structure-a-detected": "Estrutura A detectada",
"structure-b-detected": "Estrutura B detectada"
}

View File

@@ -94,5 +94,8 @@
"update": "Actualizează",
"username": "Nume de utilizator",
"virtual-collection-type": "Tip de colecție virtuală (metoda de grupare a rom-urilor)",
"watcher": "Monitor"
"watcher": "Monitor",
"passwords-must-match": "Parolele trebuie să se potrivească",
"repeat-password": "Repetă parola",
"repeat-password-required": "Este necesar să repetați parola"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "Creează un utilizator administrator",
"available-platforms": "Platforme disponibile",
"cancel": "Anulează",
"check-metadata-step": "Verifică sursele de metadate",
"confirm-create-platforms": "RomM va crea structura {structure} ({pattern}) cu {count} platformă{plural}. Continuă?",
"confirm-no-platforms": "Nu s-a detectat nicio structură de directoare și nu au fost selectate platforme. Va trebui să creezi manual structura directoarelor. Continuă?",
"confirm-no-structure": "Nu s-a detectat nicio structură de directoare. RomM va crea structura A (roms/{platform}) cu {count} platformă{plural}. Continuă?",
"continue": "Continuă",
"detected-platforms": "Platforme detectate",
"deselect-all": "Deselectează tot",
"finish": "Finalizează",
"folder-structure": "Structura directoarelor",
"game": "joc",
"games": "jocuri",
"library-structure-step": "Configurează structura bibliotecii",
"metadata-missing": "Cheie API lipsă sau invalidă",
"next": "Următorul",
"no-structure-detected": "Nu s-a detectat nicio structură - se va crea structura A",
"platform": "platformă",
"platforms": "platforme",
"previous": "anterior",
"select-all": "Selectează tot",
"select-platforms": "Selectează platformele de creat",
"selected": "selectat",
"structure-a-detected": "Structura A detectată",
"structure-b-detected": "Structura B detectată"
}

View File

@@ -94,5 +94,8 @@
"update": "Обновить",
"username": "Имя пользователя",
"virtual-collection-type": "Тип виртуальной коллекции (метод группировки ромов)",
"watcher": "Наблюдатель"
"watcher": "Наблюдатель",
"passwords-must-match": "Пароли должны совпадать",
"repeat-password": "Повторите пароль",
"repeat-password-required": "Требуется повторить пароль"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "Создать пользователя-администратора",
"available-platforms": "Доступные платформы",
"cancel": "Отмена",
"check-metadata-step": "Проверить источники метаданных",
"confirm-create-platforms": "RomM создаст структуру {structure} ({pattern}) с {count} платформ{plural}. Продолжить?",
"confirm-no-platforms": "Структура папок не обнаружена и платформы не выбраны. Вам нужно будет создать структуру папок вручную. Продолжить?",
"confirm-no-structure": "Структура папок не обнаружена. RomM создаст структуру A (roms/{platform}) с {count} платформ{plural}. Продолжить?",
"continue": "Продолжить",
"detected-platforms": "Обнаруженные платформы",
"deselect-all": "Снять все выделения",
"finish": "Завершить",
"folder-structure": "Структура папок",
"game": "игра",
"games": "игры",
"library-structure-step": "Настроить структуру библиотеки",
"metadata-missing": "API ключ отсутствует или недействителен",
"next": "Далее",
"no-structure-detected": "Структура не обнаружена - будет создана структура A",
"platform": "платформа",
"platforms": "платформы",
"previous": "назад",
"select-all": "Выбрать все",
"select-platforms": "Выбрать платформы для создания",
"selected": "выбрано",
"structure-a-detected": "Обнаружена структура A",
"structure-b-detected": "Обнаружена структура B"
}

View File

@@ -94,5 +94,8 @@
"update": "更新",
"username": "用户名",
"virtual-collection-type": "虚拟收藏类型Rom 文件分组方法)",
"watcher": "监视器"
"watcher": "监视器",
"passwords-must-match": "密码必须匹配",
"repeat-password": "重复密码",
"repeat-password-required": "需要重复密码"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "创建管理员用户",
"available-platforms": "可用平台",
"cancel": "取消",
"check-metadata-step": "检查元数据源",
"confirm-create-platforms": "RomM 将创建结构 {structure}{pattern})包含 {count} 个平台{plural}。继续吗?",
"confirm-no-platforms": "未检测到文件夹结构且未选择平台。您需要手动创建文件夹结构。继续吗?",
"confirm-no-structure": "未检测到文件夹结构。RomM 将创建结构 Aroms/{platform})包含 {count} 个平台{plural}。继续吗?",
"continue": "继续",
"detected-platforms": "检测到的平台",
"deselect-all": "取消全选",
"finish": "完成",
"folder-structure": "文件夹结构",
"game": "游戏",
"games": "游戏",
"library-structure-step": "设置库结构",
"metadata-missing": "API 密钥缺失或无效",
"next": "下一步",
"no-structure-detected": "未检测到结构 - 将创建结构 A",
"platform": "平台",
"platforms": "平台",
"previous": "上一步",
"select-all": "全选",
"select-platforms": "选择要创建的平台",
"selected": "已选择",
"structure-a-detected": "检测到结构 A",
"structure-b-detected": "检测到结构 B"
}

View File

@@ -94,5 +94,8 @@
"update": "更新",
"username": "用戶名",
"virtual-collection-type": "自動生成收藏庫形式Rom 分組方式)",
"watcher": "監視器"
"watcher": "監視器",
"passwords-must-match": "密碼必須相符",
"repeat-password": "重複密碼",
"repeat-password-required": "需要重複密碼"
}

View File

@@ -0,0 +1,28 @@
{
"admin-user-step": "建立管理員使用者",
"available-platforms": "可用平台",
"cancel": "取消",
"check-metadata-step": "檢查詮釋資料來源",
"confirm-create-platforms": "RomM 將建立結構 {structure}{pattern})包含 {count} 個平台{plural}。繼續嗎?",
"confirm-no-platforms": "未偵測到資料夾結構且未選擇平台。您需要手動建立資料夾結構。繼續嗎?",
"confirm-no-structure": "未偵測到資料夾結構。RomM 將建立結構 Aroms/{platform})包含 {count} 個平台{plural}。繼續嗎?",
"continue": "繼續",
"detected-platforms": "偵測到的平台",
"deselect-all": "取消全選",
"finish": "完成",
"folder-structure": "資料夾結構",
"game": "遊戲",
"games": "遊戲",
"library-structure-step": "設定資料庫結構",
"metadata-missing": "API 金鑰遺失或無效",
"next": "下一步",
"no-structure-detected": "未偵測到結構 - 將建立結構 A",
"platform": "平台",
"platforms": "平台",
"previous": "上一步",
"select-all": "全選",
"select-platforms": "選擇要建立的平台",
"selected": "已選擇",
"structure-a-detected": "偵測到結構 A",
"structure-b-detected": "偵測到結構 B"
}

View File

@@ -311,9 +311,10 @@ function handleNext(nextCallback: () => void) {
// Case 1: No structure detected and user is creating platforms
if (!hasStructure && platformsToCreate.length > 0) {
confirmDialogMessage.value = `No folder structure detected. RomM will create Structure A (roms/{platform}) with ${
platformsToCreate.length
} platform${platformsToCreate.length > 1 ? "s" : ""}. Continue?`;
confirmDialogMessage.value = t("setup.confirm-no-structure", {
count: platformsToCreate.length,
plural: platformsToCreate.length > 1 ? "s" : "",
});
confirmDialogAction.value = nextCallback;
showConfirmDialog.value = true;
return;
@@ -321,8 +322,7 @@ function handleNext(nextCallback: () => void) {
// Case 2: No structure detected and user is not selecting anything
if (!hasStructure && platformsToCreate.length === 0) {
confirmDialogMessage.value =
"No folder structure detected and no platforms selected. You will need to create the folder structure manually. Continue?";
confirmDialogMessage.value = t("setup.confirm-no-platforms");
confirmDialogAction.value = nextCallback;
showConfirmDialog.value = true;
return;
@@ -334,9 +334,12 @@ function handleNext(nextCallback: () => void) {
libraryInfo.value.detected_structure === "A"
? "roms/{platform}"
: "{platform}/roms";
confirmDialogMessage.value = `RomM will create Structure ${libraryInfo.value.detected_structure} (${structurePattern}) with ${
platformsToCreate.length
} platform${platformsToCreate.length > 1 ? "s" : ""}. Continue?`;
confirmDialogMessage.value = t("setup.confirm-create-platforms", {
structure: libraryInfo.value.detected_structure,
pattern: structurePattern,
count: platformsToCreate.length,
plural: platformsToCreate.length > 1 ? "s" : "",
});
confirmDialogAction.value = nextCallback;
showConfirmDialog.value = true;
return;
@@ -452,9 +455,9 @@ onMounted(() => {
<v-stepper-header style="box-shadow: unset">
<v-stepper-item :value="1">
<template #title>
<span class="text-white text-shadow"
>Setup library structure</span
>
<span class="text-white text-shadow">{{
t("setup.library-structure-step")
}}</span>
</template>
</v-stepper-item>
@@ -462,7 +465,9 @@ onMounted(() => {
<v-stepper-item :value="2">
<template #title>
<span class="text-white text-shadow">Create an admin user</span>
<span class="text-white text-shadow">{{
t("setup.admin-user-step")
}}</span>
</template>
</v-stepper-item>
@@ -470,9 +475,9 @@ onMounted(() => {
<v-stepper-item :value="3">
<template #title>
<span class="text-white text-shadow"
>Check metadata sources</span
>
<span class="text-white text-shadow">{{
t("setup.check-metadata-step")
}}</span>
</template>
</v-stepper-item>
</v-stepper-header>
@@ -481,9 +486,13 @@ onMounted(() => {
<!-- Mobile title section -->
<div v-if="xs" class="flex-grow-0 text-center">
<span class="text-white text-shadow text-subtitle-1">
<span v-if="step === 1">Setup library structure</span>
<span v-else-if="step === 2">Create an admin user</span>
<span v-else-if="step === 3">Check metadata sources</span>
<span v-if="step === 1">{{
t("setup.library-structure-step")
}}</span>
<span v-else-if="step === 2">{{ t("setup.admin-user-step") }}</span>
<span v-else-if="step === 3">{{
t("setup.check-metadata-step")
}}</span>
</span>
</div>
@@ -514,13 +523,13 @@ onMounted(() => {
<v-row v-if="!loadingLibraryInfo" no-gutters class="mb-3">
<v-col class="text-center">
<p class="text-white text-shadow">
<strong>Folder structure:</strong>
<strong>{{ t("setup.folder-structure") }}:</strong>
{{
libraryInfo?.detected_structure === "A"
? "Structure A detected"
? t("setup.structure-a-detected")
: libraryInfo?.detected_structure === "B"
? "Structure B detected"
: "No structure detected - Structure A will be created"
? t("setup.structure-b-detected")
: t("setup.no-structure-detected")
}}
</p>
<p class="text-caption text-grey">
@@ -546,15 +555,19 @@ onMounted(() => {
class="pr-2"
>
<div class="text-white text-center text-shadow mb-2">
<strong>Detected Platforms</strong>
<strong>{{ t("setup.detected-platforms") }}</strong>
</div>
<div class="mb-2 ml-4">
<v-chip label>
{{ libraryInfo?.existing_platforms.length }} platforms
{{ libraryInfo?.existing_platforms.length }}
{{ t("setup.platforms") }}
</v-chip>
<v-chip class="ml-2" variant="tonal" label>
{{ totalDetectedGames }} game{{
totalDetectedGames !== 1 ? "s" : ""
{{ totalDetectedGames }}
{{
totalDetectedGames !== 1
? t("setup.games")
: t("setup.game")
}}
</v-chip>
</div>
@@ -574,8 +587,8 @@ onMounted(() => {
<div class="text-white text-center text-shadow mb-2">
<strong>{{
hasExistingPlatforms
? "Available Platforms"
: "Select Platforms to Create"
? t("setup.available-platforms")
: t("setup.select-platforms")
}}</strong>
</div>
<div class="mb-2 ml-4">
@@ -585,10 +598,15 @@ onMounted(() => {
@click="selectAll = !selectAll"
label
>
{{ selectAll ? "Deselect All" : "Select All" }}
{{
selectAll
? t("setup.deselect-all")
: t("setup.select-all")
}}
</v-chip>
<v-chip class="ml-2" label
>{{ selectedAvailableCount }} selected</v-chip
>{{ selectedAvailableCount }}
{{ t("setup.selected") }}</v-chip
>
</div>
<div class="overflow-y-auto" style="max-height: 500px">
@@ -613,13 +631,13 @@ onMounted(() => {
:value="0"
class="text-white text-shadow"
>
Detected
{{ t("setup.detected-platforms") }}
</v-tab>
<v-tab
:value="hasExistingPlatforms ? 1 : 0"
class="text-white text-shadow"
>
Available
{{ t("setup.available-platforms") }}
</v-tab>
</v-tabs>
@@ -629,11 +647,14 @@ onMounted(() => {
<div class="mb-2 ml-4">
<v-chip label>
{{ libraryInfo?.existing_platforms.length }}
platforms
{{ t("setup.platforms") }}
</v-chip>
<v-chip class="ml-2" variant="tonal" label>
{{ totalDetectedGames }} game{{
totalDetectedGames !== 1 ? "s" : ""
{{ totalDetectedGames }}
{{
totalDetectedGames !== 1
? t("setup.games")
: t("setup.game")
}}
</v-chip>
</div>
@@ -654,10 +675,15 @@ onMounted(() => {
@click="selectAll = !selectAll"
label
>
{{ selectAll ? "Deselect All" : "Select All" }}
{{
selectAll
? t("setup.deselect-all")
: t("setup.select-all")
}}
</v-chip>
<v-chip class="ml-2" label
>{{ selectedAvailableCount }} selected</v-chip
>{{ selectedAvailableCount }}
{{ t("setup.selected") }}</v-chip
>
</div>
<div class="overflow-y-auto" style="max-height: 500px">
@@ -727,10 +753,11 @@ onMounted(() => {
:label="`${t('settings.repeat_password')} *`"
:type="visibleRepeatPassword ? 'text' : 'password'"
:rules="[
(v: string) => !!v || 'Repeat password is required',
(v: string) =>
!!v || t('settings.repeat-password-required'),
(v: string) =>
v === defaultAdminUser.password ||
'Passwords must match',
t('settings.passwords-must-match'),
]"
required
autocomplete="on"
@@ -765,7 +792,7 @@ onMounted(() => {
class="text-white text-shadow"
:title="source.name"
:subtitle="
source.disabled ? 'API key missing or invalid' : ''
source.disabled ? t('setup.metadata-missing') : ''
"
>
<template #prepend>
@@ -794,7 +821,7 @@ onMounted(() => {
:disabled="isFirstStep"
@click="prev"
>
{{ isFirstStep ? "" : "previous" }}
{{ isFirstStep ? "" : t("setup.previous") }}
</v-btn>
</template>
<template #next>
@@ -804,7 +831,7 @@ onMounted(() => {
@click="!isLastStep ? handleNext(next) : finishWizard()"
@keydown.enter="!isLastStep ? handleNext(next) : finishWizard()"
>
{{ !isLastStep ? "Next" : "Finish" }}
{{ !isLastStep ? t("setup.next") : t("setup.finish") }}
</v-btn>
</template>
</v-stepper-actions>
@@ -828,13 +855,13 @@ onMounted(() => {
<v-row class="justify-center my-2" no-gutters>
<v-btn-group divided density="compact">
<v-btn class="bg-toplayer" @click="showConfirmDialog = false">
Cancel
{{ t("setup.cancel") }}
</v-btn>
<v-btn
class="bg-toplayer text-primary"
@click="handleConfirmDialog"
>
Continue
{{ t("setup.continue") }}
</v-btn>
</v-btn-group>
</v-row>