Las cadenas del tema están traducidas en siete locales. Un sitio sirve el
subconjunto que quiere, traduce las cadenas que él mismo configuró y — si le
apetece — también las páginas.

## Pasos

::steps
1. **Reduce la lista con `duxt.locales`.**

   ```ts [app/app.config.ts]
   locales: ['en-GB', 'es-ES']
   ```

   No el array `locales` de i18n: ese se combina entre capas en lugar de
   reemplazar, así que declarar dos allí deja las otras cinco enrutadas y
   anunciadas en `hreflang`.

2. **Elige la que va sin prefijo** en `nuxt.config.ts` con
   `i18n.defaultLocale`. Es relevante para la URL: cambiarla después mueve todas
   las páginas en ambos sentidos a la vez.

3. **Traduce tus propias cadenas.** Para un puñado, la forma de registro cuesta
   menos que un archivo de locale por idioma:

   ```ts
   sections: [
     {
       label: { 'en-GB': 'Guides', 'es-ES': 'Guías' },
       to: '/guides',
       icon: 'lucide:book-open'
     }
   ]
   ```

   Para más de un puñado, registra tus propias claves i18n y escribe la clave. No
   recurras a `duxt.defaults.*` — son las claves internas de la capa, y un
   renombrado allí rompería tu sitio en silencio.

4. **Define el origen.** `hreflang` no vale en relativo, así que necesita
   `i18n.baseUrl` o `NUXT_PUBLIC_I18N_BASE_URL`.

5. **Traduce las páginas, si quieres.** Una carpeta por idioma dentro de la
   fuente; el locale por defecto se queda donde está y no mueve ninguna URL:

   ```ts [app/app.config.ts]
   sources: [{ path: 'docs', locales: ['en-GB', 'es'] }]
   ```

   ::file-tree{title="docs/"}
   ---
   tree:
     - name: index.md
     - name: 1.getting-started/
       children:
         - name: index.md
     - name: es/
       children:
         - name: index.md
   ---
   ::

   Traduce tan pocas páginas como quieras — todo lo demás recae en el original,
   con un aviso que le dice al lector por qué.

6. **Abre una página en cada locale** y comprueba que la interfaz cambió de
   idioma, que la ruta sigue resolviendo y que ninguna etiqueta configurada
   aparece como clave en crudo.
::

## Solo algunas versiones, u otro repositorio

`locales` en una ref sobrescribe el de la fuente, que es la forma habitual: la
versión actual está traducida y las dos anteriores no.

```ts
{
  path: 'docs',
  locales: ['en-GB', 'es'],
  refs: [
    { tag: 'v2.0.0' },                     // ambos idiomas
    { tag: 'v1.0.0', locales: ['en-GB'] }  // solo el original
  ]
}
```

La forma de objeto mueve un idioma a otro sitio por completo — su propio
repositorio, con sus propios responsables y su propio ritmo:

```ts
locales: ['en-GB', { locale: 'es', repo: 'acme/docs-es', path: 'docs' }]
```

Eso es lo que hacen React y Vue fuera de sus herramientas, con `de.react.dev` y
la organización `vuejs-translations`, porque quienes traducen trabajan con su
propio calendario y su propia revisión. Aquí es una entrada de fuente en lugar
de un segundo sitio web — un índice de búsqueda, un selector de idioma.

::callout{type="warning" title="Lo que cuesta compilar una traducción"}
Aproximadamente **dos segundos de compilación y 0,6 MB de base de datos por
idioma × versión × repositorio**, medido lineal hasta al menos 200 colecciones.
Traducir todas las versiones de todos los repositorios multiplica las tres;
traducir solo la versión actual es lo que hace la mayoría de los proyectos.
::

## Dirección de escritura

El locale activo aporta la dirección del documento además del idioma. La
navegación, los paneles, las flechas y la disposición de página se reflejan
cuando un sitio consumidor añade un locale RTL porque los componentes de duxt
usan inicio y fin lógicos. El material técnico no se refleja a ciegas: código,
comandos, rutas, nombres de API y otra sintaxis LTR conservan la dirección en la
que son legibles.

duxt no incluye hoy ningún locale RTL. Direction-aware significa que un sitio
puede añadirlo sin bifurcar el tema, no que uno de los siete locales incluidos
sea RTL.

## Cuando una página no tiene traducción

El lector recibe el idioma más cercano que la tenga, con un aviso, y la página
lleva `noindex` más un canonical que apunta al idioma en el que realmente está.
La cadena — locale, idioma base, región hermana, `fallbackLocale`, original —
está en [Localización](/concepts/localisation).

## Lista de comprobación

- [ ] `duxt.locales` enumera exactamente los locales que sirves
- [ ] `/sitemap.xml` contiene una entrada por página y locale, y ninguna más
- [ ] Los enlaces `hreflang` son absolutos
- [ ] Ninguna etiqueta configurada aparece como clave en crudo
- [ ] Cambiar de locale mantiene al lector en la misma página
- [ ] Una página que no tradujiste muestra el aviso de recurso, no un 404
- [ ] Un locale RTL añadido refleja la interfaz mientras la sintaxis técnica
      permanece LTR
- [ ] `duxt.sourceOptions.defaultLocale` coincide con `i18n.defaultLocale`