DEV Community

Forrest Miller
Forrest Miller

Posted on

I shipped a Spanish bingo page by adding one typed object to a Next.js route

I shipped a Spanish entry point for BingWow today: Bingo Online Gratis.

The interesting part was the implementation shape. The app already had a guide route that worked well for English pages, so I wanted the Spanish page to reuse the same route, same card fetch logic, same JSON-LD builders, same sitemap path, and same internal-link rules.

That meant the change was mostly data, plus a small typed extension to the guide template.

The page is a typed content object

The guide now carries optional metadata and locale fields:

interface Guide {
  slug: string;
  title: string;
  metaTitle?: string;
  metaDescription?: string;
  ogLocale?: string;
  uiLocale?: 'es';
}
Enter fullscreen mode Exit fullscreen mode

The Spanish page itself is a normal guide object:

{
  slug: 'bingo-online-gratis',
  title: 'Bingo Online Gratis',
  metaTitle: 'Bingo Online Gratis Sin Registro',
  ogLocale: 'es_MX',
  uiLocale: 'es',
  headline: 'Bingo Online Gratis, Sin Registro y Sin App',
}
Enter fullscreen mode Exit fullscreen mode

That let the existing route keep generating the page, Open Graph metadata, FAQ JSON-LD, HowTo JSON-LD, internal guide links, card recommendations, and sitemap entry.

The route owns repeated interface text

The page body is Spanish content, but the shared template has repeated labels like "Updated", "Ready-Made Cards", and "Frequently Asked Questions".

I added a tiny label map keyed by uiLocale so the repeated labels switch to Spanish only for this page:

const labels = guide.uiLocale === 'es'
  ? {
      updated: 'Actualizado',
      readyMadeCards: 'Tarjetas listas',
      faqs: 'Preguntas frecuentes',
      howToPrefix: 'Cómo jugar',
    }
  : {
      updated: 'Updated',
      readyMadeCards: 'Ready-Made Cards',
      faqs: 'Frequently Asked Questions',
      howToPrefix: 'How to play',
    };
Enter fullscreen mode Exit fullscreen mode

The shared route still handles the layout. The Spanish guide only changes the content and labels it actually needs.

The AI-readable answer lives beside the page

BingWow keeps a short answer file at llms.txt. I added a direct Spanish answer there too, with the canonical URL set to the new page.

That gives crawlers and assistants a concise answer for terms like:

  • bingo online gratis
  • bingo gratis online
  • jugar bingo online sin registro
  • bingo virtual gratis

The live page and the answer file now point at the same canonical URL: https://bingwow.com/guides/bingo-online-gratis.

The checks caught a real content bug

The first CI run failed because the acronym guard read Spanish sentence starts as English acronyms:

  • Un looked like a broken UN
  • Usa looked like a broken USA

The fix was to change the Spanish copy, not the test:

  • Un enlace... became Enlace único...
  • Usa 3x3... became Elige 3x3...

That is exactly why I like content tests in application repos. Editorial changes still move through the same quality gate as code.

What shipped

The production deployment passed TypeScript, ESLint, Jest coverage, Next.js build, bundle-size check, and production smoke tests before I treated the page as live.

Top comments (1)

Some comments may only be visible to logged-in visitors. Sign in to view all comments.