Uso
Traducción Básica
Una vez configurado tu layout, simplemente usa getTranslations(namespace) en cualquier página para obtener una función de traducción tipada para un namespace específico.
---
import { getTranslations } from "astro-intl";
// No need to call setRequestLocale here - it's already in the layout!
const tHero = getTranslations("hero");
const tNav = getTranslations("nav");
---
<h1>{tHero("title")}</h1>
<p>{tHero("description")}</p>
<a href="/">{tNav("home")}</a>Interpolación
Usa placeholders {curlyOpen}varName{curlyClose} en tus strings de traducción y pasa un objeto de valores como segundo argumento de t(). Tipos aceptados: string, number, boolean. Los valores faltantes o null/undefined mantienen el placeholder sin cambios.
{
"hero": {
"greeting": "Hello, {name}!",
"info": "You have {count} new messages"
}
}---
const tHero = getTranslations("hero");
---
<p>{tHero("greeting", { name: "John" })}</p>
<!-- "Hello, John!" -->
<p>{tHero("info", { count: 5 })}</p>
<!-- "You have 5 new messages" -->
<p>{tHero("greeting")}</p>
<!-- "Hello, {name}!" — placeholder kept when no values -->Traducción con Markup
Usa t.markup(key, tags) para interpolar etiquetas HTML dentro de un string de traducción. El objeto tags mapea nombres de etiquetas a funciones que reciben el contenido interno.
{
"hero": {
"description": "A <bold>type-safe</bold> solution for <link>Astro</link>"
}
}---
const tHero = getTranslations("hero");
---
<p set:html={tHero.markup("description", {
bold: (chunks) => `<strong>${chunks}</strong>`,
link: (chunks) => `<a href="https://astro.build">${chunks}</a>`,
})} />Markup + Interpolación
Combina interpolación de variables con reemplazo de tags pasando {curlyOpen} values, tags {curlyClose} a t.markup(). La interpolación se ejecuta primero, luego se procesan los tags.
{
"hero": {
"welcome": "Hello {name}, read our <link>docs</link> to get started"
}
}---
const tHero = getTranslations("hero");
---
<p set:html={tHero.markup("welcome", {
values: { name: "John" },
tags: {
link: (chunks) => `<a href="/docs">${chunks}</a>`,
}
})} />
<!-- "Hello John, read our <a href="/docs">docs</a> to get started" -->t.raw() — Valores Sin Coerción
Usa t.raw(key) para acceder al valor de traducción sin coerción a string. Perfecto para arrays, objetos y números que necesitas en su tipo JavaScript nativo.
Accediendo a Arrays
Cuando tus traducciones contienen arrays, t.raw() los retorna como arrays JavaScript reales en lugar del string [object Object].
{
"features": ["Fast", "Lightweight", "Type-safe"]
}---
import { getTranslations } from "astro-intl";
const t = getTranslations();
// Get raw array
const features = t.raw("features") as string[];
// features = ["Fast", "Lightweight", "Type-safe"]
---
<ul>
{features.map(feature => <li>{feature}</li>)}
</ul>Accediendo a Objetos
Los objetos se retornan tal cual, permitiéndote acceder a propiedades anidadas directamente sin parsing.
{
"theme": {
"primary": "#3b82f6",
"secondary": "#64748b"
}
}---
const theme = t.raw("theme") as { primary: string; secondary: string };
// theme = { primary: "#3b82f6", secondary: "#64748b" }
---
<div style={`background: ${theme.primary}`}>...</div>Accediendo a Números
Los números permanecen como números — útil para cálculos o pasar a componentes que esperan valores numéricos.
{
"config": {
"maxItems": 100,
"timeout": 30
}
}---
const maxItems = t.raw("config.maxItems") as number;
// maxItems = 100 (number, not string)
// Can use for calculations
const limit = maxItems * 0.8; // 80
---getTranslationsReact está obsoleto desde v2.0.0. Usa astro-intl/react en su lugar. Ver docs de React Componentes React Deprecated
Usa getTranslationsReact(namespace) dentro de componentes React, luego llama a t.rich(key, tags) para interpolar nodos React.
import { getTranslationsReact } from "astro-intl";
export default function MyComponent() {
const t = getTranslationsReact("hero");
return (
<p>
{t.rich("description", {
bold: (chunks) => <strong>{chunks}</strong>,
link: (chunks) => <a href="https://astro.build">{chunks}</a>,
})}
</p>
);
}