Entrega CDN: Traducciones en Caché en el Edge a Nivel Mundial | better-i18n
Traducciones servidas desde Cloudflare R2 a través de más de 300 ubicaciones edge. Fusiona, previsualiza, sube en batch y elimina duplicados — luego entrega en todo el mundo sin volver a desplegar tu aplicación.
Entrega CDN: Traducciones en Caché en el Edge a Nivel Mundial
Cada traducción que publicas en better-i18n se despliega en la red edge global de Cloudflare. Tu aplicación obtiene las traducciones desde el nodo edge más cercano — sin round-trip al servidor de origen, sin necesidad de redesplegar la app para actualizar traducciones.
Estructura de URL del CDN
Las traducciones siguen un patrón de URL predecible basado en tu organización, proyecto, locale y namespace:
https://cdn.better-i18n.com/{org}/{project}/{locale}/{namespace}.json
Ejemplos:
# Namespace common en inglés
https://cdn.better-i18n.com/acme/web-app/en/common.json
# Namespace auth en turco
https://cdn.better-i18n.com/acme/web-app/tr/auth.json
# Namespace de navegación en francés
https://cdn.better-i18n.com/acme/web-app/fr/nav.json
Cada combinación de namespace-locale es un archivo JSON independiente, así tu app solo carga las traducciones que necesita. Esta estructura de URL es estable y cacheable — los nodos edge del CDN, las cachés del navegador y los service workers pueden aprovecharla.
Manifest del Proyecto
El CDN también sirve un archivo manifest con la configuración de idiomas de tu proyecto:
https://cdn.better-i18n.com/{org}/{project}/manifest.json
Devuelve el array languages con todos los locales de tu proyecto. El SDK de Expo lo utiliza para descubrir automáticamente los idiomas disponibles en tiempo de ejecución.
Operaciones del CDN
better-i18n ofrece un conjunto completo de operaciones de gestión del CDN a través del CLI, la REST API y las herramientas MCP.
Configuración e Instalación
| Operación | Descripción |
|---|---|
cdn.setup | Inicializa la entrega CDN para tu proyecto. Crea la estructura de bucket en R2 y configura el enrutamiento edge. |
cdn.uninstall | Elimina la entrega CDN. Limpia el almacenamiento R2 y la configuración edge. |
Operaciones de Subida
Subida Individual (cdn.upload)
Sube un archivo namespace-locale individual al CDN:
# Subir las traducciones common en inglés
better-i18n cdn upload --locale en --namespace common
Escribe el archivo en R2 e invalida la caché edge para esa ruta específica. Los cambios se propagan a más de 300 nodos edge en segundos.
Subida en Lote (cdn.uploadBatch)
Sube múltiples combinaciones de namespace-locale en una sola operación:
# Subir todos los namespaces para inglés y turco
better-i18n cdn upload-batch --locales en,tr --namespaces common,auth,dashboard
La subida en lote es significativamente más rápida que las subidas individuales al publicar múltiples archivos. Agrupa las escrituras en R2 y las invalidaciones de caché, reduciendo el tiempo total de propagación.
Operaciones de Merge
Merge te permite actualizar claves específicas dentro de un archivo CDN existente sin reemplazar el archivo completo. Esto es fundamental para actualizaciones incrementales de traducciones.
Merge (cdn.merge)
# Fusionar claves actualizadas en el namespace common de inglés
better-i18n cdn merge --locale en --namespace common --keys "welcome,nav.home"
Merge lee el archivo existente de R2, aplica los cambios a nivel de clave y escribe el resultado. Las claves no incluidas en el merge permanecen sin cambios. Esto evita sobrescrituras accidentales cuando varios miembros del equipo o pipelines de automatización publican de forma simultánea.
Vista Previa del Merge (cdn.mergePreview)
Previsualiza el resultado de una operación de merge antes de ejecutarla:
# Previsualizar el resultado del merge sin aplicarlo
better-i18n cdn merge-preview --locale en --namespace common --keys "welcome"
Devuelve un diff mostrando claves añadidas, actualizadas y sin cambios. Úsalo en pipelines de CI o flujos de revisión para verificar los cambios antes de que pasen a producción.
Gestión de Archivos
| Operación | Descripción |
|---|---|
cdn.listFiles | Lista todos los archivos desplegados actualmente en el CDN para tu proyecto. Devuelve locale, namespace, tamaño y timestamp de última modificación de cada archivo. |
cdn.deleteFile | Elimina un archivo namespace-locale específico del CDN. Útil al deprecar un namespace o eliminar un locale. |
Detección y Limpieza de Duplicados
Los proyectos de traducción acumulan duplicados con el tiempo — especialmente cuando los namespaces se reorganizan o las claves se mueven entre namespaces.
Detectar Duplicados (cdn.detectDuplicates)
Analiza todos los archivos CDN de tu proyecto e identifica valores de traducción duplicados entre namespaces:
better-i18n cdn detect-duplicates
Devuelve un informe mostrando qué claves comparten valores idénticos en distintos namespaces. Esto te ayuda a consolidar traducciones en namespaces compartidos y reducir el tamaño total del payload CDN.
Limpiar Duplicados (cdn.cleanupDuplicates)
Resuelve automáticamente los duplicados detectados según tus preferencias de consolidación:
# Mover duplicados al namespace common
better-i18n cdn cleanup-duplicates --target-namespace common
Esta es una operación destructiva — ejecuta siempre cdn.detectDuplicates primero para revisar qué cambiará, y usa cdn.mergePreview para verificar el resultado en el namespace destino.
Cómo Funcionan las Actualizaciones
- Edita traducciones en el dashboard, mediante la REST API o las herramientas MCP
- Publica usando
publishTranslations— esto dispara un job de sincronizacióncdn_upload - El CDN se actualiza en segundos — Cloudflare propaga el cambio a todos los nodos edge
- Tu app recoge los cambios en la siguiente solicitud de traducciones — sin necesidad de redespliegue
Para mayor control granular, usa cdn.merge en lugar de la subida completa para actualizar solo las claves que cambiaron. Combínalo con cdn.mergePreview en tu pipeline de CI para validar los despliegues al CDN antes de aplicarlos.
Integración con Frameworks
Web: Next.js, TanStack Start, Vite
Los SDKs web (@better-i18n/next, @better-i18n/use-intl) gestionan la obtención desde el CDN automáticamente según tu i18n.config.ts:
// i18n.config.ts
export const project = "acme/web-app";
export const defaultLocale = "en";
El SDK resuelve la URL del CDN desde el identificador de tu proyecto y obtiene los archivos namespace-locale correctos en tiempo de ejecución.
Mobile: Expo / React Native
@better-i18n/expo añade caché offline-first sobre la entrega CDN:
import { initBetterI18n, storageAdapter } from '@better-i18n/expo';
import { MMKV } from 'react-native-mmkv';
const mmkv = new MMKV({ id: 'translations' });
await initBetterI18n({
project: 'acme/mobile-app',
i18n,
defaultLocale: 'en',
storage: storageAdapter(mmkv),
});
Estrategia network-first:
- Obtener desde el CDN (obtener las traducciones más recientes)
- Recurrir a la caché persistente (MMKV o AsyncStorage)
- Recurrir a datos estáticos empaquetados (opcional)
Una vez que el usuario abre la app con conectividad de red, las traducciones se almacenan en caché localmente. La app funciona completamente offline desde ese momento.
Cualquier Cliente HTTP
El CDN es un endpoint HTTPS estándar — no se requiere SDK:
curl https://cdn.better-i18n.com/acme/web-app/en/common.json
{
"welcome": "Welcome to our app",
"nav.home": "Home",
"nav.settings": "Settings"
}
Úsalo desde cualquier lenguaje o plataforma: Swift, Kotlin, Go, Python, Ruby — cualquier cosa que pueda hacer una solicitud HTTP.
Infraestructura
- Cloudflare Workers — Computación edge en más de 300 ubicaciones en todo el mundo
- Cloudflare R2 — Almacenamiento de objetos sin costes de egreso para archivos de traducción
- Propagación automática — Los cambios llegan a todos los nodos edge en segundos
- Protección DDoS — Integrada en la red de Cloudflare
- TLS 1.3 — Todas las solicitudes al CDN están cifradas
- Cero costes de egreso — R2 elimina los cargos por ancho de banda independientemente del volumen de tráfico
Organización de Namespaces
Organiza las traducciones en namespaces para controlar qué se carga:
acme/web-app/
├── en/
│ ├── common.json → Cadenas de UI compartidas
│ ├── auth.json → Login, registro, recuperación de contraseña
│ ├── dashboard.json → Cadenas específicas del dashboard
│ └── marketing.json → Textos de la landing page
├── tr/
│ ├── common.json
│ ├── auth.json
│ └── ...
└── manifest.json → Configuración de idiomas del proyecto
Tu app carga solo los namespaces que necesita para la página o funcionalidad actual. Una página de login carga auth.json; el dashboard carga dashboard.json. Esto mantiene los bundles pequeños y las cargas de página rápidas.
Usa cdn.detectDuplicates periódicamente para identificar claves que aparecen en múltiples namespaces con valores idénticos — luego consolídalas en common.json usando cdn.cleanupDuplicates.
Controles de Publicación
El CDN solo sirve traducciones publicadas. Usa el pipeline de publicación para controlar qué entra en producción:
getPendingChanges— Previsualiza qué se desplegará al CDNpublishTranslations— Despliega cambios (todos o traducciones específicas)cdn.mergePreview— Previsualiza resultados de merge a nivel de clave antes de aplicarcdn.merge— Aplica actualizaciones incrementales de claves sin reemplazar el archivo completogetSyncs/getSync— Monitoriza el estado del despliegue
Esto te ofrece un flujo de trabajo por etapas: previsualiza cambios pendientes, verifica resultados del merge, publica y monitoriza el despliegue — todo sin tocar el código de la aplicación.
Primeros Pasos
- Crea tu proyecto en dash.better-i18n.com
- Inicializa el CDN con
cdn.setuppara configurar el almacenamiento R2 y el enrutamiento edge - Añade traducciones mediante el dashboard, la REST API o las herramientas MCP
- Publica para desplegar al CDN
- Integra usando
@better-i18n/next,@better-i18n/use-intl,@better-i18n/expo, o HTTP directo
Las traducciones se sirven desde el CDN en todos los planes, incluido el plan gratuito.