Static replacement for the WordPress + Polylang + synchronous DeepL stack: - Hugo config: es (default) / de / pt-br, siblings paired by filename basename, WP slugs preserved via /:slug/ permalinks - Theme: CSS ported verbatim from the WP theme; header/footer/lang-switcher and article templates ported from their PHP counterparts (no Google Fonts — zero third-party requests) - seo-head partial: hreflang + x-default, og:locale(:alternate), JSON-LD BlogPosting/Blog with inLanguage (ported from theme/inc/seo.php) - robots.txt AI-crawler allowlist + build-time llms.txt (ported from theme/inc/robots-and-llms.php) - scripts/translate.py: async DeepL step (tag_handling=html, protected community terms, manual_translation freeze, fail-loud, bot commits) - scripts/wp-to-hugo.py: one-shot WP REST → Hugo content converter - Decap CMS admin with Gitea backend, locally-bundled JS - .woodpecker.yml: translate → build → deploy (rsync to Caddy root) - Sample trilingual welcome post + acerca/contacto pages Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017z2rT1oN7vMS4ggo23n5WG
53 lines
2.0 KiB
YAML
53 lines
2.0 KiB
YAML
# Decap CMS configuration — Gitea backend (OAuth app registered in Gitea admin).
|
|
backend:
|
|
name: gitea
|
|
repo: pablo/vienalatina # owner/repo inside Gitea
|
|
branch: main
|
|
base_url: https://git.vienalatina.com
|
|
api_root: https://git.vienalatina.com/api/v1
|
|
app_id: REPLACE_WITH_GITEA_OAUTH_CLIENT_ID
|
|
|
|
site_url: https://vienalatina.com
|
|
display_url: https://vienalatina.com
|
|
|
|
media_folder: static/uploads
|
|
public_folder: /uploads
|
|
|
|
# Pablo authors Spanish sources only; CI generates the .de.md / .pt-br.md siblings.
|
|
collections:
|
|
- name: post
|
|
label: "Artículos"
|
|
label_singular: "Artículo"
|
|
folder: content/post
|
|
create: true
|
|
extension: md
|
|
format: yaml-frontmatter
|
|
slug: "{{slug}}.es"
|
|
filter: { field: lang, value: es }
|
|
fields:
|
|
- { name: title, label: "Título", widget: string }
|
|
- { name: date, label: "Fecha", widget: datetime }
|
|
- { name: lang, label: "Idioma", widget: hidden, default: es }
|
|
- { name: manual_translation, label: "Traducción manual (congelar)", widget: boolean, default: false, required: false }
|
|
- { name: categories, label: "Categorías", widget: select, multiple: true,
|
|
options: ["Turismo", "Cultura", "Gastronomía", "Comunidad", "Comercio"] }
|
|
- { name: description, label: "Resumen", widget: text, required: false }
|
|
- { name: image, label: "Imagen destacada", widget: image, required: false }
|
|
- { name: body, label: "Cuerpo", widget: markdown }
|
|
|
|
- name: page
|
|
label: "Páginas"
|
|
label_singular: "Página"
|
|
folder: content/page
|
|
create: true
|
|
extension: md
|
|
format: yaml-frontmatter
|
|
slug: "{{slug}}.es"
|
|
filter: { field: lang, value: es }
|
|
fields:
|
|
- { name: title, label: "Título", widget: string }
|
|
- { name: date, label: "Fecha", widget: datetime, required: false }
|
|
- { name: lang, label: "Idioma", widget: hidden, default: es }
|
|
- { name: manual_translation, label: "Traducción manual (congelar)", widget: boolean, default: false, required: false }
|
|
- { name: body, label: "Cuerpo", widget: markdown }
|