d5b00a86dc
- lib/admin.ts: isAdmin(session) por allowlist ADMIN_EMAILS (normalizada) o gmlevel de AzerothCore (account_access, resiliente si no existe). ADMIN_EMAILS/ADMIN_GMLEVEL en .env.local. - lib/admin-news.ts: listNews / createNews / deleteNews (home_noticia). - Routes /api/admin/news (POST, guard isAdmin) y /api/admin/news/[id] (DELETE). - Páginas /admin (dashboard) y /admin/news (protegidas: no-admin -> redirect). AdminNewsManager (cliente: crear + listar + borrar). Verificado: /admin sin permiso redirige, APIs 403; el pipeline crear noticia -> se renderiza en la home (SSR) funciona. Turnstile bloquea el login por curl (correcto). Pendiente admin: precios de servicios, foros, sitios de voto, usuarios. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
287 lines
12 KiB
JSON
287 lines
12 KiB
JSON
{
|
|
"Metadata": {
|
|
"title": "Nova WoW Server de WoW WotLK 3.4.3 Latino y Español 💎",
|
|
"description": "Descarga y juega gratis a WotLK Classic en Nova WoW - Server de WoW WotLK 3.4.3 Latino y Español - El mejor server de WoW 🔥"
|
|
},
|
|
"Nav": {
|
|
"home": "Inicio",
|
|
"login": "Iniciar sesión",
|
|
"register": "Crear cuenta",
|
|
"account": "Mi cuenta",
|
|
"logout": "Cerrar sesión",
|
|
"language": "Idioma",
|
|
"forum": "Foros"
|
|
},
|
|
"Home": {
|
|
"brand": "Nova WoW",
|
|
"serverStatus": "Estado del servidor",
|
|
"server": "Servidor",
|
|
"onlineCharacters": "Personajes en línea",
|
|
"login": "Login",
|
|
"address": "Dirección",
|
|
"notAvailable": "No disponible",
|
|
"news": "Noticias",
|
|
"noNews": "No hay noticias disponibles en este momento.",
|
|
"link": "Enlace",
|
|
"here": "aquí"
|
|
},
|
|
"Login": {
|
|
"title": "Conectar a Nova WoW",
|
|
"email": "Correo electrónico",
|
|
"password": "Contraseña",
|
|
"submit": "Conectar",
|
|
"connecting": "Conectando…",
|
|
"success": "Conexión exitosa. Redirigiendo…",
|
|
"invalidCredentials": "Correo o contraseña incorrectos",
|
|
"missingFields": "Por favor rellene todos los campos.",
|
|
"invalidRequest": "Solicitud no válida.",
|
|
"genericError": "Algo ha salido mal. Inténtalo más tarde.",
|
|
"forgot": "He olvidado mi contraseña/usuario",
|
|
"newHere": "¿Nuevo en la comunidad? Puedes crear una cuenta",
|
|
"createAccount": "aquí",
|
|
"captchaFailed": "Verificación anti-bots fallida. Reintenta."
|
|
},
|
|
"Account": {
|
|
"title": "Mi cuenta",
|
|
"bnetAccount": "Cuenta (Battle.net)",
|
|
"gameAccount": "Cuenta de juego",
|
|
"logout": "Cerrar sesión",
|
|
"points": "Puntos",
|
|
"dp": "PD",
|
|
"vp": "PV",
|
|
"battlepayCredits": "Créditos Battlepay",
|
|
"securityToken": "Token de seguridad",
|
|
"requested": "Solicitado",
|
|
"notRequested": "Sin solicitar",
|
|
"characters": "Mis personajes",
|
|
"level": "Nivel",
|
|
"noCharacters": "No tienes personajes todavía."
|
|
},
|
|
"SelectAccount": {
|
|
"title": "Selecciona tu cuenta de juego",
|
|
"loggedInAs": "Conectado como",
|
|
"choose": "Tu cuenta Battle.net tiene varias cuentas de juego. Elige con cuál quieres continuar:",
|
|
"noAccounts": "No se han encontrado cuentas de juego asociadas a esta cuenta Battle.net.",
|
|
"entering": "Entrando…",
|
|
"error": "No se pudo seleccionar la cuenta."
|
|
},
|
|
"Register": {
|
|
"title": "Creación de cuenta",
|
|
"info": "Tu cuenta es de tipo Battle.net: se identifica con tu correo electrónico. La contraseña debe ser alfanumérica y de hasta 16 caracteres. El correo debe ser de Gmail.",
|
|
"password": "Contraseña",
|
|
"confPassword": "Confirmar contraseña",
|
|
"email": "Correo electrónico de Gmail",
|
|
"confEmail": "Confirmar correo electrónico",
|
|
"recruiter": "Reclutante (opcional)",
|
|
"terms": "Acepto las Normas, los Términos y Condiciones y la Política de Privacidad",
|
|
"submit": "Crear cuenta",
|
|
"creating": "Creando…",
|
|
"success": "La cuenta se ha creado. Revisa tu correo para activarla.",
|
|
"missingFields": "Por favor, complete todos los campos.",
|
|
"passwordMismatch": "Las contraseñas no coinciden.",
|
|
"passwordTooLong": "La contraseña no debe exceder los 16 caracteres.",
|
|
"invalidEmail": "El correo electrónico no es válido.",
|
|
"emailExists": "Ya existe una cuenta con ese correo electrónico.",
|
|
"recruiterNotFound": "El reclutador ingresado no existe.",
|
|
"genericError": "Algo ha salido mal. Inténtalo más tarde.",
|
|
"captchaFailed": "Verificación anti-bots fallida. Reintenta."
|
|
},
|
|
"Activate": {
|
|
"activating": "Activando tu cuenta…",
|
|
"success": "¡Cuenta activada! Ya puedes iniciar sesión.",
|
|
"invalidLink": "El enlace no es válido o ya se ha usado.",
|
|
"expiredLink": "El enlace ha caducado. Solicita uno nuevo.",
|
|
"goLogin": "Ir a iniciar sesión"
|
|
},
|
|
"Recover": {
|
|
"title": "Recuperar cuenta",
|
|
"type": "¿Qué quieres recuperar?",
|
|
"typePassword": "Contraseña",
|
|
"typeAccountName": "Nombre de cuenta",
|
|
"typeActivation": "Enlace de activación",
|
|
"email": "Correo electrónico de Gmail",
|
|
"submit": "Solicitar",
|
|
"sending": "Enviando…",
|
|
"success": "Si existe una cuenta con ese correo, te hemos enviado la información.",
|
|
"invalidEmail": "Introduce un correo de Gmail válido.",
|
|
"genericError": "Algo ha salido mal. Inténtalo más tarde.",
|
|
"captchaFailed": "Verificación anti-bots fallida. Reintenta."
|
|
},
|
|
"Reset": {
|
|
"title": "Restablecer contraseña",
|
|
"password": "Nueva contraseña",
|
|
"confPassword": "Confirmar contraseña",
|
|
"submit": "Restablecer",
|
|
"saving": "Guardando…",
|
|
"success": "Contraseña restablecida. Ya puedes iniciar sesión.",
|
|
"goLogin": "Ir a iniciar sesión",
|
|
"invalidLink": "El enlace no es válido o ya se ha usado.",
|
|
"expiredLink": "El enlace ha caducado. Solicita uno nuevo.",
|
|
"passwordMismatch": "Las contraseñas no coinciden.",
|
|
"passwordTooLong": "La contraseña no debe exceder los 16 caracteres.",
|
|
"accountNotFound": "No se ha encontrado la cuenta.",
|
|
"genericError": "Algo ha salido mal. Inténtalo más tarde."
|
|
},
|
|
"Services": {
|
|
"reviveTitle": "Revivir personaje",
|
|
"unstuckTitle": "Desbloquear personaje",
|
|
"reviveAction": "Revivir",
|
|
"unstuckAction": "Desbloquear",
|
|
"selectCharacter": "Selecciona un personaje",
|
|
"noCharactersYet": "No tienes personajes disponibles.",
|
|
"processing": "Procesando…",
|
|
"success": "Acción realizada con éxito.",
|
|
"noCharacter": "Selecciona un personaje.",
|
|
"notOfflineOrOwned": "El personaje debe estar desconectado y ser tuyo.",
|
|
"cooldown": "Solo puedes hacerlo una vez cada 12 horas.",
|
|
"soapError": "Error de comunicación con el servidor. Inténtalo más tarde.",
|
|
"genericError": "Algo ha salido mal. Inténtalo más tarde."
|
|
},
|
|
"Paid": {
|
|
"rename": {
|
|
"title": "Renombrar personaje",
|
|
"pay": "Renombrar por {price} €",
|
|
"success": "El personaje {name} ha sido marcado para renombrar (se aplica al próximo inicio de sesión)."
|
|
},
|
|
"customize": {
|
|
"title": "Personalizar personaje",
|
|
"pay": "Personalizar por {price} €",
|
|
"success": "El personaje {name} ha sido marcado para personalización."
|
|
},
|
|
"change-race": {
|
|
"title": "Cambiar de raza",
|
|
"pay": "Cambiar raza por {price} €",
|
|
"success": "El personaje {name} ha sido marcado para cambio de raza."
|
|
},
|
|
"change-faction": {
|
|
"title": "Cambiar de facción",
|
|
"pay": "Cambiar facción por {price} €",
|
|
"success": "El personaje {name} ha cambiado de facción con éxito."
|
|
},
|
|
"level-up": {
|
|
"title": "Subir a nivel 80",
|
|
"pay": "Subir a nivel 80 por {price} €",
|
|
"success": "El personaje {name} ha sido subido al nivel 80."
|
|
},
|
|
"error": "No se pudo completar la operación. Si se te ha cobrado, contacta con soporte.",
|
|
"gold": {
|
|
"title": "Adquirir oro",
|
|
"buy": "Comprar oro",
|
|
"selectAmount": "Selecciona la cantidad",
|
|
"option": "{amount} oro — {price} €",
|
|
"success": "El oro ha sido añadido al personaje {name}."
|
|
},
|
|
"transfer": {
|
|
"title": "Transferir personaje",
|
|
"pay": "Transferir por {price} €",
|
|
"destination": "Cuenta de destino",
|
|
"success": "El personaje {name} ha sido transferido a la cuenta de destino."
|
|
}
|
|
},
|
|
"SecurityToken": {
|
|
"title": "Token de seguridad",
|
|
"info": "El token de seguridad es un código de 6 caracteres (sensible a mayúsculas) que se solicita para acciones importantes de tu cuenta. Puedes solicitar uno nuevo cada 7 días.",
|
|
"lastRequest": "Fecha de solicitud",
|
|
"never": "Sin solicitar",
|
|
"request": "Solicitar token",
|
|
"requesting": "Solicitando…",
|
|
"success": "Se ha enviado el token de seguridad a tu correo.",
|
|
"cooldown": "Solo puedes solicitar un token cada 7 días.",
|
|
"noEmail": "Añade un correo a tu cuenta antes de solicitar un token.",
|
|
"genericError": "Algo ha salido mal. Inténtalo más tarde."
|
|
},
|
|
"ChangePassword": {
|
|
"title": "Cambiar contraseña",
|
|
"info": "La nueva contraseña debe ser alfanumérica y de hasta 16 caracteres. Necesitas un token de seguridad.",
|
|
"currentPassword": "Contraseña actual",
|
|
"newPassword": "Contraseña nueva",
|
|
"confPassword": "Confirmar contraseña nueva",
|
|
"token": "Token de seguridad",
|
|
"submit": "Cambiar contraseña",
|
|
"changing": "Cambiando…",
|
|
"success": "Contraseña cambiada. Has sido desconectado por seguridad.",
|
|
"missingFields": "Por favor, complete todos los campos.",
|
|
"passwordMismatch": "Las contraseñas no coinciden.",
|
|
"passwordTooLong": "La contraseña no debe exceder los 16 caracteres.",
|
|
"invalidToken": "El token de seguridad es incorrecto.",
|
|
"wrongCurrentPassword": "La contraseña actual es incorrecta.",
|
|
"accountNotFound": "No se ha encontrado la cuenta.",
|
|
"genericError": "Algo ha salido mal. Inténtalo más tarde."
|
|
},
|
|
"ChangeEmail": {
|
|
"title": "Cambiar correo",
|
|
"info": "El correo actual debe escribirse tal cual, respetando mayúsculas/minúsculas. El nuevo correo debe ser de Gmail. Necesitas un token de seguridad.",
|
|
"currentPassword": "Contraseña actual",
|
|
"currentEmail": "Correo actual",
|
|
"newEmail": "Nuevo correo",
|
|
"confEmail": "Confirmar nuevo correo",
|
|
"token": "Token de seguridad",
|
|
"submit": "Cambiar correo",
|
|
"sending": "Enviando…",
|
|
"success": "Se ha enviado un correo de confirmación a tu correo actual.",
|
|
"missingFields": "Por favor, complete todos los campos.",
|
|
"wrongCurrentEmail": "El correo actual no es correcto.",
|
|
"invalidEmail": "El nuevo correo no es válido.",
|
|
"invalidToken": "El token de seguridad es incorrecto.",
|
|
"wrongCurrentPassword": "La contraseña actual es incorrecta.",
|
|
"genericError": "Algo ha salido mal. Inténtalo más tarde."
|
|
},
|
|
"ConfirmOldEmail": {
|
|
"title": "Confirmar cambio de correo",
|
|
"activating": "Confirmando…",
|
|
"success": "Correo actual confirmado. Revisa tu NUEVO correo para completar el segundo paso.",
|
|
"error": "El enlace no es válido o ya se ha usado."
|
|
},
|
|
"ConfirmNewEmail": {
|
|
"title": "Confirmar nuevo correo",
|
|
"activating": "Aplicando el cambio…",
|
|
"success": "¡Correo cambiado con éxito! Ya puedes iniciar sesión con el nuevo correo.",
|
|
"error": "El enlace no es válido, ha caducado o no se ha encontrado la cuenta.",
|
|
"goLogin": "Ir a iniciar sesión"
|
|
},
|
|
"Forum": {
|
|
"title": "Foros",
|
|
"noForums": "No hay foros disponibles todavía.",
|
|
"topics": "Temas",
|
|
"posts": "Mensajes",
|
|
"lastTopic": "Último tema",
|
|
"by": "por",
|
|
"views": "Visitas",
|
|
"noTopics": "No hay temas en este foro todavía.",
|
|
"locked": "Cerrado",
|
|
"sticky": "Fijado",
|
|
"backToForum": "Volver a los foros",
|
|
"backToTopics": "Volver al foro",
|
|
"notFound": "No encontrado",
|
|
"newTopic": "Nuevo tema",
|
|
"reply": "Responder",
|
|
"newTopicName": "Título del tema",
|
|
"newTopicText": "Escribe tu mensaje…",
|
|
"publish": "Publicar tema",
|
|
"publishing": "Publicando…",
|
|
"replyText": "Escribe tu respuesta…",
|
|
"sendReply": "Responder",
|
|
"sending": "Enviando…",
|
|
"loginToPost": "Inicia sesión para participar.",
|
|
"emptyError": "Completa todos los campos.",
|
|
"genericError": "Algo ha salido mal. Inténtalo más tarde."
|
|
},
|
|
"Admin": {
|
|
"title": "Panel de administración",
|
|
"dashboard": "Panel",
|
|
"news": "Noticias",
|
|
"manageNews": "Gestionar noticias",
|
|
"newsTitle": "Título",
|
|
"newsContent": "Contenido (HTML)",
|
|
"newsLink": "Enlace (opcional)",
|
|
"create": "Crear noticia",
|
|
"creating": "Creando…",
|
|
"delete": "Borrar",
|
|
"confirmDelete": "¿Borrar esta noticia?",
|
|
"noNews": "No hay noticias.",
|
|
"forbidden": "No tienes permiso para acceder aquí.",
|
|
"emptyError": "Completa el título y el contenido.",
|
|
"genericError": "Algo ha salido mal."
|
|
}
|
|
}
|