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
+87
View File
@@ -0,0 +1,87 @@
// Generated by scripts/i18n.py index — do not edit by hand.
import en_about from "./en/about.json";
import en_contact from "./en/contact.json";
import en_industries from "./en/industries.json";
import en_industries_automotive from "./en/industries_automotive.json";
import en_industries_b2b from "./en/industries_b2b.json";
import en_industries_creators from "./en/industries_creators.json";
import en_industries_e_commerce from "./en/industries_e-commerce.json";
import en_industries_home_services from "./en/industries_home-services.json";
import en_industries_hospitality from "./en/industries_hospitality.json";
import en_industries_medical_dental from "./en/industries_medical-dental.json";
import en_services from "./en/services.json";
import en_services_brand from "./en/services_brand.json";
import en_services_consulting from "./en/services_consulting.json";
import en_services_cybersecurity from "./en/services_cybersecurity.json";
import en_services_llmo from "./en/services_llmo.json";
import en_services_paid_media from "./en/services_paid-media.json";
import en_services_seo from "./en/services_seo.json";
import en_services_social_media from "./en/services_social-media.json";
import en_services_web_development from "./en/services_web-development.json";
export const content = {
en: {
"about": en_about,
"contact": en_contact,
"industries": en_industries,
"industries_automotive": en_industries_automotive,
"industries_b2b": en_industries_b2b,
"industries_creators": en_industries_creators,
"industries_e-commerce": en_industries_e_commerce,
"industries_home-services": en_industries_home_services,
"industries_hospitality": en_industries_hospitality,
"industries_medical-dental": en_industries_medical_dental,
"services": en_services,
"services_brand": en_services_brand,
"services_consulting": en_services_consulting,
"services_cybersecurity": en_services_cybersecurity,
"services_llmo": en_services_llmo,
"services_paid-media": en_services_paid_media,
"services_seo": en_services_seo,
"services_social-media": en_services_social_media,
"services_web-development": en_services_web_development,
},
es: {
"about": en_about,
"contact": en_contact,
"industries": en_industries,
"industries_automotive": en_industries_automotive,
"industries_b2b": en_industries_b2b,
"industries_creators": en_industries_creators,
"industries_e-commerce": en_industries_e_commerce,
"industries_home-services": en_industries_home_services,
"industries_hospitality": en_industries_hospitality,
"industries_medical-dental": en_industries_medical_dental,
"services": en_services,
"services_brand": en_services_brand,
"services_consulting": en_services_consulting,
"services_cybersecurity": en_services_cybersecurity,
"services_llmo": en_services_llmo,
"services_paid-media": en_services_paid_media,
"services_seo": en_services_seo,
"services_social-media": en_services_social_media,
"services_web-development": en_services_web_development,
},
ar: {
"about": en_about,
"contact": en_contact,
"industries": en_industries,
"industries_automotive": en_industries_automotive,
"industries_b2b": en_industries_b2b,
"industries_creators": en_industries_creators,
"industries_e-commerce": en_industries_e_commerce,
"industries_home-services": en_industries_home_services,
"industries_hospitality": en_industries_hospitality,
"industries_medical-dental": en_industries_medical_dental,
"services": en_services,
"services_brand": en_services_brand,
"services_consulting": en_services_consulting,
"services_cybersecurity": en_services_cybersecurity,
"services_llmo": en_services_llmo,
"services_paid-media": en_services_paid_media,
"services_seo": en_services_seo,
"services_social-media": en_services_social_media,
"services_web-development": en_services_web_development,
},
};