export default { appName: 'voko.world', productBrandSub: 'Tu kosmo te llama.', mobileCredit: { title: 'Mis créditos', buyCredits: 'Comprar créditos', history: 'Historial de créditos', purchaseHistory: 'Compras', usageHistory: 'Uso', emptyHistory: 'Aún no hay movimientos.', loadMore: 'Cargar más', balanceAfter: 'Saldo: {points}', pending: 'Pendiente', paid: 'Pagado', canceled: 'Cancelado', failed: 'Fallido', refunded: 'Reembolsado', disputed: 'En disputa', autoReload: 'Recarga automática', bonusCredits: 'Créditos extra', buyNow: 'Comprar ahora', lowBalance: 'Saldo bajo', enabled: 'Activada', whenBelow: 'Cuando mi saldo sea inferior a', choosePack: 'Elige un paquete', consent: 'Autorizo a Voko a comprar automáticamente este paquete cuando mi saldo alcance el límite.', terms: 'Términos de uso', continueSecurely: 'Continuar de forma segura', save: 'Guardar ajustes', disable: 'Desactivar recarga', setupComplete: 'Método de pago guardado y recarga activada.', setupCanceled: 'Configuración cancelada.', actionRequired: 'La última recarga falló. Configura de nuevo el método de pago.', howTitle: 'Cómo funciona', howBalance: 'Compramos el paquete elegido cuando el saldo llega al límite.', howSecure: 'Stripe guarda los datos de pago; Voko no almacena el número de tarjeta.', howCancel: 'Puedes desactivarla cuando quieras. Las compras anteriores no se reembolsan.' }, nav: { play: 'Partida', notes: 'Pistas', state: 'Estado', editor: 'Autoría' }, scenario: { title: 'Escenario', available: 'Escenarios', assetManifest: 'Recursos' }, character: { title: 'Personaje', start: 'Iniciar', current: 'Personaje actual' }, stage: { empty: 'Elige escenario y personaje', turn: 'Turno {turn}', ending: 'Final', transcript: 'Registro' }, composer: { act: 'Actuar', say: 'Decir', placeholder: 'Escribe una acción o frase' }, actions: { refresh: 'Actualizar', start: 'Iniciar', home: 'Inicio', backHome: 'Volver', newRun: 'Reiniciar', send: 'Enviar', save: 'Guardar', compile: 'Compilar', publish: 'Publicar', rollback: 'Revertir', upload: 'Subir', select: 'Elegir', endingText: 'Texto final', load: 'Cargar', backToGame: 'Volver', cancel: 'Cancelar', confirm: 'Confirmar' }, account: { signIn: 'Iniciar sesión', signedIn: 'Sesión iniciada', signedOut: 'Sesión cerrada', sessionExpired: 'Tu sesión expiró. Vuelve a iniciar sesión.', logoutFailed: 'No se pudo cerrar sesión. Inténtalo de nuevo.', registered: 'Registrado', email: 'Email', emailPlaceholder: 'Dirección de email', password: 'Contraseña', passwordPlaceholder: 'Introduce la contraseña', confirmPassword: 'Confirmar contraseña', confirmPasswordPlaceholder: 'Repite la contraseña', verificationCode: 'Código de verificación', verificationCodePlaceholder: 'Código de 6 dígitos', inviteToken: 'Código de invitación', inviteTokenPlaceholder: 'Introduce el código de invitación de 8 caracteres', sendCode: 'Enviar código', resendCode: 'Reenviar', codeSent: 'Código enviado. Revisa tu email.', codeRequired: 'Introduce primero el código de verificación.', inviteInvalid: 'Introduce un código de invitación válido de 8 caracteres.', emailRequired: 'Introduce primero tu email.', emailInvalid: 'Introduce un email válido.', passwordRequired: 'Introduce primero tu contraseña.', confirmPasswordRequired: 'Confirma primero tu contraseña.', loginFieldsRequired: 'Introduce tu email y contraseña.', inviteEmailMismatch: 'Este email no coincide con el email de solicitud vinculado al código de invitación.', passwordMismatch: 'Las contraseñas no coinciden.', createAccount: 'Crear cuenta', hasAccount: '¿Ya tienes cuenta?', noAccount: '¿No tienes cuenta?', termsHint: 'Al continuar confirmas que este email te pertenece y aceptas guardar progreso, pedidos y créditos.', login: 'Entrar', register: 'Registrarse', reset: 'Restablecer', forgotPassword: '¿Olvidaste la contraseña?', resetPassword: 'Restablecer contraseña', resetTitle: 'Restablecer contraseña', resetBody: 'Verifica el código de email y define una nueva contraseña. Las sesiones existentes se revocarán.', resetCodeSent: 'Código de restablecimiento enviado. Revisa tu email.', resetFieldsRequired: 'Introduce el correo, el código, la nueva contraseña y su confirmación.', passwordResetDone: 'Contraseña restablecida. Entra con la nueva contraseña.', logout: 'Salir', logoutAll: 'Salir en todos los dispositivos', credits: 'Créditos', buy: 'Comprar créditos', billing: 'Facturación', promptTitle: 'Inicia sesión o regístrate para empezar', promptBody: 'Tu cuenta guarda progreso, partidas, finales, créditos y pedidos para continuar en otro dispositivo.', signedInBody: 'Tu progreso, partidas guardadas y créditos se escriben en la base de datos.', registerAndStart: 'Registrarse y elegir rol', guestStart: 'Probar como invitado', savedHint: 'Inicia sesión para guardar progreso y partidas', currentAccount: 'Cuenta actual', saveKicker: 'Guardado de cuenta', saveTitle: 'Guardar progreso y pedidos', loginTitle: 'Entrar', loginBody: 'Después de entrar, se fusionará el progreso invitado de este dispositivo cuando sea posible.', registerTitle: 'Crear cuenta', registerBody: 'Regístrate con un código de invitación y verifica tu email. El registro inicia sesión, concede 100 créditos y fusiona el progreso del dispositivo.', openBilling: 'Ver créditos y pedidos', mergePending: 'Fusionando progreso invitado de este dispositivo...', mergeSuccess: 'Datos locales fusionados: {details}.', mergeSeparator: ', ', mergeRuns: '{count} partidas', mergeTurns: '{count} turnos', mergeProgress: '{count} progresos', mergeSaveSlots: '{count} guardados', mergeEndingRecords: '{count} finales', mergeEvents: '{count} eventos', mergeAgentCalls: '{count} llamadas de IA', mergeBillingLedger: '{count} movimientos de saldo', mergeBillingUnlocks: '{count} desbloqueos pagos', mergeBillingFreeQuota: '{count} cuotas gratuitas', mergePaymentOrders: '{count} pedidos', mergeEmpty: 'No hay progreso local para fusionar.', mergeFailed: 'Sesión iniciada, pero el progreso local no se fusionó. Actualiza e inténtalo más tarde.', }, billing: { title: 'Créditos y pedidos', subtitle: 'Saldo, recargas, movimientos y pedidos vienen de la base de datos.', guestSubtitle: 'Los invitados pueden ver paquetes. Comprar, saldo, pedidos y movimientos requieren sesión.', balance: 'Saldo actual', products: 'Paquetes de créditos', ledger: 'Movimientos', orders: 'Pedidos', refresh: 'Actualizar facturación', testModeTitle: 'Entorno de prueba de Stripe', testModeBody: 'El pago usa el modo de prueba y no genera cargos reales.', testPurchase: 'Compra de prueba', buy: 'Comprar {points} créditos', checkoutReady: 'El enlace de pago está listo.', openCheckout: 'Abrir pago', selectedPack: 'Seleccionado', selectedProduct: '{title} seleccionado. Tu saldo aumentará en {points} créditos.', signInToBuy: 'Entrar para comprar', readyToBuy: 'Listo para comprar créditos', readyToBuyBody: 'Elige un paquete y continúa al pago. Los pedidos pueden aparecer en proceso antes de confirmarse.', checkoutPending: 'Redirigiendo al pago...', checkoutReturnedSuccess: 'Has vuelto a la app. Actualizando saldo y pedidos; el abono depende del estado del pedido.', checkoutReturnedCancel: 'El pago fue cancelado o no completado. No hay abono confirmado.', signInHint: 'Inicia sesión para ver saldo, pedidos y movimientos.', emptyProducts: 'No hay paquetes de créditos.', emptyLedger: 'No hay movimientos.', emptyOrders: 'No hay pedidos.', productFallback: 'Paquete de créditos', points: '{points} créditos', price: '{amount} {currency}', ledgerAmount: '{amount} créditos', orderStatus: 'Estado {status}', orderStatusPending: 'En proceso', orderStatusPaid: 'Pagado', orderStatusRefunded: 'Reembolsado', orderStatusDisputed: 'En disputa', orderStatusUnknown: 'Estado desconocido', ledgerReasonSignupGift: 'Regalo de registro', ledgerReasonCheckout: 'Compra de créditos', ledgerReasonRefund: 'Reembolso de pedido', ledgerReasonChargeback: 'Reversión por disputa', ledgerReasonUnlock: 'Desbloqueo de contenido', paywallTitle: 'Desbloqueo de pago', paywallTarget: 'Objetivo', paywallReason: 'Motivo del cargo', paywallGenericReason: 'Se requieren créditos para continuar este contenido.', paywallFreeContinue: 'Todavía tienes cupo gratis. Puedes continuar.', paywallInsufficient: 'No tienes créditos suficientes. Compra créditos primero.', paywallPrice: 'Créditos requeridos', paywallFreeQuota: 'Cupo gratis restante', paywallBalance: 'Saldo disponible', }, endings: { title: 'Colección de finales', unlocked: 'Desbloqueado', locked: 'Bloqueado', collected: 'Coleccionados {count}/{total}', lockedHint: 'Alcanza este final para desbloquearlo.', }, saves: { title: 'Guardados', progress: 'Progreso actual', activeRun: 'Partida actual', slot: 'Espacio {slotNo}', savedRun: 'Progreso guardado', emptySlot: 'Espacio vacío', emptyHint: 'Guarda la run actual para restaurarla tras recargar.', saveHere: 'Guardar', overwrite: 'Sobrescribir', restore: 'Cargar', delete: 'Eliminar', saved: 'Guardado escrito.', restored: 'Guardado cargado.', deleted: 'Guardado eliminado.', conflict: 'Ya existe un guardado. Confirma antes de sobrescribir este punto.', restoreConfirm: 'Cargar cambiará la partida actual a este punto guardado.', deleteConfirm: 'Eliminar este punto guardado no se puede deshacer.', noRunHint: 'No hay una run actual para guardar. Inicia o continúa una primero.', }, map: { title: 'Mapa', current: 'Ubicación actual', route: 'Ruta disponible', routes: 'Destinos disponibles', locked: 'Bloqueado', moveTo: 'Ir a {location}', objects: 'Objetos inspeccionables', inspect: 'Inspeccionar', inspected: 'Inspeccionado', inspectObject: 'Inspeccionar {object}', }, videoCenter: { eyebrow: 'Partidas de jugadores', title: 'Centro de vídeos', backHome: 'Volver', chooseScenario: 'Elegir guion', allScenarios: 'Todos los guiones', searchScenario: 'Buscar guiones', scenarioPaintedSkin: 'Piel pintada', scenarioGuian: 'El caso del corazón perdido de Guian', nowPlaying: 'Reproduciendo', player: 'Jugador', views: 'Visualizaciones', ending: 'Final', duration: 'Duración', libraryEyebrow: 'Más de este guion', allVideos: 'Todos los vídeos', sort: 'Orden de vídeos', recommended: 'Recomendados', latest: 'Más recientes', videoMeta: '{player} · {date}', emptyTitle: 'Aún no hay vídeos', emptyText: 'No hay partidas públicas para este guion.', viewAll: 'Ver todos los vídeos de jugadores', discoverStories: 'Descubre las decisiones de otros', backPrevious: 'Volver', aiSummary: 'Resumen IA:', endingCount: ' finales', publicSeriesCount: ' series públicas', totalPlays: ' reproducciones', seriesList: 'Series de jugadores', completed: 'Completada', updating: 'Episodio {count} · En curso', seriesMetrics: '{episodes} episodios · ▶ {plays} · ♥ {likes}', watchSeries: 'Ver esta serie', playOwnSeries: 'Crea tu propia serie', minutes: '{count} min', share: 'Compartir', shareCopied: 'Enlace copiado', shareFailed: 'No se pudo compartir el video', like: 'Me gusta', liked: 'Te gusta', save: 'Guardar', saved: 'Guardado', storyHighlight: 'Lo mejor de la historia', startPlay: 'Jugar · Reescribir el final', episodeList: 'Episodios', episodeTotal: '{count} episodios', episodeTitle: 'Episodio {count} · {title}', }, runHistory: { eyebrow: 'Registros personales', title: 'Mis partidas', allRuns: 'Todas las partidas', count: '{count} registros', empty: 'Aún no hay registros. Inicia una partida y aparecerá aquí.', loadFailed: 'Error al cargar: {error}', noTime: 'Hora desconocida', statusActive: 'En curso', statusCompleted: 'Finalizada', videoNone: 'Sin vídeo', videoQueued: 'Vídeo en cola', videoRunning: 'Generando vídeo', videoReady: 'Vídeo listo', videoFailed: 'Vídeo fallido', videoRetry: 'Generar de nuevo', untitledEnding: 'Sin final todavía', meta: '{scenario} · Turno {turn} · {date}', openRun: 'Abrir partida', openNotes: 'Notas', watchVideo: 'Ver vídeo', }, mobileProfile: { title: 'MI PERFIL', settings: 'Ajustes', content: 'Contenido', benefits: 'Beneficios', creator: 'Creador', support: 'Consultas y soporte', contact: 'Atención al cliente', terms: 'Términos de uso', privacy: 'Política de privacidad', social: 'Redes sociales' }, profileEditor: { editProfile: 'Editar perfil', nameSection: 'Nombre del perfil', nameHint: 'Este nombre aparece junto a tus juegos y vídeos.', name: 'Nombre', saveName: 'Guardar nombre', nameRequired: 'Introduce tu nombre.', nameSaved: 'Tu nombre se ha actualizado.', passwordSection: 'Cambiar contraseña', passwordHint: 'Confirma tu identidad con el código enviado a tu correo.', email: 'Correo electrónico', verificationCode: 'Código de verificación', sendCode: 'Enviar código', codeSent: 'Se envió un código a tu correo.', newPassword: 'Nueva contraseña', confirmPassword: 'Confirmar contraseña', savePassword: 'Actualizar contraseña', passwordRequirements: 'Introduce el código y una contraseña de al menos 8 caracteres.', passwordMismatch: 'Las contraseñas no coinciden.', passwordSaved: 'Tu contraseña se ha actualizado.' }, myGames: { recent: 'Jugados recientemente', popular: 'Historias populares', emptyRecent: 'Tus historias jugadas recientemente aparecerán aquí.', loadError: 'No se pudieron cargar tus juegos. Inténtalo de nuevo.' }, storyDetail: { title: 'Información de la historia', description: 'Descripción', episodes: '{count} episodios', endings: '{count} finales', by: 'Por {name}', lastUpdate: 'Última actualización', newPlay: 'Nueva partida', notFound: 'No se encontró esta historia.', loadError: 'No se pudo cargar la historia.' }, accountCenter: { loadFailed: 'No se pudo cargar tu perfil', loadTimeout: 'La solicitud agotó el tiempo. Comprueba tu conexión e inténtalo de nuevo.', title: 'Centro personal', eyebrow: 'Perfil del jugador', runs: 'Mis juegos', videos: 'Colección de vídeos', favorites: 'Favoritos', watchSeason: 'Ver temporada', emptyGames: 'Todavía no has iniciado ningún juego.', emptyVideos: 'Aún no hay vídeos generados.', emptyFavorites: 'Aún no hay vídeos guardados.', lastPlayed: 'Última partida · {date}', currentTurn: 'En curso · Turno {turn}', noActiveRun: 'No hay partida activa', endingsUnlocked: 'Finales {unlocked}/{total}', runsPlayed: '{count} partidas', continueGame: 'Continuar juego', startGame: 'Iniciar juego', viewHistory: 'Ver historial', levelProgress: '{played}/{total} niveles jugados', viewSeasonDetails: 'Ver detalles de la temporada', hideSeasonDetails: 'Ocultar detalles', levelInProgress: 'En curso', levelCompleted: 'Completado', endingLabel: 'Final alcanzado', cluesLabel: 'Pistas obtenidas', clueCount: '{count} pistas', viewRunRecords: 'Ver registros del juego', runRecordSummary: '{clues} pistas · {ending} final', noEnding: 'Aún no se alcanzó ningún final', noClues: 'Aún no se encontraron pistas', seasonDetailsLoadFailed: 'No se pudo cargar la temporada. Inténtalo de nuevo.', public: 'Público', private: 'Solo yo', deleteVideo: 'Eliminar vídeo', confirmDelete: 'Confirmar eliminación', signInTitle: 'Inicia sesión', signInBody: 'Inicia sesión para gestionar tus juegos y vídeos.' }, visual: { eyebrow: 'TRPG Visual', chooseScript: 'Elegir guion', actTitle: 'Acto {count} · {title}', actLocked: '{title} está bloqueado', actSealed: 'Acto sellado', toBeContinued: 'Continuará', finishPreviousAct: 'Alcanza un final en el acto anterior', revealAfterAct: 'Se revela al completar el acto {count}', moreScripts: 'Más niveles', comingSoon: 'Próximamente', watchScriptVideo: 'Ver vídeo de la historia', scenarioKicker: 'Guion', hiddenTitle: 'Tianyou', revealedTitle: 'Piel pintada', objectives: 'Objetivos actuales', playHistory: 'Registro de juego', objectiveLabel: 'Objetivo', close: 'Cerrar', noObjectives: 'No hay objetivos activos.', taskProgress: 'Pasos {done}/{total}', entryKicker: 'Entrar al juego', entryTitle: 'Entrar al cuarto esta noche', emptyScenarioEyebrow: 'Guion no disponible', emptyScenarioTitle: 'No hay guion jugable', emptyScenarioText: 'El servidor no devolvió un guion publicado. Actualiza o revisa el estado de publicación.', emptyScenarioActionTitle: 'Esperando publicación', emptyScenarioActionText: 'La app no iniciará un guion local falso sin datos reales.', continueTitle: 'Continuar partida', entryBody: 'Elige un personaje antes de entrar en la vieja habitación.', chooseCharacter: 'Elegir personaje', enterStory: 'Entrar en la historia', back: 'Volver', skip: 'Saltar', editor: 'Editor', debugPage: 'Depurar', state: 'Estado', settings: 'Ajustes', language: 'Idioma', languageUnavailable: 'Este nivel aún no tiene una traducción disponible para ese idioma.', turnVideoMatching: 'Emparejamiento inteligente de CG', turnVideoMatchingHint: 'Al activarlo, se buscan CG de escenas similares para este turno. Desactivado, solo se reproducen CG vinculados exactamente.', turnVideoMatchingOn: 'Activado', turnVideoMatchingOff: 'Desactivado', exitGame: 'Salir de la partida', exitGameHint: 'Sal de la sesión actual y vuelve a la selección de escenarios.', saveAndExit: 'Guardar y salir', exitWithoutSaving: 'Salir sin guardar', notes: 'Notas', saves: 'Guardados', continueRun: 'Continuar partida', balanceEntry: 'Saldo {credits}', endingCollection: 'Colección de finales', narrator: 'Narrador', npcName: 'Mujer en la habitación', npcLine: '"{line}"', notStarted: 'Sin iniciar', startHint: 'Pulsa iniciar para entrar en la casa vieja.', debug: 'Depurar atributos', debugOnly: 'Solo depuración', waiting: 'Esperando.', modeAct: 'Hacer', modeSay: 'Decir', inputMethod: 'Método de entrada', textInputMode: 'Texto', voiceInputMode: 'Voz', choiceGroupLabel: 'Opciones de historia', inputPlaceholder: 'Ejemplo: levanto el espejo de bronce hacia ella y el retrato.', mobileInputPlaceholder: 'Habla o actúa…', voiceStart: 'Iniciar entrada de voz', voiceStop: 'Detener entrada de voz', voiceListening: 'Escuchando…', voiceRecognizing: 'Reconociendo…', voiceUnsupported: 'Este navegador no admite entrada de voz', voicePermissionDenied: 'No se permitió el acceso al micrófono. Revisa los permisos del navegador', voiceMicrophoneUnavailable: 'No se encontró un micrófono disponible', voiceNoSpeech: 'No se reconoció ninguna voz. Inténtalo de nuevo', voiceNoAudioCaptured: 'No se capturó audio del micrófono. Revisa los permisos del navegador', voiceRecognitionFailed: 'Falló el reconocimiento de voz. Inténtalo de nuevo', voiceHoldToTalk: 'Mantén pulsado para hablar', voicePreparing: 'Preparando el micrófono…', voiceShortcutLabel: 'Atajo', voiceReleaseSend: 'Suelta para enviar', voiceSlideCancel: 'Desliza hacia arriba para cancelar', voiceReleaseCancel: 'Suelta para cancelar', voiceUnderstanding: 'Interpretando tu instrucción…', ending: 'Final', endingLabel: 'Final', endingLine: 'Final: {title}\n{description}', endingSummary: 'Resumen del final', endingPoem: 'Poema final', endingFallbackPoem: '...', endingBackgroundLoadFailed: 'No se pudo cargar la escena final. Actualiza la página e inténtalo de nuevo.', recordSeal: 'Caso', recordTitle: 'Registro del alguacil', recordKicker: 'Archivo del condado', recordMeta: 'Tras la noche lluviosa', continue: 'Continuar', enterNextEpisode: 'Entrar al siguiente episodio', viewCurrentSeasonStory: 'Ver esta temporada', played: 'Reproducido', nextPage: 'Página siguiente', statusCreating: 'Preparando tu historia...', statusStarted: 'Iniciado. Escribe una frase o acción.', statusHistoryRun: 'Viendo una partida histórica. Continuar usa el progreso del servidor.', statusKp: 'El KP está juzgando...', statusDone: 'Turno completado.', contentFiltered: 'Esta acción no se puede describir. Intenta actuar de otra manera.', turnFailed: 'No pudimos completar este paso. Inténtalo de nuevo.', audioFailed: 'No se pudo reproducir la voz. Inténtalo de nuevo.', actionRejected: 'Esa acción aún no puede surtir efecto. Prueba otro enfoque.', statusEnded: 'Partida terminada.', statusEndingText: 'Generando texto final...', statusEndingLocked: 'Final determinado. Entrando al final...', statusNpcAction: 'El NPC intenta actuar. Esperando juicio del KP...', statusNpcDone: 'El NPC respondió.', clueGained: 'Pista obtenida', landscapeTitle: 'Gira tu dispositivo', landscapeBody: 'Juega en horizontal para ver la escena y las imágenes CG completas.', stats: { suspicion: 'Sospecha', charm: 'Encanto', fear: 'Miedo', }, guide: { label: 'Guía', skip: 'Saltar', next: 'Siguiente', done: 'Entendido', optionsTitle: 'Elegir directamente', optionsText: 'Tras la respuesta del NPC aparecerán dos opciones sugeridas: decir o hacer.', keyboardTitle: 'Cambiar a entrada por teclado', keyboardText: 'La entrada de voz es la opción predeterminada. Pulsa el botón del teclado para escribir lo que dices o haces.', inputTitle: 'Elegir Decir o Hacer', inputText: 'Antes de escribir, elige si vas a hablar o actuar. El KP evaluará cualquiera de las dos opciones.', notesTitle: 'Ver notas', notesText: 'El botón de notas registra pistas descubiertas y finales desbloqueados.', goalTitle: 'Sobrevive', goalText: 'No es solo conversar. Escucha, pero observa la habitación, las pistas y lo extraño.', videoTitle: 'Completa la historia y convierte tu aventura en un video único', videoExampleLabel: 'Video de ejemplo', videoExampleNotice: 'Este video es solo un ejemplo y no representa el contenido generado a partir de tu partida.', videoLoading: 'Cargando un video de ejemplo…', videoUnavailable: 'Esta historia todavía no tiene un video de ejemplo.', videoDone: 'Comenzar mi historia', }, openingOptions: { say: 'Perdón, no quise entrar. Algo afuera me estaba persiguiendo.', act: 'Bajar la voz y revisar puertas, ventanas, la lámpara y la posición de ella.', }, }, panels: { clues: 'Pistas', conclusions: 'Conclusiones', info: 'Información', inventory: 'Inventario', events: 'Eventos', stats: 'Atributos', flags: 'Marcas', objects: 'Objetos', npcs: 'NPC', endingRecords: 'Finales desbloqueados' }, standalone: { summary: 'Resumen', availableClues: 'Pistas disponibles', recentTurns: 'Turnos recientes', audit: { title: 'Auditoría de IA', subtitle: 'Costos y fallos de llamadas KP, NPC, finales y TTS.', totalCalls: 'Llamadas', failedCalls: 'Fallidas', tokens: 'Tokens entrada/salida', cost: 'Costo', roles: 'Resumen por rol', models: 'Resumen por modelo', recentCalls: 'Llamadas recientes', empty: 'No hay llamadas de IA registradas.', calls: '{count} llamadas', tokenPair: 'tokens {tokens}', }, state: { title: 'Vista de estado', waiting: 'Esperando RunState.', noRun: 'No hay runId. Abre esta página desde el juego o escribe un runId.', loading: 'Cargando {runId}...', loaded: '{runId} cargado', }, notes: { title: 'Notas', waiting: 'Cargando notas.', noRun: 'No se encontró guardado actual. Inicia o continúa una partida primero.', loading: 'Cargando {runId}...', loaded: '{runId} cargado', unavailable: 'Las notas de esta partida no están disponibles temporalmente.', emptyClues: 'Aún no hay pistas', emptyConclusions: 'Aún no hay conclusiones', emptyEndings: 'Aún no hay finales', tabs: 'Categorías de notas', list: 'Lista de entradas', detail: 'Detalle de entrada', locked: 'Bloqueado', lockedHint: 'Este final aún no se ha registrado.', recorded: 'Registrado', importance: { minor: 'Secundaria', major: 'Importante', critical: 'Crítica' }, relatedClues: 'Pistas relacionadas', noRelatedClues: 'Aún no se ha encontrado ninguna pista que apoye esta conclusión.', }, }, editor: { title: 'Autoría de escenario', pack: 'Paquete', section: 'Sección', raw: 'JSON', structured: 'Editor estructurado', debugJson: 'JSON de depuración', item: 'Elemento', noStructuredFields: 'Esta sección aún no tiene campos estructurados editables.', updated: 'Guardado', assetUploaded: 'Recurso subido al borrador', compiled: 'Borrador compilado', published: 'Versión publicada', rolledBack: 'Versión revertida', versions: 'Versiones', assets: 'Índice de recursos', current: 'Actual', currentVersion: 'Versión actual', noPublishedVersion: 'Sin publicar', noVersions: 'Aún no hay versiones. Compila un borrador primero.', noAssets: 'Aún no hay índice de recursos. Compila el manifiesto primero.', noFilteredAssets: 'Ningún recurso coincide con los filtros.', assetSearch: 'Buscar', assetSearchPlaceholder: 'Etiqueta, archivo u objectKey', assetTypeFilter: 'Tipo', assetSourceFilter: 'Origen', assetFilterAll: 'Todos', assetFilterResult: '{shown}/{total}', assetSource: { uploaded: 'Objeto subido', static: 'Archivo estático', missing: 'Sin localizador', }, uploadFile: 'Archivo', uploadTag: 'Etiqueta', uploadTagPlaceholder: 'opening_cg', uploadType: 'Tipo', noUploadFile: 'Sin archivo', }, waitingList: { eyebrow: 'Acceso anticipado', apply: 'Solicitar acceso', useInvite: 'Usar código de invitación', invitedRegister: '¿Tienes invitación? Crear cuenta', title: 'Únete a la waiting list del servidor de juego', body: 'Deja un email y un caso de uso. Operaciones emitirá invitaciones desde admin.', displayName: 'Nombre', displayNamePlaceholder: 'Opcional', useCase: 'Caso de uso', useCaseOptional: 'Caso de uso (opcional)', useCasePlaceholder: 'Prueba de equipo, creador, evento', useCaseRequired: 'El caso de uso es obligatorio.', consent: 'Acepto recibir emails de invitación y producto para esta waiting list.', join: 'Unirme', joined: 'Solicitud recibida. Espera la notificación por email.', joinedTitle: 'Solicitud enviada', changeEmail: 'Usar otro email', accountAlreadyRegistered: 'Este email ya está registrado. Inicia sesión.', emailRequired: 'El email es obligatorio.', consentRequired: 'Debes aceptar los emails antes de unirte.', inviteEyebrow: 'Invitación', inviteTitle: 'Crea tu cuenta de voko.world', inviteBody: 'Esta invitación está vinculada a tu email. Define una contraseña para completar el registro.', inviteMissing: 'Falta el token de invitación.', inviteEnterCode: 'Introduce el código de invitación de 8 caracteres que recibiste para crear una cuenta.', inviteValidate: 'Verificar código', inviteReenter: 'Introducir otro código', inviteInvalid: 'La invitación no es válida o expiró.', codeSent: 'Código de verificación enviado.', passwordMismatch: 'Las contraseñas no coinciden.', acceptInvite: 'Crear cuenta', }, landing: { officialVideo: 'Ver el vídeo oficial', officialVideoEyebrow: 'Conoce VOKO', officialVideoTitle: 'Tu mundo te está llamando.', officialVideoBody: 'Crea tu propio mundo, vive historias que vuelven a llamarte y comparte cada momento como un vídeo que merece la pena ver.', homeLabel: 'Inicio de voko.world', navHome: 'Home', navScripts: 'Historias', navVideos: 'Vídeos', featuredStories: 'Historias destacadas', featuredStoriesEyebrow: 'Empieza a jugar', endingCount: '{count} finales', allStories: 'Todas las historias', dramaTitle: 'Drama', brandSub: 'Historias interactivas', navLabel: 'Navegación principal', navStories: 'Juegos', navGallery: 'Galería', eyebrow: 'Rol visual con IA', loadError: 'No se pudo cargar el inicio.', retry: 'Reintentar', emptyGames: 'Aún no hay juegos publicados.', scenarioFallback: 'Cambia la historia con tus decisiones.', publicVideos: 'vídeos de jugadores', publicGames: 'juegos públicos', watchDrama: 'Ver drama', enterPlay: 'Jugar', comingSoon: 'Próximamente', carouselLabel: 'Carrusel de juegos', previousGame: 'Juego anterior', nextGame: 'Juego siguiente', showcaseTitle: 'Historias creadas por jugadores', showcaseBody: 'Mira otros finales y crea tu propia versión.', searchLabel: 'Buscar historias', searchPlaceholder: 'Buscar por título', sortLabel: 'Orden', latest: 'Recientes', popular: 'Populares', videoCount: '{count} vídeos', levelCount: '{count} niveles', levelNumber: 'Nivel {count}', singleLevel: 'Nivel independiente', publicGame: 'Juego público', noSearchResults: 'No se encontraron historias', clearSearch: 'Borrar búsqueda', finalEyebrow: 'Tu historia te espera', finalTitle: '¿Quién serás?', finalBody: 'Cruza el umbral y pronuncia tus primeras palabras.', begin: 'Comenzar el viaje', footer: '© 2026 voko.world', earlyAccess: 'Acceso anticipado', footerSocial: 'Comunidad', footerLegal: 'Legal y contacto', privacy: 'Política de privacidad', terms: 'Términos del servicio', contact: 'Email de contacto' }, landingCarousel: { introEyebrow: 'Juego dramático generativo', introSummary: 'Mira un drama breve, entra en el papel y cambia la historia con cada decisión.', dramaEyebrow: 'Drama destacado {count}', controls: 'Carrusel de inicio', goToSlide: 'Ir a la diapositiva {count}' }, landingCinema: { navHome: 'Inicio', navDramas: 'Juego', navPlayerStories: 'Dramas', navMy: 'Yo', featuredDramas: 'Juegos', playerStories: 'Dramas' }, searchPage: { placeholder: 'Buscar historias, dramas o cuentas', popular: 'Búsquedas populares', history: 'Búsquedas recientes', clearHistory: 'Borrar', resultTypes: 'Tipos de resultados', all: 'Todo', accounts: 'Cuenta', accountStats: '{titles} títulos · {plays} reproducciones' }, landingIntro: { title: 'voko.world', apply: 'Solicitar acceso', watchVideo: 'Ver vídeos', start: 'Iniciar partida', continue: 'Continuar partida', viewJourney: 'Historial de juego', continueProgress: 'Temporada {season} {scenario}', storyLine: 'Línea narrativa', viewMore: 'Ver más' }, storyTree: { eyebrow: 'Líneas de temporada', subtitle: 'Cada línea es una temporada y cada nodo es un nivel.', root: 'Drama', branch: 'Rama', active: 'En curso', completed: 'Completado', locked: 'No alcanzado', empty: 'Aún no hay líneas de temporada.', loadError: 'No se pudieron cargar las líneas de temporada.', navigation: 'Rango de temporadas', range: 'Temporadas {first}–{last} · {total} en total', newer: 'Anterior', older: 'Siguiente', startPlaying: 'Jugar ahora', turnProgress: 'Turno {turn}', continuePlaying: 'Continuar jugando', playLog: 'Registro de juego', seasonEnding: 'Final de temporada', currentSeason: 'Temporada actual', logLoadError: 'No se pudo cargar el registro.', logEmpty: 'Esta temporada aún no tiene historial.', turnNumber: 'Turno {turn}', playerSaid: 'Dijiste', playerDid: 'Hiciste', storyOpening: 'Inicio de la historia', turnVideos: 'Vídeos coincidentes', playActionVideo: 'Vídeo de acción', playPlayerVideo: 'Vídeo del jugador', playNpcVideo: 'Vídeo del NPC', replayTurn: 'Repetición', replayTurnTitle: 'Repetición del turno {turn}', replayProgress: 'Segmento {current}/{total}', actionSegment: 'Acción', playerSpeechSegment: 'Habla del jugador', npcSpeechSegment: 'Habla del NPC', pauseReplay: 'Pausar', continueReplay: 'Continuar', restartReplay: 'Repetir', exportReplay: 'Exportar repetición', replayQueued: 'En cola', replayExporting: 'Exportando', playFullReplay: 'Reproducir todo', retryReplayExport: 'Reintentar exportación', downloadReplay: 'Descargar MP4', downloadSegment: 'Descargar este segmento', downloadTurn: 'Descargar turno completo', turnExporting: 'Preparando vídeo del turno', turnExportError: 'Falló la exportación del turno.', segmentExporting: 'Preparando segmento', segmentExportError: 'Falló la exportación del segmento.', fullReplayTitle: '{title} · Repetición completa', replayExportError: 'Falló la exportación de la repetición.', videoLoadError: 'No se pudo cargar el vídeo.', tools: 'Buscar, filtrar y ordenar historias', search: 'Buscar', searchPlaceholder: 'Buscar nivel, final o acción reciente', filter: 'Estado', filterAll: 'Todo', filterInProgress: 'En curso', filterCompleted: 'Completado', sort: 'Ordenar', sortRecent: 'Jugado recientemente', sortSeasonDesc: 'Temporada descendente', sortSeasonAsc: 'Temporada ascendente', resultCount: '{count} temporadas', noResults: 'Ninguna historia coincide con los criterios.', canvasHint: 'Arrastra el lienzo o desplázate para ver los niveles de la derecha', canvasLabel: 'Lienzo del árbol de historia desplazable horizontalmente', storySwitch: 'Historia', }, storyTreeCurrentSeasonHint: 'Progreso más reciente', storyTreeViewDetails: 'Ver detalles de la temporada {number}', storyTreeDelete: { action: 'Eliminar rama', confirm: '¿Eliminar la temporada {number} y todas sus ramas derivadas? Esta acción no se puede deshacer.', deleting: 'Eliminando…', error: 'No se pudo eliminar la rama.' }, storyTreeVideoUnavailable: 'Vídeo no disponible', storyTreeFork: { action: 'Volver a jugar desde aquí', confirm: 'Se creará una nueva rama desde el turno {turn}. El historial actual no cambiará.', failed: 'No se pudo crear la nueva rama. Inténtalo de nuevo.', creating: 'Creando…' }, runVideoGeneration: { title: 'Generar vídeo completo', description: 'Genera un vídeo completo de esta partida. Los puntos se cobran al confirmar y se devuelven si falla la generación.', generate: 'Generar vídeo', regenerate: 'Generar de nuevo', retry: 'Intentar de nuevo', queued: 'En cola', running: 'Generando', price: 'Puntos necesarios', balance: 'Saldo actual', balanceAfter: 'Saldo después del cobro' }, landingShowcase: { title: 'Vidas en escena', body: 'Descubre los destinos de otros jugadores, entra en la historia y escribe tu propio final.' }, landingMetrics: { playCount: 'Reproducciones', likeCount: 'Me gusta' }, landingCard: { level: 'Episodio', searchPlaceholder: 'Encuentra historias, vídeos o jugadores', scriptFilter: 'Drama', scriptAll: 'Todos los dramas', playerVideoCount: '{count} vídeos públicos', publishedAt: 'Publicado', publishedAll: 'Todo', publishedToday: 'Hoy', publishedWeek: 'Últimos 7 días', publishedMonth: 'Últimos 30 días', expandSynopsis: 'Ver más', collapseSynopsis: 'Ver menos' }, playerPage: { loadError: 'No se pudieron cargar los vídeos del jugador.', notFound: 'No se encontró al jugador o no tiene vídeos públicos.', searchPlaceholder: 'Buscar dramas, niveles o temporadas' }, season: { choose: 'Elige una temporada', chooseBody: 'Este episodio continuará la historia de la temporada elegida.', number: 'Temporada {number}', empty: 'Completa el episodio anterior de una temporada antes de continuar.' }, status: { loading: 'Cargando', empty: 'Sin datos', error: 'Error al cargar', streaming: 'Procesando' }, storiesPage: { tags: 'Etiquetas de historias', allTags: 'Todas', swipeForNextStory: 'Desliza hacia arriba para ver la siguiente historia' }, creator: { nav: 'Crear', queued: 'En cola', attachmentTypeError: 'Sube un archivo TXT, PDF, Word, PNG, JPG o WEBP.', attachmentSizeError: 'El archivo adjunto no puede superar los 10 MB.', attachmentReadError: 'No se pudo leer el archivo adjunto.', generationFailed: 'Generación fallida', reviewRejected: 'Revisión rechazada', published: 'Publicado', archived: 'Archivado', composerTitle: '¿Qué mundo quieres crear hoy?', submitIdea: 'Enviar idea', examplesNote: 'Juegos publicados reales mostrados como referencia visual.', exampleStatus: 'Ejemplo publicado', projectsEyebrow: 'Visual Game Creator', projectsTitle: 'Mis juegos', projectsBody: 'Gestiona tus juegos y consulta su generación y revisión.', newGame: 'Crear juego', draftStatus: 'Borrador', continueEditing: 'Seguir editando', generatedScopes: 'elementos de generación', emptyTitle: 'Crea tu primer juego', emptyBody: 'Empieza con una idea, un guion o un mundo y conviértelo en un juego.', eyebrow: 'Visual Game Creator', title: 'Convierte tu historia en un mundo jugable', subtitle: 'Comparte una idea, un guion o un mundo. El sistema diseñará, producirá y validará el juego.', stepIdea: 'Idea', stepGenerate: 'Generar', stepReview: 'Revisión', ideaTitle: 'Describe tu juego', ideaBody: 'Escribe con naturalidad. No necesitas conocer JSON.', ideaLabel: 'Idea o guion', ideaHint: 'Incluye mundo, personajes, conflicto y experiencia.', ideaPlaceholder: 'Un viajero despierta en una posada donde todos recuerdan una noche diferente…', ideaError: 'Escribe al menos 20 caracteres.', languageLabel: 'Idioma', languages: { zh: 'Chino', en: 'Inglés', ja: 'Japonés', ko: 'Coreano' }, scopeTitle: 'Generar ahora', scopeStory: 'Historia y niveles', scopeStoryBody: 'Personajes, misiones, estados y finales', scopeVisuals: 'Medios visuales', scopeVisualsBody: 'Personajes, escenas, objetos y vídeos', scopeVoice: 'Voces', scopeVoiceBody: 'Jugador, NPC y narración', scopeError: 'Selecciona al menos un elemento.', assetsTitle: 'Material de referencia', assetsBody: 'Opcional. Ayuda a mantener la coherencia.', uploadAction: 'Añadir archivos', uploadHint: 'Un archivo · TXT, PDF, Word, PNG, JPG o WEBP · máximo 10 MB', supportedTitle: 'Material compatible', supportedBody: 'Imágenes, guiones, documentos, vídeo y audio.', removeFile: 'Eliminar {name}', saved: 'Borrador guardado.', draftNote: 'Esta primera versión guarda un borrador local.', save: 'Guardar borrador' }, labels: { scenario: 'Escenario', asset: 'Recurso', mode: 'Modo', phase: 'Fase', location: 'Ubicación', noRun: 'Sin iniciar', none: 'Nada' }, }