feat: add translation system with runtime reload and 636 new Spanish translations

- Add LanguageManager::ReloadTranslations() and RequestMenuRebuild()
- Add SohMenu::RequestRebuild() and RebuildMenu() for in-place translation updates
- Add originalName field to WidgetInfo for tracking English source strings
- Add 636 new Spanish translations (1084 -> 1720 keys)
  - Menu tooltips and labels (Enhancements, Network, DevTools)
  - Randomizer item tracker (boss souls, jabber nuts, keys, ocarina buttons)
  - Randomizer check tracker (color pickers, labels, tooltips)
  - Randomizer entrance tracker (entrance names, group names, tooltips)
  - Plandomizer (area names, buttons, labels)
- UI Translation dropdown now triggers menu rebuild on language change
This commit is contained in:
2026-04-04 23:34:10 -06:00
parent ca5c80fc47
commit 5656d48efe
7 changed files with 1104 additions and 22 deletions

View File

@@ -301,7 +301,7 @@
"Boomerang": "Bumerang",
"Instant Boomerang Recall": "Retorno Instantáneo de Bumerang",
"Aim Boomerang in First-Person Mode": "Apuntar Bumerang en Modo Primera Persona",
"Aiming Reticle for Boomerang": "Retícula de Puntería para Bumerang",
"Aiming Reticle for Boomerang": "Retícula de Puntería para Bumerán",
"Magic Spells": "Hechizos",
"Better Farore's Wind": "Mejor Viento de Farore",
"Faster Farore's Wind": "Viento de Farore Más Rápido",
@@ -916,7 +916,7 @@
"Toggles the Item Tracker.": "Alterna el Rastreador de Objetos.",
"Translate Title Screen": "Traducir Pantalla de Título",
"Translate the Debug Warp Screen based on the game language.": "Traducir la Pantalla de Teletransporte Debug según el idioma del juego.",
"Trap Options": "Opciones de Trampas",
"Trap Options": "Opciones de Trampa",
"Trees Drop Sticks": "Los Árboles Suelten Palos",
"Tricks/Glitches": "Trucos/Glitches",
"Turn on/off changes to the Bombchu Bowling behavior.": "Activar/desactivar cambios al comportamiento de Bolos de Bombchu.",
@@ -951,7 +951,6 @@
"Resources": "Recursos",
"Spoiler Log Rewards": "Recompensas del Spoiler Log",
"Model": "Modelo",
"Trap Options": "Opciones de Trampa",
"Name: ": "Nombre: ",
"Load/Save Spoiler Log": "Cargar/Guardar Spoiler Log",
"No Spoiler Logs found.": "No se encontraron Spoiler Logs.",
@@ -984,7 +983,6 @@
"Total": "Total",
"General settings": "Configuración general",
"Section settings": "Configuración de sección",
"Hidden": "Oculto",
"Main Window": "Ventana Principal",
"Misc Window": "Ventana Miscelánea",
"Separate": "Separado",
@@ -1029,10 +1027,6 @@
"Text size : %dpx": "Tamaño de texto: %dpx",
"Align count to left side": "Alinear conteo al lado izquierdo",
"Inventory": "Inventario",
"Equipment": "Equipo",
"Aiming Reticle for the Bow/Slingshot": "Retícula de Puntería para Arco/Honda",
"Aiming Reticle for Boomerang": "Retícula de Puntería para Bumerán",
"Targetable Hookshot Reticle": "Retícula de Gancho Dirigible",
"Boss Souls": "Almas de Jefes",
"Ocarina Buttons": "Botones de Ocarina",
"Overworld Keys": "Llaves de Mundo",
@@ -1077,13 +1071,9 @@
"Exclude": "Excluir",
"Included": "Incluido",
"Excluded": "Excluido",
"Off": "Apagado",
"On": "Encendido",
"Disabled": "Desactivado",
"Enabled": "Activado",
"Apply": "Aplicar",
"Cancel": "Cancelar",
"Clear": "Limpiar",
"Reset": "Reiniciar",
"Save": "Guardar",
"Load": "Cargar",
@@ -1092,15 +1082,644 @@
"Export": "Exportar",
"Generate": "Generar",
"Refresh": "Actualizar",
"None": "Ninguno",
"All": "Todos",
"Both": "Ambos",
"Default": "Por Defecto",
"Custom": "Personalizado",
"Random": "Aleatorio",
"Vanilla": "Original",
"Unknown": "Desconocido",
"Yes": "Sí",
"No": "No"
"No": "No",
"Adds back in a delay after unpausing before the game resumes playing again, where inputs can be held prematurely to be input immediately after the game resumes. This essentially brings back behaviour from console releases which are lost on default because SoH isn't limited to N64 hardware.": "Añade un retraso después de despausar antes de que el juego se reanude, donde las entradas pueden mantenerse presionadas prematuramente para ingresarse inmediatamente después de que el juego se reanude. Esto esencialmente restaura el comportamiento de las versiones de consola que se pierden por defecto porque SoH no está limitado al hardware de N64.",
"Aiming with a Bow or Slingshot will display a reticle as with the Hookshot when the projectile is ready to fire.": "Apuntar con un Arco o Resortera mostrará una retícula como con el Gancho cuando el proyectil esté listo para dispararse.",
"Allows Link to bounce off walls when linear velocity is high enough, this is relevant when frequently being knocked back by traps, CC, or in Anchor.": "Permite que Link rebote en las paredes cuando la velocidad lineal es lo suficientemente alta, esto es relevante cuando es frecuentemente rechazado por trampas, CC o en Anchor.",
"Allows the cursor on the pause menu to be over any slot. Sometimes required in Randomizer to select certain items.": "Permite que el cursor del menú de pausa esté sobre cualquier espacio. A veces es necesario en Randomizer para seleccionar ciertos objetos.",
"Allows unequipping items from C-Buttons/D-pad by hovering over an equipped item and pressing the button it's equipped to.": "Permite desequipar objetos de los Botones-C/D-pad pasando el cursor sobre un objeto equipado y presionando el botón al que está equipado.",
"Bombchus do not sell out when bought, and a 10 pack of Bombchus costs 99 rupees instead of 100.": "Los Bombchus no se agotan al comprarlos, y un paquete de 10 Bombchus cuesta 99 rupias en lugar de 100.",
"Disables 2D pre-rendered backgrounds. Enable this when using a mod that implements 3D backdrops for these areas.\nRequires Scene Change to alter.": "Desactiva los fondos prerenderizados en 2D. Actívalo al usar un mod que implemente fondos 3D para estas áreas.\nRequiere cambio de escena para aplicar.",
"Disables the sword trail effect when swinging Link's sword. Useful when using mods that replace Link's sword model.": "Desactiva el efecto de estela de la espada al blandir la espada de Link. Útil al usar mods que reemplazan el modelo de la espada de Link.",
"Disables warning text when you don't have on the Goron/Zora Tunic in Hot/Underwater conditions.": "Desactiva el texto de advertencia cuando no tienes puesta la túnica Goron/Zora en condiciones de calor/bajo el agua.",
"Don't skip cutscenes that are associated with useful glitches. Currently, it is only the Fire Temple Darunia CS, Forest Temple Poe Sisters CS, Dodongo Boss Door Switch CS, Water Temple Dragon Switch CS, the Box Skip One Point in Jabu, Early Hammer Switch CS in MQ Spirit, and Cow Switch Chest CS in MQ Jabu.": "No omitas las cinemáticas asociadas con glitches útiles. Actualmente, solo son la cinemática de Darunia del Templo del Fuego, las Hermanas Poe del Templo del Bosque, el interruptor de puerta de Dodongo, el interruptor del dragón del Templo del Agua, el Box Skip One Point en Jabu, Early Hammer Switch en MQ Spirit y Cow Switch Chest en MQ Jabu.",
"Fixes camera slightly drifting to the left when standing still due to a math error. May impact certain glitches.": "Corrige la ligera deriva de la cámara hacia la izquierda al estar quieto debido a un error matemático. Puede afectar ciertos glitches.",
"Fixes camera swing rate when the player falls off a ledge and the camera swings around. May impact certain glitches.": "Corrige la velocidad de giro de la cámara cuando el jugador cae de un borde y la cámara gira. Puede afectar ciertos glitches.",
"Fixes kokiri animation state to match their text state when getting Zelda's Letter before Kokiri Emerald.": "Corrige el estado de animación de los Kokiri para que coincida con su estado de texto al obtener la Carta de Zelda antes de la Esmeralda Kokiri.",
"Instantly return the Boomerang to Link by pressing its item button while it's in the air.": "Devuelve instantáneamente el Bumerán a Link presionando su botón de objeto mientras está en el aire.",
"Make Deku Nuts explode Bombs, similar to how they interact with Bombchus. This does not affect Bomb Flowers.": "Hace que las Nueces Deku exploten las Bombas, similar a cómo interactúan con los Bombchus. Esto no afecta a las Flores Bomba.",
"Makes Link always kick the chest to open it, instead of doing the longer chest opening animation for major items.": "Hace que Link siempre patee el cofre para abrirlo, en lugar de hacer la animación más larga de apertura de cofres para objetos importantes.",
"Prevents the Forest Stage Deku Nut upgrade from becoming unobtainable after receiving the Poacher's Saw.": "Evita que la mejora de Nueces Deku de la etapa del Bosque se vuelva imposible de obtener después de recibir la Sierra de Cazador Furtivo.",
"Resets the Navi timer on scene change. If you have already talked to her, she will try and talk to you again, instead of needing a save warp or death.": "Reinicia el temporizador de Navi al cambiar de escena. Si ya le hablaste, intentará hablarte de nuevo, en lugar de necesitar un warp de guardado o muerte.",
"Skips Link's taking breath animation after coming up from water. This setting does not interfere with getting items from underwater.": "Omite la animación de Link tomando aire después de salir del agua. Esta configuración no interfiere con obtener objetos del fondo del agua.",
"The skybox in the background of the File Select screen will go through the day and night cycle over time.": "El skybox en el fondo de la pantalla de selección de archivo pasará por el ciclo de día y noche con el tiempo.",
"These are NOT like emulator states. They do not save your game progress and they WILL break across transitions and load zones (like doors). Support for related issues will not be provided.": "Estos NO son como los estados de emulador. No guardan el progreso de tu juego y SE romperán entre transiciones y zonas de carga (como puertas). No se proporcionará soporte para problemas relacionados.",
"This is not compatible with the Locked Overworld Doors Randomizer option.": "Esto no es compatible con la opción de Randomizer 'Puertas del Overworld Bloqueadas'.",
"Turns the Static Image of Link in the Pause Menu's Equipment Subscreen into a model cycling through his idle animations.": "Convierte la imagen estática de Link en la subpantalla de equipo del menú de pausa en un modelo que cicla a través de sus animaciones de reposo.",
"Matches the color of maps & compasses to the dungeon they belong to. This helps identify maps & compasses from afar and adds a little bit of flair to your item pool.": "Hace coincidir el color de los mapas y brújulas con la mazmorra a la que pertenecen. Esto ayuda a identificar mapas y brújulas desde lejos y añade un poco de estilo a tu pool de objetos.",
"Must be on File Select to generate a randomizer seed.": "Debes estar en la Selección de Archivo para generar una semilla de randomizer.",
"Presets": "Preajustes",
"Crowd Control is a platform that allows viewers to interact with a streamer's game in real time. This integration allows viewers to spawn enemies, change Link's equipment, and more!": "Crowd Control es una plataforma que permite a los espectadores interactuar con el juego de un streamer en tiempo real. ¡Esta integración permite a los espectadores generar enemigos, cambiar el equipo de Link y más!",
"Enemies spawned by CrowdControl won't be considered for \"clear enemy rooms\", so they don't need to be killed to complete these rooms.": "Los enemigos generados por CrowdControl no se considerarán para \"limpiar salas de enemigos\", por lo que no necesitan ser eliminados para completar estas salas.",
"Sail is a networking protocol designed to facilitate remote control of the Ship of Harkinian client. It allows you to control the game from a remote device, such as a phone or tablet.": "Sail es un protocolo de red diseñado para facilitar el control remoto del cliente Ship of Harkinian. Te permite controlar el juego desde un dispositivo remoto, como un teléfono o tableta.",
"Changes the behavior of debug file select creation (creating a save file on slot 1 with debug mode on). Normal: Creates a save file with the default starting equipment. Randomizer: Creates a save file with the starting equipment defined in the randomizer settings.": "Cambia el comportamiento de creación de archivo de depuración (crear un archivo de guardado en el slot 1 con el modo depuración activado). Normal: Crea un archivo de guardado con el equipo inicial predeterminado. Randomizer: Crea un archivo de guardado con el equipo inicial definido en la configuración del randomizer.",
"Enables Debug Mode, allowing you to select maps with L + R + Z, noclip with L + D-pad Right, and open the debug menu with L on the pause screen.": "Activa el Modo Depuración, permitiéndote seleccionar mapas con L + R + Z, noclip con L + D-pad Derecha, y abrir el menú de depuración con L en la pantalla de pausa.",
"Enables Skulltula Debug, when moving the cursor in the menu above various map icons (boss key, compass, map screen locations, etc.) will set the GS bits in that area. This allows you to quickly set GS tokens for testing purposes.": "Activa la Depuración de Skulltulas, al mover el cursor en el menú sobre varios íconos del mapa (llave de jefe, brújula, ubicaciones del mapa, etc.) establecerá los bits de GS en esa área. Esto te permite establecer rápidamente tokens de GS para propósitos de prueba.",
"Inventory Items Tracker": "Rastreador de Inventario",
"Equipment Items Tracker": "Rastreador de Equipamiento",
"Misc Items Tracker": "Rastreador de Varios",
"Dungeon Rewards Tracker": "Rastreador de Recompensas de Mazmorra",
"Songs Tracker": "Rastreador de Canciones",
"Dungeon Items Tracker": "Rastreador de Objetos de Mazmorra",
"Greg Tracker": "Rastreador de Greg",
"Triforce Piece Tracker": "Rastreador de Piezas de Trifuerza",
"Bean Soul Tracker": "Rastreador de Almas de Semilla",
"Boss Soul Tracker": "Rastreador de Almas de Jefe",
"Jabber Nut Tracker": "Rastreador de Jabber Nuts",
"Ocarina Button Tracker": "Rastreador de Botones de Ocarina",
"Overworld Key Tracker": "Rastreador de Llaves del Mundo",
"Fishing Pole Tracker": "Rastreador de Caña de Pescar",
"Personal Notes": "Notas Personales",
"Background Color##ItemTracker": "Color de Fondo##ItemTracker",
"Window Type##ItemTracker": "Tipo de Ventana##ItemTracker",
"Ammo/Capacity Tracking": "Seguimiento de Munición/Capacidad",
"Key Count Tracking": "Seguimiento de Cantidad de Llaves",
"Triforce Pieces": "Piezas de Trifuerza",
"Greg": "Greg",
"Bean Souls": "Almas de Semilla",
"Jabber Nuts": "Jabber Nuts",
"Triforce Piece Count Tracking": "Seguimiento de Cantidad de Piezas de Trifuerza",
"Fishing Pole": "Caña de Pescar",
"Personal notes": "Notas personales",
"Show Hookshot Identifiers": "Mostrar Identificadores de Gancho",
"Circle display": "Mostrar en círculo",
"Horizontal display": "Mostrar horizontal",
"Maps and compasses": "Mapas y brújulas",
"Dungeon Rewards": "Recompensas de Mazmorra",
"Songs": "Canciones",
"No Numbers": "Sin Números",
"Current Capacity": "Capacidad Actual",
"Current Ammo": "Munición Actual",
"Current Capacity / Max Capacity": "Capacidad Actual / Capacidad Máxima",
"Current Ammo / Current Capacity": "Munición Actual / Capacidad Actual",
"Collected / Max": "Recolectados / Máx",
"Current / Collected / Max": "Actual / Recolectados / Máx",
"Current / Max": "Actual / Máx",
"Collected / Required": "Recolectados / Requeridos",
"Collected / Required / Max": "Recolectados / Requeridos / Máx",
"Customize what the numbers under each item are tracking.\n\nNote: items without capacity upgrades will track ammo even in capacity mode": "Personaliza qué rastrean los números debajo de cada objeto.\n\nNota: los objetos sin mejoras de capacidad rastrearán munición incluso en modo capacidad",
"Customize what numbers are shown for key tracking.": "Personaliza qué números se muestran para el seguimiento de llaves.",
"Customize what numbers are shown for triforce piece tracking.": "Personaliza qué números se muestran para el seguimiento de piezas de Trifuerza.",
"Shows an 'H' or an 'L' to more easily distinguish between Hookshot and Longshot.": "Muestra una 'H' o una 'L' para distinguir más fácilmente entre Gancho y Super Gancho.",
"Disabled because tracker is set to floating and display combo is enabled.": "Deshabilitado porque el rastreador está configurado como flotante y la visualización combinada está activada.",
"Triforce Piece": "Pieza de Trifuerza",
"Roc's Feather": "Pluma de Roc",
"Death Mountain Crater Bean Soul": "Alma de Semilla del Cráter de la Montaña de la Muerte",
"Death Mountain Trail Bean Soul": "Alma de Semilla del Camino de la Montaña de la Muerte",
"Desert Colossus Bean Soul": "Alma de Semilla del Coloso del Desierto",
"Gerudo Valley Bean Soul": "Alma de Semilla del Valle Gerudo",
"Graveyard Bean Soul": "Alma de Semilla del Cementerio",
"Kokiri Forest Bean Soul": "Alma de Semilla del Bosque Kokiri",
"Lake Hylia Bean Soul": "Alma de Semilla del Lago Hylia",
"Lost Woods Bridge Bean Soul": "Alma de Semilla del Puente del Bosque Perdido",
"Lost Woods Theatre Bean Soul": "Alma de Semilla del Teatro del Bosque Perdido",
"Zora's River Bean Soul": "Alma de Semilla del Río Zora",
"Gohma's Soul": "Alma de Gohma",
"King Dodongo's Soul": "Alma del Rey Dodongo",
"Barinade's Soul": "Alma de Barinade",
"Phantom Ganon's Soul": "Alma de Ganon Fantasma",
"Volvagia's Soul": "Alma de Volvagia",
"Morpha's Soul": "Alma de Morpha",
"Bongo Bongo's Soul": "Alma de Bongo Bongo",
"Twinrova's Soul": "Alma de Twinrova",
"Ganon's Soul": "Alma de Ganon",
"Deku Jabber Nut": "Jabber Nut Deku",
"Gerudo Jabber Nut": "Jabber Nut Gerudo",
"Goron Jabber Nut": "Jabber Nut Goron",
"Hylian Jabber Nut": "Jabber Nut Hyliano",
"Kokiri Jabber Nut": "Jabber Nut Kokiri",
"Zora Jabber Nut": "Jabber Nut Zora",
"Ocarina A Button": "Botón A de la Ocarina",
"Ocarina C Up Button": "Botón C Arriba de la Ocarina",
"Ocarina C Down Button": "Botón C Abajo de la Ocarina",
"Ocarina C Left Button": "Botón C Izquierda de la Ocarina",
"Ocarina C Right Button": "Botón C Derecha de la Ocarina",
"Guard House Key": "Llave de la Casa del Guardia",
"Market Bazaar Key": "Llave del Bazar del Mercado",
"Market Potion Shop Key": "Llave de la Tienda de Pociones del Mercado",
"Mask Shop Key": "Llave de la Tienda de Máscaras",
"Market Shooting Gallery Key": "Llave de la Galería de Tiro del Mercado",
"Bombchu Bowling Key": "Llave de los Bolos Bombchu",
"Treasure Chest Game Building Key": "Llave del Edificio del Juego de Cofres",
"Bombchu Shop Key": "Llave de la Tienda de Bombchus",
"Richards House Key": "Llave de la Casa de Richard",
"Alley House Key": "Llave de la Casa del Callejón",
"Kak Bazaar Key": "Llave del Bazar de Kakariko",
"Kak Potion Shop Key": "Llave de la Tienda de Pociones de Kakariko",
"Boss House Key": "Llave de la Casa del Jefe",
"Granny's Potion Shop Key": "Llave de la Tienda de Pociones de la Abuela",
"Skulltula House Key": "Llave de la Casa de las Skulltulas",
"Impa's House Key": "Llave de la Casa de Impa",
"Windmill Key": "Llave del Molino de Viento",
"Kak Shooting Gallery Key": "Llave de la Galería de Tiro de Kakariko",
"Dampé's Hut Key": "Llave de la Cabaña de Dampé",
"Talon's House Key": "Llave de la Casa de Talon",
"Stables Key": "Llave de los Establos",
"Back Tower Key": "Llave de la Torre Trasera",
"Hylia Lab Key": "Llave del Laboratorio de Hylia",
"Fishing Hole Key": "Llave del Pozo de Pesca",
"Swim": "Nadar",
"Crawl": "Gatear",
"Climb": "Escalar",
"Grab": "Agarrar",
"Open": "Abrir",
"FRST": "BSQ",
"FIRE": "FG",
"WATR": "AG",
"SPRT": "ESP",
"SHDW": "TS",
"BOTW": "PdB",
"DEKU": "DEK",
"DCVN": "CD",
"JABU": "BJJ",
"ICE": "CH",
"GANON": "CG",
"GTG": "EGG",
"HIDE": "ETG",
"DMC": "CMD",
"DMT": "CMd",
"DC": "Cd",
"GV": "VG",
"GY": "Cem",
"KF": "BK",
"LH": "LH",
"LWB": "PBd",
"LWT": "TPd",
"ZR": "RZ",
"GOHMA": "GOH",
"KD": "RD",
"BARI": "BAR",
"PG": "GF",
"VOLV": "VOL",
"MORPH": "MOR",
"BONGO": "BON",
"TWIN": "TWI",
"GERUDO": "GER",
"GORON": "GOR",
"HYLIAN": "HIL",
"KOKIRI": "KOK",
"ZORA": "ZOR",
"A": "A",
"C-U": "C-A",
"C-D": "C-Ab",
"C-L": "C-Iz",
"C-R": "C-De",
"GUARD": "GRD",
"MKBAZ": "MBZ",
"MKPOT": "MPC",
"MASK": "MSC",
"MKSHO": "MTI",
"BOWL": "BOL",
"TREASU": "TCO",
"CHUSHO": "CBO",
"RICH": "RIC",
"ALLEY": "CAJ",
"KAKBAZ": "KBZ",
"KAKPO": "KPC",
"BOSS": "JFE",
"GRANNY": "ABU",
"SKULL": "SKL",
"IMPAS": "IMP",
"WIND": "MOL",
"KAKSHO": "KTI",
"DAMPES": "DAM",
"TALONS": "TLN",
"STABLE": "EST",
"TOWER": "TOR",
"LAB": "LAB",
"FISH": "PES",
"Available / ": "Disponible / ",
" Checked / ": " Verificado / ",
" Total": " Total",
"Available / Checked / Total": "Disponible / Verificado / Total",
" - MQ": " - MQ",
" - Vanilla": " - Clásico",
"???": "???",
"Skipped": "Omitido",
" ?": " ?",
"Sets the font size used in the check tracker.": "Establece el tamaño de fuente usado en el rastreador de verificaciones.",
"Filter Empty Areas": "Filtrar Áreas Vacías",
"If enabled, will hide area headers that have no locations matching filter": "Si está activado, ocultará los encabezados de área que no tengan ubicaciones que coincidan con el filtro",
"Hidden Items Toggle": "Alternar Objetos Ocultos",
"Available Checks Toggle": "Alternar Verificaciones Disponibles",
"Expand/Collapse Buttons": "Botones Expandir/Colapsar",
"Search Input": "Entrada de Búsqueda",
"Check Totals": "Totales de Verificación",
"Area Incomplete": "Área Incompleta",
"Area Complete": "Área Completa",
"Unchecked": "Sin Verificar",
"Checks you have not interacted with at all.": "Verificaciones con las que no has interactuado en absoluto.",
"Seen": "Visto",
"Used for shops. Shows item names for shop slots when walking in, and prices when highlighting them in buy mode.": "Usado para tiendas. Muestra nombres de objetos para espacios de tienda al entrar, y precios al seleccionarlos en modo compra.",
"Scummed": "Scummeado",
"Checks you collect, but then reload before saving so you no longer have them.": "Verificaciones que recolectas, pero luego recargas antes de guardar, por lo que ya no las tienes.",
"Collected": "Recolectado",
"Checks you have collected without saving or reloading yet.": "Verificaciones que has recolectado sin guardar ni recargar aún.",
"Saved": "Guardado",
"Checks that you saved the game while having collected.": "Verificaciones que guardaste en el juego mientras las tenías recolectadas.",
"Background Color##CheckTracker": "Color de Fondo##CheckTracker",
"Window Type##CheckTracker": "Tipo de Ventana##CheckTracker",
"Vanilla/MQ Dungeon Spoilers": "Spoilers de Mazmorra Clásica/MQ",
"If enabled, Vanilla/MQ dungeons will show on the tracker immediately. Otherwise, Vanilla/MQ dungeon locations must be unlocked.": "Si está activado, las mazmorras Clásica/MQ se mostrarán en el rastreador inmediatamente. De lo contrario, las ubicaciones de mazmorras Clásica/MQ deben desbloquearse.",
"Hide Unshuffled Shop Item Checks": "Ocultar Verificaciones de Objetos de Tienda No Aleatorizados",
"If enabled, will prevent the tracker from displaying slots with non-shop-item shuffles.": "Si está activado, evitará que el rastreador muestre espacios con aleatorizaciones que no sean de objetos de tienda.",
"Always Show Gold Skulltulas": "Mostrar Siempre Skulltulas Doradas",
"If enabled, will show GS locations in the tracker regardless of tokensanity settings.": "Si está activado, mostrará ubicaciones de SD en el rastreador sin importar la configuración de tokensanity.",
"Show Logic": "Mostrar Lógica",
"If enabled, will show a check's logic when hovering over it.": "Si está activado, mostrará la lógica de una verificación al pasar el cursor sobre ella.",
"Enable Available Checks": "Habilitar Verificaciones Disponibles",
"If enabled, will show the checks that are available to be collected with your current progress.": "Si está activado, mostrará las verificaciones que están disponibles para recolectar con tu progreso actual.",
"Name##": "Nombre##",
"Details##": "Detalles##",
"Checked / Total": "Verificado / Total",
" (%s)": " (%s)",
"The entrance tracker will only track shuffled entrances": "El rastreador de entradas solo rastreará entradas aleatorizadas",
"Clear the search field": "Limpiar el campo de búsqueda",
"Collapse all entrance groups": "Colapsar todos los grupos de entradas",
"Expand all entrance groups": "Expandir todos los grupos de entradas",
"Background Color##EntranceTracker": "Color de Fondo##EntranceTracker",
"Window Type##EntranceTracker": "Tipo de Ventana##EntranceTracker",
"Spawns/Warp Songs/Owls": "Apariciones/Canciones de Teletransporte/Búhos",
"Kokiri Forest": "Bosque Kokiri",
"Lost Woods": "Bosque Perdido",
"Sacred Forest Meadow": "Claro del Bosque Sagrado",
"Kakariko Village": "Aldea Kakariko",
"Graveyard": "Cementerio",
"Death Mountain Trail": "Camino de la Montaña de la Muerte",
"Death Mountain Crater": "Cráter de la Montaña de la Muerte",
"Goron City": "Ciudad Goron",
"Zora's River": "Río Zora",
"Zora's Domain": "Dominio Zora",
"Zora's Fountain": "Fuente Zora",
"Hyrule Field": "Campo de Hyrule",
"Lon Lon Ranch": "Rancho Lon Lon",
"Lake Hylia": "Lago Hylia",
"Gerudo Valley": "Valle Gerudo",
"Gerudo Fortress": "Fortaleza Gerudo",
"Haunted Wasteland": "Páramo Embrujado",
"Desert Colossus": "Coloso del Desierto",
"Market": "Mercado",
"Hyrule Castle": "Castillo de Hyrule",
"One Way": "Un Solo Sentido",
"Overworld": "Mundo Exterior",
"Interior": "Interior",
"Fortress": "Fortaleza",
"Grotto": "Gruta",
"Dungeon": "Mazmorra",
"Child Spawn": "Aparición de Niño",
"Adult Spawn": "Aparición de Adulto",
"Temple of Time": "Templo del Tiempo",
"Minuet of Forest": "Minueto del Bosque",
"SFM Warp Pad": "Placa de Teletransporte CBS",
"Bolero of Fire": "Bolero del Fuego",
"DMC Warp Pad": "Placa de Teletransporte CMD",
"Serenade of Water": "Serenata del Agua",
"Lake Hylia Warp Pad": "Placa de Teletransporte LH",
"Requiem of Spirit": "Réquiem del Espíritu",
"Desert Colossus Warp Pad": "Placa de Teletransporte CdD",
"Nocturne of Shadow": "Nocturno de la Sombra",
"Graveyard Warp Pad": "Placa de Teletransporte Cem",
"Prelude of Light": "Preludio de la Luz",
"Temple of Time Warp Pad": "Placa de Teletransporte TdT",
"DMT Owl Flight": "Vuelo de Búho CMd",
"Kakariko Village Owl Drop": "Caída de Búho Aldea Kakariko",
"LH Owl Flight": "Vuelo de Búho LH",
"Hyrule Field Owl Drop": "Caída de Búho Campo de Hyrule",
"Kokiri Forest Lower Exit": "Salida Inferior Bosque Kokiri",
"Lost Woods Bridge East Exit": "Salida Este Puente Bosque Perdido",
"Kokiri Forest Upper Exit": "Salida Superior Bosque Kokiri",
"Lost Woods South Exit": "Salida Sur Bosque Perdido",
"KF Link's House Entry": "Entrada Casa de Link BK",
"KF Mido's House Entry": "Entrada Casa de Mido BK",
"Mido's House": "Casa de Mido",
"KF Saria's House Entry": "Entrada Casa de Saria BK",
"Saria's House": "Casa de Saria",
"KF House of Twins Entry": "Entrada Casa de los Gemelos BK",
"House of Twins": "Casa de los Gemelos",
"KF Know-It-All House Entry": "Entrada Casa del Sabelotodo BK",
"Know-It-All House": "Casa del Sabelotodo",
"KF Shop Entry": "Entrada Tienda BK",
"Kokiri Shop": "Tienda Kokiri",
"KF Storms Grotto Entry": "Entrada Gruta de Tormentas BK",
"KF Storms Grotto": "Gruta de Tormentas BK",
"KF Outside Deku Tree": "Exterior del Árbol Deku BK",
"Deku Tree Entrance": "Entrada del Árbol Deku",
"Link's House": "Casa de Link",
"Deku Tree Boss Door": "Puerta de Jefe del Árbol Deku",
"Gohma": "Gohma",
"Gohma Blue Warp": "Teletransporte Azul de Gohma",
"Deku Tree Blue Warp": "Teletransporte Azul del Árbol Deku",
"Lost Woods Bridge West Exit": "Salida Oeste Puente Bosque Perdido",
"Hyrule Field Wooded Exit": "Salida Arbolada Campo de Hyrule",
"Lost Woods Tunnel Shortcut": "Atajo del Túnel del Bosque Perdido",
"Goron City Tunnel Shortcut": "Atajo del Túnel de la Ciudad Goron",
"Lost Woods Underwater Shortcut": "Atajo Subacuático del Bosque Perdido",
"Zora's River Underwater Shortcut": "Atajo Subacuático del Río Zora",
"Lost Woods North Exit": "Salida Norte Bosque Perdido",
"Sacred Forest Meadow South Exit": "Salida Sur Claro del Bosque Sagrado",
"LW Tunnel Grotto Entry": "Entrada Gruta del Túnel BP",
"LW Tunnel Grotto": "Gruta del Túnel BP",
"LW North Grotto Entry": "Entrada Gruta Norte BP",
"LW Deku Scrub Grotto": "Gruta de los Deku Scrub BP",
"LW Meadow Grotto Entry": "Entrada Gruta del Claro BP",
"Deku Theater": "Teatro Deku",
"SFM Wolfos Grotto Entry": "Entrada Gruta de Wolfos CBS",
"SFM Wolfos Grotto": "Gruta de Wolfos CBS",
"SFM Fairy Grotto Entry": "Entrada Gruta de Hadas CBS",
"SFM Fairy Grotto": "Gruta de Hadas CBS",
"SFM Storms Grotto Entry": "Entrada Gruta de Tormentas CBS",
"SFM Deku Scrub Grotto": "Gruta de Deku Scrub CBS",
"Sacred Forest Meadow Outside Forest Temple": "Claro del Bosque Sagrado Exterior del Templo del Bosque",
"Forest Temple Entrance": "Entrada del Templo del Bosque",
"Forest Temple Boss Door": "Puerta de Jefe del Templo del Bosque",
"Phantom Ganon": "Ganon Fantasma",
"Phantom Ganon Blue Warp": "Teletransporte Azul de Ganon Fantasma",
"Forest Temple Blue Warp": "Teletransporte Azul del Templo del Bosque",
"Kakariko Front Gate": "Puerta Frontal de Kakariko",
"Hyrule Field Stairs Exit": "Salida de Escaleras Campo de Hyrule",
"Kakariko Southeast Exit": "Salida Sureste de Kakariko",
"Graveyard Entrance": "Entrada del Cementerio",
"Kakariko Guard Gate Exit": "Salida de la Puerta del Guardia de Kakariko",
"Death Mountain Trail Bottom Exit": "Salida Inferior del Camino de la Montaña de la Muerte",
"Kak Boss House Entry": "Entrada Casa del Jefe Kak",
"Carpenter Boss House": "Casa del Jefe de los Carpinteros",
"Kak Skulltula House Entry": "Entrada Casa de las Skulltulas Kak",
"House of Skulltula": "Casa de las Skulltulas",
"Kak Impa's House Front Entry": "Entrada Frontal Casa de Impa Kak",
"Impa's House Front": "Casa de Impa Frontal",
"Kak Impa's House Back Entry": "Entrada Trasera Casa de Impa Kak",
"Impa's House Back": "Casa de Impa Trasera",
"Kak Windmill Entry": "Entrada del Molino de Viento Kak",
"Windmill": "Molino de Viento",
"Kak Shooting Gallery Entry": "Entrada Galería de Tiro Kak",
"Kak Shooting Gallery": "Galería de Tiro Kak",
"Kak Granny's Potion Shop Entry": "Entrada Tienda de Pociones de la Abuela Kak",
"Granny's Potion Shop": "Tienda de Pociones de la Abuela",
"Kak Bazaar Entry": "Entrada del Bazar Kak",
"Kak Bazaar": "Bazar Kak",
"Kak Potion Shop Front Entry": "Entrada Frontal Tienda de Pociones Kak",
"Kak Potion Shop Front": "Tienda de Pociones Kak Frontal",
"Kak Potion Shop Back Entry": "Entrada Trasera Tienda de Pociones Kak",
"Kak Potion Shop Back": "Tienda de Pociones Kak Trasera",
"Kak Open Grotto Entry": "Entrada Gruta Abierta Kak",
"Kak Open Grotto": "Gruta Abierta Kak",
"Kak Center Grotto Entry": "Entrada Gruta Central Kak",
"Kak Redead Grotto": "Gruta de ReDead Kak",
"Kakariko Outside the Well": "Kakariko Exterior del Pozo",
"Bottom of the Well Entrance": "Entrada del Fondo del Pozo",
"GY Dampe's Hut Entry": "Entrada Cabaña de Dampé Cem",
"Dampe's Hut": "Cabaña de Dampé",
"GY Near-Hut Grave Entry": "Entrada Tumba Cerca de la Cabaña Cem",
"Shield Grave": "Tumba del Escudo",
"GY Near-Tomb Grave Entry": "Entrada Tumba Cerca de la Tumba Real Cem",
"Heart Piece Grave": "Tumba del Trozo de Corazón",
"GY Royal Family's Tomb Entry": "Entrada Tumba de la Familia Real Cem",
"Royal Family's Tomb": "Tumba de la Familia Real",
"GY Near-Ledge Grave Entry": "Entrada Tumba Cerca del Borde Cem",
"Dampe's Grave": "Tumba de Dampé",
"Graveyard Outside Temple": "Cementerio Exterior del Templo",
"Shadow Temple Entrance": "Entrada del Templo de la Sombra",
"Shadow Temple Boss Door": "Puerta de Jefe del Templo de la Sombra",
"Bongo-Bongo": "Bongo-Bongo",
"Bongo-Bongo Blue Warp": "Teletransporte Azul de Bongo-Bongo",
"Shadow Temple Blue Warp": "Teletransporte Azul del Templo de la Sombra",
"Death Mountain Trail Middle Exit": "Salida Intermedia del Camino de la Montaña de la Muerte",
"Goron City Upper Exit": "Salida Superior de la Ciudad Goron",
"DMT Great Fairy Entry": "Entrada Gran Hada CMd",
"DMT Great Fairy Fountain": "Fuente de la Gran Hada CMd",
"DMT Rock Circle Grotto Entry": "Entrada Gruta del Círculo de Rocas CMd",
"DMT Storms Grotto": "Gruta de Tormentas CMd",
"DMT Boulder Grotto Entry": "Entrada Gruta de la Roca CMd",
"DMT Cow Grotto": "Gruta de la Vaca CMd",
"Death Mountain Trail Outside Dodongo's Cavern": "Camino de la Montaña de la Muerte Exterior de la Caverna de los Dodongos",
"Dodongo's Cavern Entrance": "Entrada de la Caverna de los Dodongos",
"Dodongo's Cavern Boss Door": "Puerta de Jefe de la Caverna de los Dodongos",
"King Dodongo": "Rey Dodongo",
"King Dodongo Blue Warp": "Teletransporte Azul del Rey Dodongo",
"Dodongo's Cavern Blue Warp": "Teletransporte Azul de la Caverna de los Dodongos",
"Death Mountain Crater Bridge Exit": "Salida del Puente del Cráter de la Montaña de la Muerte",
"Goron City Darunia's Room Backdoor": "Puerta Trasera de la Habitación de Darunia Ciudad Goron",
"Death Mountain Crater Upper Exit": "Salida Superior del Cráter de la Montaña de la Muerte",
"Death Mountain Trail Top Exit": "Salida Superior del Camino de la Montaña de la Muerte",
"DMC Great Fairy Entry": "Entrada Gran Hada CMD",
"DMC Great Fairy Fountain": "Fuente de la Gran Hada CMD",
"DMC Upper Grotto Entry": "Entrada Gruta Superior CMD",
"DMC Upper Grotto": "Gruta Superior CMD",
"DMC Hammer Grotto Entry": "Entrada Gruta del Martillo CMD",
"DMC Deku Scrub Grotto": "Gruta de Deku Scrub CMD",
"Death Mountain Crater Outside Temple": "Cráter de la Montaña de la Muerte Exterior del Templo",
"Fire Temple Entrance": "Entrada del Templo del Fuego",
"Fire Temple Boss Door": "Puerta de Jefe del Templo del Fuego",
"Volvagia": "Volvagia",
"Volvagia Blue Warp": "Teletransporte Azul de Volvagia",
"Fire Temple Blue Warp": "Teletransporte Azul del Templo del Fuego",
"GC Shop Entry": "Entrada Tienda CG",
"Goron Shop": "Tienda Goron",
"GC Lava Grotto Entry": "Entrada Gruta de Lava CG",
"GC Deku Scrub Grotto": "Gruta de Deku Scrub CG",
"Zora's River Lower Exit": "Salida Inferior del Río Zora",
"Hyrule Field River Exit": "Salida del Río Campo de Hyrule",
"ZR Rock Circle Grotto Entry": "Entrada Gruta del Círculo de Rocas RZ",
"ZR Deku Scrub Grotto": "Gruta de Deku Scrub RZ",
"ZR Raised Boulder Grotto Entry": "Entrada Gruta de la Roca Elevada RZ",
"ZR Fairy Grotto": "Gruta de Hadas RZ",
"ZR Raised Open Grotto Entry": "Entrada Gruta Abierta Elevada RZ",
"ZR Open Grotto": "Gruta Abierta RZ",
"Zora's Domain Entrance": "Entrada del Dominio Zora",
"Zora's River Waterfall Exit": "Salida de la Cascada del Río Zora",
"Zora's Domain Underwater Shortcut": "Atajo Subacuático del Dominio Zora",
"Lake Hylia Underwater Shortcut": "Atajo Subacuático del Lago Hylia",
"Zora's Domain Behind King Zora": "Dominio Zora Detrás del Rey Zora",
"Zora's Fountain Tunnel Exit": "Salida del Túnel de la Fuente Zora",
"ZD Shop Entry": "Entrada Tienda DZ",
"Zora Shop": "Tienda Zora",
"ZD Island Grotto Entry": "Entrada Gruta de la Isla DZ",
"ZD Fairy Grotto": "Gruta de Hadas DZ",
"ZF Great Fairy Entry": "Entrada Gran Hada FZ",
"ZF Great Fairy Fountain": "Fuente de la Gran Hada FZ",
"Zora's Fountain Outside Jabu Jabu": "Fuente Zora Exterior de Jabu Jabu",
"Jabu Jabu's Belly Entrance": "Entrada del Vientre de Jabu Jabu",
"Zora's Fountain Outside Ice Cavern": "Fuente Zora Exterior de la Caverna de Hielo",
"Ice Cavern Entrance": "Entrada de la Caverna de Hielo",
"Jabu Jabu's Belly Boss Door": "Puerta de Jefe del Vientre de Jabu Jabu",
"Barinade": "Barinade",
"Barinade Blue Warp": "Teletransporte Azul de Barinade",
"Jabu Jabu's Belly Blue Warp": "Teletransporte Azul del Vientre de Jabu Jabu",
"Hyrule Field Drawbridge Exit": "Salida del Puente Levadizo Campo de Hyrule",
"Market Entrance South Exit": "Salida Sur de la Entrada del Mercado",
"Hyrule Field Center Exit": "Salida Central del Campo de Hyrule",
"Lon Lon Ranch Entrance": "Entrada del Rancho Lon Lon",
"Hyrule Field Fence Exit": "Salida de la Cerca del Campo de Hyrule",
"Lake Hylia North Exit": "Salida Norte del Lago Hylia",
"Hyrule Field Rocky Path": "Camino Rocoso del Campo de Hyrule",
"Gerudo Valley East Exit": "Salida Este del Valle Gerudo",
"HF Near Market Boulder Grotto Entry": "Entrada Gruta de la Roca Cerca del Mercado CH",
"HF Near Market Boulder Grotto": "Gruta de la Roca Cerca del Mercado CH",
"HF Stone Bridge Tree Grotto Entry": "Entrada Gruta del Árbol del Puente de Piedra CH",
"HF Stone Bridge Tree Grotto": "Gruta del Árbol del Puente de Piedra CH",
"HF Northwest Tree Grotto Entry": "Entrada Gruta del Árbol Noroeste CH",
"HF Tektite Grotto": "Gruta de Tektites CH",
"HF Northwest Boulder Grotto Entry": "Entrada Gruta de la Roca Noroeste CH",
"HF Fairy Grotto": "Gruta de Hadas CH",
"HF West Rock Circle Grotto Entry": "Entrada Gruta del Círculo de Rocas Oeste CH",
"HF Cow Grotto": "Gruta de la Vaca CH",
"HF South Open Grotto Entry": "Entrada Gruta Abierta Sur CH",
"HF Open Grotto": "Gruta Abierta CH",
"HF Fenced Grotto Entry": "Entrada Gruta Cercada CH",
"HF Fenced Deku Scrub Grotto": "Gruta de Deku Scrub Cercada CH",
"HF Southeast Boulder Grotto Entry": "Entrada Gruta de la Roca Sureste CH",
"HF Southeast Grotto": "Gruta Sureste CH",
"LLR Talon's House Entry": "Entrada Casa de Talon RLL",
"Talon's House": "Casa de Talon",
"LLR Stables Entry": "Entrada Establos RLL",
"LLR Stables": "Establos RLL",
"LLR Tower Entry": "Entrada Torre RLL",
"LLR Tower": "Torre RLL",
"LLR Grotto Entry": "Entrada Gruta RLL",
"LLR Deku Scrub Grotto": "Gruta de Deku Scrub RLL",
"LH Lab Entry": "Entrada Laboratorio LH",
"LH Lab": "Laboratorio LH",
"LH Fishing Pond Entry": "Entrada Pozo de Pesca LH",
"Fishing Pond": "Pozo de Pesca",
"LH Grave Grotto Entry": "Entrada Gruta de la Tumba LH",
"LH Deku Scrub Grotto": "Gruta de Deku Scrub LH",
"Lake Hylia Outside Temple": "Lago Hylia Exterior del Templo",
"Water Temple Entrance": "Entrada del Templo del Agua",
"Water Temple Boss Door": "Puerta de Jefe del Templo del Agua",
"Morpha": "Morpha",
"Morpha Blue Warp": "Teletransporte Azul de Morpha",
"Water Temple Blue Warp": "Teletransporte Azul del Templo del Agua",
"Gerudo Valley West Exit": "Salida Oeste del Valle Gerudo",
"Gerudo Fortress East Exit": "Salida Este de la Fortaleza Gerudo",
"Gerudo Valley River Exit": "Salida del Río del Valle Gerudo",
"Lake Hylia River Exit": "Salida del Río del Lago Hylia",
"GV Carpenters' Tent Entry": "Entrada Tienda de los Carpinteros VG",
"Carpenters' Tent": "Tienda de los Carpinteros",
"GV Silver Rock Grotto Entry": "Entrada Gruta de la Roca Plateada VG",
"GV Octorok Grotto": "Gruta de Octorok VG",
"GV Behind Tent Grotto Entry": "Entrada Gruta Detrás de la Tienda VG",
"GV Deku Scrub Grotto": "Gruta de Deku Scrub VG",
"Gerudo Fortress Gate Exit": "Salida de la Puerta de la Fortaleza Gerudo",
"Haunted Wasteland East Exit": "Salida Este del Páramo Embrujado",
"GF Storms Grotto Entry": "Entrada Gruta de Tormentas FG",
"GF Fairy Grotto": "Gruta de Hadas FG",
"GF Outside Training Ground": "FG Exterior del Campo de Entrenamiento",
"Gerudo Training Ground Entrance": "Entrada del Campo de Entrenamiento Gerudo",
"TH 1 Torch Cell Turn": "Giro de la Celda de 1 Antorcha PF",
"GF Outskirts": "Afueras FG",
"TH 1 Torch Cell": "Celda de 1 Antorcha PF",
"GF Near Grotto East": "Cerca de la Gruta Este FG",
"TH Kitchen Corridor Lower": "Corredor de la Cocina Inferior PF",
"GF Near Grotto North": "Cerca de la Gruta Norte FG",
"TH Kitchen Corridor Upper": "Corredor de la Cocina Superior PF",
"GF Above GTG": "Sobre el CEG FG",
"TH Steep Slope Cell": "Celda de Pendiente Pronunciada PF",
"GF Near Grotto": "Cerca de la Gruta FG",
"TH Steep Slope Cell Two Ramps": "Celda de Pendiente Pronunciada Dos Rampas PF",
"GF Bottom of Lower Vines": "Fondo de las Enredaderas Inferiores FG",
"TH Double Cell Lower": "Celda Doble Inferior PF",
"GF Above GTG Directly": "Directamente Sobre el CEG FG",
"TH Double Cell Upper": "Celda Doble Superior PF",
"GF Top of Lower Vines Across": "Cima de las Enredaderas Inferiores Cruzando FG",
"TH Kitchen By Corridor": "Cocina Cerca del Corredor PF",
"GF Top of Lower Vines Near": "Cima de las Enredaderas Inferiores Cerca FG",
"TH Kitchen Opposite Corridor": "Cocina Frente al Corredor PF",
"GF Near GS": "Cerca de la SD FG",
"TH Break Room": "Sala de Descanso PF",
"GF Below Chest": "Debajo del Cofre FG",
"TH Break Room Corridor": "Corredor de la Sala de Descanso PF",
"GF Above Jail": "Sobre la Celda FG",
"TH Dead End Cell": "Celda Sin Salida PF",
"GF Below GS": "Debajo de la SD FG",
"Haunted Wasteland West Exit": "Salida Oeste del Páramo Embrujado",
"Desert Colossus East Exit": "Salida Este del Coloso del Desierto",
"Colossus Great Fairy Entry": "Entrada Gran Hada del Coloso",
"Colossus Great Fairy Fountain": "Fuente de la Gran Hada del Coloso",
"Colossus Grotto Entry": "Entrada Gruta del Coloso",
"Colossus Deku Scrub Grotto": "Gruta de Deku Scrub del Coloso",
"Colossus Outside Temple": "Coloso Exterior del Templo",
"Spirit Temple Entrance": "Entrada del Templo del Espíritu",
"Spirit Temple Boss Door": "Puerta de Jefe del Templo del Espíritu",
"Twinrova": "Twinrova",
"Twinrova Blue Warp": "Teletransporte Azul de Twinrova",
"Spirit Temple Blue Warp": "Teletransporte Azul del Templo del Espíritu",
"Market Entrance North Exit": "Salida Norte de la Entrada del Mercado",
"Market South Exit": "Salida Sur del Mercado",
"MK Entrance Guard House Entry": "Entrada Casa del Guardia de la Entrada M",
"Guard House": "Casa del Guardia",
"Market Castle Exit": "Salida del Castillo del Mercado",
"Castle Grounds South Exit": "Salida Sur de los Terrenos del Castillo",
"Market Temple Exit": "Salida del Templo del Mercado",
"ToT Courtyard Gossip Stones Exit": "Salida de las Piedras Chismosas del Patio TdT",
"MK Shooting Gallery Entry": "Entrada Galería de Tiro M",
"MK Shooting Gallery": "Galería de Tiro M",
"MK Bombchu Bowling Entry": "Entrada Bolos Bombchu M",
"MK Treasure Chest Game Entry": "Entrada Juego de Cofres M",
"Treasure Chest Game": "Juego de Cofres",
"MK Man-in-Green House Entry": "Entrada Casa del Hombre de Verde M",
"Man-in-Green's House": "Casa del Hombre de Verde",
"MK Mask Shop Entry": "Entrada Tienda de Máscaras M",
"Mask Shop": "Tienda de Máscaras",
"MK Bazaar Entry": "Entrada del Bazar M",
"MK Bazaar": "Bazar M",
"MK Potion Shop Entry": "Entrada Tienda de Pociones M",
"MK Potion Shop": "Tienda de Pociones M",
"MK Bombchu Shop Entry": "Entrada Tienda de Bombchus M",
"Bombchu Shop": "Tienda de Bombchus",
"ToT Courtyard Temple Entry": "Entrada del Templo del Patio TdT",
"Temple of Time Entrance": "Entrada del Templo del Tiempo",
"HC Boulder Crawlspace": "Espacio de Gateo de la Roca CH",
"HC Great Fairy Fountain": "Fuente de la Gran Hada CH",
"HC Storms Grotto Entry": "Entrada Gruta de Tormentas CH",
"HC Storms Grotto": "Gruta de Tormentas CH",
"OGC Behind Pillar": "Detrás del Pilar PFC",
"OGC Great Fairy Fountain": "Fuente de la Gran Hada PFC",
"OGC Rainbow Bridge Exit": "Salida del Puente Arcoíris PFC",
"Inside Ganon's Castle Entrance": "Entrada Interior del Castillo de Ganon",
"Ganon's Tower Entrance": "Entrada de la Torre de Ganon",
"Inside Ganon's Castle": "Interior del Castillo de Ganon",
"Ganon's Blue Warp": "Teletransporte Azul de Ganon",
"Ganon's Castle Blue Warp": "Teletransporte Azul del Castillo de Ganon",
"%d Undiscovered": "%d No Descubiertas",
" -> ": " -> ",
"Price:": "Precio:",
"%d Rupees": "%d Rupias",
"Filter by Area:##AreaFilter": "Filtrar por Área:##AreaFilter",
"Filter by Item:##ItemFilter": "Filtrar por Objeto:##ItemFilter",
"Type to search and press Enter": "Escribe para buscar y presiona Enter",
"+": "+",
"The following options are available:\n- Use \\n to create New Lines.\n- Use %g to change the text color to Green,\n - %r for Red, %y for Yellow, and %w for White\n can also be used as color examples.": "Las siguientes opciones están disponibles:\n- Usa \\n para crear Nuevas Líneas.\n- Usa %g para cambiar el color del texto a Verde,\n - %r para Rojo, %y para Amarillo, y %w para Blanco\n también se pueden usar como ejemplos de color.",
"Invalid Spoiler Log Format": "Formato de Registro de Spoiler Inválido",
"Hyrule Market": "Mercado de Hyrule",
"Deku Tree": "Árbol Deku",
"Dodongo's Cavern": "Caverna de los Dodongos",
"Jabu Jabu's Belly": "Vientre de Jabu Jabu",
"Fire Temple": "Templo del Fuego",
"Water Temple": "Templo del Agua",
"Spirit Temple": "Templo del Espíritu",
"Shadow Temple": "Templo de la Sombra",
"Bottom of the Well": "Fondo del Pozo",
"Ice Cavern": "Caverna de Hielo",
"Gerudo Training Ground": "Campo de Entrenamiento Gerudo",
"Ganon's Castle": "Castillo de Ganon",
"Hints": "Pistas",
"Main": "Principal",
"ItemList": "ListaDeObjetos",
"TrapList": "ListaDeTrampas",
"##TrapName": "##NombreDeTrampa",
"##HintMessage": "##MensajeDePista",
"##JsonFiles": "##ArchivosJson",
"Frst": "BSQ",
"Fire": "FG",
"Watr": "AG",
"Sprt": "ESP",
"Shdw": "TS",
"Ganon": "CG",
"C-UP": "C-ARR",
"C-DWN": "C-ABJ",
"C-LFT": "C-IZQ",
"C-RHT": "C-DER"
}
}

