5bcf71a37b
Los enlaces de wowhead se guardan con el locale de quien los postea (subdominio, domain y nombre), así que un ítem posteado en /es se veía en español aunque lo leyeras en /en, y al revés. Ahora siguen el idioma de QUIEN LEE. Al renderizar el tema (server component, conoce el locale del lector) se localizan los enlaces: se reescribe el subdominio y el domain del data-wowhead y se vuelve a resolver el nombre en el idioma del lector (lib/forum-wowhead + lib/wowhead-resolve, compartido con la API del editor y cacheado). Es solo de presentación: no cambia lo guardado ni añade parpadeo (el nombre llega ya resuelto del servidor). Verificado: un post guardado con nombre inglés y domain=wotlk se lee como «Bolsa de tejido de Escarcha» + es.wotlk en /es, y «Frostweave Bag» + www en /en. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
40 lines
1.4 KiB
TypeScript
40 lines
1.4 KiB
TypeScript
// Resolución server-side de una entidad de wowhead (nombre, calidad, icono) en la
|
|
// rama WotLK y en un idioma concreto, usando el endpoint de tooltip de wowhead (el
|
|
// mismo que consume tooltips.js). Cacheado un día: nombres/calidades no cambian.
|
|
|
|
export const WOWHEAD_ENTITY_TYPES = ['item', 'spell', 'quest', 'npc', 'achievement', 'object'] as const
|
|
export type WowheadEntityType = (typeof WOWHEAD_ENTITY_TYPES)[number]
|
|
|
|
// Código de locale de wowhead: 0 = inglés, 6 = español.
|
|
const WH_LOCALE: Record<string, number> = { es: 6, en: 0 }
|
|
|
|
export interface WowheadInfo {
|
|
name: string | null
|
|
quality: number | null
|
|
icon: string | null
|
|
}
|
|
|
|
export async function fetchWowheadInfo(
|
|
type: string,
|
|
id: string | number,
|
|
locale: string,
|
|
): Promise<WowheadInfo | null> {
|
|
const cleanId = String(id).replace(/\D/g, '')
|
|
if (!WOWHEAD_ENTITY_TYPES.includes(type as WowheadEntityType) || !cleanId) return null
|
|
const wl = WH_LOCALE[locale] ?? 0
|
|
try {
|
|
const r = await fetch(`https://nether.wowhead.com/tooltip/${type}/${cleanId}?dataEnv=8&locale=${wl}`, {
|
|
next: { revalidate: 86400 },
|
|
})
|
|
if (!r.ok) return null
|
|
const d = (await r.json()) as { name?: string; quality?: number; icon?: string }
|
|
return {
|
|
name: d.name ?? null,
|
|
quality: typeof d.quality === 'number' ? d.quality : null,
|
|
icon: d.icon ?? null,
|
|
}
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|