Esta página enumera cada opción que puedes pasar a universally({...}) en astro.config.mjs, la variable de entorno que establece cada una y el formato del endpoint de envío.
Opciones
| Opción | Variable de entorno | Predeterminado | Notas |
|---|---|---|---|
modo |
UNIVERSALLY_MODE |
'sdk' |
'sdk' o 'proxy', sin distinción entre mayúsculas y minúsculas. Cualquier otro valor genera un error al ejecutarse la configuración. Consulta Astro con subdominios de idioma. |
apiKey |
UNIVERSALLY_API_KEY |
ninguno, requerido | La clave de 64 caracteres de la página de Configuración del proyecto. Una clave sk_ también autentica. Una clave pk_ falla la llamada de idiomas y la compilación. |
apiUrl |
UNIVERSALLY_API_URL |
https://api.universally.com |
Desde dónde se leen los idiomas y los catálogos. |
translatorUrl |
UNIVERSALLY_TRANSLATOR_URL |
https://translator.universally.com |
A dónde se informan las nuevas cadenas. |
revalidateSeconds |
UNIVERSALLY_REVALIDATE_SECONDS |
60 |
Intervalo mínimo entre dos verificaciones de ediciones del panel, por idioma. 0 o un número negativo desactiva el sondeo. Se ignora un valor de entorno no numérico y se aplica el valor predeterminado. |
hreflang.format |
ninguno | 'variant' |
'variant', 'lang', o una función. Cualquier otra cadena se comporta como 'variant'. |
hreflang.xDefault |
ninguno | verdadero |
Agrega un enlace x-default a la página de origen. Solo false lo deshabilita. |
switcher |
ninguno | verdadero |
Renderiza el script del selector de idioma en <UniversallyHead />. Solo false lo deshabilita. |
scriptsUrl |
UNIVERSALLY_SCRIPTS_URL |
https://scripts.universally.com |
Origen desde el cual se carga el script del selector. |
Una clave faltante genera: "establece UNIVERSALLY_API_KEY en .env o pasa apiKey en las opciones de integración. La clave es la clave de sitio de 64 caracteres de la página de Configuración de tu proyecto."
De dónde provienen los valores
Cada valor se resuelve en este orden, la primera coincidencia gana:
- La opción en
universally({...}) - El entorno del proceso
.env.localen la raíz del proyecto Astro, junto aastro.config.mjs.enven la misma carpeta
Un valor vacío se considera faltante. No se leen .env.production y otros archivos de modo. La lectura de los archivos requiere Node 20.12 o más reciente; en Node más antiguo se omiten sin error. La clave se resuelve en el momento de la compilación y se compila en el paquete del servidor, nunca en el paquete del cliente, por lo que debe estar presente donde se ejecuta la compilación. Consulta Implementa un sitio Astro con Universally.
hreflang.format
Para un origen en inglés (EE. UU.) con francés (Francia) en /fr/ y español (México) en /es/, la página /fr/about se renderiza:
<!-- format: 'variant', the default -->
<link rel="alternate" hreflang="en-us" href="https://example.com/about" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/about" />
<link rel="alternate" hreflang="es-419" href="https://example.com/es/about" />
<link rel="alternate" hreflang="x-default" href="https://example.com/about" />
<!-- format: 'lang' -->
<link rel="alternate" hreflang="en" href="https://example.com/about" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/about" />
<link rel="alternate" hreflang="es" href="https://example.com/es/about" />
<link rel="alternate" hreflang="x-default" href="https://example.com/about" />
El origen va primero, luego los destinos en el orden en que Universally los devuelve, luego x-default. Las cadenas de consulta y los hashes se eliminan de las URL. Consulta etiquetas hreflang.
Una función recibe una fila de idioma, con campos como lang, variant, region y url, y devuelve el valor. Se ejecuta solo cuando se ejecuta la configuración:
universally({
hreflang: {
format: (language) => language.variant.toUpperCase()
}
})
Ejemplos
// Check for dashboard edits every five minutes
universally({ revalidateSeconds: 300 })
// Place the switcher script yourself
universally({ switcher: false })
// Serve through language subdomains
universally({ mode: 'proxy' })
Tipos y exportaciones
import universally, {
REVALIDATE_PATH, // '/_universally/revalidate'
DEFAULT_REVALIDATE_SECONDS, // 60
DEFAULT_SCRIPTS_URL // 'https://scripts.universally.com'
} from '@universally-sdk/astro';
import type {
HreflangOptions,
ResolvedHreflang,
UniversallyMode,
UniversallyOptions,
ResolvedUniversallyOptions
} from '@universally-sdk/astro';
import { UniversallyHead } from '@universally-sdk/astro/components';
Astro.locals está tipificado por /// <reference types="@universally-sdk/astro/env" /> en src/env.d.ts:
declare namespace App {
interface Locals {
lang?: string;
t: (source: string) => string;
href: (path: string) => string;
}
}
Endpoint de inserción
POST /_universally/revalidate
X-Universally-Signature: v1=<hex>
Content-Type: application/json
{ "siteId": "site_123", "cacheEpoch": 12, "langs": ["fr"], "ts": 1750000000 }
| Campo | Significado |
|---|---|
X-Universally-Signature |
HMAC-SHA256 del cuerpo sin procesar, con clave de la mitad privada de la clave del sitio (sus últimos 32 caracteres hexadecimales), como hexadecimal en minúsculas |
langs |
Códigos de variante o prefijos de URL. null o [] significa todos los idiomas. |
ts |
Segundos Unix, dentro de los 5 minutos del reloj del receptor |
Se acepta una barra inclinada al final de la ruta.
| Estado | Cuando |
|---|---|
200 |
{ "ok": true, "reloaded": [...] }, listando solo los idiomas cuya época de caché cambió |
401 |
{ "ok": false }: cuerpo mal formado, firma faltante o incorrecta, ts expirado, o una clave sin mitad privada |
404 |
Modo proxy, donde el endpoint no existe |
405 |
Cualquier método que no sea POST |
413 |
Cuerpo de más de 16 KiB, verificado antes de la firma |