View File

@@ -35,13 +35,29 @@ void LanguageManager::ScanLanguageFiles() {
}
std::string LanguageManager::GetLanguagesDirectory() {
std::string currentDir = std::filesystem::current_path().string();
std::string appShortName = "com.shipofharkinian.soh";
// Primero busca en el directorio actual (desde donde se ejecuta)
std::string currentDir = std::filesystem::current_path().string();
std::string langDir = currentDir + "/lenguajes";
if (std::filesystem::exists(langDir)) {
return langDir;
}
// Luego busca en la ruta del ejecutable (para AppImage y builds normales)
std::string exePath = Ship::Context::GetPathRelativeToAppDirectory("", appShortName);
langDir = exePath + "/lenguajes";
if (std::filesystem::exists(langDir)) {
return langDir;
}
// También busca en usr/lenguajes (para AppImage donde linuxdeploy reorganiza archivos)
langDir = exePath + "/usr/lenguajes";
if (std::filesystem::exists(langDir)) {
return langDir;
}
// Finalmente busca en el directorio de datos de la app
std::string appDir = Ship::Context::GetInstance()->GetAppDirectoryPath();
langDir = appDir + "/lenguajes";
if (std::filesystem::exists(langDir)) {
@@ -119,4 +135,21 @@ bool LanguageManager::IsTranslationLoaded() {
return translationLoaded;
}
void LanguageManager::ReloadTranslations() {
ScanLanguageFiles();
if (!currentLanguage.empty()) {
LoadLanguage(currentLanguage);
}
}
void LanguageManager::RequestMenuRebuild() {
if (mMenuRebuildCallback) {
mMenuRebuildCallback();
}
}
void LanguageManager::SetMenuRebuildCallback(std::function<void()> callback) {
mMenuRebuildCallback = callback;
}
} // namespace SohGui

View File

@@ -4,6 +4,7 @@
#include <string>
#include <vector>
#include <map>
#include <functional>
namespace SohGui {
@@ -13,6 +14,9 @@ public:
void Init();
void LoadLanguage(const std::string& languageName);
void ReloadTranslations();
void RequestMenuRebuild();
void SetMenuRebuildCallback(std::function<void()> callback);
std::string GetString(const std::string& key);
std::vector<std::string> GetAvailableLanguages();
std::string GetCurrentLanguage();
@@ -32,6 +36,8 @@ private:
void ScanLanguageFiles();
bool LoadJsonFile(const std::string& path);
std::string GetLanguagesDirectory();
std::function<void()> mMenuRebuildCallback;
};
} // namespace SohGui

