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@ariaskit/astro-i18ni18n type-safe para Astro: autocompletado de claves anidadas, interpolación de variables y un inspector visual de desarrollo. 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.titlehero.rolecontact.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.