Serve the site in English, Spanish and Arabic, add a captcha, make the message optional

- Move every route under app/[lang]; a proxy keeps English on unprefixed URLs and serves /es and /ar
- Interface strings and homepage copy per locale; content pages load a translated JSON when one exists
- Language switch in the header, hreflang alternates and a multilingual sitemap
- Right-to-left layout for Arabic with logical CSS properties, Noto Sans Arabic and no letter-spacing
- Self-hosted proof-of-work "I'm not a robot" check (no third-party account) replaces Turnstile
- The message field is optional; failed attempts refill the form instead of clearing it
This commit is contained in:
Alejandro Veras
2026-10-13 10:49:14 -04:00
parent 2f9b63ccac
commit 5bf472b735
65 changed files with 2386 additions and 756 deletions
+2 -2
View File
@@ -7,7 +7,7 @@ Usage:
Paragraphs that start with "> " were bold sentences in the deck and render as
emphasised lines. Each document follows the same conventions: bold all-caps lines are eyebrows
(when followed by a heading) or CTAs; Heading 1/2/3 give the structure.
The output lands in src/content/pages/<slug>.json. The homepage is hand-built
The output lands in src/content/pages/en/<slug>.json. The homepage is hand-built
and is skipped.
"""
@@ -18,7 +18,7 @@ import re
import sys
import zipfile
OUT = pathlib.Path(__file__).resolve().parent.parent / "src" / "content" / "pages"
OUT = pathlib.Path(__file__).resolve().parent.parent / "src" / "content" / "pages" / "en"
# Lines in the decks that are notes to the team, not site copy.
DROP = [