337
soh/soh/SohGui/MenuTypes.h Normal file
View File

@@ -0,0 +1,337 @@
#ifndef MENUTYPES_H
#define MENUTYPES_H
#include <libultraship/libultraship.h>
#include "UIWidgets.hpp"
typedef enum {
DISABLE_FOR_NO_VSYNC,
DISABLE_FOR_NO_WINDOWED_FULLSCREEN,
DISABLE_FOR_NO_MULTI_VIEWPORT,
DISABLE_FOR_NOT_DIRECTX,
DISABLE_FOR_DIRECTX,
DISABLE_FOR_MATCH_REFRESH_RATE_ON,
DISABLE_FOR_ADVANCED_RESOLUTION_ON,
DISABLE_FOR_VERTICAL_RES_TOGGLE_ON,
DISABLE_FOR_LOW_RES_MODE_ON,
DISABLE_FOR_NULL_PLAY_STATE,
DISABLE_FOR_DEBUG_MODE_OFF,
DISABLE_FOR_FRAME_ADVANCE_OFF,
DISABLE_FOR_ADVANCED_RESOLUTION_OFF,
DISABLE_FOR_VERTICAL_RESOLUTION_OFF,
} DisableOption;
struct WidgetInfo;
struct disabledInfo;
using VoidFunc = std::function<void()>;
using DisableInfoFunc = std::function<bool(disabledInfo&)>;
using DisableVec = std::vector<DisableOption>;
using WidgetFunc = std::function<void(WidgetInfo&)>;
typedef enum {
WIDGET_CHECKBOX,
WIDGET_COMBOBOX,
WIDGET_SLIDER_INT,
WIDGET_SLIDER_FLOAT,
WIDGET_CVAR_CHECKBOX,
WIDGET_CVAR_COMBOBOX,
WIDGET_CVAR_SLIDER_INT,
WIDGET_CVAR_SLIDER_FLOAT,
WIDGET_CVAR_BTN_SELECTOR,
WIDGET_BUTTON,
WIDGET_INPUT,
WIDGET_CVAR_INPUT,
WIDGET_CVAR_COLOR_PICKER,
WIDGET_COLOR_PICKER,
WIDGET_SEARCH,
WIDGET_SEPARATOR,
WIDGET_SEPARATOR_TEXT,
WIDGET_TEXT,
WIDGET_WINDOW_BUTTON,
WIDGET_AUDIO_BACKEND, // needed for special operations that can't be handled easily with the normal combobox widget
WIDGET_VIDEO_BACKEND, // same as above
WIDGET_CUSTOM,
} WidgetType;
typedef enum {
SECTION_COLUMN_1,
SECTION_COLUMN_2,
SECTION_COLUMN_3,
} SectionColumns;
typedef enum {
DEBUG_LOG_TRACE,
DEBUG_LOG_DEBUG,
DEBUG_LOG_INFO,
DEBUG_LOG_WARN,
DEBUG_LOG_ERROR,
DEBUG_LOG_CRITICAL,
DEBUG_LOG_OFF,
} DebugLogOption;
// holds the widget values for a widget, contains all CVar types available from LUS. int32_t is used for boolean
// evaluation
using CVarVariant = std::variant<int32_t, const char*, float, Color_RGBA8, Color_RGB8>;
using OptionsVariant = std::variant<UIWidgets::ButtonOptions, UIWidgets::CheckboxOptions, UIWidgets::ComboboxOptions,
UIWidgets::FloatSliderOptions, UIWidgets::IntSliderOptions, UIWidgets::TextOptions,
UIWidgets::WidgetOptions, UIWidgets::WindowButtonOptions,
UIWidgets::ColorPickerOptions, UIWidgets::BtnSelectorOptions>;
// All the info needed for display and search of all widgets in the menu.
// `name` is the label displayed,
// `cVar` is the string representation of the CVar used to store the widget value
// `tooltip` is what is displayed when hovering (except when disabled, more on that later)
// `type` is the WidgetType for the widget, which is what determines how the information is used in the draw func
// `options` is a variant that holds the UIWidgetsOptions struct for the widget type
// blank objects need to be initialized with specific typing matching the expected Options struct for the widget
// `callback` is a lambda used for running code on widget change. may need `SohGui::GetMenu()` for specific menu actions
// `preFunc` is a lambda called before drawing code starts. It can be used to determine a widget's status,
// whether disabled or hidden, as well as update pointers for non-CVar widget types.
// `postFunc` is a lambda called after all drawing code is finished, for reacting to states other than
// widgets having been changed, like holding buttons.
// All three lambdas accept a `widgetInfo` reference in case it needs information on the widget for these operations
// `activeDisables` is a vector of DisableOptions for specifying what reasons a widget is disabled, which are displayed
// in the disabledTooltip for the widget. Can display multiple reasons. Handling the reasons is done in `preFunc`.
// It is recommended to utilize `disabledInfo`/`DisableReason` to list out all reasons for disabling and isHidden so
// the info can be shown.
// `windowName` is what is displayed and searched for `windowButton` type and window interactions
// `isHidden` just prevents the widget from being drawn under whatever circumstances you specify in the `preFunc`
// `sameLine` allows for specifying that the widget should be on the same line as the previous widget
struct WidgetInfo {
std::string name; // Used by all widgets
std::string originalName; // Original English name for translation updates
const char* cVar; // Used by all widgets except
WidgetType type;
std::shared_ptr<UIWidgets::WidgetOptions> options;
std::variant<bool*, int32_t*, float*> valuePointer;
WidgetFunc callback = nullptr;
WidgetFunc preFunc = nullptr;
WidgetFunc postFunc = nullptr;
WidgetFunc customFunction = nullptr;
DisableVec activeDisables = {};
const char* windowName = "";
bool isHidden = false;
bool sameLine = false;
bool raceDisable = true;
bool hideInSearch = false;
WidgetInfo& CVar(const char* cVar_) {
cVar = cVar_;
return *this;
}
WidgetInfo& Options(OptionsVariant options_) {
switch (type) {
case WIDGET_AUDIO_BACKEND:
case WIDGET_VIDEO_BACKEND:
case WIDGET_COMBOBOX:
case WIDGET_CVAR_COMBOBOX:
options = std::make_shared<UIWidgets::ComboboxOptions>(std::get<UIWidgets::ComboboxOptions>(options_));
break;
case WIDGET_CHECKBOX:
case WIDGET_CVAR_CHECKBOX:
options = std::make_shared<UIWidgets::CheckboxOptions>(std::get<UIWidgets::CheckboxOptions>(options_));
break;
case WIDGET_SLIDER_FLOAT:
case WIDGET_CVAR_SLIDER_FLOAT:
options =
std::make_shared<UIWidgets::FloatSliderOptions>(std::get<UIWidgets::FloatSliderOptions>(options_));
break;
case WIDGET_CVAR_BTN_SELECTOR:
options =
std::make_shared<UIWidgets::BtnSelectorOptions>(std::get<UIWidgets::BtnSelectorOptions>(options_));
break;
case WIDGET_SLIDER_INT:
case WIDGET_CVAR_SLIDER_INT:
options =
std::make_shared<UIWidgets::IntSliderOptions>(std::get<UIWidgets::IntSliderOptions>(options_));
break;
case WIDGET_COLOR_PICKER:
case WIDGET_CVAR_COLOR_PICKER:
options =
std::make_shared<UIWidgets::ColorPickerOptions>(std::get<UIWidgets::ColorPickerOptions>(options_));
break;
case WIDGET_BUTTON:
options = std::make_shared<UIWidgets::ButtonOptions>(std::get<UIWidgets::ButtonOptions>(options_));
break;
case WIDGET_WINDOW_BUTTON:
options = std::make_shared<UIWidgets::WindowButtonOptions>(
std::get<UIWidgets::WindowButtonOptions>(options_));
break;
case WIDGET_TEXT:
case WIDGET_SEPARATOR_TEXT:
options = std::make_shared<UIWidgets::TextOptions>(std::get<UIWidgets::TextOptions>(options_));
break;
case WIDGET_SEPARATOR:
default:
options = std::make_shared<UIWidgets::WidgetOptions>(std::get<UIWidgets::WidgetOptions>(options_));
}
return *this;
}
WidgetInfo& Options(std::shared_ptr<UIWidgets::WidgetOptions> options_) {
options = options_;
return *this;
}
WidgetInfo& Callback(WidgetFunc callback_) {
callback = callback_;
return *this;
}
WidgetInfo& PreFunc(WidgetFunc preFunc_) {
preFunc = preFunc_;
return *this;
}
WidgetInfo& PostFunc(WidgetFunc postFunc_) {
postFunc = postFunc_;
return *this;
}
WidgetInfo& WindowName(const char* windowName_) {
windowName = windowName_;
return *this;
}
WidgetInfo& ValuePointer(std::variant<bool*, int32_t*, float*> valuePointer_) {
valuePointer = valuePointer_;
return *this;
}
WidgetInfo& SameLine(bool sameLine_) {
sameLine = sameLine_;
return *this;
}
WidgetInfo& CustomFunction(WidgetFunc customFunction_) {
customFunction = customFunction_;
return *this;
}
WidgetInfo& RaceDisable(bool disable) {
raceDisable = disable;
return *this;
}
WidgetInfo& HideInSearch(bool hide) {
hideInSearch = hide;
return *this;
}
void ResetDisables() {
isHidden = false;
options->disabled = false;
options->disabledTooltip = "";
activeDisables.clear();
}
};
struct WidgetPath {
std::string sectionName;
std::string sidebarName;
SectionColumns column;
};
// `disabledInfo` holds information on reasons for hiding or disabling a widget, as well as an evaluation lambda that
// is run once per frame to update its status (this is done to prevent dozens of redundant CVarGets in each frame loop)
// `evaluation` returns a bool which can be determined by whatever code you want that changes its status
// `reason` is the text displayed in the disabledTooltip when a widget is disabled by a particular DisableReason
// `active` is what's referenced when determining disabled status for a widget that uses this This can also be used to
// hold reasons to hide widgets so that their evaluations are also only run once per frame
struct disabledInfo {
DisableInfoFunc evaluation;
const char* reason;
bool active = false;
int32_t value = 0;
};
// Contains the name displayed in the sidebar (label), the number of columns to use in drawing (columnCount; for visual
// separation, 1-3), and nested vectors of the widgets, grouped by column (columnWidgets). The number of widget vectors
// added to the column groups does not need to match the specified columnCount, e.g. you can have one vector added to
// the sidebar, but still separate the window into 3 columns and display only in the first column
struct SidebarEntry {
uint32_t columnCount;
std::string translatedName;
std::vector<std::vector<WidgetInfo>> columnWidgets;
};
// Contains entries for what's listed in the header at the top, including the name displayed on the top bar (label),
// a vector of the SidebarEntries for that header entry, and the name of the cvar used to track what sidebar entry is
// the last viewed for that header.
struct MainMenuEntry {
std::string label;
const char* sidebarCvar;
std::unordered_map<std::string, SidebarEntry> sidebars = {};
std::vector<std::string> sidebarOrder = {};
};
static const std::map<Ship::AudioBackend, const char*> audioBackendsMap = {
{ Ship::AudioBackend::WASAPI, "Windows Audio Session API" },
{ Ship::AudioBackend::SDL, "SDL" },
{ Ship::AudioBackend::COREAUDIO, "Core Audio" },
{ Ship::AudioBackend::NUL, "Null" },
};
static const std::map<Ship::WindowBackend, const char*> windowBackendsMap = {
{ Ship::WindowBackend::FAST3D_DXGI_DX11, "DirectX" },
{ Ship::WindowBackend::FAST3D_SDL_OPENGL, "OpenGL" },
{ Ship::WindowBackend::FAST3D_SDL_METAL, "Metal" },
};
struct MenuInit {
static std::vector<std::function<void()>>& GetInitFuncs() {
static std::vector<std::function<void()>> menuInitFuncs;
return menuInitFuncs;
}
static std::unordered_map<std::string, std::unordered_map<std::string, std::vector<std::function<void()>>>>&
GetUpdateFuncs() {
static std::unordered_map<std::string, std::unordered_map<std::string, std::vector<std::function<void()>>>>
menuUpdateFuncs;
return menuUpdateFuncs;
}
static void InitAll() {
auto& menuInitFuncs = MenuInit::GetInitFuncs();
for (const auto& initFunc : menuInitFuncs) {
initFunc();
}
}
};
struct SearchEntry {
// First four required
std::string widgetName;
std::string menuName;
std::string sidebarName;
std::string location;
std::string extraTerms = "";
};
struct SearchWidget {
// First four required
WidgetInfo& info;
std::string menuName;
std::string sidebarName;
std::string location;
std::string extraTerms = "";
};
struct RegisterMenuInitFunc {
RegisterMenuInitFunc(std::function<void()> initFunc) {
auto& menuInitFuncs = MenuInit::GetInitFuncs();
menuInitFuncs.push_back(initFunc);
}
};
struct RegisterMenuUpdateFunc {
RegisterMenuUpdateFunc(std::function<void()> updateFunc, std::string sectionName, std::string sidebarName) {
auto& menuUpdateFuncs = MenuInit::GetUpdateFuncs();
menuUpdateFuncs[sectionName][sidebarName].push_back(updateFunc);
}
};
#endif // MENUTYPES_H

