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
+4 -4
View File
@@ -1,9 +1,9 @@
import Link from "next/link";
import Image from "next/image";
export default function Logo() {
export default function Logo({ href, label }: { href: string; label: string }) {
return (
<Link href="/" className="logo" aria-label="AI Growth Technologies — home">
<Link href={href} className="logo" aria-label={label}>
<Image className="logo-mark" src="/logo-mark.png" alt="" width={229} height={192} priority />
<span className="logo-type">
<b>AI GROWTH</b>
@@ -13,9 +13,9 @@ export default function Logo() {
);
}
export function LogoStacked() {
export function LogoStacked({ href, label }: { href: string; label: string }) {
return (
<Link href="/" className="logo-stacked" aria-label="AI Growth Technologies — home">
<Link href={href} className="logo-stacked" aria-label={label}>
<Image src="/logo-stacked.png" alt="AI Growth Technologies" width={480} height={547} />
</Link>
);