Una plantilla nunca va a buscar nada. Recibe un conjunto de valores listos para usar — FolioPress lo llama el contexto — e imprime lo que necesita. Parte del conjunto es igual en todas las páginas; el resto depende de qué plantilla se está renderizando.
Común a todas las plantillas
Variable Qué es
page La página o entrada que se está viendo, ya en el idioma actual (ver más abajo). None en el archivo de etiquetas y en la búsqueda.
site_title, site_description, footer De los Ajustes del sitio, en el idioma actual. footer ya viene renderizado desde Markdown.
navigation_menu El menú configurado en la administración: una lista de {title, url, slug, page_id}, cada url lista para usar en este idioma.
languages Los idiomas del sitio, indexados por código. Cada entrada: code, name, native_name, short_code, menu_label, flag.
current_language, current_language_code, default_language_code El idioma que se está renderizando (con la misma forma que una entrada de languages), su código y el idioma principal del sitio.
language_switch_urls Indexado por código de idioma: la URL de esta misma página en ese idioma, slug traducido incluido.
home_url, url_language_code La página de inicio en el idioma actual (/ o /pt-pt) y el prefijo en minúsculas que debes poner delante de cualquier URL que construyas tú ('' para el idioma principal).
static_url, media_url Desde dónde se sirven los archivos de este tema (/static/<tema>) y dónde viven las imágenes subidas.
page_title, meta_description, canonical_url, hreflang_urls, social_image_url, twitter_card_type, json_ld Todo lo que necesita el <head>: un título de pestaña sensato, URLs canónica y alternativas por idioma absolutas, una imagen Open Graph y datos estructurados — todo precalculado.
theme_name, theme_info, theme_settings El nombre del tema activo, su theme.yml completo y su bloque settings.
t El traductor del propio tema: {{ t('Read more') }} busca la frase en locales/<idioma>.json (ver más abajo).
request La petición FastAPI, para el raro caso en que necesites la ruta o un parámetro de consulta.
El objeto page
Tiene la misma forma tanto si es una página, una entrada o un elemento de cualquier lista de entradas:
Campo Notas
title, slug, url En el idioma actual. url es completa, incluido el prefijo de idioma o el dominio propio del idioma.
content Ya convertido de Markdown a HTML — imprímelo con {{ page.content | safe }}.
excerpt, meta_description Formas cortas, en el idioma actual.
poster_image_url URL completa de la imagen de portada, o None.
gallery, content_gallery Listas de imágenes: {id, url, title, width, height, original_filename}. Usa image.url directamente.
tags {slug, title, url} por cada etiqueta pública. Las etiquetas privadas nunca se incluyen.
is_post, is_featured, published_at, created_at, updated_at Si es una entrada, si está destacada, y sus fechas.
id El id en la base de datos — útil para anclas y claves de caché.
Listas de entradas
Plantilla Variable Contenido
home.html posts (alias recent_posts), pages, is_home Entradas que comparten una etiqueta con la página de inicio, con el tamaño y orden de la sección home del theme.yml. Una página de inicio sin etiquetas no recibe entradas — etiquétala para llenarla.
page.html posts (alias page_posts) Entradas que comparten una etiqueta con esta página, de la sección page. Así es como una página “Blog” lista sus entradas.
post.html related_posts, is_post Otras entradas que comparten una etiqueta con esta, de la sección post.
tag.html tag (title, slug), posts Todas las entradas publicadas con esta etiqueta, de la sección tag.
search.html search_query, search_results, results_count El término buscado y las páginas y entradas coincidentes.
Cada lista de entradas viene con paginación de la misma forma: has_pagination, current_page, total_pages, has_previous, has_next, previous_page, next_page y pagination_urls con first, previous, next y last — None donde no hay a dónde ir. Con has_pagination desactivado en theme.yml, la lista simplemente se corta en posts y los indicadores quedan en falso.
Idiomas y el selector
Dos de los campos de idioma se calculan por ti. short_code es solo el código del idioma — EN — salvo que el sitio tenga activada también otra variante del mismo idioma, en cuyo caso conserva la región: EN-US y EN-GB. menu_label sigue la misma regla con nombres: English, o English (US) y English (UK). Es exactamente la regla que usa el selector de idioma de la propia administración, así que el sitio y la administración nunca discrepan en una etiqueta. Un selector completo es, por tanto, corto:
{% if languages | length > 1 %} <button type="button" aria-label="{{ t('Change language') }}"> {{ current_language.short_code }} </button> <ul> {% for lang in languages.values() | sort(attribute='menu_label') %} <li> {% if lang.code == current_language.code %} <span aria-current="true">{{ lang.menu_label }}</span> {% else %} <a href="{{ language_switch_urls[lang.code] }}" hreflang="{{ lang.code }}">{{ lang.menu_label }}</a> {% endif %} </li> {% endfor %} </ul> {% endif %}
language_switch_urls ya apunta a la misma página en cada idioma — el slug traducido, o la página de inicio si esa traducción aún no existe —, así que un selector nunca construye una URL por sí mismo.