# Traducciones

> Publica un sitio en varios idiomas, con un selector de idioma, textos de interfaz traducidos y alternativas para las páginas aún sin traducir.

Un sitio se puede publicar en varios idiomas. El primer idioma es el predeterminado y conserva sus URL; cada uno de los demás se sirve bajo su propio prefijo, como `/es/`, con su propia navegación, búsqueda, `llms.txt` y textos de interfaz. La cabecera recibe un selector de idioma, y una página aún sin traducir se queda en la navegación, marcada con el idioma en el que está escrita.

## Configurar los idiomas

**htmlpress.yaml**

```yaml
languages:
  - code: en
    label: English
  - code: es
    label: Español
  - code: zh
    label: 简体中文
```

Cada idioma acepta:

| Campo      | Predeterminado                                             | Propósito                                                                                                             |
| ---------- | ---------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| `code`     | ninguno, obligatorio                                       | El prefijo de URL y el sufijo del nombre de archivo: letras minúsculas, dígitos y `-`, empezando por una letra.       |
| `label`    | ninguno, obligatorio                                       | El nombre que se muestra en el selector de idioma.                                                                    |
| `locale`   | el `code`                                                  | La etiqueta para `<html lang>`, hreflang y las fechas, como `pt-BR`.                                                  |
| `dir`      | `rtl` para árabe, hebreo, persa, urdu y algunos más        | `ltr` o `rtl`, escrito en `<html dir>`.                                                                               |
| `flag`     | la región del locale o, si no, el país habitual del idioma | Un código de país de dos letras para la bandera del selector, como `br`; uno sin bandera incluida no muestra ninguna. |
| `messages` | ninguno                                                    | Textos de interfaz que reemplazan a los integrados; ver más abajo.                                                    |

Sin `languages`, el sitio está solo en inglés y nada de lo que sigue se aplica. Un código listado dos veces, una clave de mensaje desconocida, o una sección cuyo prefijo queda bajo el prefijo de otro idioma (`/es/…`) hace fallar la compilación.

## Traducir una página

Una traducción es un archivo junto a su original, nombrado con el código del idioma antes de `.html`. Se sirve bajo el prefijo del idioma y se empareja con el original por URL:

- index.html — `/`

- index.es.html — `/es/`

- guides

  - install.html — `/guides/install/`
  - install.es.html — `/es/guides/install/`

Un sufijo que no nombra ningún idioma configurado sigue formando parte del nombre, así que `vite.config.html` sigue siendo una página en inglés. Para guardar las traducciones en una carpeta propia, o para nombrar un archivo libremente, define el idioma en su head; un archivo que ya está bajo la carpeta del idioma no recibe el prefijo dos veces:

**HTML**

**es/guias/instalar.html**

```html
<meta name="language" content="es" />
<meta name="path" content="/guides/install/" />
```

**Markdown**

**es/guias/instalar.md**

```md
---
language: es
path: /guides/install/
---
```

Una traducción solo se empareja con su original cuando ambos comparten una URL bajo el prefijo del idioma, así que da a un archivo renombrado el mismo `path` que su original. Un idioma que la configuración no lista hace fallar la compilación.

## Traducir la configuración

El `title`, la `description` y el `banner` del sitio, el `title` de un enlace, y el `title`, el `siteTitle` y el `siteDescription` de una sección aceptan un texto para todos los idiomas o un mapa por código de idioma. Un idioma que falta en el mapa recibe el texto del idioma predeterminado:

**htmlpress.yaml**

```yaml
title:
  en: Acme Docs
  es: Documentación de Acme
sections:
  - title: { en: Guide, es: Guía, zh: 指南 }
    prefix: /
  - title: Blog
    type: blog
    prefix: /blog/
```

Cada sección y cada enlace con un `prefix` se replica bajo el prefijo de cada idioma: el blog en español vive en `/es/blog/`, con su propio índice, páginas de etiquetas y feed RSS que listan las entradas en español y, después, las predeterminadas aún sin traducir. Una sección de changelog compila sus páginas en todos los idiomas, conservando las notas de versión tal como se escribieron; esas copias apuntan su URL canónica a la del idioma predeterminado y quedan fuera del sitemap. Una sección `custom` cuya `url` es una página del sitio lleva a la traducción de esa página, cuando el idioma abierto la tiene.

## Páginas aún sin traducir

Un idioma lista cada página del idioma predeterminado de la que no tiene traducción, para que su navegación mantenga la misma forma. Esa entrada enlaza al original y lleva como insignia el código del idioma predeterminado, con "Aún sin traducir" como texto emergente. La página sin traducir se compila una sola vez, en su propio idioma; la búsqueda y `llms.txt` solo listan las páginas propias de cada idioma.

El selector de idioma enlaza cada idioma a la versión de esta página en él o, si no existe, a la página de inicio de ese idioma. Un idioma sin página de inicio propia, `index.es.html`, recibe una redirección de `/es/` a su primera página; también el idioma predeterminado sin `index.html`. Los hosts que leen `_redirects`, como Cloudflare y Netlify, y `htmlpress start` redirigen en el servidor; los demás usan una página de redirección.

## Textos de la interfaz

Los textos propios de htmlpress, como "En esta página", "Anterior" y "Editar esta página", y las fechas, vienen incluidos en inglés, alemán, español, francés, japonés, ruso y chino, y se eligen según el idioma del locale. Cualquiera de ellos se puede reemplazar por idioma:

**htmlpress.yaml**

```yaml
languages:
  - code: en
    label: English
    messages:
      page.edit: Edit on GitHub
  - code: pt
    label: Português
    locale: pt-BR
    messages:
      toc.title: Nesta página
      nav.previous: Anterior
      nav.next: Próximo
```

Un idioma que htmlpress no incluye recurre al inglés para los textos que no define. Las claves son las de [`messages/en.yaml`](https://github.com/datisthq/htmlpress/blob/main/rust/src/messages/en.yaml); los marcadores `{name}`, como `{date}`, se rellenan. `date.format` y `date.months` dan forma a cada fecha que se muestra a los lectores.

## Qué recibe una página traducida

- `<html lang>` y, para los idiomas que se escriben de derecha a izquierda, `<html dir="rtl">`.
- Con `site` definido, un alternate hreflang por cada idioma que tiene la página, además de `x-default` apuntando a la versión del idioma predeterminado, y un `og:locale`.
- El índice de búsqueda de su idioma, `_htmlpress/search.<code>.json`, y una copia en Markdown y un `llms.txt` bajo el prefijo del idioma.
- El selector `<htmlpress-language>`, que un escape del layout coloca como cualquier otro elemento; se elimina en un sitio de un solo idioma.

## Ver también

- [Configuración](/es/customization/configuration-file/): todas las claves de `htmlpress.yaml`.
- [Secciones de artículos](/es/customization/article-sections/): cómo funcionan los prefijos y la correspondencia de secciones.
- [Frontmatter](/es/authoring/frontmatter/): los metadatos propios de la página, incluido `<meta name="language">`.
