Ehundu 0.3.0
Sites in several languages, with one file per language in the same tree: contacto.md and contacto.eu.md are the same page in Spanish and in Basque, without declaring it anywhere. The languages are declared in idiomas in sitio.yml, and the first one is the default. A site in a single language writes none of this and builds the same as with 0.2 (docs/formato.md (opens in a new tab), §15, decisions 72 to 81).
Each language with its prefix in the URL, which Ehundu also applies to the URL written in url and to the one from a pattern: url: /instalazioak/ in instalaciones.eu.md gives /eu/instalazioak/, and the pattern of a _datos.yml works for all languages.
The translations, in the templates: pagina.idioma, pagina.traducciones (the published versions of the page, itself included) and sitio.idiomas, with which a template writes the hreflang and a language selector that never links to a page that does not exist. Translating only part of the site is the normal case: there is no automatic fallback and no warnings for the translations that are missing.
Collections and data for each language. coleccion() gives the pages in the language of the page that asks for it, or in another with coleccion('blog', 'eu') or 'todos'. datos/menus.eu.yml is merged with datos/menus.yml on the pages in Basque, _datos.eu.yml goes on top of the _datos.yml of its folder, and what is not translated in a page can go in a .yml with its name, common to all its versions.
fecha() in the language of the page, with Spanish, Basque (“2025eko martxoaren 18a”) and English; also in single-language sites that are not in Spanish.
One sitemap with all the languages and one feed per language (/feed.xml, /eu/feed.xml).
The incremental build of ehundu servir knows which translations each page looks at and keeps giving the same as a full build (docs/compilacion.md (opens in a new tab)).
Changes for 0.2 sites: sitio.idioma is es if sitio.yml does not say otherwise, and the feed always carries xml:lang; a .yml inside contenido/ with the name of a page is no longer copied to salida/, because it holds its common fields; idioma becomes a reserved field; and two files for the same page in the same language (contacto.md and contacto.twig) stop the build.
This version on GitHub (opens in a new tab), with the ehundu.phar.