Las traducciones basadas en strings sueltos tienen un problema silencioso: nada te avisa cuando escribes mal una clave o cuando una traducción falta en un idioma. El error aparece en producción, no en tu editor.

El objetivo

Que t("metadata.title") autocomplete y que t("metdata.title") sea un error de tipo en tiempo de compilación.

La solución

Construí @ariaskit/astro-i18n precisamente para esto. Defines tus traducciones en JSON y derivas el tipo:

import base from '@/i18n/_template.json' with { type: 'json' };
export type BaseJSON = typeof base;

Luego el genérico hace toda la magia:

const { t, locale } = useI18n<BaseJSON>({ ssg: { astro: Astro } });

A partir de ahí, estas claves están verificadas por TypeScript:

  • metadata.title
  • hero.role
  • contact.email

Lo que aprendí

El tipo recursivo DotNotation recorre el JSON hasta 5 niveles de profundidad. Más allá, conviene aplanar la estructura. Y un detalle clave: la librería resuelve estado de idioma desde Astro.currentLocale, así que nunca hardcodees el locale.

Este mismo blog que estás leyendo usa exactamente este enfoque en tres idiomas.