Ir al contenido
Código en GitHub (se abre en una pestaña nueva)

Documentación · Guías

Varios idiomas

Un sitio en dos o más idiomas con un fichero por idioma, con su selector, sus menús y sus fechas.

Versión 0.16

Para que un sitio hable dos idiomas, dilo en sitio.yml:

idiomas:
  - codigo: es
    nombre: Castellano
  - codigo: eu
    nombre: Euskara

Y escribe cada página una vez por idioma. El idioma va en el nombre del fichero:

contenido/
  index.md                →  /
  index.eu.md             →  /eu/
  contacto.md             →  /contacto/
  contacto.eu.md          →  /eu/contacto/
  blog/
    un-articulo.md        →  solo en castellano

Eso es todo. No hay que declarar que contacto.md y contacto.eu.md son la misma página: lo son porque se llaman igual.

El idioma predeterminado

El primero de la lista es el predeterminado. Sus páginas no llevan prefijo, y su fichero no necesita código: contacto.md está en castellano. Por eso un sitio que ya existe puede pasar a ser bilingüe sin renombrar nada, solo añadiendo los ficheros del otro idioma. Las páginas de los demás idiomas llevan delante el suyo (/eu/), también cuando les das una dirección propia:

# contenido/contacto.eu.md
url: /kontaktua/

Esa página sale en /eu/kontaktua/. Escribes solo lo que traduces.

Cada idioma necesita una página que sea su raíz, como index.eu.md para /eu/: si no existe, el selector de idioma llevaría a una dirección que no hay y Ehundu te avisa.

Lo que no está traducido no existe

El caso normal no es un sitio duplicado, sino una empresa que traduce la portada, quiénes somos y el contacto, y mantiene el blog solo en castellano. Con un fichero por idioma eso sale solo: un-articulo.md existe en castellano y no se genera nada en euskera. Ehundu no publica nunca el texto de un idioma bajo la dirección de otro, porque sería contenido duplicado, y no te avisa de lo que falta traducir.

Por la misma razón, las colecciones se limitan al idioma de la página que las usa: un listado del blog en euskera no saca artículos en castellano. Si quieres otro idioma, se pide con un segundo argumento:

{% for articulo in coleccion('blog', 'es') %}

El selector de idioma

El motor no escribe selectores: es cosa de la plantilla. Tienes lo necesario. pagina.idioma es el código de la página; pagina.traducciones son sus versiones publicadas, ella incluida; y sitio.idiomas es la lista de idiomas con su codigo, su nombre y la url de su raíz.

<html lang="{{ pagina.idioma }}">

{% for idioma in sitio.idiomas %}
  {% set traduccion = pagina.traducciones[idioma.codigo] %}
  <a href="{{ traduccion ? traduccion.url : idioma.url }}" hreflang="{{ idioma.codigo }}">{{ idioma.nombre }}</a>
{% endfor %}

Si la página actual no está traducida, el enlace lleva a la portada de ese idioma, así que nunca apunta a una dirección que no existe. Y para los buscadores, el hreflang de las traducciones que sí existen:

{% for codigo, traduccion in pagina.traducciones %}
  <link rel="alternate" hreflang="{{ codigo }}" href="{{ sitio.url }}{{ traduccion.url }}">
{% endfor %}

Los datos siguen la misma regla que las páginas, con una diferencia: un fichero sin código es común a todos los idiomas.

datos/menus.yml       común a todos
datos/menus.es.yml    castellano
datos/menus.eu.yml    euskera

En una página, datos.menus es el fichero común con el de su idioma encima. Si el blog solo existe en castellano, el menú en euskera tiene una entrada menos, y no hay que hacer nada más.

Las fechas

fecha() escribe los días y los meses en el idioma de la página. Ehundu trae castellano, euskera, inglés y alemán:

{{ pagina.fecha|fecha }}

Una misma fecha sale 18 de marzo de 2025 en castellano, 2025eko martxoaren 18a en euskera y 18 March 2025 en inglés.

Lo que no se traduce de una página (la imagen principal, el orden) puede ir en un .yml que lleve su mismo nombre, como contacto.yml, para no repetirlo en cada idioma. El detalle de todo esto está en multiidioma.