Las cadenas del propio tema — etiquetas de navegación, búsqueda, el aviso de
versión, el 404 — se entregan traducidas en `en-GB`, `en-US`, `de-DE`, `es-ES`,
`fr-FR`, `pt-PT` y `pt-BR`. Un sitio elige cuáles sirve con `locales`, y
`i18n.defaultLocale` decide cuál se sirve sin prefijo de URL.

`locales` se lee en tiempo de compilación: los locales deciden rutas y
`hreflang`, no solo lo que dibuja un componente, así que cambiar la lista exige
recompilar.

::callout{type="warning" title="Restringir la lista necesita esta clave, no la de i18n"}
El array `locales` de i18n se combina entre capas en lugar de reemplazar, así
que declarar `['de-DE']` allí no añade ni quita nada: los otros seis siguen
enrutados, indexados y anunciados en `hreflang`. `duxt.locales` es la clave que
realmente la reduce.
::

## Cada cadena configurada admite tres formas

Todo lo que escribas en la configuración — una etiqueta, un título, una
descripción — puede ser un literal, una clave i18n o un registro con una cadena
por locale:

```ts
label: 'Repository'                                    // literal
label: 'app.nav.repository'                            // clave propia
label: { 'en-GB': 'Repository', 'es-ES': 'Repositorio' } // por locale
```

Cuál de ellas es se decide según si la cadena es una clave registrada. Un sitio
monolingüe nunca se topa con las otras dos formas, y un sitio con un puñado de
cadenas en cinco idiomas no necesita archivos de locale en absoluto — la forma
de registro se resuelve por el idioma base, así que `pt-PT` cubre `pt-BR` y
`en-GB` cubre `en-US`.

## No toques las claves de la capa

`duxt.defaults.*` traduce los valores por defecto que la propia capa entrega.
Esas claves son internas: renombrar una no es un cambio incompatible de la capa,
e i18n responde a una clave inexistente imprimiendo la clave — quien dependa de
una se enteraría por un lector, no por una compilación. Usa un literal, una
clave propia o la forma de registro.

## Rutas y enlaces

Solo las rutas se localizan. `useDuxtPath()` da la ruta en la que está la
**documentación**, sin el segmento de locale; `useDuxtLink()` la vuelve a
escribir como enlace, añadiendo de nuevo el segmento. Una URL absoluta, un
enlace de correo o un ancla suelta pasan intactos. Todo lo que calcule una ruta
de documentación debería pasar por ese par en lugar de leer la ruta
directamente.

## Páginas traducidas

La interfaz y las páginas son dos decisiones separadas. Un sitio que no diga
nada sirve un mismo árbol en todos los locales — la interfaz cambia de idioma,
el Markdown no — y esa es la forma correcta para la mayoría de la documentación.

`locales` en una fuente añade la segunda mitad:

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

El locale por defecto es el árbol de `path` mismo, sin carpeta propia, así que
añadir esta clave nunca mueve una página ya publicada. Cualquier otro idioma es
una carpeta dentro — `docs/es/` — o algo completamente aparte; véase
[Varios idiomas](/guides/several-languages).

::callout{type="tip" title="El locale no forma parte de la ruta de contenido"}
`/es-ES/guides/deploying` y `/guides/deploying` son la misma ruta de contenido en
dos colecciones. El segmento pertenece al enrutado de i18n, nunca a una
colección — por eso cambiar de idioma mantiene al lector en la misma página, y
por eso una traducción ausente se resuelve con una consulta más y no con una
redirección.
::

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

El lector recibe el idioma más cercano que sí la tiene, con un aviso que lo
dice, y la página queda fuera del índice bajo `noindex` con un `canonical` que
apunta al idioma en el que realmente está. La cadena es la que la capa ya aplica
a las cadenas de texto:

1. el propio locale — `es-ES` lee `es-ES`
2. su idioma base — `es-ES` lee un árbol `es`, de modo que una carpeta `pt/`
   puede servir tanto a `pt-PT` como a `pt-BR`
3. un hermano del mismo idioma — `pt-BR` lee `pt-PT` antes de salirse del
   portugués
4. `fallbackLocale` de vue-i18n, el mismo valor por el que se resuelve una
   cadena ausente
5. el original sin traducir

Un 404 queda deliberadamente fuera: un hueco en una traducción es de quien
escribe, y responderlo escondiendo la página castiga al lector por ello.

## Dirección de escritura

El locale activo también aporta la dirección del documento. Los componentes
usan inicio y fin lógicos, de modo que navegación, paneles, flechas y elementos
de página se reflejan cuando un consumidor añade un locale RTL. 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.