View File

@@ -37,7 +37,7 @@ WidgetInfo& SohMenu::AddWidget(WidgetPath& pathInfo, std::string widgetName, Wid
}
SidebarEntry& entry = sidebar.at(pathInfo.sidebarName);
std::string translatedName = LanguageManager::Instance().GetString(widgetName);
entry.columnWidgets.at(column).push_back({ .name = translatedName, .type = widgetType });
entry.columnWidgets.at(column).push_back({ .name = translatedName, .originalName = widgetName, .type = widgetType });
WidgetInfo& widget = entry.columnWidgets.at(column).back();
switch (widgetType) {
case WIDGET_CHECKBOX:
@@ -177,8 +177,32 @@ void SohMenu::Draw() {
}
void SohMenu::DrawElement() {
if (mNeedsRebuild) {
RebuildMenu();
}
if (mMenuElementsInitialized) {
Ship::Menu::DrawElement();
}
}
void SohMenu::RequestRebuild() {
mNeedsRebuild = true;
}
void SohMenu::RebuildMenu() {
for (auto& [sectionName, section] : menuEntries) {
for (auto& [sidebarName, sidebar] : section.sidebars) {
for (auto& column : sidebar.columnWidgets) {
for (auto& widget : column) {
if (!widget.originalName.empty()) {
widget.name = LanguageManager::Instance().GetString(widget.originalName);
}
}
}
}
}
mNeedsRebuild = false;
}
} // namespace SohGui

