Um template nunca vai buscar nada. Recebe um conjunto de valores prontos a usar — o FolioPress chama-lhe o contexto — e imprime o que precisa. Parte do conjunto é igual em todas as páginas; o resto depende do template que está a ser renderizado.
Comum a todos os templates
Variável O que é
page A página ou artigo em exibição, já no idioma atual (ver abaixo). None no arquivo de etiquetas e na pesquisa.
site_title, site_description, footer Das Definições do site, no idioma atual. O footer já vem renderizado a partir de Markdown.
navigation_menu O menu configurado na administração: uma lista de {title, url, slug, page_id}, cada url pronto a usar neste idioma.
languages Os idiomas do site, indexados por código. Cada entrada: code, name, native_name, short_code, menu_label, flag.
current_language, current_language_code, default_language_code O idioma a ser renderizado (com a mesma forma de uma entrada de languages), o seu código e o idioma principal do site.
language_switch_urls Indexado por código de idioma: o URL desta mesma página nesse idioma, slug traduzido incluído.
home_url, url_language_code A página inicial no idioma atual (/ ou /pt-pt) e o prefixo em minúsculas a pôr à frente de qualquer URL que construa por si ('' para o idioma principal).
static_url, media_url De onde são servidos os ficheiros deste tema (/static/<tema>) e onde vivem as imagens carregadas.
page_title, meta_description, canonical_url, hreflang_urls, social_image_url, twitter_card_type, json_ld Tudo o que o <head> precisa: um título de separador sensato, URLs canónico e alternativos por idioma absolutos, uma imagem Open Graph e dados estruturados — tudo pré-calculado.
theme_name, theme_info, theme_settings O nome do tema ativo, o seu theme.yml completo e o bloco settings.
t O tradutor do próprio tema: {{ t('Read more') }} procura a frase em locales/<idioma>.json (ver abaixo).
request O pedido FastAPI, para o raro caso em que precisa do caminho ou de um parâmetro.
O objeto page
Tem a mesma forma quer seja uma página, um artigo ou uma entrada em qualquer lista de artigos:
Campo Notas
title, slug, url No idioma atual. O url é completo, incluindo o prefixo de idioma ou o domínio próprio do idioma.
content Já convertido de Markdown para HTML — imprima-o com {{ page.content | safe }}.
excerpt, meta_description Formas curtas, no idioma atual.
poster_image_url URL completo da imagem de capa, ou None.
gallery, content_gallery Listas de imagens: {id, url, title, width, height, original_filename}. Use image.url diretamente.
tags {slug, title, url} para cada etiqueta pública. As etiquetas privadas nunca são incluídas.
is_post, is_featured, published_at, created_at, updated_at Se é um artigo, se está em destaque, e as suas datas.
id O id na base de dados — útil para âncoras e chaves de cache.
Listas de artigos
Template Variável Conteúdo
home.html posts (alias recent_posts), pages, is_home Artigos que partilham uma etiqueta com a página inicial, na quantidade e ordem da secção home do theme.yml. Uma página inicial sem etiquetas não recebe artigos — etiquete-a para a preencher.
page.html posts (alias page_posts) Artigos que partilham uma etiqueta com esta página, da secção page. É assim que uma página “Blogue” lista os seus artigos.
post.html related_posts, is_post Outros artigos que partilham uma etiqueta com este, da secção post.
tag.html tag (title, slug), posts Todos os artigos publicados com esta etiqueta, da secção tag.
search.html search_query, search_results, results_count O termo pesquisado e as páginas e artigos correspondentes.
Cada lista de artigos vem com paginação na mesma forma: has_pagination, current_page, total_pages, has_previous, has_next, previous_page, next_page e pagination_urls com first, previous, next e last — None onde não há para onde ir. Com has_pagination desligado no theme.yml, a lista é simplesmente cortada em posts e os indicadores ficam a falso.
Idiomas e o seletor
Dois dos campos de idioma são calculados por si. short_code é só o código do idioma — EN — a menos que o site tenha também outra variante do mesmo idioma ativa, caso em que mantém a região: EN-US e EN-GB. menu_label segue a mesma regra com nomes: English, ou English (US) e English (UK). É exatamente a regra que o seletor de idioma da própria administração usa, pelo que o site e a administração nunca discordam de um rótulo. Um seletor completo é, por isso, curto:
{% 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 %}
O language_switch_urls já aponta para a mesma página em cada idioma — o slug traduzido, ou a página inicial se essa tradução ainda não existir —, pelo que um seletor nunca constrói um URL por si.