diff --git a/web-next/app/[locale]/[realm]/page.tsx b/web-next/app/[locale]/[realm]/page.tsx
index 2dc3592..2574779 100644
--- a/web-next/app/[locale]/[realm]/page.tsx
+++ b/web-next/app/[locale]/[realm]/page.tsx
@@ -1,5 +1,5 @@
import type { Metadata } from 'next'
-import { setRequestLocale } from 'next-intl/server'
+import { getTranslations, setRequestLocale } from 'next-intl/server'
import { notFound } from 'next/navigation'
import { getRealmName, realmSlug } from '@/lib/realm'
import { RealmInfo } from '@/components/RealmInfo'
@@ -38,10 +38,11 @@ export default async function RealmPage({
}) {
const { locale, realm } = await params
setRequestLocale(locale)
+ const t = await getTranslations('Misc')
const r = await resolve(realm)
if (!r) notFound()
- const heading = r.kind === 'players' ? 'Personajes' : 'Reino'
+ const heading = r.kind === 'players' ? t('realm.charactersHeading') : t('realm.realmHeading')
return (
diff --git a/web-next/app/[locale]/ban-history/page.tsx b/web-next/app/[locale]/ban-history/page.tsx
index a2e574f..332fe5d 100644
--- a/web-next/app/[locale]/ban-history/page.tsx
+++ b/web-next/app/[locale]/ban-history/page.tsx
@@ -1,5 +1,5 @@
import type { Metadata } from 'next'
-import { setRequestLocale } from 'next-intl/server'
+import { setRequestLocale, getTranslations } from 'next-intl/server'
import { redirect, Link } from '@/i18n/navigation'
import { getSession } from '@/lib/session'
import { getSanctions, type Sanction } from '@/lib/ban-history'
@@ -21,7 +21,7 @@ function StatusCell({ s }: { s: Sanction }) {
}
/** Caja con la tabla de sanciones (baneos o muteos), o el vacío del diseño. */
-function SanctionBox({
+async function SanctionBox({
title,
emptyText,
rows,
@@ -32,6 +32,7 @@ function SanctionBox({
rows: Sanction[]
showScope: boolean
}) {
+ const t = await getTranslations('History')
return (
@@ -52,12 +53,12 @@ function SanctionBox({
- {showScope &&
Alcance
}
-
Motivo
-
Sancionado por
-
Fecha
-
Expira
-
Estado
+ {showScope &&
{t('ban.thScope')}
}
+
{t('ban.thReason')}
+
{t('ban.thBy')}
+
{t('ban.thDate')}
+
{t('ban.thExpires')}
+
{t('ban.thStatus')}
{rows.map((s, i) => (
@@ -76,7 +77,7 @@ function SanctionBox({
{fmt(s.date)}
Aquí podrás ver todas las sanciones que ha tenido la cuenta.
+
{t('ban.intro1')}
- Si tienes una sanción vigente, verás que su estado indica Activo.
+ {t.rich('ban.intro2', { s: (c) => {c} })}
-
Para evitar que tu cuenta sea sancionada, recuerda respetar las normas de nuestro servidor.
+
{t('ban.intro3')}
- Importante:
+ {t('ban.important')}
- Si tu cuenta aparece como sancionada o cerrada al intentar ingresar al reino, pero tu historial no tiene
- ninguna sanción activa, significa que has tenido un bloqueo automático temporal por demasiados intentos de
- inicio de sesión fallidos.
+ {t('ban.autoBlock1')}
- Espera al menos 10 minutos para volver a intentar y asegúrate de usar nombre de cuenta y contraseña
- correctas.
+ {t('ban.autoBlock2')}
- Para realizar un reclamo de sanción, por favor ingresa en nuestro foro y visita la
- sección Reclamaciones.
+ {t.rich('ban.claim', { link: (c) => {c} })}
-
-
+
+
)
}
diff --git a/web-next/app/[locale]/change-faction-character/page.tsx b/web-next/app/[locale]/change-faction-character/page.tsx
index fdc6afe..79d325c 100644
--- a/web-next/app/[locale]/change-faction-character/page.tsx
+++ b/web-next/app/[locale]/change-faction-character/page.tsx
@@ -1,5 +1,5 @@
import type { Metadata } from 'next'
-import { setRequestLocale } from 'next-intl/server'
+import { getTranslations, setRequestLocale } from 'next-intl/server'
import { redirect } from '@/i18n/navigation'
import { getSession } from '@/lib/session'
import { getGameCharacters } from '@/lib/characters'
@@ -34,34 +34,33 @@ export default async function ChangeFactionCharacterPage({ params }: { params: P
const [chars, price] = await Promise.all([getGameCharacters(session.accountId!), getChangeFactionPrice()])
+ const t = await getTranslations('CharServiceB.changeFaction')
+
return (
-
- La herramienta Cambiar facción del personaje te permite cambiar de la Alianza a la Horda y
- viceversa.
-
-
Si también deseas cambiar el nombre del personaje, debes usar la herramienta Renombrar personaje.
+
{t.rich('intro', { s: (c) => {c} })}
+
{t('alsoRename')}
-
Al hacer un cambio de Facción:
-
- Los items, hechizos, títulos, reputaciones, monturas y logros se cambiarán a la nueva facción
-
- Las misiones activas en el Registro de misiones serán abandonadas
-
- Los teams de arena serán borrados
-
- Los amigos en la Lista de amigos se borrarán
+
{t('onChange')}
+
{t('change1')}
+
{t('change2')}
+
{t('change3')}
+
{t('change4')}
-
Restricciones del personaje:
-
- No debe tener subastas activas
-
- No debe tener correos en el buzón
-
- No debe ser capitán de un team de arenas
-
- No debe ser miembro de una hermandad
-
- No debe tener demasiado oro
+
{t('restrictionsTitle')}
+
{t('restriction1')}
+
{t('restriction2')}
+
{t('restriction3')}
+
{t('restriction4')}
+
{t('restriction5')}
-
Nivel
-
Max. Oro
+
{t('tableLevel')}
+
{t('tableMaxGold')}
10-30
31-50
@@ -70,36 +69,30 @@ export default async function ChangeFactionCharacterPage({ params }: { params: P
-
- Al usar el botón CAMBIAR FACCIÓN del personaje que hayas escogido, se enviará una petición de cambio de
- facción de dicho personaje.
-
-
Cuando ingreses a la lista de personajes de tu cuenta, verás un ícono a la izquierda de tu personaje escogido.
-
Al darle click a dicho ícono ingresarás al menú de edición de personaje que te permitirá pasar a la facción contraria.
({ name: c.name, classCss: c.classCss }))}
checkoutEndpoint="/api/character/change-race/checkout"
- payLabel="CAMBIAR RAZA"
+ payLabel={t('payLabel')}
buttonClass="change-race-button"
provider="sumup"
- confirmText={`¿Estás seguro de cambiar de raza al personaje seleccionado por ${price} € (SumUp)?`}
+ confirmText={t('confirm', { price })}
/>
diff --git a/web-next/app/[locale]/contact-us/page.tsx b/web-next/app/[locale]/contact-us/page.tsx
index bf85ce3..c716ee1 100644
--- a/web-next/app/[locale]/contact-us/page.tsx
+++ b/web-next/app/[locale]/contact-us/page.tsx
@@ -1,31 +1,33 @@
import type { Metadata } from 'next'
+import { getTranslations } from 'next-intl/server'
export const metadata: Metadata = {
title: 'Contáctanos',
}
-export default function ContactUsPage() {
+export default async function ContactUsPage() {
+ const t = await getTranslations('Legal')
return (
-
Contáctanos
+
{t('contact.title')}
-
¡Gracias por tu interés en contactar con nosotros!
-
Si tienes alguna pregunta, consulta o comentario, estaremos encantados de ayudarte. Por favor, envía un correo electrónico a la siguiente dirección:
+
{t('contact.p1')}
+
{t('contact.p2')}
contacto@ultimowow.com
-
Error 404 es la empresa que representa el servicio de UltimoWoW.
-
Nos esforzamos por responder a todos los mensajes en un plazo de 48 horas hábiles.
-
Asegúrate de incluir la información relevante en tu correo para que podamos brindarte una respuesta precisa y oportuna.
+
{t('contact.p3')}
+
{t('contact.p4')}
+
{t('contact.p5')}
-
En Error 404, valoramos tus comentarios y opiniones. Tu satisfacción es nuestra prioridad y nos esforzamos por brindarte la mejor experiencia posible en UltimoWoW.
-
¡Esperamos tener noticias tuyas pronto!
+
{t('contact.p6')}
+
{t('contact.p7')}
-
Atentamente, el equipo de Error 404.
+
{t('contact.p8')}
diff --git a/web-next/app/[locale]/cookies/page.tsx b/web-next/app/[locale]/cookies/page.tsx
index 0150fdb..9fb72eb 100644
--- a/web-next/app/[locale]/cookies/page.tsx
+++ b/web-next/app/[locale]/cookies/page.tsx
@@ -1,4 +1,5 @@
import type { Metadata } from 'next'
+import { getTranslations } from 'next-intl/server'
import { Link } from '@/i18n/navigation'
import { CookieConsentButtons, ConsentStatus } from '@/components/CookieConsent'
@@ -6,172 +7,173 @@ export const metadata: Metadata = {
title: 'Declaración de Cookies',
}
-export default function CookiesPage() {
+export default async function CookiesPage() {
+ const t = await getTranslations('Legal')
return (
-
Declaración de Cookies
+
{t('cookies.title')}
-
Esta página web usa cookies. Las cookies de este sitio web se usan para personalizar el contenido y los anuncios, ofrecer funciones de redes sociales y analizar el tráfico. Además, compartimos información sobre el uso que haga del sitio web con nuestros partners de redes sociales, publicidad y análisis web, quienes pueden combinarla con otra información que les haya proporcionado o que hayan recopilado a partir del uso que haya hecho de sus servicios.
+
{t('cookies.p1')}
-
Las cookies son pequeños archivos de texto que las páginas web pueden utilizar para hacer más eficiente la experiencia del usuario.
-
La ley afirma que podemos almacenar cookies en tu dispositivo si son estrictamente necesarias para el funcionamiento de esta página. Para todos los demás tipos de cookies necesitamos tu permiso.
+
{t('cookies.p2')}
+
{t('cookies.p3')}
-
Esta página utiliza tipos diferentes de cookies. Algunas cookies son colocadas por servicios de terceros que aparecen en nuestras páginas.
-
En cualquier momento puedes cambiar o retirar tu consentimiento desde esta Declaración de cookies en nuestro sitio web.
+
{t('cookies.p4')}
+
{t('cookies.p5')}
-
Obten más información sobre quiénes somos, cómo puedes contactarnos y cómo procesamos los datos personales en nuestra Política de Privacidad.
+
{t.rich('cookies.p6', { link: (c) => {c} })}
- Tipos de cookies que utilizamos
+ {t('cookies.h1cat')}
- Cookies Necesarias
-
Las cookies necesarias ayudan a hacer una página web utilizable activando funciones básicas como la navegación en la página y el acceso a áreas seguras de la página web. La página web no puede funcionar adecuadamente sin estas cookies.
+ {t('cookies.necessaryTitle')}
+
{t('cookies.necessaryDesc')}
-
Cookie
-
Proveedor
-
Propósito
-
Duración
+
{t('cookies.thCookie')}
+
{t('cookies.thProvider')}
+
{t('cookies.thPurpose')}
+
{t('cookies.thDuration')}
-
PHPSESSID
UltimoWoW
Mantiene el estado de la sesión del usuario entre páginas. Presente en ultimowow.com y wotlk.ultimowow.com.
Sesión
-
uw_cookie_consent
UltimoWoW
Almacena tus preferencias de consentimiento de cookies. Se comparte entre ultimowow.com y wotlk.ultimowow.com.
1 año
-
cf_clearance
Cloudflare
Identifica tráfico legítimo y protege contra bots.
1 año
-
__cf_bm
Cloudflare
Bot management y protección contra ataques DDoS.
30 minutos
-
_cfuvid
Cloudflare
Identificador de sesión para gestión de tráfico.
Sesión
-
CF_VERIFIED_DEVICE_*
Cloudflare
Verificación de dispositivo para seguridad.
30 días
-
_cf_logged_in
Cloudflare
Indica estado de autenticación en servicios Cloudflare.
Sesión
-
cf_chl_*
Cloudflare Turnstile
Cookies del sistema de verificación captcha Turnstile.
Variable
-
cf.turnstile.u
Cloudflare Turnstile
Distingue entre humanos y bots en el sistema de verificación.
Persistente
-
zaraz-consent
Cloudflare Zaraz
Gestión de consentimiento del sistema Zaraz.
1 año
-
cfz_*
Cloudflare Zaraz
Cookies técnicas del sistema de gestión de tags Zaraz.
Variable
+
PHPSESSID
UltimoWoW
{t('cookies.nPurpose1')}
{t('cookies.durSession')}
+
uw_cookie_consent
UltimoWoW
{t('cookies.nPurpose2')}
{t('cookies.dur1Year')}
+
cf_clearance
Cloudflare
{t('cookies.nPurpose3')}
{t('cookies.dur1Year')}
+
__cf_bm
Cloudflare
{t('cookies.nPurpose4')}
{t('cookies.dur30Min')}
+
_cfuvid
Cloudflare
{t('cookies.nPurpose5')}
{t('cookies.durSession')}
+
CF_VERIFIED_DEVICE_*
Cloudflare
{t('cookies.nPurpose6')}
{t('cookies.dur30Days')}
+
_cf_logged_in
Cloudflare
{t('cookies.nPurpose7')}
{t('cookies.durSession')}
+
cf_chl_*
Cloudflare Turnstile
{t('cookies.nPurpose8')}
{t('cookies.durVariable')}
+
cf.turnstile.u
Cloudflare Turnstile
{t('cookies.nPurpose9')}
{t('cookies.durPersistent')}
+
zaraz-consent
Cloudflare Zaraz
{t('cookies.nPurpose10')}
{t('cookies.dur1Year')}
+
cfz_*
Cloudflare Zaraz
{t('cookies.nPurpose11')}
{t('cookies.durVariable')}
-
Nota sobre Cloudflare: Utilizamos Cloudflare como proveedor de seguridad y rendimiento. Cloudflare puede establecer cookies adicionales de forma dinámica para proteger el sitio contra amenazas, gestionar el tráfico y optimizar el rendimiento. Estas cookies son estrictamente necesarias para el funcionamiento seguro del sitio. Para más información, consulta la Política de Cookies de Cloudflare.
Las cookies de preferencias permiten a la página web recordar información que cambia la forma en que la página se comporta o el aspecto que tiene, como su idioma preferido o la región en la que usted se encuentra.
+ {t('cookies.prefTitle')}
+
{t('cookies.prefDesc')}
-
Cookie
-
Proveedor
-
Propósito
-
Duración
+
{t('cookies.thCookie')}
+
{t('cookies.thProvider')}
+
{t('cookies.thPurpose')}
+
{t('cookies.thDuration')}
-
comments_sort
wotlk.ultimowow.com
Guarda tu preferencia de ordenación de comentarios.
1 año
-
wwcomments_sort
wotlk.ultimowow.com
Guarda tu preferencia de ordenación de comentarios.
1 año
-
temp_default_3dmodel
wotlk.ultimowow.com
Guarda la configuración del visor 3D de modelos.
1 año
+
comments_sort
wotlk.ultimowow.com
{t('cookies.prefPurpose1')}
{t('cookies.dur1Year')}
+
wwcomments_sort
wotlk.ultimowow.com
{t('cookies.prefPurpose2')}
{t('cookies.dur1Year')}
+
temp_default_3dmodel
wotlk.ultimowow.com
{t('cookies.prefPurpose3')}
{t('cookies.dur1Year')}
- Cookies Analíticas
-
Las cookies analíticas nos permiten contar las visitas y fuentes de tráfico para poder medir y mejorar el rendimiento de nuestro sitio. Nos ayudan a saber qué páginas son las más y menos populares, y a ver cómo se mueven los visitantes por el sitio. Toda la información que recogen estas cookies es agregada y, por lo tanto, anónima.
+ {t('cookies.analyticsTitle')}
+
{t('cookies.analyticsDesc')}
-
Cookie
-
Proveedor
-
Propósito
-
Duración
+
{t('cookies.thCookie')}
+
{t('cookies.thProvider')}
+
{t('cookies.thPurpose')}
+
{t('cookies.thDuration')}
-
_ga
Google Analytics
Distingue usuarios únicos asignando un número aleatorio.
2 años
-
_ga_*
Google Analytics
Mantiene el estado de la sesión.
2 años
-
_gid
Google Analytics
Distingue usuarios para análisis estadístico.
24 horas
-
_gat
Google Analytics
Limita la velocidad de solicitudes.
1 minuto
-
sparrow_id
Cloudflare
Identificador para análisis de rendimiento web.
1 año
+
_ga
Google Analytics
{t('cookies.aPurpose1')}
{t('cookies.dur2Years')}
+
_ga_*
Google Analytics
{t('cookies.aPurpose2')}
{t('cookies.dur2Years')}
+
_gid
Google Analytics
{t('cookies.aPurpose3')}
{t('cookies.dur24Hours')}
+
_gat
Google Analytics
{t('cookies.aPurpose4')}
{t('cookies.dur1Minute')}
+
sparrow_id
Cloudflare
{t('cookies.aPurpose5')}
{t('cookies.dur1Year')}
- Cookies de Marketing
-
Las cookies de marketing se utilizan para rastrear a los visitantes en las páginas web. La intención es mostrar anuncios relevantes y atractivos para el usuario individual, y por lo tanto, más valiosos para los editores y terceros anunciantes.
+ {t('cookies.marketingTitle')}
+
{t('cookies.marketingDesc')}
-
Cookie
-
Proveedor
-
Propósito
-
Duración
+
{t('cookies.thCookie')}
+
{t('cookies.thProvider')}
+
{t('cookies.thPurpose')}
+
{t('cookies.thDuration')}
-
_gcl_*
Google
Conversiones de Google Ads.
90 días
-
IDE
Google DoubleClick
Publicidad personalizada.
1 año
-
_fbp
Facebook (Meta)
Identifica navegadores para proporcionar servicios de publicidad y análisis.
3 meses
-
_fbc
Facebook (Meta)
Almacena el último clic en anuncios de Facebook.
3 meses
-
fr
Facebook (Meta)
Habilita la entrega y medición de anuncios.
3 meses
-
AMCV_*
Adobe Experience Cloud
Identificación de visitantes para servicios de Adobe.
2 años
-
_q_state_*
Varios
Gestión de estado para servicios de publicidad.
Variable
+
_gcl_*
Google
{t('cookies.mPurpose1')}
{t('cookies.dur90Days')}
+
IDE
Google DoubleClick
{t('cookies.mPurpose2')}
{t('cookies.dur1Year')}
+
_fbp
Facebook (Meta)
{t('cookies.mPurpose3')}
{t('cookies.dur3Months')}
+
_fbc
Facebook (Meta)
{t('cookies.mPurpose4')}
{t('cookies.dur3Months')}
+
fr
Facebook (Meta)
{t('cookies.mPurpose5')}
{t('cookies.dur3Months')}
+
AMCV_*
Adobe Experience Cloud
{t('cookies.mPurpose6')}
{t('cookies.dur2Years')}
+
_q_state_*
{t('cookies.providerVarious')}
{t('cookies.mPurpose7')}
{t('cookies.durVariable')}
-
Nota sobre servicios de terceros: Utilizamos Cloudflare Zaraz como sistema de gestión de tags. Los servicios de marketing (Google Ads, Facebook, Adobe, etc.) pueden establecer cookies adicionales cuando aceptas cookies de marketing. Para más información sobre cada servicio, consulta sus respectivas políticas de privacidad.
+
{t('cookies.thirdPartyNote')}
- Cookies de Contenido Embebido
-
Algunas páginas de nuestro sitio incluyen contenido embebido de terceros (vídeos de YouTube, widgets de Discord, publicaciones de redes sociales, etc.). Estos servicios pueden establecer sus propias cookies cuando visualizas dicho contenido.
Utilizamos youtube-nocookie.com cuando es posible para minimizar el seguimiento. Sin embargo, los servicios de terceros pueden establecer cookies como: YSC, VISITOR_INFO1_LIVE, yt-remote-*, __Secure-*, y otras relacionadas con la reproducción de contenido.
+
{t('cookies.embeddedNote')}
- Cómo eliminar cookies de tu navegador
-
Además de utilizar nuestro panel de configuración, puedes eliminar las cookies directamente desde tu navegador:
+ {t('cookies.h2cat')}
+
{t('cookies.deleteP')}
-
Chrome: Configuración → Privacidad y seguridad → Cookies y otros datos de sitios
-
Firefox: Opciones → Privacidad & Seguridad → Cookies y datos del sitio
-
Safari: Preferencias → Privacidad → Gestionar datos de sitios web
-
Edge: Configuración → Cookies y permisos del sitio → Cookies
+
{t('cookies.deleteLi1')}
+
{t('cookies.deleteLi2')}
+
{t('cookies.deleteLi3')}
+
{t('cookies.deleteLi4')}
- Tu estado de consentimiento
-
Puedes cambiar o retirar tu consentimiento en cualquier momento. Al contactarnos respecto a su consentimiento, por favor, indique la fecha de su consentimiento.
+ {t('cookies.h3cat')}
+
{t('cookies.consentP')}
- Más información
-
Si tienes alguna pregunta sobre nuestra política de cookies, puedes contactarnos a través de nuestra página de Contacto.
({ name: c.name, classCss: c.classCss }))}
checkoutEndpoint="/api/character/customize/checkout"
- payLabel="PERSONALIZAR"
+ payLabel={t('payLabel')}
buttonClass="customize-button"
provider="sumup"
- confirmText={`¿Estás seguro de personalizar al personaje seleccionado por ${price} € (SumUp)?`}
+ confirmText={t('confirm', { price })}
/>
diff --git a/web-next/app/[locale]/d-points-success/page.tsx b/web-next/app/[locale]/d-points-success/page.tsx
index e27f3a2..82d2fc1 100644
--- a/web-next/app/[locale]/d-points-success/page.tsx
+++ b/web-next/app/[locale]/d-points-success/page.tsx
@@ -1,4 +1,4 @@
-import { setRequestLocale } from 'next-intl/server'
+import { getTranslations, setRequestLocale } from 'next-intl/server'
import { Link } from '@/i18n/navigation'
import { fulfillCheckoutSession } from '@/lib/fulfill'
import { isSessionPaid } from '@/lib/stripe'
@@ -16,6 +16,7 @@ export default async function DPointsSuccessPage({
}) {
const { locale } = await params
setRequestLocale(locale)
+ const t = await getTranslations('Points')
const { provider, session_id, ref } = await searchParams
// Entrega compartida con el webhook/return (idempotente vía reclamo atómico).
@@ -32,20 +33,20 @@ export default async function DPointsSuccessPage({
}
return (
-
+
{status === 'ok' ? (
- ¡Pago completado! Tus PD ya fueron acreditados a tu cuenta.
+ {t('dpointsSuccess.paidOk')}
) : status === 'already' ? (
- Este pago ya había sido procesado. Tus PD están acreditados.
+ {t('dpointsSuccess.alreadyPaid')}
) : (
- No pudimos confirmar tu pago. Si se realizó el cargo, contacta con soporte.
+ {t('dpointsSuccess.error')}
)}
- ← Regresar a mi cuenta
+ {t('dpointsSuccess.backToAccount')}
diff --git a/web-next/app/[locale]/d-points/page.tsx b/web-next/app/[locale]/d-points/page.tsx
index ebd6813..ea0fa8d 100644
--- a/web-next/app/[locale]/d-points/page.tsx
+++ b/web-next/app/[locale]/d-points/page.tsx
@@ -1,5 +1,5 @@
import type { Metadata } from 'next'
-import { setRequestLocale } from 'next-intl/server'
+import { getTranslations, setRequestLocale } from 'next-intl/server'
import { redirect } from '@/i18n/navigation'
import { getSession } from '@/lib/session'
import { getRealmName } from '@/lib/realm'
@@ -14,6 +14,7 @@ export const metadata: Metadata = { title: 'Adquirir PD' }
export default async function DPointsPage({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params
setRequestLocale(locale)
+ const t = await getTranslations('Points')
const session = await getSession()
if (!session.bnetId) redirect({ href: '/login', locale })
@@ -27,7 +28,7 @@ export default async function DPointsPage({ params }: { params: Promise<{ locale
const currency = (process.env.DP_CURRENCY || 'eur').toLowerCase()
return (
-
+
)
diff --git a/web-next/app/[locale]/download-addons/page.tsx b/web-next/app/[locale]/download-addons/page.tsx
index 0a847ff..d6cba63 100644
--- a/web-next/app/[locale]/download-addons/page.tsx
+++ b/web-next/app/[locale]/download-addons/page.tsx
@@ -1,40 +1,42 @@
import type { Metadata } from 'next'
+import { getTranslations } from 'next-intl/server'
export const metadata: Metadata = { title: 'Descarga de addons' }
-// Lista de addons (edítala con los tuyos). name/desc/url.
-const ADDONS: { name: string; desc: string; url: string }[] = [
- { name: 'Deadly Boss Mods (DBM)', desc: 'Avisos y temporizadores de habilidades de jefes en mazmorras y bandas.', url: 'https://www.curseforge.com/wow/addons/deadly-boss-mods' },
- { name: 'Details! Damage Meter', desc: 'Medidor de daño, curación y amenaza con gráficas detalladas.', url: 'https://www.curseforge.com/wow/addons/details' },
- { name: 'AtlasLoot', desc: 'Consulta el botín de jefes de mazmorras y bandas dentro del juego.', url: 'https://www.curseforge.com/wow/addons/atlasloot-enhanced' },
- { name: 'Questie', desc: 'Muestra objetivos y ubicaciones de misiones en el mapa y el minimapa.', url: 'https://www.curseforge.com/wow/addons/questie' },
- { name: 'Bagnon', desc: 'Unifica todas tus bolsas y el banco en una sola ventana con búsqueda.', url: 'https://www.curseforge.com/wow/addons/bagnon' },
- { name: 'Bartender4', desc: 'Personaliza por completo tus barras de acción.', url: 'https://www.curseforge.com/wow/addons/bartender4' },
- { name: 'Auctioneer', desc: 'Herramientas avanzadas para la casa de subastas.', url: 'https://www.curseforge.com/wow/addons/auctioneer' },
- { name: 'Pawn', desc: 'Compara equipo y te indica qué objeto es una mejora para tu personaje.', url: 'https://www.curseforge.com/wow/addons/pawn' },
+// Lista de addons (edítala con los tuyos). name/descKey/url.
+const ADDONS: { name: string; descKey: string; url: string }[] = [
+ { name: 'Deadly Boss Mods (DBM)', descKey: 'descDbm', url: 'https://www.curseforge.com/wow/addons/deadly-boss-mods' },
+ { name: 'Details! Damage Meter', descKey: 'descDetails', url: 'https://www.curseforge.com/wow/addons/details' },
+ { name: 'AtlasLoot', descKey: 'descAtlasLoot', url: 'https://www.curseforge.com/wow/addons/atlasloot-enhanced' },
+ { name: 'Questie', descKey: 'descQuestie', url: 'https://www.curseforge.com/wow/addons/questie' },
+ { name: 'Bagnon', descKey: 'descBagnon', url: 'https://www.curseforge.com/wow/addons/bagnon' },
+ { name: 'Bartender4', descKey: 'descBartender4', url: 'https://www.curseforge.com/wow/addons/bartender4' },
+ { name: 'Auctioneer', descKey: 'descAuctioneer', url: 'https://www.curseforge.com/wow/addons/auctioneer' },
+ { name: 'Pawn', descKey: 'descPawn', url: 'https://www.curseforge.com/wow/addons/pawn' },
]
-export default function DownloadAddonsPage() {
+export default async function DownloadAddonsPage() {
+ const t = await getTranslations('Misc')
return (
-
Descarga de addons
+
{t('downloadAddons.title')}
-
Addons recomendados
+
{t('downloadAddons.recommended')}
-
Los addons son complementos opcionales que mejoran y personalizan tu experiencia de juego.
-
Descarga los que quieras desde su página oficial (elige la versión compatible con WotLK 3.4.3).
+
{t('downloadAddons.intro1')}
+
{t('downloadAddons.intro2')}
-
Cómo instalarlos
-
1) Descarga el addon y descomprime el archivo .zip.
-
2) Copia la carpeta resultante dentro de Interface/AddOns (en la carpeta de tu cliente).
-
3) Inicia el juego y, en la pantalla de selección de personaje, pulsa Complementos para activarlos.
diff --git a/web-next/app/[locale]/legal-notice/page.tsx b/web-next/app/[locale]/legal-notice/page.tsx
index a898383..18953f9 100644
--- a/web-next/app/[locale]/legal-notice/page.tsx
+++ b/web-next/app/[locale]/legal-notice/page.tsx
@@ -1,30 +1,32 @@
import type { Metadata } from 'next'
+import { getTranslations } from 'next-intl/server'
export const metadata: Metadata = {
title: 'Aviso legal',
}
-export default function LegalNoticePage() {
+export default async function LegalNoticePage() {
+ const t = await getTranslations('Legal')
return (
-
Aviso legal
+
{t('legalNotice.title')}
-
El sitio web "UltimoWoW.com" y sus subdominios (en adelante, "el sitio web") se ofrecen únicamente con fines informativos y de entretenimiento. UltimoWoW no se hace responsable del uso que los usuarios hagan del sitio web. Aunque se procura que se dé un uso correcto, UltimoWoW no asume responsabilidad por las acciones, decisiones o consecuencias derivadas del uso del sitio web. Los usuarios son responsables de verificar la precisión, integridad y utilidad de la información proporcionada, así como de cumplir con las leyes y regulaciones aplicables al utilizar el contenido del sitio web.
+
{t('legalNotice.p1')}
-
Enlaces a terceros: El sitio web puede contener enlaces a sitios web de terceros. Estos enlaces se proporcionan únicamente para tu conveniencia y no implican el respaldo o afiliación de UltimoWoW con dichos sitios web. UltimoWoW no se hace responsable del contenido o las prácticas de privacidad de estos sitios web de terceros.
+
{t('legalNotice.p2')}
-
Privacidad y Cookies: La recopilación y uso de tus datos personales se rigen por nuestra Política de Privacidad y el uso de cookies se rige por nuestra Declaración de Cookies. Al utilizar el sitio web, aceptas nuestras prácticas descritas en dichas políticas.
+
{t('legalNotice.p3')}
-
Derechos de autor: Los usuarios del sitio web deben respetar los derechos de autor y no publicar contenido que infrinja los derechos de propiedad intelectual de terceros. UltimoWoW se compromete a proteger los derechos de autor y cumplir con las leyes aplicables. Si encuentras contenido infractor, contáctanos utilizando el mecanismo de reclamación de infracción descrito a continuación.
+
{t('legalNotice.p4')}
-
Mecanismo de reclamación de infracción: Si crees que tu trabajo ha sido utilizado de manera no autorizada en el sitio web, puedes presentar una reclamación por infracción de derechos de autor proporcionando la información requerida. Contáctanos utilizando los datos de contacto a continuación.
+
{t('legalNotice.p5')}
-
Contacto
+
{t('legalNotice.contactTitle')}
ultimowow.com
info@ultimowow.com
diff --git a/web-next/app/[locale]/level-up-character/page.tsx b/web-next/app/[locale]/level-up-character/page.tsx
index 04f1156..aaf814f 100644
--- a/web-next/app/[locale]/level-up-character/page.tsx
+++ b/web-next/app/[locale]/level-up-character/page.tsx
@@ -1,5 +1,5 @@
import type { Metadata } from 'next'
-import { setRequestLocale } from 'next-intl/server'
+import { getTranslations, setRequestLocale } from 'next-intl/server'
import { redirect } from '@/i18n/navigation'
import { getSession } from '@/lib/session'
import { getGameCharacters } from '@/lib/characters'
@@ -22,44 +22,39 @@ export default async function LevelUpCharacterPage({ params }: { params: Promise
const [chars, price] = await Promise.all([getGameCharacters(session.accountId!), getLevelUpPrice()])
+ const t = await getTranslations('CharServiceB.levelUp')
+
return (
-
- La herramienta Subir a nivel 80 te permite subir cualquier personaje al nivel 80.
-
-
Sólo subirá de nivel al personaje. Esta opción no incluye ítems/oro/etc.
+
{t.rich('intro', { s: (c) => {c} })}
+
{t('onlyLevel')}
-
- Al usar el botón SUBIR A NIVEL 80 del personaje que hayas escogido, se enviará el nivel 80 al personaje.
-
-
Cuando ingreses a la lista de personajes de tu cuenta, verás que tu personaje escogido ya es nivel 80.
({ name: c.name, classCss: c.classCss }))}
checkoutEndpoint="/api/character/level-up/checkout"
- payLabel="SUBIR A NIVEL 80"
+ payLabel={t('payLabel')}
buttonClass="level-up-button"
provider="sumup"
- confirmText={`¿Estás seguro de subir a nivel 80 al personaje seleccionado por ${price} € (SumUp)?`}
+ confirmText={t('confirm', { price })}
/>
diff --git a/web-next/app/[locale]/page.tsx b/web-next/app/[locale]/page.tsx
index 2d87945..fbada07 100644
--- a/web-next/app/[locale]/page.tsx
+++ b/web-next/app/[locale]/page.tsx
@@ -1,4 +1,4 @@
-import { setRequestLocale } from 'next-intl/server'
+import { getTranslations, setRequestLocale } from 'next-intl/server'
import { Link } from '@/i18n/navigation'
import { ServerClock } from '@/components/ServerClock'
import { getNoticias, getServerStatus, type Noticia, type ServerStatus } from '@/lib/home'
@@ -38,6 +38,7 @@ function formatFecha(iso: string | Date | null): string {
export default async function HomePage({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params
setRequestLocale(locale)
+ const t = await getTranslations('Misc')
const { noticias, status } = await getData()
const realmName = await getRealmName()
@@ -72,7 +73,7 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
{loginStatus}
-
Hora
+
{t('home.labelTime')}
@@ -93,42 +94,32 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
- ¡RECLUTA A UN AMIGO!
+ {t('home.recruitFriend')}
- ¡RECLUTA A UN AMIGO!
+ {t('home.recruitFriend')}
-
- {realmName} es una comunidad enfocada en usuarios de habla hispana,
- especialmente dirigida al público español y latino.
-
-
- Atraemos a usuarios apasionados tanto por el PvE como por el PvP, y ofrecemos una
- amplia variedad de contenido.
-
+
{t('home.introP1', { realm: realmName })}
+
{t('home.introP2')}
-
- Nuestro objetivo principal es mantener una comunidad de alto nivel, brindando un
- ambiente agradable para que todos los miembros, nuevos y veteranos, encuentren aquí
- un lugar donde puedan vivir momentos inigualables.
-
-
¡Únete y disfruta de una experiencia única con miles de usuarios!
)}
@@ -153,7 +144,7 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
))}
- * Mostrando las últimas 50 noticias
+ {t('home.showingLatest')}
>
diff --git a/web-next/app/[locale]/points-history/page.tsx b/web-next/app/[locale]/points-history/page.tsx
index 8739918..fb94dd9 100644
--- a/web-next/app/[locale]/points-history/page.tsx
+++ b/web-next/app/[locale]/points-history/page.tsx
@@ -1,5 +1,5 @@
import type { Metadata } from 'next'
-import { setRequestLocale } from 'next-intl/server'
+import { setRequestLocale, getTranslations } from 'next-intl/server'
import { redirect } from '@/i18n/navigation'
import { getSession } from '@/lib/session'
import { getPointsHistory, getPointsBalances, type PointsMovement } from '@/lib/points-history'
@@ -25,6 +25,7 @@ function methodClass(method: PointsMovement['method']): string {
export default async function PointsHistoryPage({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params
setRequestLocale(locale)
+ const t = await getTranslations('History')
const session = await getSession()
if (!session.bnetId) redirect({ href: '/login', locale })
@@ -36,25 +37,24 @@ export default async function PointsHistoryPage({ params }: { params: Promise<{
])
return (
-
+
-
Aquí verás los consumos de PD y PV más recientes que ha tenido la cuenta.
+
{t('points.intro1')}
- Con esta información podrás tener control de todo lo que has adquirido así como también chequear que toda la
- actividad sea normal.
+ {t('points.intro2')}
-
Si observas algún movimiento sospechoso, puedes contactar con el equipo de Nova WoW.
diff --git a/web-next/app/[locale]/privacy-policy/page.tsx b/web-next/app/[locale]/privacy-policy/page.tsx
index 50f0a45..2ea6b3b 100644
--- a/web-next/app/[locale]/privacy-policy/page.tsx
+++ b/web-next/app/[locale]/privacy-policy/page.tsx
@@ -1,76 +1,78 @@
import type { Metadata } from 'next'
+import { getTranslations } from 'next-intl/server'
export const metadata: Metadata = {
title: 'Política de privacidad',
}
-export default function PrivacyPolicyPage() {
+export default async function PrivacyPolicyPage() {
+ const t = await getTranslations('Legal')
return (
-
Política de privacidad
+
{t('privacy.title')}
-
Esta Política de Privacidad describe cómo recopilamos, utilizamos, almacenamos y protegemos la información personal de los usuarios ("usted" o "usuario") de nuestro sitio web. Al utilizar nuestro sitio web, usted acepta las prácticas descritas en esta política.
+
{t('privacy.p1')}
-
Recopilación de Información Personal
-
Recopilamos la siguiente información personal cuando usted utiliza nuestro sitio web:
-
1. Cookies: Utilizamos cookies para recopilar información sobre su actividad en nuestro sitio web. Las cookies son pequeños archivos de texto que se almacenan en su dispositivo y nos permiten reconocer su navegador o dispositivo y recordar cierta información. Estas cookies pueden ser cookies de sesión o cookies persistentes. Puede ajustar la configuración de su navegador para rechazar todas las cookies o para indicar cuándo se envía una cookie. Sin embargo, si desactiva las cookies, es posible que algunas funciones de nuestro sitio web no funcionen correctamente.
-
2. Direcciones IP: Recopilamos direcciones IP de los usuarios que visitan nuestro sitio web. Las direcciones IP se utilizan para analizar tendencias, administrar el sitio web, rastrear el movimiento del usuario y recopilar información demográfica. No vinculamos las direcciones IP con ninguna información de identificación personal.
-
3. Direcciones de correo electrónico: Recopilamos las direcciones de correo electrónico que usted proporciona al registrarse en nuestro sitio web o al actualizar su información de registro. Utilizamos estas direcciones de correo electrónico para enviarle información relacionada con su cuenta, como confirmaciones de registro, notificaciones de cambios en los términos o políticas, y actualizaciones de seguridad.
-
4. Nombres de usuario y contraseñas: Recopilamos los nombres de usuario y las contraseñas que usted elige al registrar una cuenta en nuestro sitio web. Estas credenciales se utilizan para autenticar su acceso a su cuenta y para proteger su información personal.
+
{t('privacy.h1')}
+
{t('privacy.p2')}
+
{t('privacy.p3')}
+
{t('privacy.p4')}
+
{t('privacy.p5')}
+
{t('privacy.p6')}
-
Uso de la Información Personal
-
Utilizamos la información personal que recopilamos para los siguientes fines:
-
1. Brindar y mejorar nuestros servicios: Utilizamos su información personal para brindarle los servicios solicitados y mejorar su experiencia en nuestro sitio web. Esto incluye personalizar el contenido y las recomendaciones, proporcionar soporte técnico, y analizar el rendimiento y la eficacia de nuestro sitio web.
-
2. Comunicaciones: Podemos utilizar su dirección de correo electrónico para enviarle comunicaciones relacionadas con su cuenta, como confirmaciones de registro, notificaciones de cambios en los términos o políticas, actualizaciones de seguridad y otras actualizaciones importantes.
+
{t('privacy.h2')}
+
{t('privacy.p7')}
+
{t('privacy.p8')}
+
{t('privacy.p9')}
-
Protección de la Información Personal
-
Tomamos medidas razonables para proteger la información personal que recopilamos y almacenamos. Utilizamos medidas de seguridad técnicas, administrativas y físicas para proteger su información contra el acceso no autorizado, la divulgación, la alteración o la destrucción.
+
{t('privacy.h3')}
+
{t('privacy.p10')}
-
Divulgación de la Información Personal a Terceros
-
No vendemos, intercambiamos ni transferimos su información personal a terceros sin su consentimiento, excepto en los siguientes casos:
-
- Proveedores de servicios: Podemos compartir su información personal con proveedores de servicios que realizan funciones en nuestro nombre, como el alojamiento del sitio web, el procesamiento de pagos y el análisis de datos. Estos proveedores de servicios tienen acceso a su información personal solo en la medida necesaria para realizar sus funciones y están obligados a no divulgar ni utilizar la información con ningún otro fin.
-
- Cumplimiento legal: Podemos divulgar su información personal si creemos de buena fe que dicha divulgación es necesaria para cumplir con una obligación legal, proteger sus derechos o seguridad, investigar fraudes o responder a una solicitud legal.
+
{t('privacy.h4')}
+
{t('privacy.p11')}
+
{t('privacy.p12')}
+
{t('privacy.p13')}
-
Sus Derechos y Opciones
-
Usted tiene ciertos derechos y opciones con respecto a su información personal:
-
- Acceso y actualización: Usted puede acceder y actualizar cierta información personal proporcionada a través de su cuenta en nuestro sitio web.
-
- Eliminación de datos: Usted puede solicitar la eliminación de su información personal de nuestros registros, sujeto a cualquier requisito legal o contractual que podamos tener.
-
- Cookies: Puede ajustar la configuración de su navegador para rechazar cookies o para indicar cuándo se envía una cookie. Sin embargo, tenga en cuenta que deshabilitar las cookies puede afectar el funcionamiento de nuestro sitio web.
+
{t('privacy.h5')}
+
{t('privacy.p14')}
+
{t('privacy.p15')}
+
{t('privacy.p16')}
+
{t('privacy.p17')}
-
Uso incorrecto de plataformas de terceros con el fin de violar nuestra política de devolución
-
Este tipo de acciones conllevará a la expulsión del usuario de nuestro sitio sin ningún tipo de devolución.
+
{t('privacy.h6')}
+
{t('privacy.p18')}
-
Cambios a esta Política de Privacidad
-
Nos reservamos el derecho de actualizar esta Política de Privacidad en cualquier momento. Le recomendamos que revise periódicamente esta página para conocer los cambios. La fecha de entrada en vigencia de la política se indicará en la parte superior de la página.
+
{t('privacy.h7')}
+
{t('privacy.p19')}
-
Contáctanos
-
Si tiene alguna pregunta o inquietud sobre esta Política de Privacidad, puede contactarnos a través de la siguiente información de contacto:
- Los Códigos de promoción son palabras con letras y números que se canjean en el formulario de
- abajo por PD o PV y tienen usos limitados. Cada uno puede dar diferente cantidad de PD/PV.
+ {t.rich('promo.intro1', { s: (c) => {c} })}
- Estos códigos son generados por el Equipo de {realm} y pueden aparecer en la página web, Discord, las redes
- sociales o el servidor.
+ {t('promo.intro2', { realm })}
-
Aconsejamos poner atención a las redes sociales y los anuncios del servidor para saber cuándo hay un código disponible.
- La herramienta Rastreador de misiones te permite ver el estado de misiones o cadenas de misiones
- importantes en tus personajes.
+ {t.rich('quest.intro', { s: (c) => {c} })}
- Los Hijos de Hodir: Cadena
- de misiones principal hasta interactuar con el intendente{' '}
- Lillehoff
+ {t.rich('quest.hodir', {
+ hodir: (c) => {c},
+ lille: (c) => {c},
+ })}
Al usar el botón BUSCAR MISIONES, podrás ver el estado de las misiones del personaje.
+
{t('quest.searchButtonExplain')}
diff --git a/web-next/app/[locale]/refund-policy/page.tsx b/web-next/app/[locale]/refund-policy/page.tsx
index d62d672..370a2ae 100644
--- a/web-next/app/[locale]/refund-policy/page.tsx
+++ b/web-next/app/[locale]/refund-policy/page.tsx
@@ -1,104 +1,106 @@
import type { Metadata } from 'next'
+import { getTranslations } from 'next-intl/server'
export const metadata: Metadata = {
title: 'Política de reembolso',
}
-export default function RefundPolicyPage() {
+export default async function RefundPolicyPage() {
+ const t = await getTranslations('Legal')
return (
-
Política de reembolso
+
{t('refund.title')}
-
NUESTRO SERVICIO
-
Todos nuestros servicios son de entrega inmediata y se reciben tal cual se encuentran descritos.
+
{t('refund.h1')}
+
{t('refund.p1')}
-
NUESTRA RESPONSABILIDAD
-
Garantizamos el funcionamiento, tiempo de entrega y descripción de los servicios brindados por nuestro sitio.
-
Es importante que el usuario comprenda que lo que adquiere en el sitio son servicios que se reciben de forma inmediata.
-
No adquiere tiempo de uso de los servicios, ni beneficio alguno, ni inmunidad.
-
Todo caso avalado por nuestra política de devolución será tratado con el reinicio o corrección del servicio y posterior revisión garantizando el funcionamiento correcto del servicio reiniciado o corregido.
+
{t('refund.h2')}
+
{t('refund.p2')}
+
{t('refund.p3')}
+
{t('refund.p4')}
+
{t('refund.p5')}
-
TIEMPO DE NOTIFICACIÓN
-
Cualquier error o problema de nuestros servicios debe ser notificado a la administración en un período máximo de 48 horas desde la entrega del servicio.
-
Pasado este período de tiempo, el usuario ya no puede solicitar ningún tipo de devolución.
- Adquisición del servicio incorrecto por una mala selección del usuario.
-
- Errores ocasionados por el sitio web que hayan impedido la entrega del servicio.
-
- Errores ocasionados por plataformas de terceros que hayan impedido la entrega del servicio.
+
{t('refund.h4')}
+
{t('refund.p9')}
+
{t('refund.p10')}
+
{t('refund.p11')}
+
{t('refund.p12')}
-
Esta política de devolución NO cubre, bajo ninguna circunstancia:
-
- Arrepentimientos.
-
- Errores en el uso del servicio realizados por el usuario.
-
- Desconocimiento de nuestra política de devolución.
-
- Uso incorrecto de plataformas de terceros con el fin de violar nuestra política de devolución.
-
- Expulsión de nuestro sitio por incumplimiento de nuestros términos y normas.
+
{t('refund.p13')}
+
{t('refund.p14')}
+
{t('refund.p15')}
+
{t('refund.p16')}
+
{t('refund.p17')}
+
{t('refund.p18')}
-
Solicitud de reembolso hecha a través de la plataforma de pago.
-
Pedir un reembolso por razones avaladas en esta política de devolución procederá a un reembolso de nuestra parte con la correspondiente cancelación del servicio adquirido.
+
{t('refund.h5')}
+
{t('refund.p19')}
-
Pedir un reembolso por razones no avaladas en esta política de devolución como:
-
- La cuenta ha sido sancionada.
-
- La persona ya no usa el servicio e intenta solicitar un reembolso posterior a las 48 hs del momento de la adquisición.
-
- Abuso de herramientas disponibles alegando razones que falten a la verdad respecto del servicio entregado.
-
No aplican para devolución y puede conllevar a la expulsión permanente del sitio por falta a nuestros términos y un uso inadecuado de las plataformas de pago disponibles.
+
{t('refund.p20')}
+
{t('refund.p21')}
+
{t('refund.p22')}
+
{t('refund.p23')}
+
{t('refund.p24')}
-
Arrepentimientos
-
Ningún tipo de arrepentimiento posterior a la entrega de un servicio aplica para devolución.
+
{t('refund.h6')}
+
{t('refund.p25')}
-
Errores en el uso del servicio realizados por el usuario
-
Errores en el uso de los servicios, ocasionados por el usuario, que no tienen relación con ningún tipo de falla en el servicio entregado no aplica para devolución.
-
Cualquier error de usuario ocasionado por no leer la descripción de un servicio no aplica para devolución.
-
Una vez que el servicio se encuentra entregado, el uso del mismo queda a responsabilidad del usuario.
+
{t('refund.h7')}
+
{t('refund.p26')}
+
{t('refund.p27')}
+
{t('refund.p28')}
-
Desconocimiento de nuestra política de devolución
-
El desconocimiento por parte del usuario de nuestra política de devolución no exime al usuario de su cumplimiento.
+
{t('refund.h8')}
+
{t('refund.p29')}
-
Uso incorrecto de plataformas de terceros con el fin de violar nuestra política de devolución
-
Este tipo de acciones conllevará a la expulsión del usuario de nuestro sitio sin ningún tipo de devolución.
+
{t('refund.h9')}
+
{t('refund.p30')}
-
Expulsión de nuestro sitio por incumplimiento de nuestros términos y normas
-
Ninguna adquisición de nuestros servicios otorga ningún tipo de inmunidad.
-
La expulsión de un usuario de nuestro sitio no aplica a ningún tipo de devolución.
-
El cumplimiento de nuestros términos y normas queda a exclusiva responsabilidad del usuario y cualquier expulsión que resulte del incumplimiento de los mismos no califica a solicitar devolución de los servicios ya entregados y disfrutados.
+
{t('refund.h10')}
+
{t('refund.p31')}
+
{t('refund.p32')}
+
{t('refund.p33')}
-
Cambios a esta Política de Reembolso
-
Nos reservamos el derecho de actualizar esta Política de Reembolso en cualquier momento. Le recomendamos que revise periódicamente esta página para conocer los cambios.
+
{t('refund.h11')}
+
{t('refund.p34')}
-
Contáctanos
-
Si tiene alguna pregunta o inquietud sobre esta Política de Reembolso, puede contactarnos a través de la siguiente información de contacto:
+
{t('refund.h12')}
+
{t('refund.p35')}
Error 404
ultimowow.com
info@ultimowow.com
-
Fecha de actualización: 25-05-2023
+
{t('refund.updated')}
diff --git a/web-next/app/[locale]/rename-character/page.tsx b/web-next/app/[locale]/rename-character/page.tsx
index 2eb3b74..6f2acc4 100644
--- a/web-next/app/[locale]/rename-character/page.tsx
+++ b/web-next/app/[locale]/rename-character/page.tsx
@@ -1,5 +1,5 @@
import type { Metadata } from 'next'
-import { setRequestLocale } from 'next-intl/server'
+import { getTranslations, setRequestLocale } from 'next-intl/server'
import { redirect } from '@/i18n/navigation'
import { getSession } from '@/lib/session'
import { getGameCharacters } from '@/lib/characters'
@@ -22,43 +22,37 @@ export default async function RenameCharacterPage({ params }: { params: Promise<
const [chars, price] = await Promise.all([getGameCharacters(session.accountId!), getRenamePrice()])
+ const t = await getTranslations('CharServiceB.rename')
+
return (
-
- La herramienta Renombrar personaje te permite cambiar de nombre a un personaje.
-
+
{t.rich('intro', { s: (c) => {c} })}
-
- Al usar el botón RENOMBRAR del personaje que hayas escogido, se enviará una petición de cambio de nombre de
- dicho personaje.
-
-
Cuando intentes entrar al reino con ese personaje, te pedirá que escojas un nuevo nombre.
- La herramienta Renombrar hermandad te permite cambiar de nombre a una hermandad de la cual seas
- Maestro de Hermandad.
+ {t.rich('renameGuild.intro1', { s: (c) => {c} })}
-
A la hora de escoger un nuevo nombre, ten en cuenta:
-
- La longitud máxima es de 24 caracteres.
-
- Los caracteres permitidos son A-Za-z y el espacio.
+
{t('renameGuild.rules')}
+
{t('renameGuild.rule1')}
+
{t('renameGuild.rule2')}
- Al usar el botón RENOMBRAR HERMANDAD de la hermandad que hayas escogido, se cambiará su nombre al nuevo nombre
- que hayas ingresado.
+ {t('renameGuild.intro2')}
- El cambio de nombre de hermandad es instantáneo. Puede ser necesario que los miembros de la hermandad
- conectados deban volver a conectar para finalmente ver el nuevo nombre.
+ {t('renameGuild.intro3')}
@@ -56,7 +53,13 @@ export default async function RenameGuildPage({ params }: { params: Promise<{ lo
2FA son las siglas de "Two Factor Authentication", o verificación en dos pasos.
+
{t.rich('twofaLogin.p1', { s: (c) => {c} })}
-
Es un método que añade una capa adicional de seguridad al proceso de inicio de sesión.
-
En lugar de simplemente ingresar tu nombre de usuario y contraseña, 2FA requiere un segundo paso de verificación, aumentando así la protección de tu cuenta.
+
{t('twofaLogin.p2')}
+
{t('twofaLogin.p3')}
-
Una vez activado, luego de ingresar usuario y contraseña, aparecerá una ventana (Imagen derecha) que te pedirá el código de autenticación generado por la aplicación.
+
{t('twofaLogin.p4')}
-
Códigos de respaldo
-
Al activar 2FA, se te proporcionarán códigos de respaldo únicos.
-
Estos códigos son útiles en caso de que pierdas acceso a tu aplicación de autenticación.
-
Cada código de respaldo puede usarse una sola vez.
-
Guárdalos en un lugar seguro, ya que te permitirán acceder a tu cuenta en el sitio web si no puedes usar la aplicación de autenticación.
+
{t('twofaLogin.backupCodes')}
+
{t('twofaLogin.p5')}
+
{t('twofaLogin.p6')}
+
{t('twofaLogin.p7')}
+
{t('twofaLogin.p8')}
-
Si aún no tienes Token de seguridad, puedes solicitarlo aquí.
diff --git a/web-next/app/[locale]/security-history/page.tsx b/web-next/app/[locale]/security-history/page.tsx
index a87d5d7..b1e0509 100644
--- a/web-next/app/[locale]/security-history/page.tsx
+++ b/web-next/app/[locale]/security-history/page.tsx
@@ -1,5 +1,5 @@
import type { Metadata } from 'next'
-import { setRequestLocale } from 'next-intl/server'
+import { setRequestLocale, getTranslations } from 'next-intl/server'
import { redirect } from '@/i18n/navigation'
import { getSession } from '@/lib/session'
import { getSecurityHistory } from '@/lib/security-history'
@@ -35,6 +35,7 @@ function UserCell({ label, bnet }: { label: string; bnet: string }) {
export default async function SecurityHistoryPage({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params
setRequestLocale(locale)
+ const t = await getTranslations('History')
const session = await getSession()
if (!session.bnetId) redirect({ href: '/login', locale })
@@ -45,39 +46,37 @@ export default async function SecurityHistoryPage({ params }: { params: Promise<
const { activity, realm, web } = await getSecurityHistory(session.accountId!, displayUser, bnetEmail)
return (
-
+
-
Aquí verás información de actividad y conexiones de tu cuenta.
-
Cada tabla tiene una explicación detallada de la información provista.
+
{t('security.intro1')}
+
{t('security.intro2')}
- Si desconoces algún tipo de actividad te recomendamos cambiar la contraseña de tu cuenta y del correo ligado a
- la misma.
+ {t('security.intro3')}
- Historial de actividad
+ {t('security.activityTitle')}
-
Muestra actividad de seguridad de la cuenta, como por ejemplo cambios de contraseña.
+
{t('security.activityDesc')}
- Historial de conexiones (Reino)
+ {t('security.realmTitle')}
- Muestra un historial de conexiones al reino sólo cuando la IP ha cambiado. No es un historial de cada
- conexión.
+ {t.rich('security.realmDesc', { u: (c) => {c} })}
- Historial de conexiones (Web)
+ {t('security.webTitle')}
-
Muestra un historial de cada conexión al sitio web.