62
soh/soh/SohGui/SohMenu.h Normal file
View File

@@ -0,0 +1,62 @@
#ifndef SOHMENU_H
#define SOHMENU_H
#include <libultraship/libultraship.h>
#include "Menu.h"
#include <fast/backends/gfx_rendering_api.h>
#include "soh/cvar_prefixes.h"
extern "C" {
#include "z64.h"
}
#ifdef __cplusplus
extern "C" {
#endif
void enableBetaQuest();
void disableBetaQuest();
#ifdef __cplusplus
}
#endif
namespace SohGui {
static std::map<int32_t, const char*> languages = {
{ LANGUAGE_ENG, "English" },
{ LANGUAGE_GER, "German" },
{ LANGUAGE_FRA, "French" },
{ LANGUAGE_JPN, "Japanese" },
};
void UpdateMenuTricks();
void UpdateMenuLocations();
class SohMenu : public Ship::Menu {
public:
SohMenu(const std::string& consoleVariable, const std::string& name);
void InitElement() override;
void DrawElement() override;
void UpdateElement() override;
void Draw() override;
void AddSidebarEntry(std::string sectionName, std::string sidbarName, uint32_t columnCount);
WidgetInfo& AddWidget(WidgetPath& pathInfo, std::string widgetName, WidgetType widgetType);
void AddMenuElements();
void AddMenuSettings();
void AddMenuEnhancements();
void AddMenuDevTools();
void AddMenuRandomizer();
void AddMenuNetwork();
static void UpdateLanguageMap(std::map<int32_t, const char*>& languageMap);
private:
char mGitCommitHashTruncated[8];
bool mIsTaggedVersion;
bool mMenuElementsInitialized = false;
bool mNeedsRebuild = false;
void RequestRebuild();
void RebuildMenu();
};
} // namespace SohGui
#endif // SOHMENU_H

View File

@@ -280,6 +280,7 @@ void SohMenu::AddMenuSettings() {
SPDLOG_INFO("UI Translation callback: translation loaded={}", LanguageManager::Instance().IsTranslationLoaded());
}
}
mSohMenu->RequestRebuild();
})
.Options(ComboboxOptions()
.LabelPosition(LabelPositions::Far)