From f33d29fe7b2bd4a4b02d2f1e2e9fbdc9bcf1eb9c Mon Sep 17 00:00:00 2001 From: Javaxman Date: Fri, 24 Apr 2026 20:59:53 +0200 Subject: [PATCH 1/4] Rende operativa la pagina news e sostituisce il README starter con un runbook di progetto. Allinea la documentazione a setup, deploy Cloudflare e gestione contatti per supportare il go-live. Made-with: Cursor --- README.md | 145 +++++++++++++++++++++++-------------------- src/pages/news.astro | 31 +++++++-- 2 files changed, 102 insertions(+), 74 deletions(-) diff --git a/README.md b/README.md index a6105e9..c256778 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,71 @@ -# Astro Starter Kit: Minimal +# NexStudio Website Runbook -```sh -npm create astro@latest -- --template minimal -``` +Sito istituzionale NexStudio basato su Astro, con deploy su Cloudflare e form contatti protetto da Turnstile. -> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! +## Obiettivo del repository -## 🚀 Project Structure +- Presentazione aziendale e servizi (homepage e pagine legali). +- Entry point unico per richieste commerciali e supporto. +- Base pronta per contenuti multilingua IT/EN/TH. +- Pipeline di deploy stabile su Cloudflare. -Inside of your Astro project, you'll see the following folders and files: +## Stack tecnico -```text -/ -├── public/ -├── src/ -│ └── pages/ -│ └── index.astro -└── package.json -``` +- Astro + Tailwind CSS +- Adapter Cloudflare (`@astrojs/cloudflare`) +- Sitemap (`@astrojs/sitemap`) +- Form backend su endpoint `/api/contact` +- Turnstile + Resend per anti-spam e invio email -Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name. +## Struttura essenziale -There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components. +- `src/pages/`: pagine pubbliche e route API (`src/pages/api/contact.ts`) +- `src/components/`: componenti UI condivisi +- `src/data/`: contenuti testuali e configurazioni pagine +- `public/`: asset statici (loghi, immagini, robots) +- `.env.example`: variabili locali di riferimento -Any static assets, like images, can be placed in the `public/` directory. +## Prerequisiti -## 🧞 Commands +- Node.js 20+ +- npm 10+ +- Account Cloudflare (Pages/Workers + Turnstile) +- Account Resend (API key + sender verificato) -All commands are run from the root of the project, from a terminal: +## Avvio locale -| Command | Action | -| :------------------------ | :----------------------------------------------- | -| `npm install` | Installs dependencies | -| `npm run dev` | Starts local dev server at `localhost:4321` | -| `npm run build` | Build your production site to `./dist/` | -| `npm run preview` | Preview your build locally, before deploying | -| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | -| `npm run astro -- --help` | Get help using the Astro CLI | +1. Installazione dipendenze: + - `npm install` +2. Copia variabili di ambiente: + - copia `.env.example` in `.env` +3. Avvio sviluppo: + - `npm run dev` +4. Se Vite resta in cache incoerente: + - `npm run dev:fresh` -## 👀 Want to learn more? +## Comandi utili -Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). +- `npm run dev`: sviluppo locale +- `npm run dev:fresh`: reset cache `.vite` e `.astro` + avvio dev server +- `npm run build`: build produzione +- `npm run preview`: preview locale della build +- `npm run deploy:cf`: build + deploy con wrangler su output Astro -## Cloudflare deploy notes +## Configurazione contatti -If you deploy with Wrangler in CI/Cloudflare, build first and deploy using Astro's generated Worker config: +Variabili pubbliche (frontend): -- Build command: `npm run build` -- Deploy command: `npm run deploy:cf` - -This avoids entrypoint errors like `@astrojs/cloudflare/entrypoints/server` not found. - -## Contact form configuration - -Set these variables for the website contact form. - -Public (frontend): - -- `PUBLIC_CONTACT_FORM_ACTION_URL` (default `/api/contact`) -- `PUBLIC_CONTACT_FORM_SUCCESS_REDIRECT` (absolute URL for `_next`) -- `PUBLIC_CONTACT_FORM_MAILTO` (fallback only if `ACTION_URL` is empty) +- `PUBLIC_CONTACT_FORM_ACTION_URL` (default consigliato: `/api/contact`) +- `PUBLIC_CONTACT_FORM_SUCCESS_REDIRECT` (URL assoluto della pagina post-submit) +- `PUBLIC_CONTACT_FORM_MAILTO` (fallback se action URL non disponibile) - `PUBLIC_CONTACT_TURNSTILE_SITE_KEY` -Server-side (Cloudflare runtime / local `.env`): +Variabili server (Cloudflare/local): -- `CONTACT_FORM_MODE` (`dev` or `live`) +- `CONTACT_FORM_MODE` (`dev` oppure `live`) - `CONTACT_FORM_RESEND_API_KEY` -- `CONTACT_FORM_FROM_EMAIL` (verified sender in Resend, recommended `no-reply@nexstudio.com`) -- `CONTACT_FORM_TO_EMAIL` (default recipient inbox or alias, recommended `info@nexstudio.com`) +- `CONTACT_FORM_FROM_EMAIL` (consigliato: `no-reply@nexstudio.ai`) +- `CONTACT_FORM_TO_EMAIL` (default destinatario, es. `info@nexstudio.ai`) - `CONTACT_FORM_TO_EMAIL_SUPPORT` - `CONTACT_FORM_TO_EMAIL_PRIVACY` - `CONTACT_FORM_TO_EMAIL_SECURITY` @@ -76,29 +74,40 @@ Server-side (Cloudflare runtime / local `.env`): - `CONTACT_FORM_TO_EMAIL_HR` - `CONTACT_TURNSTILE_SECRET_KEY` -Mode behavior: +Comportamento: -- `dev`: accepts form and logs payload server-side (no real email send) -- `live`: verifies Turnstile (if secret configured) and sends via Resend API +- `dev`: accetta submit e scrive payload nei log (senza invio reale) +- `live`: valida Turnstile e invia email via Resend -Department routing: +## Deploy Cloudflare -- the contact form includes a department selector -- if a department-specific env is set, the email is routed to that recipient -- otherwise it falls back to `CONTACT_FORM_TO_EMAIL` +Impostazioni consigliate: -Suggested operational use: +- Build command: `npm run build` +- Deploy command: `npm run deploy:cf` -- `info@...` for prospects and generic clarifications (non-clients) -- `support@...` for existing customers -- `no-reply@...` as sender for newsletters and automated communications +Questa configurazione evita errori tipo: +`The entry-point file at "@astrojs/cloudflare/entrypoints/server" was not found.` -Copy `.env.example` to `.env` for local development and configure the same keys in Cloudflare Pages/Workers for production. +## Dominio e sicurezza -## Production domain - -- Official domain: `https://nexstudio.ai` -- Keep Turnstile widget hostnames aligned with: +- Dominio ufficiale: `https://nexstudio.ai` +- Hostname Turnstile da mantenere allineati: - `nexstudio.ai` - - `www.nexstudio.ai` (if used) - - `localhost` (for local testing) + - `www.nexstudio.ai` (se usato) + - `localhost` (test locale) +- Accesso pre-go-live gestito con Cloudflare Zero Trust Access + +## Stato operativo attuale + +- Issue #1 (contact form live): implementata +- Issue #2 (anti-spam Turnstile): implementata +- Issue #3 (SEO base): implementata (sitemap, robots, canonical/OG/Twitter) +- Issue #4: in avanzamento (contenuti non placeholder) +- Issue #5: da completare (localizzazione reale IT/EN/TH) + +## Note operative + +- Per modifiche non minori usare branch dedicato (`feat/*`, `fix/*`) e merge su `main` dopo verifica. +- Evitare commit su `main` per attivita complesse. +- Rigenerare eventuali API key esposte e aggiornare subito i secret su Cloudflare. diff --git a/src/pages/news.astro b/src/pages/news.astro index a1a0e1d..b01f530 100644 --- a/src/pages/news.astro +++ b/src/pages/news.astro @@ -6,13 +6,32 @@ import SubpageLayout from '../layouts/SubpageLayout.astro'; title="Novità — NexStudio" description="Novità, release e articoli da NexStudio." heading="Novità" - lead="Hub comunicazioni: collegate qui il vostro blog CMS, oppure elencate manualmente le notizie." + lead="Aggiornamenti ufficiali su piattaforma, compliance, infrastruttura e contenuti editoriali." > -

- Quando avrete contenuti da pubblicare (release di prodotto, note di - conformità, eventi), potete sostituire questa pagina con una raccolta - articoli Astro, un redirect verso Medium/Substack, o un headless CMS. +

+ Stato editoriale: canale attivo. Le prossime pubblicazioni verranno aggiornate su questa pagina con frequenza periodica.

+ +

Programma editoriale

+ + +

Canali di distribuzione

+ +

Archivio

-

Nessuna news pubblicata per il momento.

+

+ In questa fase il sito e in pre-lancio operativo. Il primo blocco di news verra pubblicato con il go-live ufficiale. +

+

+ Per richieste stampa, partnership o approfondimenti tecnici e possibile usare il form nella sezione + Contatti. +

From ddab32d3efc31e0f937326f479a6c9697d71ac76 Mon Sep 17 00:00:00 2001 From: Javaxman Date: Fri, 24 Apr 2026 21:32:15 +0200 Subject: [PATCH 2/4] Riduce il routing del contact form pubblico a info, privacy e careers. Allinea backend, configurazione env e documentazione al nuovo modello vetrina con destinatari meno granulari. Made-with: Cursor --- .env.example | 7 ++----- README.md | 20 +++++++++++++++----- src/data/home/cta.ts | 12 ++++-------- src/pages/api/contact.ts | 9 +++------ 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.env.example b/.env.example index aef0b21..e3ce163 100644 --- a/.env.example +++ b/.env.example @@ -7,10 +7,7 @@ CONTACT_FORM_MODE=dev CONTACT_FORM_RESEND_API_KEY= CONTACT_FORM_FROM_EMAIL=no-reply@nexstudio.com CONTACT_FORM_TO_EMAIL=info@nexstudio.com -CONTACT_FORM_TO_EMAIL_SUPPORT=support@nexstudio.com +CONTACT_FORM_TO_EMAIL_INFO=info@nexstudio.com CONTACT_FORM_TO_EMAIL_PRIVACY= -CONTACT_FORM_TO_EMAIL_SECURITY= -CONTACT_FORM_TO_EMAIL_ETHICS= -CONTACT_FORM_TO_EMAIL_LEGAL= -CONTACT_FORM_TO_EMAIL_HR= +CONTACT_FORM_TO_EMAIL_CAREERS= CONTACT_TURNSTILE_SECRET_KEY= diff --git a/README.md b/README.md index c256778..3a175f8 100644 --- a/README.md +++ b/README.md @@ -66,12 +66,9 @@ Variabili server (Cloudflare/local): - `CONTACT_FORM_RESEND_API_KEY` - `CONTACT_FORM_FROM_EMAIL` (consigliato: `no-reply@nexstudio.ai`) - `CONTACT_FORM_TO_EMAIL` (default destinatario, es. `info@nexstudio.ai`) -- `CONTACT_FORM_TO_EMAIL_SUPPORT` +- `CONTACT_FORM_TO_EMAIL_INFO` (opzionale, override esplicito per area "info") - `CONTACT_FORM_TO_EMAIL_PRIVACY` -- `CONTACT_FORM_TO_EMAIL_SECURITY` -- `CONTACT_FORM_TO_EMAIL_ETHICS` -- `CONTACT_FORM_TO_EMAIL_LEGAL` -- `CONTACT_FORM_TO_EMAIL_HR` +- `CONTACT_FORM_TO_EMAIL_CAREERS` - `CONTACT_TURNSTILE_SECRET_KEY` Comportamento: @@ -79,6 +76,19 @@ Comportamento: - `dev`: accetta submit e scrive payload nei log (senza invio reale) - `live`: valida Turnstile e invia email via Resend +Routing pubblico consigliato (portale vetrina): + +- `info`: informazioni generali/commerciali +- `privacy`: richieste privacy e diritti interessato +- `careers`: candidature e collaborazioni + +Indirizzi consigliati portale: + +- `info@nexstudio.ai` +- `privacy@nexstudio.ai` +- `careers@nexstudio.ai` +- `no-reply@nexstudio.ai` (solo invio comunicazioni/newsletter, non destinazione inbound) + ## Deploy Cloudflare Impostazioni consigliate: diff --git a/src/data/home/cta.ts b/src/data/home/cta.ts index 746f3a1..1ead7e6 100644 --- a/src/data/home/cta.ts +++ b/src/data/home/cta.ts @@ -30,7 +30,7 @@ export const cta = { nameLabel: 'Nome', companyLabel: 'Azienda (opzionale)', countryLabel: 'Paese', - departmentLabel: 'Reparto', + departmentLabel: 'Area', emailLabel: 'Email', messageLabel: 'Scrivi qui il tuo messaggio', submitLabel: 'Invia messaggio', @@ -54,13 +54,9 @@ export const cta = { fieldEmail: 'email', fieldMessage: 'message', departmentOptions: [ - { value: 'general', label: 'Generale' }, - { value: 'support', label: 'Support' }, - { value: 'privacy', label: 'Privacy / DPO' }, - { value: 'security', label: 'Security / Incident Response' }, - { value: 'ethics', label: 'Segnalazioni confidenziali (Ethics)' }, - { value: 'legal', label: 'Legal' }, - { value: 'hr', label: 'HR' }, + { value: 'info', label: 'Informazioni generali e commerciali' }, + { value: 'privacy', label: 'Privacy' }, + { value: 'careers', label: 'Careers / Collaborazioni' }, ], }, } as const; diff --git a/src/pages/api/contact.ts b/src/pages/api/contact.ts index f69dd38..2d86cf7 100644 --- a/src/pages/api/contact.ts +++ b/src/pages/api/contact.ts @@ -82,12 +82,9 @@ async function sendWithResend(apiKey: string, fromEmail: string, toEmail: string function resolveDepartmentRecipient(runtimeEnv: RuntimeEnv, defaultRecipient: string, department: string): string { const normalized = department.trim().toLowerCase(); const map: Record = { - support: readEnv('CONTACT_FORM_TO_EMAIL_SUPPORT', runtimeEnv), + info: readEnv('CONTACT_FORM_TO_EMAIL_INFO', runtimeEnv) || defaultRecipient, privacy: readEnv('CONTACT_FORM_TO_EMAIL_PRIVACY', runtimeEnv), - security: readEnv('CONTACT_FORM_TO_EMAIL_SECURITY', runtimeEnv), - ethics: readEnv('CONTACT_FORM_TO_EMAIL_ETHICS', runtimeEnv), - legal: readEnv('CONTACT_FORM_TO_EMAIL_LEGAL', runtimeEnv), - hr: readEnv('CONTACT_FORM_TO_EMAIL_HR', runtimeEnv), + careers: readEnv('CONTACT_FORM_TO_EMAIL_CAREERS', runtimeEnv), }; return map[normalized] || defaultRecipient; } @@ -111,7 +108,7 @@ export const POST: APIRoute = async ({ request, locals, url }) => { const company = required(form.get('company')); const email = required(form.get('email')); const country = required(form.get('country')); - const department = required(form.get('department')) || 'general'; + const department = required(form.get('department')) || 'info'; const message = required(form.get('message')); if (!name || !email || !country || !message) { From 0714ec13354d0a7c3e1d971bca30e9da3ad23a2e Mon Sep 17 00:00:00 2001 From: Javaxman Date: Mon, 27 Apr 2026 09:12:00 +0200 Subject: [PATCH 3/4] Avvia i18n reale della home su IT EN TH. Introduco contenuti localizzati per menu, footer e principali sezioni della homepage, includendo il form contatti e i messaggi client per mantenere coerenza UX tra le tre lingue. Made-with: Cursor --- src/components/ContactFormInline.astro | 20 +- src/components/SiteFooter.astro | 18 +- src/data/home/cta.ts | 211 +++++++++++++++----- src/data/home/faq.ts | 191 +++++++++++++----- src/data/home/footer.ts | 259 +++++++++++++++++-------- src/data/home/hero.ts | 110 ++++++++--- src/data/home/index.ts | 8 + src/data/home/navigation.ts | 88 +++++++-- src/data/home/services.ts | 192 +++++++++++++----- src/data/home/site-meta.ts | 27 ++- src/data/home/stack.ts | 170 +++++++++++++++- src/layouts/SubpageLayout.astro | 8 +- src/pages/index.astro | 40 ++-- src/scripts/nx-contact-form.ts | 34 +++- 14 files changed, 1068 insertions(+), 308 deletions(-) diff --git a/src/components/ContactFormInline.astro b/src/components/ContactFormInline.astro index 82ed22d..54ad4f9 100644 --- a/src/components/ContactFormInline.astro +++ b/src/components/ContactFormInline.astro @@ -1,5 +1,10 @@ --- -import { cta } from '../data/home'; +import { getCta } from '../data/home'; + +const path = Astro.url.pathname; +const localeMatch = path.match(/^\/(en|th)(\/|$)/); +const currentLocale = (localeMatch?.[1] ?? 'it') as 'it' | 'en' | 'th'; +const cta = getCta(currentLocale); const cf = cta.contactForm; const model = { @@ -14,6 +19,15 @@ const model = { fieldDepartment: cf.fieldDepartment, fieldEmail: cf.fieldEmail, fieldMessage: cf.fieldMessage, + turnstileError: cf.errors.turnstile, + configError: cf.errors.config, + mailtoFallbackSubject: cf.mailtoFallbackSubject, + mailtoLabelName: cf.mailtoLabels.name, + mailtoLabelCompany: cf.mailtoLabels.company, + mailtoLabelEmail: cf.mailtoLabels.email, + mailtoLabelCountry: cf.mailtoLabels.country, + mailtoLabelDepartment: cf.mailtoLabels.department, + mailtoDefaultDepartment: cf.mailtoLabels.defaultDepartment, }; const hasFormspree = typeof cf.actionUrl === 'string' && cf.actionUrl.length > 0; @@ -203,11 +217,11 @@ const fieldClass = class="cf-turnstile" data-sitekey={cf.turnstileSiteKey} data-theme="dark" - data-language="it" + data-language={cf.turnstileLanguage} data-size="normal" >

- Verifica anti-spam: completa il controllo prima di inviare il messaggio. + {cf.turnstileHint}

) : null diff --git a/src/components/SiteFooter.astro b/src/components/SiteFooter.astro index 3e7e9b0..0df5cf8 100644 --- a/src/components/SiteFooter.astro +++ b/src/components/SiteFooter.astro @@ -1,5 +1,10 @@ --- -import { footer } from '../data/home'; +import { getFooter } from '../data/home'; + +const path = Astro.url.pathname; +const localeMatch = path.match(/^\/(en|th)(\/|$)/); +const currentLocale = (localeMatch?.[1] ?? 'it') as 'it' | 'en' | 'th'; +const footer = getFooter(currentLocale); const hasNewsletterAction = typeof footer.newsletter.actionUrl === 'string' && @@ -17,9 +22,6 @@ const notifySubject = const linkClass = 'text-sm text-sky-400/90 transition-colors hover:text-sky-300'; -const path = Astro.url.pathname; -const localeMatch = path.match(/^\/(en|th)(\/|$)/); -const currentLocale = localeMatch?.[1] ?? 'it'; const withLocale = (href: string) => { if (currentLocale === 'it') return href; if (href.startsWith(`/${currentLocale}`)) return href; @@ -91,7 +93,7 @@ const withLocale = (href: string) => { ) : ( {item.label} @@ -115,7 +117,7 @@ const withLocale = (href: string) => { {link.label} ) : ( - + {link.label} )} @@ -131,7 +133,7 @@ const withLocale = (href: string) => { >

- Impostazioni cookie + {footer.labels.cookieTitle}

{footer.cookiePreferences.hint} @@ -204,7 +206,7 @@ const withLocale = (href: string) => { {nl.buttonLabel}

- Iscrizione in arrivo: configura l’endpoint nel progetto per attivare il modulo. + {footer.labels.newsletterComingSoon}

) diff --git a/src/data/home/cta.ts b/src/data/home/cta.ts index 1ead7e6..43662e9 100644 --- a/src/data/home/cta.ts +++ b/src/data/home/cta.ts @@ -5,58 +5,165 @@ const contactSuccessRedirect = (env.PUBLIC_CONTACT_FORM_SUCCESS_REDIRECT ?? ''). const contactMailto = (env.PUBLIC_CONTACT_FORM_MAILTO ?? '').trim(); const contactTurnstileSiteKey = (env.PUBLIC_CONTACT_TURNSTILE_SITE_KEY ?? '').trim(); -export const cta = { - /** Riga sezione (stesso ruolo di FAQ, Stack, â€Ķ) */ - eyebrow: 'Contatti', +import type { SupportedLocale } from './navigation'; - /** Titolo CTA su due righe (dopo il punto) */ - titleLine1: 'Automatizza il complesso.', - titleLine2: 'Velocizza il processo.', - body: - 'Dai modelli LLM alla distribuzione globale in pochi millisecondi. La directory definitiva per il LegalTech e MedTech. Utilizza il modulo contatto qui a fianco e ti forniremo tutti i chiarimenti che ti servono.', - - /** - * Modulo contatti in pagina (sezione Contatti). - * - * **Formspree:** crea un form su https://formspree.io e incolla l’URL in `actionUrl`. - * **Solo mailto:** lascia `actionUrl` vuoto e imposta `mailto` con l’indirizzo destinatario - * (si apre il client di posta dell’utente). - */ - contactForm: { - /** Lasciare vuoti endpoint/chiavi nelle fasi di sola UI. */ - title: 'Parliamone', - description: - 'Lascia i tuoi dati e il messaggio: ti risponde il team NexStudio.', - nameLabel: 'Nome', - companyLabel: 'Azienda (opzionale)', - countryLabel: 'Paese', - departmentLabel: 'Area', - emailLabel: 'Email', - messageLabel: 'Scrivi qui il tuo messaggio', - submitLabel: 'Invia messaggio', - /** Formspree: `https://formspree.io/f/xxxx` — valorizzato via `PUBLIC_CONTACT_FORM_ACTION_URL` */ - actionUrl: contactActionUrl, - /** Formspree `_next` — URL assoluta in produzione (`PUBLIC_CONTACT_FORM_SUCCESS_REDIRECT`) */ - successRedirect: contactSuccessRedirect, - /** - * Cloudflare Turnstile (anti-spam): inserisci qui la site key pubblica. - * Se vuota, il CAPTCHA non viene mostrato. - */ - turnstileSiteKey: contactTurnstileSiteKey, - /** Formspree `_subject` e oggetto mailto */ - notifySubject: 'Richiesta contatto — sito NexStudio', - /** Fallback se `actionUrl` e' vuoto (`PUBLIC_CONTACT_FORM_MAILTO`) */ - mailto: contactMailto, - fieldName: 'name', - fieldCompany: 'company', - fieldCountry: 'country', - fieldDepartment: 'department', - fieldEmail: 'email', - fieldMessage: 'message', - departmentOptions: [ - { value: 'info', label: 'Informazioni generali e commerciali' }, - { value: 'privacy', label: 'Privacy' }, - { value: 'careers', label: 'Careers / Collaborazioni' }, - ], +const ctaByLocale = { + it: { + eyebrow: 'Contatti', + titleLine1: 'Automatizza il complesso.', + titleLine2: 'Velocizza il processo.', + body: + 'Dai modelli LLM alla distribuzione globale in pochi millisecondi. La directory definitiva per il LegalTech e MedTech. Utilizza il modulo contatto qui a fianco e ti forniremo tutti i chiarimenti che ti servono.', + contactForm: { + title: 'Parliamone', + description: + 'Lascia i tuoi dati e il messaggio: ti risponde il team NexStudio.', + nameLabel: 'Nome', + companyLabel: 'Azienda (opzionale)', + countryLabel: 'Paese', + departmentLabel: 'Area', + emailLabel: 'Email', + messageLabel: 'Scrivi qui il tuo messaggio', + submitLabel: 'Invia messaggio', + actionUrl: contactActionUrl, + successRedirect: contactSuccessRedirect, + turnstileSiteKey: contactTurnstileSiteKey, + turnstileLanguage: 'it', + turnstileHint: + 'Verifica anti-spam: completa il controllo prima di inviare il messaggio.', + notifySubject: 'Richiesta contatto — sito NexStudio', + mailto: contactMailto, + mailtoFallbackSubject: 'Contatto sito', + mailtoLabels: { + name: 'Nome', + company: 'Azienda', + email: 'Email', + country: 'Paese', + department: 'Area', + defaultDepartment: 'general', + }, + errors: { + turnstile: 'Completa il controllo anti-spam prima di inviare il messaggio.', + config: + 'Configura `contactForm.actionUrl` (Formspree) o `contactForm.mailto` in `src/data/home/cta.ts`.', + }, + fieldName: 'name', + fieldCompany: 'company', + fieldCountry: 'country', + fieldDepartment: 'department', + fieldEmail: 'email', + fieldMessage: 'message', + departmentOptions: [ + { value: 'info', label: 'Informazioni generali e commerciali' }, + { value: 'privacy', label: 'Privacy' }, + { value: 'careers', label: 'Careers / Collaborazioni' }, + ], + }, + }, + en: { + eyebrow: 'Contacts', + titleLine1: 'Automate complexity.', + titleLine2: 'Accelerate operations.', + body: + 'From LLM models to global distribution in milliseconds. Use the contact form and our team will provide all the details you need.', + contactForm: { + title: 'Let’s talk', + description: 'Share your details and message: the NexStudio team will reply.', + nameLabel: 'Name', + companyLabel: 'Company (optional)', + countryLabel: 'Country', + departmentLabel: 'Area', + emailLabel: 'Email', + messageLabel: 'Write your message', + submitLabel: 'Send message', + actionUrl: contactActionUrl, + successRedirect: contactSuccessRedirect, + turnstileSiteKey: contactTurnstileSiteKey, + turnstileLanguage: 'en', + turnstileHint: + 'Anti-spam verification: complete the challenge before sending your message.', + notifySubject: 'Contact request — NexStudio website', + mailto: contactMailto, + mailtoFallbackSubject: 'Website contact', + mailtoLabels: { + name: 'Name', + company: 'Company', + email: 'Email', + country: 'Country', + department: 'Area', + defaultDepartment: 'general', + }, + errors: { + turnstile: 'Complete the anti-spam check before sending your message.', + config: + 'Configure `contactForm.actionUrl` (Formspree) or `contactForm.mailto` in `src/data/home/cta.ts`.', + }, + fieldName: 'name', + fieldCompany: 'company', + fieldCountry: 'country', + fieldDepartment: 'department', + fieldEmail: 'email', + fieldMessage: 'message', + departmentOptions: [ + { value: 'info', label: 'General and commercial information' }, + { value: 'privacy', label: 'Privacy' }, + { value: 'careers', label: 'Careers / Collaborations' }, + ], + }, + }, + th: { + eyebrow: 'āļ•āļīāļ”āļ•āđˆāļ­', + titleLine1: 'āļ—āļģāļ‡āļēāļ™āļ‹āļąāļšāļ‹āđ‰āļ­āļ™āđƒāļŦāđ‰āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī', + titleLine2: 'āđ€āļĢāđˆāļ‡āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢ', + body: + 'āļˆāļēāļāđ‚āļĄāđ€āļ”āļĨ LLM āļŠāļđāđˆāļāļēāļĢāļāļĢāļ°āļˆāļēāļĒāļĢāļ°āļšāļšāļĢāļ°āļ”āļąāļšāđ‚āļĨāļāļ āļēāļĒāđƒāļ™āđ„āļĄāđˆāļāļĩāđˆāļĄāļīāļĨāļĨāļīāļ§āļīāļ™āļēāļ—āļĩ āđƒāļŠāđ‰āļŸāļ­āļĢāđŒāļĄāļ•āļīāļ”āļ•āđˆāļ­āļ”āđ‰āļēāļ™āļ‚āđ‰āļēāļ‡ āđāļĨāđ‰āļ§āļ—āļĩāļĄ NexStudio āļˆāļ°āļ•āļ­āļšāļāļĨāļąāļšāļžāļĢāđ‰āļ­āļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ„āļļāļ“āļ•āđ‰āļ­āļ‡āļāļēāļĢ', + contactForm: { + title: 'āļ„āļļāļĒāļāļąāļšāđ€āļĢāļē', + description: 'āļāļĢāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ āđāļĨāđ‰āļ§āļ—āļĩāļĄ NexStudio āļˆāļ°āļ•āļīāļ”āļ•āđˆāļ­āļāļĨāļąāļš', + nameLabel: 'āļŠāļ·āđˆāļ­', + companyLabel: 'āļšāļĢāļīāļĐāļąāļ— (āđ„āļĄāđˆāļšāļąāļ‡āļ„āļąāļš)', + countryLabel: 'āļ›āļĢāļ°āđ€āļ—āļĻ', + departmentLabel: 'āđāļœāļ™āļ', + emailLabel: 'āļ­āļĩāđ€āļĄāļĨ', + messageLabel: 'āļžāļīāļĄāļžāđŒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ‚āļ­āļ‡āļ„āļļāļ“', + submitLabel: 'āļŠāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ', + actionUrl: contactActionUrl, + successRedirect: contactSuccessRedirect, + turnstileSiteKey: contactTurnstileSiteKey, + turnstileLanguage: 'th', + turnstileHint: 'āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ›āđ‰āļ­āļ‡āļāļąāļ™āļŠāđāļ›āļĄ: āļāļĢāļļāļ“āļēāļ—āļģāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļŦāđ‰āđ€āļŠāļĢāđ‡āļˆāļāđˆāļ­āļ™āļŠāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ', + notifySubject: 'āļ„āļģāļ‚āļ­āļ•āļīāļ”āļ•āđˆāļ­ â€” āđ€āļ§āđ‡āļšāđ„āļ‹āļ•āđŒ NexStudio', + mailto: contactMailto, + mailtoFallbackSubject: 'āļ•āļīāļ”āļ•āđˆāļ­āļˆāļēāļāđ€āļ§āđ‡āļšāđ„āļ‹āļ•āđŒ', + mailtoLabels: { + name: 'āļŠāļ·āđˆāļ­', + company: 'āļšāļĢāļīāļĐāļąāļ—', + email: 'āļ­āļĩāđ€āļĄāļĨ', + country: 'āļ›āļĢāļ°āđ€āļ—āļĻ', + department: 'āđāļœāļ™āļ', + defaultDepartment: 'general', + }, + errors: { + turnstile: 'āļāļĢāļļāļ“āļēāļĒāļ·āļ™āļĒāļąāļ™āļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™āļŠāđāļ›āļĄāļāđˆāļ­āļ™āļŠāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ', + config: + 'āļāļĢāļļāļ“āļēāļ•āļąāđ‰āļ‡āļ„āđˆāļē `contactForm.actionUrl` (Formspree) āļŦāļĢāļ·āļ­ `contactForm.mailto` āđƒāļ™ `src/data/home/cta.ts`', + }, + fieldName: 'name', + fieldCompany: 'company', + fieldCountry: 'country', + fieldDepartment: 'department', + fieldEmail: 'email', + fieldMessage: 'message', + departmentOptions: [ + { value: 'info', label: 'āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđˆāļ§āđ„āļ›āđāļĨāļ°āđ€āļŠāļīāļ‡āļžāļēāļ“āļīāļŠāļĒāđŒ' }, + { value: 'privacy', label: 'āļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ•āļąāļ§' }, + { value: 'careers', label: 'Careers / Collaborations' }, + ], + }, }, } as const; + +export const getCta = (locale: SupportedLocale) => ctaByLocale[locale]; + +/** Retro-compatibilità: fallback italiano. */ +export const cta = ctaByLocale.it; diff --git a/src/data/home/faq.ts b/src/data/home/faq.ts index e59e54c..e5ca8b7 100644 --- a/src/data/home/faq.ts +++ b/src/data/home/faq.ts @@ -1,47 +1,148 @@ +import type { SupportedLocale } from './navigation'; + /** FAQ — domande/risposte allineate a hero, prodotti, servizi e stack */ -export const faq = { - eyebrow: 'FAQ', - title: 'Domande frequenti', - items: [ - { - question: 'Che tipo di organizzazioni seguite con LexAura e MediAura?', - answer: - 'Lavoriamo con studi legali e strutture sanitarie — dal professionista singolo a team e sedi multi‑unità — che gestiscono volumi elevati di informazione e hanno bisogno di strumenti affidabili in ambiti regolamentati. La verticalità su Legal Tech e Health Tech ÃĻ parte della nostra proposta: meno genericismo, piÃđ requisiti operativi, tracciabilità e continuità del servizio.', - }, - { - question: 'L’intelligenza artificiale sostituisce avvocati o medici?', - answer: - 'No. I nostri prodotti sono pensati per integrarsi nei flussi professionali: sintesi, ricerca, drafting assistito, automazione della documentazione e interfacce vocali liberano tempo, ma la decisione finale e la responsabilità restano del professionista. L’obiettivo ÃĻ ridurre il carico ripetitivo e offrire una base analitica solida, non sostituire il giudizio umano.', - }, - { - question: 'Cosa succede dopo l’adozione del software?', - answer: - 'Il modello di servizio va oltre la licenza: onboarding e formazione specialistica per team legali e sanitari, supporto tecnico e consulenza operativa continuativi, aggiornamento dei motori di analisi e manutenzione evolutiva rispetto a normative e contesto di mercato. Per criticità urgenti sono previsti protocolli di intervento prioritario, cosÃŽ che studi e strutture non restino isolati dai propri strumenti.', - }, - { - question: 'Potete collegare LexAura o MediAura ai nostri sistemi già in uso?', - answer: - 'SÃŽ, quando serve. Oltre ai prodotti standard supportiamo integrazioni tramite API e moduli personalizzati nel perimetro dei nostri SaaS, per collegare gestionali o flussi documentali preesistenti senza reinventare l’intero stack informativo.', - }, - { - question: 'Come gestite sicurezza, disponibilità e dati sensibili?', - answer: - 'Progettiamo su architetture cloud‑native ad alta disponibilità, con attenzione a crittografia, protezione di perimetro (es. WAF, mitigazione DDoS) e continuità operativa. Il trattamento di informazioni legali e sanitarie ÃĻ affrontato con criteri di integrità dei dati e conformità alle normative applicabili, inclusa la chiarezza su dove risiedono i dati e sui requisiti di due diligence che i settori regolamentati si attendono.', - }, - { - question: 'Lavorate solo in loco o anche con clienti in Italia e all’estero?', - answer: - 'Siamo una software company con base operativa a Bangkok e collaboriamo con clienti a livello internazionale. Workshop e incontri possono essere online o in presenza in base al progetto; supporto e comunicazioni operative in italiano, inglese, tedesco, francese, spagnolo o tailandese, con orari concordati.', - }, - { - question: 'Diritto d’uso e proprietà del software: come le regolate?', - answer: - 'Dipende dal contratto: in genere cediamo l’esclusiva sul deliverable a saldo, con clausole esplicite su componenti open source e librerie di terze parti. Per licenze SaaS, permessi d’uso e responsabilità sono definiti nei termini commerciali e nel contratto quadro.', - }, - { - question: 'Qual ÃĻ il modo piÃđ rapido per parlarne con voi?', - answer: - 'Il punto di ingresso principale ÃĻ la chat dal pulsante ÂŦChattiamoÂŧ in header: prima vedi se il canale ÃĻ con operatore umano, solo chatbot o misto, poi lasci email (e facoltativamente il nome) per ricevere un link o un codice monouso e aprire la sessione senza perdite di tempo. In chat operatore umano e chatbot collaborano per orientamento iniziale, requisiti e passi successivi. Per il supporto via web ci interfacciamo in italiano, inglese, tedesco, francese, spagnolo o tailandese. Per materiale sensibile useremo sempre i canali concordati in fase di rapporto commerciale. Se ci si sente piÃđ a proprio agio usando un form di contatto, in fondo alla homepage nella sezione Contatti trovate il modulo a destra del testo introduttivo.', - }, - ] as const, +const faqByLocale = { + it: { + eyebrow: 'FAQ', + title: 'Domande frequenti', + items: [ + { + question: 'Che tipo di organizzazioni seguite con LexAura e MediAura?', + answer: + 'Lavoriamo con studi legali e strutture sanitarie — dal professionista singolo a team e sedi multi‑unità — che gestiscono volumi elevati di informazione e hanno bisogno di strumenti affidabili in ambiti regolamentati. La verticalità su Legal Tech e Health Tech ÃĻ parte della nostra proposta: meno genericismo, piÃđ requisiti operativi, tracciabilità e continuità del servizio.', + }, + { + question: 'L’intelligenza artificiale sostituisce avvocati o medici?', + answer: + 'No. I nostri prodotti sono pensati per integrarsi nei flussi professionali: sintesi, ricerca, drafting assistito, automazione della documentazione e interfacce vocali liberano tempo, ma la decisione finale e la responsabilità restano del professionista. L’obiettivo ÃĻ ridurre il carico ripetitivo e offrire una base analitica solida, non sostituire il giudizio umano.', + }, + { + question: 'Cosa succede dopo l’adozione del software?', + answer: + 'Il modello di servizio va oltre la licenza: onboarding e formazione specialistica per team legali e sanitari, supporto tecnico e consulenza operativa continuativi, aggiornamento dei motori di analisi e manutenzione evolutiva rispetto a normative e contesto di mercato. Per criticità urgenti sono previsti protocolli di intervento prioritario, cosÃŽ che studi e strutture non restino isolati dai propri strumenti.', + }, + { + question: 'Potete collegare LexAura o MediAura ai nostri sistemi già in uso?', + answer: + 'SÃŽ, quando serve. Oltre ai prodotti standard supportiamo integrazioni tramite API e moduli personalizzati nel perimetro dei nostri SaaS, per collegare gestionali o flussi documentali preesistenti senza reinventare l’intero stack informativo.', + }, + { + question: 'Come gestite sicurezza, disponibilità e dati sensibili?', + answer: + 'Progettiamo su architetture cloud‑native ad alta disponibilità, con attenzione a crittografia, protezione di perimetro (es. WAF, mitigazione DDoS) e continuità operativa. Il trattamento di informazioni legali e sanitarie ÃĻ affrontato con criteri di integrità dei dati e conformità alle normative applicabili, inclusa la chiarezza su dove risiedono i dati e sui requisiti di due diligence che i settori regolamentati si attendono.', + }, + { + question: 'Lavorate solo in loco o anche con clienti in Italia e all’estero?', + answer: + 'Siamo una software company con base operativa a Bangkok e collaboriamo con clienti a livello internazionale. Workshop e incontri possono essere online o in presenza in base al progetto; supporto e comunicazioni operative in italiano, inglese, tedesco, francese, spagnolo o tailandese, con orari concordati.', + }, + { + question: 'Diritto d’uso e proprietà del software: come le regolate?', + answer: + 'Dipende dal contratto: in genere cediamo l’esclusiva sul deliverable a saldo, con clausole esplicite su componenti open source e librerie di terze parti. Per licenze SaaS, permessi d’uso e responsabilità sono definiti nei termini commerciali e nel contratto quadro.', + }, + { + question: 'Qual ÃĻ il modo piÃđ rapido per parlarne con voi?', + answer: + 'Il punto di ingresso principale ÃĻ la chat dal pulsante ÂŦChattiamoÂŧ in header: prima vedi se il canale ÃĻ con operatore umano, solo chatbot o misto, poi lasci email (e facoltativamente il nome) per ricevere un link o un codice monouso e aprire la sessione senza perdite di tempo. In chat operatore umano e chatbot collaborano per orientamento iniziale, requisiti e passi successivi. Per il supporto via web ci interfacciamo in italiano, inglese, tedesco, francese, spagnolo o tailandese. Per materiale sensibile useremo sempre i canali concordati in fase di rapporto commerciale. Se ci si sente piÃđ a proprio agio usando un form di contatto, in fondo alla homepage nella sezione Contatti trovate il modulo a destra del testo introduttivo.', + }, + ] as const, + }, + en: { + eyebrow: 'FAQ', + title: 'Frequently asked questions', + items: [ + { + question: 'What organizations do you support with LexAura and MediAura?', + answer: + 'We work with law firms and healthcare organizations, from solo professionals to multi-site teams, that manage high information volumes and need reliable tools in regulated environments.', + }, + { + question: 'Does AI replace lawyers or doctors?', + answer: + 'No. Our products support professional workflows with summarization, research, assisted drafting, and automation. Final decisions and responsibility always remain with the professional.', + }, + { + question: 'What happens after software adoption?', + answer: + 'Our service model goes beyond licensing: specialist onboarding and training, continuous technical support and consulting, and ongoing engine updates aligned with regulations and market context.', + }, + { + question: 'Can you integrate LexAura or MediAura with our existing systems?', + answer: + 'Yes, when needed. We support API integrations and custom modules within our SaaS perimeter to connect existing management or document flows.', + }, + { + question: 'How do you handle security, availability, and sensitive data?', + answer: + 'We design for high-availability cloud-native architectures, encryption, perimeter protection, and operational continuity, with clear data-governance practices aligned with applicable regulations.', + }, + { + question: 'Do you work only locally or also with international clients?', + answer: + 'We are based in Bangkok and collaborate internationally. Workshops can be remote or on-site depending on the project.', + }, + { + question: 'How do you handle software usage rights and ownership?', + answer: + 'This depends on the contract. In many engagements, exclusive rights on deliverables are transferred after final payment, with explicit clauses for open source and third-party components.', + }, + { + question: 'What is the fastest way to talk with your team?', + answer: + 'The primary entry point is the chat button in the header. You provide your email to receive a one-time link or code, then start the session without delay.', + }, + ] as const, + }, + th: { + eyebrow: 'āļ„āļģāļ–āļēāļĄāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ', + title: 'āļ„āļģāļ–āļēāļĄāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ', + items: [ + { + question: 'āļ­āļ‡āļ„āđŒāļāļĢāđāļšāļšāđ„āļŦāļ™āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļāļąāļš LexAura āđāļĨāļ° MediAura?', + answer: + 'āđ€āļĢāļēāļ—āļģāļ‡āļēāļ™āļāļąāļšāļŠāļģāļ™āļąāļāļ‡āļēāļ™āļāļŽāļŦāļĄāļēāļĒāđāļĨāļ°āļ­āļ‡āļ„āđŒāļāļĢāļŠāļļāļ‚āļ āļēāļž āļ•āļąāđ‰āļ‡āđāļ•āđˆāļœāļđāđ‰āđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāđ€āļ”āļĩāđˆāļĒāļ§āđ„āļ›āļˆāļ™āļ–āļķāļ‡āļ—āļĩāļĄāļŦāļĨāļēāļĒāļŠāļēāļ‚āļē āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļģāļ™āļ§āļ™āļĄāļēāļāđƒāļ™āļšāļĢāļīāļšāļ—āļ—āļĩāđˆāļĄāļĩāļ‚āđ‰āļ­āļāļģāļāļąāļšāļŠāļđāļ‡', + }, + { + question: 'AI āļˆāļ°āđāļ—āļ™āļ—āļĩāđˆāļ—āļ™āļēāļĒāļŦāļĢāļ·āļ­āđāļžāļ—āļĒāđŒāļŦāļĢāļ·āļ­āđ„āļĄāđˆ?', + answer: + 'āđ„āļĄāđˆāđƒāļŠāđˆ āđ€āļ›āđ‰āļēāļŦāļĄāļēāļĒāļ‚āļ­āļ‡āđ€āļĢāļēāļ„āļ·āļ­āļŠāđˆāļ§āļĒāļ‡āļēāļ™āđ€āļŠāļīāļ‡āļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒ āļ‡āļēāļ™āđ€āļ­āļāļŠāļēāļĢ āđāļĨāļ°āđ€āļ§āļīāļĢāđŒāļāđ‚āļŸāļĨāļ§āđŒāļ‹āđ‰āļģ āđ† āđ‚āļ”āļĒāļāļēāļĢāļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļŠāļļāļ”āļ—āđ‰āļēāļĒāļĒāļąāļ‡āļ„āļ‡āđ€āļ›āđ‡āļ™āļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ‚āļ­āļ‡āļœāļđāđ‰āđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļ', + }, + { + question: 'āļŦāļĨāļąāļ‡āđ€āļĢāļīāđˆāļĄāđƒāļŠāđ‰āļ‡āļēāļ™āļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒāđāļĨāđ‰āļ§āļˆāļ°āđ€āļāļīāļ”āļ­āļ°āđ„āļĢāļ‚āļķāđ‰āļ™?', + answer: + 'āđ€āļĢāļēāļĄāļĩāļšāļĢāļīāļāļēāļĢāļŦāļĨāļąāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļĢāļšāļ§āļ‡āļˆāļĢ āļ—āļąāđ‰āļ‡ onboarding āļāļēāļĢāļ­āļšāļĢāļĄāđ€āļ‰āļžāļēāļ°āļ—āļēāļ‡ āļāļēāļĢāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ—āļēāļ‡āđ€āļ—āļ„āļ™āļīāļ„ āđāļĨāļ°āļāļēāļĢāļ­āļąāļ›āđ€āļ”āļ•āļĢāļ°āļšāļšāļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡', + }, + { + question: 'āļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄ LexAura āļŦāļĢāļ·āļ­ MediAura āļāļąāļšāļĢāļ°āļšāļšāđ€āļ”āļīāļĄāļ‚āļ­āļ‡āđ€āļĢāļēāđ„āļ”āđ‰āđ„āļŦāļĄ?', + answer: + 'āđ„āļ”āđ‰ āđ€āļĢāļēāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļœāđˆāļēāļ™ API āđāļĨāļ°āđ‚āļĄāļ”āļđāļĨāđāļšāļšāļāļģāļŦāļ™āļ”āđ€āļ­āļ‡āļ āļēāļĒāđƒāļ™āļ‚āļ­āļšāđ€āļ‚āļ• SaaS āļ‚āļ­āļ‡āđ€āļĢāļē', + }, + { + question: 'āļˆāļąāļ”āļāļēāļĢāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ āļ„āļ§āļēāļĄāļžāļĢāđ‰āļ­āļĄāđƒāļŠāđ‰āļ‡āļēāļ™ āđāļĨāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļ­āđˆāļ­āļ™āđ„āļŦāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļĢ?', + answer: + 'āđ€āļĢāļēāđƒāļŠāđ‰āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ„āļĨāļēāļ§āļ”āđŒāļ—āļĩāđˆāļžāļĢāđ‰āļ­āļĄāđƒāļŠāđ‰āļ‡āļēāļ™āļŠāļđāļ‡ āļāļēāļĢāđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠ āļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™āļĢāļ°āļ”āļąāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āđāļĨāļ°āđāļ™āļ§āļ›āļāļīāļšāļąāļ•āļīāļ”āđ‰āļēāļ™āļāļēāļĢāļāļģāļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāđ‰āļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļ‚āđ‰āļ­āļāļģāļāļąāļšāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡', + }, + { + question: 'āļĢāļąāļšāļ‡āļēāļ™āđ€āļ‰āļžāļēāļ°āđƒāļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŦāļĢāļ·āļ­āļĢāļąāļšāļĨāļđāļāļ„āđ‰āļēāļ•āđˆāļēāļ‡āļ›āļĢāļ°āđ€āļ—āļĻāļ”āđ‰āļ§āļĒ?', + answer: + 'āļŠāļģāļ™āļąāļāļ‡āļēāļ™āđƒāļŦāļāđˆāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ‚āļ­āļ‡āđ€āļĢāļēāļ­āļĒāļđāđˆāļ—āļĩāđˆāļāļĢāļļāļ‡āđ€āļ—āļžāļŊ āđāļĨāļ°āļ—āļģāļ‡āļēāļ™āļāļąāļšāļĨāļđāļāļ„āđ‰āļēāļ•āđˆāļēāļ‡āļ›āļĢāļ°āđ€āļ—āļĻāđ„āļ”āđ‰ āļ—āļąāđ‰āļ‡āļ­āļ­āļ™āđ„āļĨāļ™āđŒāđāļĨāļ°āļ­āļ­āļ™āđ„āļ‹āļ•āđŒāļ•āļēāļĄāļ„āļ§āļēāļĄāđ€āļŦāļĄāļēāļ°āļŠāļĄāļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļāļēāļĢ', + }, + { + question: 'āļŠāļīāļ—āļ˜āļīāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđāļĨāļ°āļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āđ€āļˆāđ‰āļēāļ‚āļ­āļ‡āļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒāļāļģāļŦāļ™āļ”āļ­āļĒāđˆāļēāļ‡āđ„āļĢ?', + answer: + 'āļ‚āļķāđ‰āļ™āļāļąāļšāļŠāļąāļāļāļē āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āļˆāļ°āļĢāļ°āļšāļļāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ āļ„āļ§āļēāļĄāļĢāļąāļšāļœāļīāļ”āļŠāļ­āļš āđāļĨāļ°āļŠāļīāļ—āļ˜āļīāđƒāļ™āļŠāļīāđ‰āļ™āļ‡āļēāļ™āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™ āļĢāļ§āļĄāļ–āļķāļ‡āļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāđ‚āļ­āđ€āļžāļ™āļ‹āļ­āļĢāđŒāļŠāđāļĨāļ° third-party', + }, + { + question: 'āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āļļāļĒāđ€āļĢāđ‡āļ§āļ—āļĩāđˆāļŠāļļāļ”āļ„āļ§āļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāđˆāļ­āļ‡āļ—āļēāļ‡āđ„āļŦāļ™?', + answer: + 'āļāļ”āļ›āļļāđˆāļĄāđāļŠāļ—āļšāļ™āļŠāđˆāļ§āļ™āļŦāļąāļ§āđ€āļ§āđ‡āļšāđ„āļ‹āļ•āđŒ āđƒāļŠāđˆāļ­āļĩāđ€āļĄāļĨāđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļĨāļīāļ‡āļāđŒāļŦāļĢāļ·āļ­āđ‚āļ„āđ‰āļ”āđāļšāļšāđƒāļŠāđ‰āļ„āļĢāļąāđ‰āļ‡āđ€āļ”āļĩāļĒāļ§ āđāļĨāđ‰āļ§āđ€āļĢāļīāđˆāļĄāđ€āļ‹āļŠāļŠāļąāļ™āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ', + }, + ] as const, + }, } as const; + +export const getFaq = (locale: SupportedLocale) => faqByLocale[locale]; + +/** Retro-compatibilità: fallback italiano. */ +export const faq = faqByLocale.it; diff --git a/src/data/home/footer.ts b/src/data/home/footer.ts index 680b421..b7e1ef7 100644 --- a/src/data/home/footer.ts +++ b/src/data/home/footer.ts @@ -1,87 +1,178 @@ +import type { SupportedLocale } from './navigation'; + /** Footer — griglia 4 colonne (link); newsletter in blocco unico sotto, allineata a sinistra */ -export const footer = { - brandName: 'NexStudio', - tagline: 'Ingegneria del software e IA per settori regolamentati.', - legalLine: 'P.IVA e note legali: da inserire.', - - columnTitles: { - sections: 'Sezioni', - legal: 'Normative', - social: 'Reti sociali', - company: 'Azienda', - } as const, - - /** Colonna 1 — ancore sulla homepage */ - homeNav: [ - { label: 'Prodotti', href: '/#prodotti' }, - { label: 'Servizi', href: '/#servizi' }, - { label: 'Stack', href: '/#stack' }, - { label: 'FAQ', href: '/#faq' }, - ] as const, - - /** Pannello preferenze (CMP): non ÃĻ un documento legale; tenuto fuori dalla colonna Normative */ - cookiePreferences: { - label: 'Impostazioni cookie', - hint: 'Preferenze di consenso sul tuo browser (non ÃĻ un testo legale).', - } as const, - - /** Colonna 2 — documenti legali (testi bozza nelle rispettive pagine) */ - legalColumnNav: [ - { label: 'Condizioni d’uso', href: '/terms' }, - { label: 'Informativa cookie', href: '/cookies' }, - { label: 'Privacy', href: '/privacy' }, - { label: 'Diritti privacy (GDPR)', href: '/gdpr' }, - ] as const, - - /** - * Colonna 3 — social (sostituire gli URL con i profili reali). - * Lasciare `href` vuoto per mostrare solo etichetta disabilitata finchÃĐ non configurato. - */ - socialLinks: [ - { label: 'Facebook', href: '' }, - { label: 'LinkedIn', href: '' }, - { label: 'Twitter / X', href: '' }, - { label: 'GitHub', href: '' }, - ] as const, - - /** Colonna 4 — pagine istituzionali e compliance */ - companyNav: [ - { label: 'Chi siamo', href: '/about' }, - { label: 'Codice etico', href: '/codice-etico' }, - { label: 'Modello organizzativo', href: '/modello-organizzativo' }, - { label: 'Dove siamo', href: '/dove-siamo' }, - ] as const, - - /** - * Newsletter — invio via POST a un endpoint esterno. - * - * Opzione A (consigliata per partire): Formspree - * 1. Crea account su https://formspree.io e un nuovo form. - * 2. Copia l’URL tipo `https://formspree.io/f/abcdefgh` in `actionUrl`. - * 3. Opzionale: `successRedirect` = URL assoluta della pagina di ringraziamento - * (es. `https://tuodominio.com/newsletter/grazie` — vedi `src/pages/newsletter/grazie.astro`). - * 4. In Formspree collega l’invio a email / Slack / Google Sheets. - * - * Opzione B: Brevo, Mailchimp, Buttondown, ConvertKit — usano spesso un URL - * dedicato o un embed; adatta `fieldName` al nome campo richiesto dalla doc. - * - * Opzione C: Worker Cloudflare + lista in KV/D1 (piÃđ controllo, piÃđ codice). - */ - newsletter: { - title: 'Newsletter', - description: 'Aggiornamenti su prodotti e roadmap.', - placeholder: 'La tua email', - buttonLabel: 'Iscriviti', - /** Formspree: `https://formspree.io/f/xxxx` — vuoto = modulo disabilitato */ - actionUrl: '', - /** Nome campo email richiesto dal provider (Formspree: di solito `email`) */ - fieldName: 'email', - /** - * Formspree: redirect dopo invio (`_next`). Deve essere URL **assoluta** - * (es. produzione). Vuoto = pagina di ringrazio predefinita Formspree. - */ - successRedirect: '', - /** Formspree: oggetto della mail di notifica (`_subject`) */ - notifySubject: 'Nuova iscrizione newsletter — NexStudio', +const footerByLocale = { + it: { + brandName: 'NexStudio', + tagline: 'Ingegneria del software e IA per settori regolamentati.', + legalLine: 'P.IVA e note legali: da inserire.', + columnTitles: { + sections: 'Sezioni', + legal: 'Normative', + social: 'Reti sociali', + company: 'Azienda', + } as const, + homeNav: [ + { label: 'Prodotti', href: '/#prodotti' }, + { label: 'Servizi', href: '/#servizi' }, + { label: 'Stack', href: '/#stack' }, + { label: 'FAQ', href: '/#faq' }, + ] as const, + cookiePreferences: { + label: 'Impostazioni cookie', + hint: 'Preferenze di consenso sul tuo browser (non ÃĻ un testo legale).', + } as const, + legalColumnNav: [ + { label: 'Condizioni d’uso', href: '/terms' }, + { label: 'Informativa cookie', href: '/cookies' }, + { label: 'Privacy', href: '/privacy' }, + { label: 'Diritti privacy (GDPR)', href: '/gdpr' }, + ] as const, + socialLinks: [ + { label: 'Facebook', href: '' }, + { label: 'LinkedIn', href: '' }, + { label: 'Twitter / X', href: '' }, + { label: 'GitHub', href: '' }, + ] as const, + companyNav: [ + { label: 'Chi siamo', href: '/about' }, + { label: 'Codice etico', href: '/codice-etico' }, + { label: 'Modello organizzativo', href: '/modello-organizzativo' }, + { label: 'Dove siamo', href: '/dove-siamo' }, + ] as const, + newsletter: { + title: 'Newsletter', + description: 'Aggiornamenti su prodotti e roadmap.', + placeholder: 'La tua email', + buttonLabel: 'Iscriviti', + actionUrl: '', + fieldName: 'email', + successRedirect: '', + notifySubject: 'Nuova iscrizione newsletter — NexStudio', + }, + labels: { + cookieTitle: 'Impostazioni cookie', + socialPlaceholderTitle: 'URL da configurare in footer.ts', + companyPlaceholderTitle: 'Collegamento in arrivo', + newsletterComingSoon: + 'Iscrizione in arrivo: configura l’endpoint nel progetto per attivare il modulo.', + }, + }, + en: { + brandName: 'NexStudio', + tagline: 'Software engineering and AI for regulated industries.', + legalLine: 'VAT number and legal notes: to be added.', + columnTitles: { + sections: 'Sections', + legal: 'Legal', + social: 'Social', + company: 'Company', + } as const, + homeNav: [ + { label: 'Products', href: '/#prodotti' }, + { label: 'Services', href: '/#servizi' }, + { label: 'Stack', href: '/#stack' }, + { label: 'FAQ', href: '/#faq' }, + ] as const, + cookiePreferences: { + label: 'Cookie settings', + hint: 'Consent preferences in your browser (this is not a legal document).', + } as const, + legalColumnNav: [ + { label: 'Terms of use', href: '/terms' }, + { label: 'Cookie policy', href: '/cookies' }, + { label: 'Privacy', href: '/privacy' }, + { label: 'Privacy rights (GDPR)', href: '/gdpr' }, + ] as const, + socialLinks: [ + { label: 'Facebook', href: '' }, + { label: 'LinkedIn', href: '' }, + { label: 'Twitter / X', href: '' }, + { label: 'GitHub', href: '' }, + ] as const, + companyNav: [ + { label: 'About us', href: '/about' }, + { label: 'Code of ethics', href: '/codice-etico' }, + { label: 'Organizational model', href: '/modello-organizzativo' }, + { label: 'Where we are', href: '/dove-siamo' }, + ] as const, + newsletter: { + title: 'Newsletter', + description: 'Updates on products and roadmap.', + placeholder: 'Your email', + buttonLabel: 'Subscribe', + actionUrl: '', + fieldName: 'email', + successRedirect: '', + notifySubject: 'New newsletter signup — NexStudio', + }, + labels: { + cookieTitle: 'Cookie settings', + socialPlaceholderTitle: 'URL to configure in footer.ts', + companyPlaceholderTitle: 'Coming soon', + newsletterComingSoon: + 'Newsletter signups coming soon: configure the endpoint in the project to enable this form.', + }, + }, + th: { + brandName: 'NexStudio', + tagline: 'āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒāđāļĨāļ° AI āļŠāļģāļŦāļĢāļąāļšāļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāļ—āļĩāđˆāļĄāļĩāļ‚āđ‰āļ­āļāļģāļāļąāļš', + legalLine: 'āđ€āļĨāļ‚āļ›āļĢāļ°āļˆāļģāļ•āļąāļ§āļœāļđāđ‰āđ€āļŠāļĩāļĒāļ āļēāļĐāļĩāđāļĨāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļēāļ‡āļāļŽāļŦāļĄāļēāļĒ: āļĢāļ­āđ€āļžāļīāđˆāļĄāļ āļēāļĒāļŦāļĨāļąāļ‡', + columnTitles: { + sections: 'āļŠāđˆāļ§āļ™āļ•āđˆāļēāļ‡ āđ†', + legal: 'āļāļŽāļŦāļĄāļēāļĒ', + social: 'āđ‚āļ‹āđ€āļŠāļĩāļĒāļĨ', + company: 'āļšāļĢāļīāļĐāļąāļ—', + } as const, + homeNav: [ + { label: 'āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒ', href: '/#prodotti' }, + { label: 'āļšāļĢāļīāļāļēāļĢ', href: '/#servizi' }, + { label: 'āļŠāđāļ•āļ', href: '/#stack' }, + { label: 'āļ„āļģāļ–āļēāļĄāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ', href: '/#faq' }, + ] as const, + cookiePreferences: { + label: 'āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ„āļļāļāļāļĩāđ‰', + hint: 'āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ„āļ§āļēāļĄāļĒāļīāļ™āļĒāļ­āļĄāđƒāļ™āđ€āļšāļĢāļēāļ§āđŒāđ€āļ‹āļ­āļĢāđŒāļ‚āļ­āļ‡āļ„āļļāļ“ (āđ„āļĄāđˆāđƒāļŠāđˆāđ€āļ­āļāļŠāļēāļĢāļ—āļēāļ‡āļāļŽāļŦāļĄāļēāļĒ)', + } as const, + legalColumnNav: [ + { label: 'āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™', href: '/terms' }, + { label: 'āļ™āđ‚āļĒāļšāļēāļĒāļ„āļļāļāļāļĩāđ‰', href: '/cookies' }, + { label: 'āļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ•āļąāļ§', href: '/privacy' }, + { label: 'āļŠāļīāļ—āļ˜āļīāļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ•āļąāļ§ (GDPR)', href: '/gdpr' }, + ] as const, + socialLinks: [ + { label: 'Facebook', href: '' }, + { label: 'LinkedIn', href: '' }, + { label: 'Twitter / X', href: '' }, + { label: 'GitHub', href: '' }, + ] as const, + companyNav: [ + { label: 'āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāđ€āļĢāļē', href: '/about' }, + { label: 'āļˆāļĢāļĢāļĒāļēāļšāļĢāļĢāļ“', href: '/codice-etico' }, + { label: 'āđ‚āļĄāđ€āļ”āļĨāļ­āļ‡āļ„āđŒāļāļĢ', href: '/modello-organizzativo' }, + { label: 'āļ—āļĩāđˆāļ•āļąāđ‰āļ‡', href: '/dove-siamo' }, + ] as const, + newsletter: { + title: 'āļˆāļ”āļŦāļĄāļēāļĒāļ‚āđˆāļēāļ§', + description: 'āļ­āļąāļ›āđ€āļ”āļ•āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāđāļĨāļ°āđ‚āļĢāļ”āđāļĄāļ›', + placeholder: 'āļ­āļĩāđ€āļĄāļĨāļ‚āļ­āļ‡āļ„āļļāļ“', + buttonLabel: 'āļŠāļĄāļąāļ„āļĢāļĢāļąāļšāļ‚āđˆāļēāļ§āļŠāļēāļĢ', + actionUrl: '', + fieldName: 'email', + successRedirect: '', + notifySubject: 'āļĄāļĩāļœāļđāđ‰āļŠāļĄāļąāļ„āļĢāļˆāļ”āļŦāļĄāļēāļĒāļ‚āđˆāļēāļ§āđƒāļŦāļĄāđˆ — NexStudio', + }, + labels: { + cookieTitle: 'āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ„āļļāļāļāļĩāđ‰', + socialPlaceholderTitle: 'āļ•āđ‰āļ­āļ‡āļ•āļąāđ‰āļ‡āļ„āđˆāļē URL āđƒāļ™ footer.ts', + companyPlaceholderTitle: 'āļāļģāļĨāļąāļ‡āļˆāļ°āđ€āļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™', + newsletterComingSoon: + 'āļĢāļ°āļšāļšāļŠāļĄāļąāļ„āļĢāļˆāļ”āļŦāļĄāļēāļĒāļ‚āđˆāļēāļ§āļāļģāļĨāļąāļ‡āļˆāļ°āđ€āļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™: āļ•āļąāđ‰āļ‡āļ„āđˆāļē endpoint āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āđ€āļ›āļīāļ”āļŸāļ­āļĢāđŒāļĄāļ™āļĩāđ‰', + }, }, } as const; + +export const getFooter = (locale: SupportedLocale) => footerByLocale[locale]; + +/** Retro-compatibilità: fallback italiano. */ +export const footer = footerByLocale.it; diff --git a/src/data/home/hero.ts b/src/data/home/hero.ts index 97341e9..4c98b72 100644 --- a/src/data/home/hero.ts +++ b/src/data/home/hero.ts @@ -1,29 +1,85 @@ +import type { SupportedLocale } from './navigation'; + /** Sezione hero */ -export const hero = { - badge: 'Restituiamo valore al tuo tempo', - /** Parte prima dell’evidenziazione nel titolo */ - titleBefore: "Ingegneria del software per l'era dell'", - /** Segmento con gradiente nel titolo */ - titleHighlight: 'Intelligenza Artificiale', - titleAfter: '.', - subtitle: - 'Sviluppiamo soluzioni SaaS ad alta complessità per settori regolamentati.', - /** Paragrafi introduttivi */ - paragraphs: [ - "Ci occupiamo di progettazione di ecosistemi digitali evoluti. La nostra specializzazione risiede nell'integrazione di modelli di Intelligenza Artificiale all'interno di flussi di lavoro professionali dove precisione, sicurezza e affidabilità sono requisiti non negoziabili.", - 'Il nostro approccio si concentra sulla trasformazione di dati complessi in strumenti operativi fluidi, attraverso lo sviluppo di algoritmi proprietari, interfacce vocali e architetture cloud scalabili.', - ] as const, - businessUnitsHeading: 'Le nostre Business Unit:', - businessUnitsIntro: - 'Operiamo attraverso divisioni specializzate per garantire la massima verticalità e competenza di dominio:', - businessUnits: [ - { - name: 'Legal Tech', - description: "Soluzioni per l'automazione e l'analisi normativa.", - }, - { - name: 'Health Tech', - description: 'Sistemi avanzati per la gestione e l’automazione sanitaria.', - }, - ] as const, +const heroByLocale = { + it: { + badge: 'Restituiamo valore al tuo tempo', + titleBefore: "Ingegneria del software per l'era dell'", + titleHighlight: 'Intelligenza Artificiale', + titleAfter: '.', + subtitle: + 'Sviluppiamo soluzioni SaaS ad alta complessità per settori regolamentati.', + paragraphs: [ + "Ci occupiamo di progettazione di ecosistemi digitali evoluti. La nostra specializzazione risiede nell'integrazione di modelli di Intelligenza Artificiale all'interno di flussi di lavoro professionali dove precisione, sicurezza e affidabilità sono requisiti non negoziabili.", + 'Il nostro approccio si concentra sulla trasformazione di dati complessi in strumenti operativi fluidi, attraverso lo sviluppo di algoritmi proprietari, interfacce vocali e architetture cloud scalabili.', + ] as const, + businessUnitsHeading: 'Le nostre Business Unit:', + businessUnitsIntro: + 'Operiamo attraverso divisioni specializzate per garantire la massima verticalità e competenza di dominio:', + businessUnits: [ + { + name: 'Legal Tech', + description: "Soluzioni per l'automazione e l'analisi normativa.", + }, + { + name: 'Health Tech', + description: 'Sistemi avanzati per la gestione e l’automazione sanitaria.', + }, + ] as const, + }, + en: { + badge: 'We give your time back', + titleBefore: "Software engineering for the era of ", + titleHighlight: 'Artificial Intelligence', + titleAfter: '.', + subtitle: + 'We build high-complexity SaaS solutions for regulated industries.', + paragraphs: [ + 'We design advanced digital ecosystems. Our specialization is integrating AI models into professional workflows where accuracy, security, and reliability are non-negotiable requirements.', + 'Our approach turns complex data into smooth operational tools through proprietary algorithms, voice interfaces, and scalable cloud-native architectures.', + ] as const, + businessUnitsHeading: 'Our Business Units:', + businessUnitsIntro: + 'We operate through specialized divisions to ensure deep domain expertise and vertical focus:', + businessUnits: [ + { + name: 'Legal Tech', + description: 'Solutions for legal automation and regulatory analysis.', + }, + { + name: 'Health Tech', + description: + 'Advanced systems for healthcare workflow management and automation.', + }, + ] as const, + }, + th: { + badge: 'āļ„āļ·āļ™āļ„āļļāļ“āļ„āđˆāļēāđƒāļŦāđ‰āļāļąāļšāđ€āļ§āļĨāļēāļ‚āļ­āļ‡āļ„āļļāļ“', + titleBefore: 'āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒāļŠāļģāļŦāļĢāļąāļšāļĒāļļāļ„āļ‚āļ­āļ‡', + titleHighlight: 'āļ›āļąāļāļāļēāļ›āļĢāļ°āļ”āļīāļĐāļāđŒ', + titleAfter: '.', + subtitle: 'āđ€āļĢāļēāļžāļąāļ’āļ™āļēāđ‚āļ‹āļĨāļđāļŠāļąāļ™ SaaS āļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļŠāļđāļ‡āļŠāļģāļŦāļĢāļąāļšāļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāļ—āļĩāđˆāļĄāļĩāļ‚āđ‰āļ­āļāļģāļāļąāļš', + paragraphs: [ + 'āđ€āļĢāļēāļ­āļ­āļāđāļšāļšāļĢāļ°āļšāļšāļ™āļīāđ€āļ§āļĻāļ”āļīāļˆāļīāļ—āļąāļĨāļ‚āļąāđ‰āļ™āļŠāļđāļ‡ āđ‚āļ”āļĒāđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāđƒāļ™āļāļēāļĢāļœāļŠāļēāļ™āđ‚āļĄāđ€āļ”āļĨ AI āđ€āļ‚āđ‰āļēāļāļąāļšāđ€āļ§āļīāļĢāđŒāļāđ‚āļŸāļĨāļ§āđŒāļĢāļ°āļ”āļąāļšāļĄāļ·āļ­āļ­āļēāļŠāļĩāļžāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģ āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ āđāļĨāļ°āļ„āļ§āļēāļĄāļ™āđˆāļēāđ€āļŠāļ·āđˆāļ­āļ–āļ·āļ­', + 'āđāļ™āļ§āļ—āļēāļ‡āļ‚āļ­āļ‡āđ€āļĢāļēāļ„āļ·āļ­āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāļĨāļ·āđˆāļ™āđ„āļŦāļĨ āļœāđˆāļēāļ™āļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄāđ€āļ‰āļžāļēāļ°āļ—āļēāļ‡ āļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļŸāļ‹āđ€āļŠāļĩāļĒāļ‡ āđāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ„āļĨāļēāļ§āļ”āđŒāļ—āļĩāđˆāļ‚āļĒāļēāļĒāđ„āļ”āđ‰', + ] as const, + businessUnitsHeading: 'āļŦāļ™āđˆāļ§āļĒāļ˜āļļāļĢāļāļīāļˆāļ‚āļ­āļ‡āđ€āļĢāļē:', + businessUnitsIntro: + 'āđ€āļĢāļēāļ”āļģāđ€āļ™āļīāļ™āļ‡āļēāļ™āļœāđˆāļēāļ™āļ—āļĩāļĄāđ€āļ‰āļžāļēāļ°āļ—āļēāļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ„āļ”āđ‰āļ„āļ§āļēāļĄāđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāđ€āļŠāļīāļ‡āļĨāļķāļāđƒāļ™āđāļ•āđˆāļĨāļ°āđ‚āļ”āđ€āļĄāļ™:', + businessUnits: [ + { + name: 'Legal Tech', + description: 'āđ‚āļ‹āļĨāļđāļŠāļąāļ™āļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļāļŽāļŦāļĄāļēāļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāđāļĨāļ°āļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ‚āđ‰āļ­āļāļģāļāļąāļš', + }, + { + name: 'Health Tech', + description: 'āļĢāļ°āļšāļšāļ‚āļąāđ‰āļ™āļŠāļđāļ‡āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđāļĨāļ°āļ—āļģāļ‡āļēāļ™āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāđƒāļ™āļ āļēāļ„āļŠāļļāļ‚āļ āļēāļž', + }, + ] as const, + }, } as const; + +export const getHero = (locale: SupportedLocale) => heroByLocale[locale]; + +/** Retro-compatibilità: fallback italiano. */ +export const hero = heroByLocale.it; diff --git a/src/data/home/index.ts b/src/data/home/index.ts index 62a6c57..778375f 100644 --- a/src/data/home/index.ts +++ b/src/data/home/index.ts @@ -3,13 +3,21 @@ * Modifica i file in questa cartella per aggiornare testi senza toccare il markup. */ export { siteMeta } from './site-meta'; +export { getSiteMeta } from './site-meta'; export { chat } from './chat'; export { navigation } from './navigation'; +export { getNavigation } from './navigation'; export { hero } from './hero'; +export { getHero } from './hero'; export { stats } from './stats'; export { services } from './services'; +export { getServices } from './services'; export { stackSection } from './stack'; +export { getStackSection } from './stack'; export { productsSection } from './products'; export { faq } from './faq'; +export { getFaq } from './faq'; export { cta } from './cta'; +export { getCta } from './cta'; export { footer } from './footer'; +export { getFooter } from './footer'; diff --git a/src/data/home/navigation.ts b/src/data/home/navigation.ts index 4d7510c..115d110 100644 --- a/src/data/home/navigation.ts +++ b/src/data/home/navigation.ts @@ -1,19 +1,77 @@ import { chat } from './chat'; -/** Header — CTA unico: ingresso chat live (config in `chat.ts`) */ -export const navigation = { - brandName: 'NexStudio', - items: [ - { label: 'Prodotti', href: '/#prodotti' }, - { label: 'Servizi', href: '/#servizi' }, - { label: 'Stack', href: '/#stack' }, - { label: 'FAQ', href: '/#faq' }, - { label: 'Contattaci', href: '/#contatti' }, - ] as const, - cta: { - label: 'Chattiamo', - linkTitle: chat.linkTitle, - ariaLabel: - 'Richiedi accesso alla chat NexStudio: stato operatore e chatbot, identificazione con email (link o codice) prima della sessione.', +export type SupportedLocale = 'it' | 'en' | 'th'; + +const navigationByLocale = { + it: { + brandName: 'NexStudio', + items: [ + { label: 'Prodotti', href: '/#prodotti' }, + { label: 'Servizi', href: '/#servizi' }, + { label: 'Stack', href: '/#stack' }, + { label: 'FAQ', href: '/#faq' }, + { label: 'Contattaci', href: '/#contatti' }, + ] as const, + cta: { + label: 'Chattiamo', + linkTitle: chat.linkTitle, + ariaLabel: + 'Richiedi accesso alla chat NexStudio: stato operatore e chatbot, identificazione con email (link o codice) prima della sessione.', + }, + labels: { + mainNavAria: 'Principale', + mobileNavAria: 'Navigazione mobile', + languageSelectorAria: 'Seleziona lingua', + openMenuAria: 'Apri menu', + }, + }, + en: { + brandName: 'NexStudio', + items: [ + { label: 'Products', href: '/#prodotti' }, + { label: 'Services', href: '/#servizi' }, + { label: 'Stack', href: '/#stack' }, + { label: 'FAQ', href: '/#faq' }, + { label: 'Contact', href: '/#contatti' }, + ] as const, + cta: { + label: 'Let’s chat', + linkTitle: 'Open NexStudio chat access request.', + ariaLabel: + 'Request access to NexStudio chat: operator and chatbot availability, email verification link or code before session start.', + }, + labels: { + mainNavAria: 'Main navigation', + mobileNavAria: 'Mobile navigation', + languageSelectorAria: 'Select language', + openMenuAria: 'Open menu', + }, + }, + th: { + brandName: 'NexStudio', + items: [ + { label: 'āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒ', href: '/#prodotti' }, + { label: 'āļšāļĢāļīāļāļēāļĢ', href: '/#servizi' }, + { label: 'āļŠāđāļ•āļ', href: '/#stack' }, + { label: 'āļ„āļģāļ–āļēāļĄāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ', href: '/#faq' }, + { label: 'āļ•āļīāļ”āļ•āđˆāļ­āđ€āļĢāļē', href: '/#contatti' }, + ] as const, + cta: { + label: 'āđ€āļĢāļīāđˆāļĄāđāļŠāļ—', + linkTitle: 'āđ€āļ›āļīāļ”āļ„āļģāļ‚āļ­āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āļ‡āļēāļ™āđāļŠāļ—āļ‚āļ­āļ‡ NexStudio', + ariaLabel: + 'āļ‚āļ­āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āļ‡āļēāļ™āđāļŠāļ— NexStudio: āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ–āļēāļ™āļ°āļœāļđāđ‰āļ”āļđāđāļĨāđāļĨāļ°āđāļŠāļ—āļšāļ­āļ• āļžāļĢāđ‰āļ­āļĄāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™āļ”āđ‰āļ§āļĒāļ­āļĩāđ€āļĄāļĨāļāđˆāļ­āļ™āđ€āļĢāļīāđˆāļĄāđƒāļŠāđ‰āļ‡āļēāļ™', + }, + labels: { + mainNavAria: 'āđ€āļĄāļ™āļđāļŦāļĨāļąāļ', + mobileNavAria: 'āđ€āļĄāļ™āļđāļšāļ™āļĄāļ·āļ­āļ–āļ·āļ­', + languageSelectorAria: 'āđ€āļĨāļ·āļ­āļāļ āļēāļĐāļē', + openMenuAria: 'āđ€āļ›āļīāļ”āđ€āļĄāļ™āļđ', + }, }, } as const; + +export const getNavigation = (locale: SupportedLocale) => navigationByLocale[locale]; + +/** Retro-compatibilità: fallback italiano. */ +export const navigation = navigationByLocale.it; diff --git a/src/data/home/services.ts b/src/data/home/services.ts index e86d14c..ea8ee6a 100644 --- a/src/data/home/services.ts +++ b/src/data/home/services.ts @@ -2,51 +2,153 @@ * Servizi (griglia bento). * layout: wide = 2 colonne, tall = 2 righe + elenco puntato */ -export const services = { - eyebrow: 'I nostri servizi', - title: 'Implementazione, evoluzione e supporto', - lead: - 'In NexStudio, il nostro impegno non si esaurisce con la fornitura della licenza software. Il nostro modello di servizio ÃĻ progettato per garantire che ogni professionista e struttura possa estrarre il massimo valore dalle potenzialità dell’Intelligenza Artificiale integrata in LexAura e MediAura.', - cards: [ - { - layout: 'tall' as const, - /** Sfera geodetica vettoriale (SVG) in basso a destra */ - decoration: 'wireframe-globe' as const, - title: 'Onboarding e formazione specialistica', - body: - 'L’adozione di un sistema basato su IA richiede un passaggio metodologico, non solo tecnico. Offriamo programmi di formazione dedicati per team legali e medici, finalizzati a:', - bullets: [ - 'Ottimizzare l’interazione con gli algoritmi di ricerca e sintesi.', - 'Padroneggiare i comandi vocali e l’automazione dei flussi documentali.', - 'Ridurre drasticamente la curva di apprendimento tecnologico.', - ], - }, - { - layout: 'wide' as const, - title: 'Supporto Tecnico e Consulenza Operativa', - body: - 'Forniamo un’assistenza continua e di alto profilo per garantire la costante continuità operativa dei vostri sistemi. NexStudio non agisce come un semplice fornitore di supporto tecnico, ma come un partner strategico che affianca lo studio o la struttura sanitaria nell’ottimizzazione dei processi interni attraverso l’uso dei nostri SaaS.', - callout: { - title: 'Intervento ÂŦBreaking GlassÂŧ', +import type { SupportedLocale } from './navigation'; + +const servicesByLocale = { + it: { + eyebrow: 'I nostri servizi', + title: 'Implementazione, evoluzione e supporto', + lead: + 'In NexStudio, il nostro impegno non si esaurisce con la fornitura della licenza software. Il nostro modello di servizio ÃĻ progettato per garantire che ogni professionista e struttura possa estrarre il massimo valore dalle potenzialità dell’Intelligenza Artificiale integrata in LexAura e MediAura.', + cards: [ + { + layout: 'tall' as const, + decoration: 'wireframe-globe' as const, + title: 'Onboarding e formazione specialistica', body: - 'Per le situazioni di estrema urgenza o criticità sistemica, garantiamo protocolli di accesso rapido e intervento prioritario. Questa procedura di emergenza permette di superare i normali flussi di assistenza per risolvere istantaneamente anomalie che potrebbero impattare sulla continuità del servizio, assicurando che il professionista non resti mai isolato dai propri dati o strumenti decisionali.', + 'L’adozione di un sistema basato su IA richiede un passaggio metodologico, non solo tecnico. Offriamo programmi di formazione dedicati per team legali e medici, finalizzati a:', + bullets: [ + 'Ottimizzare l’interazione con gli algoritmi di ricerca e sintesi.', + 'Padroneggiare i comandi vocali e l’automazione dei flussi documentali.', + 'Ridurre drasticamente la curva di apprendimento tecnologico.', + ], }, - }, - { - layout: 'default' as const, - title: 'Estensioni e integrazioni personalizzate', - body: - 'Sebbene LexAura e MediAura siano prodotti finiti e pronti all’uso, comprendiamo che strutture complesse possano avere esigenze di interconnessione specifiche.', - bullets: [ - 'API integration: supportiamo l’integrazione dei nostri SaaS con sistemi gestionali preesistenti.', - 'Custom modules: progettiamo estensioni su misura che aggiungono funzionalità specifiche all’interno del perimetro dei nostri prodotti, per rispondere a flussi di lavoro unici.', - ], - }, - { - layout: 'default' as const, - title: 'Aggiornamento e manutenzione evolutiva', - body: - 'Il mondo dell’IA e delle normative (legali e sanitarie) ÃĻ in costante mutamento. Il nostro servizio include l’aggiornamento continuo dei motori di analisi, garantendo che il software sia sempre allineato con le ultime tecnologie e le evoluzioni del mercato di riferimento.', - }, - ], + { + layout: 'wide' as const, + title: 'Supporto Tecnico e Consulenza Operativa', + body: + 'Forniamo un’assistenza continua e di alto profilo per garantire la costante continuità operativa dei vostri sistemi. NexStudio non agisce come un semplice fornitore di supporto tecnico, ma come un partner strategico che affianca lo studio o la struttura sanitaria nell’ottimizzazione dei processi interni attraverso l’uso dei nostri SaaS.', + callout: { + title: 'Intervento ÂŦBreaking GlassÂŧ', + body: + 'Per le situazioni di estrema urgenza o criticità sistemica, garantiamo protocolli di accesso rapido e intervento prioritario. Questa procedura di emergenza permette di superare i normali flussi di assistenza per risolvere istantaneamente anomalie che potrebbero impattare sulla continuità del servizio, assicurando che il professionista non resti mai isolato dai propri dati o strumenti decisionali.', + }, + }, + { + layout: 'default' as const, + title: 'Estensioni e integrazioni personalizzate', + body: + 'Sebbene LexAura e MediAura siano prodotti finiti e pronti all’uso, comprendiamo che strutture complesse possano avere esigenze di interconnessione specifiche.', + bullets: [ + 'API integration: supportiamo l’integrazione dei nostri SaaS con sistemi gestionali preesistenti.', + 'Custom modules: progettiamo estensioni su misura che aggiungono funzionalità specifiche all’interno del perimetro dei nostri prodotti, per rispondere a flussi di lavoro unici.', + ], + }, + { + layout: 'default' as const, + title: 'Aggiornamento e manutenzione evolutiva', + body: + 'Il mondo dell’IA e delle normative (legali e sanitarie) ÃĻ in costante mutamento. Il nostro servizio include l’aggiornamento continuo dei motori di analisi, garantendo che il software sia sempre allineato con le ultime tecnologie e le evoluzioni del mercato di riferimento.', + }, + ], + }, + en: { + eyebrow: 'Our services', + title: 'Implementation, evolution, and support', + lead: + 'At NexStudio, our commitment goes beyond software licensing. Our service model helps each professional and organization unlock the full value of AI integrated into LexAura and MediAura.', + cards: [ + { + layout: 'tall' as const, + decoration: 'wireframe-globe' as const, + title: 'Onboarding and specialist training', + body: + 'Adopting AI-powered systems is a methodological shift, not only a technical one. We provide dedicated programs for legal and medical teams to:', + bullets: [ + 'Improve interaction with search and summarization algorithms.', + 'Master voice commands and document workflow automation.', + 'Significantly reduce the technology learning curve.', + ], + }, + { + layout: 'wide' as const, + title: 'Technical support and operational consulting', + body: + 'We provide continuous, high-level assistance to ensure operational continuity. NexStudio is not just a support vendor, but a strategic partner for legal firms and healthcare organizations.', + callout: { + title: '“Breaking Glass” intervention', + body: + 'For critical urgency or systemic incidents, we offer rapid-access and priority intervention protocols. This emergency procedure bypasses standard support flows to restore continuity as fast as possible.', + }, + }, + { + layout: 'default' as const, + title: 'Custom extensions and integrations', + body: + 'Although LexAura and MediAura are complete, ready-to-use products, complex organizations may still require specific interoperability needs.', + bullets: [ + 'API integration: we integrate our SaaS with your existing management systems.', + 'Custom modules: we build tailored extensions inside our product perimeter to support unique workflows.', + ], + }, + { + layout: 'default' as const, + title: 'Evolutionary updates and maintenance', + body: + 'AI and regulated frameworks evolve continuously. Our service includes ongoing analysis-engine updates to keep software aligned with new technologies and market requirements.', + }, + ], + }, + th: { + eyebrow: 'āļšāļĢāļīāļāļēāļĢāļ‚āļ­āļ‡āđ€āļĢāļē', + title: 'āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ āļāļēāļĢāļžāļąāļ’āļ™āļē āđāļĨāļ°āļāļēāļĢāļŠāļ™āļąāļšāļŠāļ™āļļāļ™', + lead: + 'āļ—āļĩāđˆ NexStudio āļ„āļ§āļēāļĄāļĄāļļāđˆāļ‡āļĄāļąāđˆāļ™āļ‚āļ­āļ‡āđ€āļĢāļēāđ„āļĄāđˆāđ„āļ”āđ‰āļˆāļšāđāļ„āđˆāļāļēāļĢāđƒāļŦāđ‰āļŠāļīāļ—āļ˜āļīāđŒāđƒāļŠāđ‰āļ‡āļēāļ™āļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒ āđ‚āļĄāđ€āļ”āļĨāļšāļĢāļīāļāļēāļĢāļ‚āļ­āļ‡āđ€āļĢāļēāļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ—āļĩāļĄāļ‡āļēāļ™āļ”āļķāļ‡āļĻāļąāļāļĒāļ āļēāļžāļŠāļđāļ‡āļŠāļļāļ”āļˆāļēāļ AI āļ—āļĩāđˆāļœāļŠāļēāļ™āđƒāļ™ LexAura āđāļĨāļ° MediAura', + cards: [ + { + layout: 'tall' as const, + decoration: 'wireframe-globe' as const, + title: 'āļāļēāļĢāđ€āļĢāļīāđˆāļĄāđƒāļŠāđ‰āļ‡āļēāļ™āđāļĨāļ°āļāļēāļĢāļ­āļšāļĢāļĄāđ€āļ‰āļžāļēāļ°āļ—āļēāļ‡', + body: + 'āļāļēāļĢāļ™āļģāļĢāļ°āļšāļš AI āļĄāļēāđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļ­āļēāļĻāļąāļĒāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļœāđˆāļēāļ™āđ€āļŠāļīāļ‡āļ§āļīāļ˜āļĩāļāļēāļĢ āđ„āļĄāđˆāđƒāļŠāđˆāđāļ„āđˆāđ€āļ—āļ„āļ™āļīāļ„ āđ€āļĢāļēāļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļšāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļ—āļĩāļĄāļāļŽāļŦāļĄāļēāļĒāđāļĨāļ°āļāļēāļĢāđāļžāļ—āļĒāđŒāđ€āļžāļ·āđˆāļ­:', + bullets: [ + 'āđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄāļ„āđ‰āļ™āļŦāļēāđāļĨāļ°āļŠāļĢāļļāļ›āļœāļĨ', + 'āđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡āđ€āļŠāļĩāļĒāļ‡āđāļĨāļ°āļĢāļ°āļšāļšāļ‡āļēāļ™āđ€āļ­āļāļŠāļēāļĢāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ„āļĨāđˆāļ­āļ‡āļ•āļąāļ§', + 'āļĨāļ”āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ™āļąāļĒāļŠāļģāļ„āļąāļ', + ], + }, + { + layout: 'wide' as const, + title: 'āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ—āļēāļ‡āđ€āļ—āļ„āļ™āļīāļ„āđāļĨāļ°āļ—āļĩāđˆāļ›āļĢāļķāļāļĐāļēāļāļēāļĢāļ›āļāļīāļšāļąāļ•āļīāļ‡āļēāļ™', + body: + 'āđ€āļĢāļēāđƒāļŦāđ‰āļāļēāļĢāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āđ€āļžāļ·āđˆāļ­āļ„āļ‡āļ„āļ§āļēāļĄāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āđƒāļ™āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļ‡āļēāļ™ NexStudio āđ„āļĄāđˆāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āđ€āļžāļĩāļĒāļ‡āļœāļđāđ‰āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļ‹āļąāļžāļžāļ­āļĢāđŒāļ• āđāļ•āđˆāđ€āļ›āđ‡āļ™āļžāļēāļĢāđŒāļ•āđ€āļ™āļ­āļĢāđŒāđ€āļŠāļīāļ‡āļāļĨāļĒāļļāļ—āļ˜āđŒāļŠāļģāļŦāļĢāļąāļšāļ­āļ‡āļ„āđŒāļāļĢ', + callout: { + title: 'āļāļēāļĢāđāļ—āļĢāļāđāļ‹āļ‡āđāļšāļš â€œBreaking Glass”', + body: + 'āđ€āļĄāļ·āđˆāļ­āđ€āļāļīāļ”āđ€āļŦāļ•āļļāđ€āļĢāđˆāļ‡āļ”āđˆāļ§āļ™āļŦāļĢāļ·āļ­āļ„āļ§āļēāļĄāļœāļīāļ”āļ›āļāļ•āļīāļĢāļ°āļ”āļąāļšāļ§āļīāļāļĪāļ• āđ€āļĢāļēāļĄāļĩāđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ”āđˆāļ§āļ™āđāļĨāļ°āļˆāļąāļ”āļĨāļģāļ”āļąāļšāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļŠāļđāļ‡āļŠāļļāļ” āđ€āļžāļ·āđˆāļ­āđāļāđ‰āļ›āļąāļāļŦāļēāđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩāđāļĨāļ°āļĢāļąāļāļĐāļēāļ„āļ§āļēāļĄāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āļ‚āļ­āļ‡āļšāļĢāļīāļāļēāļĢ', + }, + }, + { + layout: 'default' as const, + title: 'āļŠāđˆāļ§āļ™āļ‚āļĒāļēāļĒāđāļĨāļ°āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđāļšāļšāļāļģāļŦāļ™āļ”āđ€āļ­āļ‡', + body: + 'āđāļĄāđ‰ LexAura āđāļĨāļ° MediAura āļˆāļ°āļžāļĢāđ‰āļ­āļĄāđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļąāļ™āļ—āļĩ āđāļ•āđˆāļšāļēāļ‡āļ­āļ‡āļ„āđŒāļāļĢāļ­āļēāļˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ€āļ‰āļžāļēāļ°āļ—āļēāļ‡āļāļąāļšāļĢāļ°āļšāļšāđ€āļ”āļīāļĄ', + bullets: [ + 'API integration: āđ€āļŠāļ·āđˆāļ­āļĄ SaaS āļ‚āļ­āļ‡āđ€āļĢāļēāđ€āļ‚āđ‰āļēāļāļąāļšāļĢāļ°āļšāļšāļˆāļąāļ”āļāļēāļĢāļ—āļĩāđˆāđƒāļŠāđ‰āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§', + 'Custom modules: āļ­āļ­āļāđāļšāļšāļŠāđˆāļ§āļ™āļ‚āļĒāļēāļĒāđ€āļ‰āļžāļēāļ°āļ‡āļēāļ™āļ āļēāļĒāđƒāļ™āļ‚āļ­āļšāđ€āļ‚āļ•āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ‚āļ­āļ‡āđ€āļĢāļē', + ], + }, + { + layout: 'default' as const, + title: 'āļ­āļąāļ›āđ€āļ”āļ•āđāļĨāļ°āļšāļģāļĢāļļāļ‡āļĢāļąāļāļĐāļēāđ€āļŠāļīāļ‡āļžāļąāļ’āļ™āļē', + body: + 'āđ‚āļĨāļāļ‚āļ­āļ‡ AI āđāļĨāļ°āļ‚āđ‰āļ­āļāļģāļāļąāļšāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ•āļĨāļ­āļ”āđ€āļ§āļĨāļē āļšāļĢāļīāļāļēāļĢāļ‚āļ­āļ‡āđ€āļĢāļēāļĢāļ§āļĄāļ–āļķāļ‡āļāļēāļĢāļ­āļąāļ›āđ€āļ”āļ•āđ€āļ­āļ™āļˆāļīāļ™āļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒāļ—āļąāļ™āļŠāļĄāļąāļĒāđāļĨāļ°āļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļšāļĢāļīāļšāļ—āļ•āļĨāļēāļ”', + }, + ], + }, } as const; + +export const getServices = (locale: SupportedLocale) => servicesByLocale[locale]; + +/** Retro-compatibilità: fallback italiano. */ +export const services = servicesByLocale.it; diff --git a/src/data/home/site-meta.ts b/src/data/home/site-meta.ts index 0f8ca16..d6370ce 100644 --- a/src/data/home/site-meta.ts +++ b/src/data/home/site-meta.ts @@ -1,6 +1,25 @@ +import type { SupportedLocale } from './navigation'; + /** Meta pagina principale — usato da BaseLayout */ -export const siteMeta = { - title: 'NexStudio — Ingegneria del software e IA per settori regolamentati', - description: - 'NexStudio: software company con sede a Bangkok. SaaS ad alta complessità, integrazione di IA in flussi professionali, Legal Tech e Health Tech.', +const siteMetaByLocale = { + it: { + title: 'NexStudio — Ingegneria del software e IA per settori regolamentati', + description: + 'NexStudio: software company con sede a Bangkok. SaaS ad alta complessità, integrazione di IA in flussi professionali, Legal Tech e Health Tech.', + }, + en: { + title: 'NexStudio — Software engineering and AI for regulated industries', + description: + 'NexStudio is a software company based in Bangkok. We build high-complexity SaaS products and integrate AI into professional workflows across Legal Tech and Health Tech.', + }, + th: { + title: 'NexStudio — āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒāđāļĨāļ° AI āļŠāļģāļŦāļĢāļąāļšāļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāļ—āļĩāđˆāļĄāļĩāļ‚āđ‰āļ­āļāļģāļāļąāļš', + description: + 'NexStudio āļ„āļ·āļ­āļšāļĢāļīāļĐāļąāļ—āļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒāđƒāļ™āļāļĢāļļāļ‡āđ€āļ—āļžāļŊ āļžāļąāļ’āļ™āļē SaaS āļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļŠāļđāļ‡ āđāļĨāļ°āļœāļŠāļēāļ™ AI āđ€āļ‚āđ‰āļēāļāļąāļšāđ€āļ§āļīāļĢāđŒāļāđ‚āļŸāļĨāļ§āđŒāļĢāļ°āļ”āļąāļšāļĄāļ·āļ­āļ­āļēāļŠāļĩāļžāđƒāļ™āļŠāļēāļĒ Legal Tech āđāļĨāļ° Health Tech', + }, } as const; + +export const getSiteMeta = (locale: SupportedLocale) => siteMetaByLocale[locale]; + +/** Retro-compatibilità: fallback italiano. */ +export const siteMeta = siteMetaByLocale.it; diff --git a/src/data/home/stack.ts b/src/data/home/stack.ts index 04e3e3b..cb1bbcd 100644 --- a/src/data/home/stack.ts +++ b/src/data/home/stack.ts @@ -1,9 +1,12 @@ +import type { SupportedLocale } from './navigation'; + /** Sezione stack — infrastruttura Cloudflare e sicurezza */ -export const stackSection = { +const stackIt = { eyebrow: 'Lo stack tecnologico', title: 'Infrastruttura e sicurezza', lead: 'In NexStudio, la qualità dell’esperienza utente ÃĻ inscindibile dalla solidità dell’infrastruttura. Per questo motivo ci affidiamo a partner globali ad alta efficienza che garantiscono i piÃđ elevati standard di disponibilità e protezione dei dati.', + infrastructureHeading: 'Infrastruttura', cloudflare: { title: 'Ecosistema Cloudflare', intro: @@ -145,3 +148,168 @@ export const stackSection = { ] as const, }, } as const; + +const stackByLocale = { + it: stackIt, + en: { + ...stackIt, + eyebrow: 'Technology stack', + title: 'Infrastructure and security', + lead: + 'At NexStudio, user experience quality is inseparable from infrastructure resilience. That is why we rely on high-efficiency global partners that provide strong availability and data protection standards.', + infrastructureHeading: 'Infrastructure', + cloudflare: { + ...stackIt.cloudflare, + title: 'Cloudflare ecosystem', + intro: + '"Cloudflare helps accelerate performance, secure app availability, and optimize web experiences globally."', + points: [ + { + title: 'Performance without compromise', + body: + 'Access to our services remains low-latency worldwide, ensuring fluid usage even during complex data-processing operations.', + }, + { + title: 'Advanced security', + body: + 'We apply modern protection layers including end-to-end encryption, DDoS mitigation, and Web Application Firewall controls.', + }, + { + title: 'Compliance and data integrity', + body: + 'We use geographic data-control capabilities to align legal and medical data processing with local and international privacy requirements.', + }, + ] as const, + }, + continuity: { + title: 'Continuity and scalability', + body: + 'We provide professional-grade SLA uptime. Our cloud-native architecture scales instantly for workload peaks, large offices, and multi-site organizations.', + }, + whyThisChoice: { + title: 'Why NexStudio', + points: [ + 'Regulated vertical focus: we design for Legal Tech and Health Tech, where traceability, privacy, and service continuity are core product requirements.', + 'AI in real professional workflows: we embed models and automation with attention to accuracy, auditability, and human oversight.', + 'End-to-end responsibility: architecture, development, and evolution stay under one ownership model for clearer priorities and delivery.', + ] as const, + }, + cloudflareBadge: { + ...stackIt.cloudflareBadge, + label: 'Cloudflare ecosystem', + slogan: '"Helping build a better Internet."', + }, + awsBadge: { + ...stackIt.awsBadge, + label: 'AWS ecosystem', + slogan: '"The world’s most comprehensive and broadly adopted cloud platform."', + }, + infrastructureCarousel: { + ...stackIt.infrastructureCarousel, + ariaLabel: 'NexStudio infrastructure and technology partners', + items: [ + { + ...stackIt.infrastructureCarousel.items[0], + label: 'Cloudflare ecosystem', + slogan: '"Helping build a better Internet."', + }, + { + ...stackIt.infrastructureCarousel.items[1], + label: 'AWS ecosystem', + slogan: '"The world’s most comprehensive and broadly adopted cloud platform."', + }, + { + ...stackIt.infrastructureCarousel.items[2], + label: 'GitHub ecosystem', + }, + { + ...stackIt.infrastructureCarousel.items[3], + label: 'OpenAI ecosystem', + }, + ] as const, + }, + }, + th: { + ...stackIt, + eyebrow: 'āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāđāļ•āļ', + title: 'āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āđāļĨāļ°āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ', + lead: + 'āļ—āļĩāđˆ NexStudio āļ„āļļāļ“āļ āļēāļžāļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļœāļđāđ‰āđƒāļŠāđ‰āđāļĒāļāđ„āļĄāđˆāļ­āļ­āļāļˆāļēāļāļ„āļ§āļēāļĄāļĄāļąāđˆāļ™āļ„āļ‡āļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™ āđ€āļĢāļēāļˆāļķāļ‡āđ€āļĨāļ·āļ­āļāļžāļēāļĢāđŒāļ•āđ€āļ™āļ­āļĢāđŒāļĢāļ°āļ”āļąāļšāđ‚āļĨāļāļ—āļĩāđˆāļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ„āļ”āđ‰āļĄāļēāļ•āļĢāļāļēāļ™āļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāļžāļĢāđ‰āļ­āļĄāđƒāļŠāđ‰āļ‡āļēāļ™āđāļĨāļ°āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ', + infrastructureHeading: 'āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™', + cloudflare: { + ...stackIt.cloudflare, + title: 'āļĢāļ°āļšāļšāļ™āļīāđ€āļ§āļĻ Cloudflare', + intro: + '"Cloudflare āļŠāđˆāļ§āļĒāđ€āļĢāđˆāļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āļĢāļąāļšāļ›āļĢāļ°āļāļąāļ™āļ„āļ§āļēāļĄāļžāļĢāđ‰āļ­āļĄāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āđāļ­āļ› āđāļĨāļ°āļĒāļāļĢāļ°āļ”āļąāļšāļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāđ€āļ§āđ‡āļšāļ—āļąāđˆāļ§āđ‚āļĨāļ"', + points: [ + { + title: 'āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ—āļĩāđˆāđ„āļĄāđˆāļ›āļĢāļ°āļ™āļĩāļ›āļĢāļ°āļ™āļ­āļĄ', + body: + 'āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļšāļĢāļīāļāļēāļĢāļ‚āļ­āļ‡āđ€āļĢāļēāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļŦāļ™āđˆāļ§āļ‡āļ•āđˆāļģāļˆāļēāļāļ—āļļāļāļ—āļĩāđˆāļ—āļąāđˆāļ§āđ‚āļĨāļ āđāļĄāđ‰āđƒāļ™āļ‡āļēāļ™āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™', + }, + { + title: 'āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ‚āļąāđ‰āļ™āļŠāļđāļ‡', + body: + 'āđ€āļĢāļēāđƒāļŠāđ‰āļāļĨāđ„āļāļ›āđ‰āļ­āļ‡āļāļąāļ™āļŠāļĄāļąāļĒāđƒāļŦāļĄāđˆ āđ€āļŠāđˆāļ™ āļāļēāļĢāđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠ end-to-end āļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™ DDoS āđāļĨāļ° Web Application Firewall', + }, + { + title: 'āļāļēāļĢāļ›āļāļīāļšāļąāļ•āļīāļ•āļēāļĄāļ‚āđ‰āļ­āļāļģāļāļąāļšāđāļĨāļ°āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ', + body: + 'āđ€āļĢāļēāđƒāļŠāđ‰āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļāļģāļāļąāļšāļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļ­āđˆāļ­āļ™āđ„āļŦāļ§āļ”āđ‰āļēāļ™āļāļŽāļŦāļĄāļēāļĒāđāļĨāļ°āļāļēāļĢāđāļžāļ—āļĒāđŒāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļšāļ‚āđ‰āļ­āļāļģāļāļąāļšāļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ•āļąāļ§', + }, + ] as const, + }, + continuity: { + title: 'āļ„āļ§āļēāļĄāļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āđāļĨāļ°āļāļēāļĢāļ‚āļĒāļēāļĒāļ•āļąāļ§', + body: + 'āđ€āļĢāļēāļĢāļąāļšāļ›āļĢāļ°āļāļąāļ™ uptime āļĢāļ°āļ”āļąāļšāļĄāļ·āļ­āļ­āļēāļŠāļĩāļžāļ•āļēāļĄ SLA āđāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ cloud-native āļ—āļĩāđˆāļ‚āļĒāļēāļĒāđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩāđ€āļĄāļ·āđˆāļ­āļĄāļĩāđ‚āļŦāļĨāļ”āļŠāļđāļ‡', + }, + whyThisChoice: { + title: 'āļ—āļģāđ„āļĄāļ•āđ‰āļ­āļ‡ NexStudio', + points: [ + 'āđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāļ—āļĩāđˆāļĄāļĩāļ‚āđ‰āļ­āļāļģāļāļąāļš: Legal Tech āđāļĨāļ° Health Tech', + 'āļœāļŠāļēāļ™ AI āđ€āļ‚āđ‰āļēāļāļąāļšāļ‡āļēāļ™āļˆāļĢāļīāļ‡ āđ‚āļ”āļĒāļ„āļģāļ™āļķāļ‡āļ–āļķāļ‡āļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģ āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļĒāđ‰āļ­āļ™āļŦāļĨāļąāļ‡ āđāļĨāļ°āļāļēāļĢāļāļģāļāļąāļšāđ‚āļ”āļĒāļĄāļ™āļļāļĐāļĒāđŒ', + 'āļĢāļąāļšāļœāļīāļ”āļŠāļ­āļšāđāļšāļš end-to-end: āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ āļāļēāļĢāļžāļąāļ’āļ™āļē āđāļĨāļ°āļāļēāļĢāļ•āđˆāļ­āļĒāļ­āļ”āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āļ—āļĩāļĄāđ€āļ”āļĩāļĒāļ§', + ] as const, + }, + cloudflareBadge: { + ...stackIt.cloudflareBadge, + label: 'āļĢāļ°āļšāļšāļ™āļīāđ€āļ§āļĻ Cloudflare', + slogan: '"āļŠāđˆāļ§āļĒāļāļąāļ™āļŠāļĢāđ‰āļēāļ‡āļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļ™āđ‡āļ•āļ—āļĩāđˆāļ”āļĩāļāļ§āđˆāļē"', + }, + awsBadge: { + ...stackIt.awsBadge, + label: 'āļĢāļ°āļšāļšāļ™āļīāđ€āļ§āļĻ AWS', + slogan: '"āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļ„āļĨāļēāļ§āļ”āđŒāļ—āļĩāđˆāļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāđāļĨāļ°āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāđˆāļēāļ‡āļāļ§āđ‰āļēāļ‡āļ‚āļ§āļēāļ‡āļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āđ‚āļĨāļ"', + }, + infrastructureCarousel: { + ...stackIt.infrastructureCarousel, + ariaLabel: 'āļžāļēāļĢāđŒāļ•āđ€āļ™āļ­āļĢāđŒāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āđāļĨāļ°āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ‚āļ­āļ‡ NexStudio', + items: [ + { + ...stackIt.infrastructureCarousel.items[0], + label: 'āļĢāļ°āļšāļšāļ™āļīāđ€āļ§āļĻ Cloudflare', + slogan: '"āļŠāđˆāļ§āļĒāļāļąāļ™āļŠāļĢāđ‰āļēāļ‡āļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļ™āđ‡āļ•āļ—āļĩāđˆāļ”āļĩāļāļ§āđˆāļē"', + }, + { + ...stackIt.infrastructureCarousel.items[1], + label: 'āļĢāļ°āļšāļšāļ™āļīāđ€āļ§āļĻ AWS', + slogan: '"āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļ„āļĨāļēāļ§āļ”āđŒāļ—āļĩāđˆāļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāđāļĨāļ°āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāđˆāļēāļ‡āļāļ§āđ‰āļēāļ‡āļ‚āļ§āļēāļ‡āļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āđ‚āļĨāļ"', + }, + { + ...stackIt.infrastructureCarousel.items[2], + label: 'āļĢāļ°āļšāļšāļ™āļīāđ€āļ§āļĻ GitHub', + }, + { + ...stackIt.infrastructureCarousel.items[3], + label: 'āļĢāļ°āļšāļšāļ™āļīāđ€āļ§āļĻ OpenAI', + }, + ] as const, + }, + }, +} as const; + +export const getStackSection = (locale: SupportedLocale) => stackByLocale[locale]; + +/** Retro-compatibilità: fallback italiano. */ +export const stackSection = stackByLocale.it; diff --git a/src/layouts/SubpageLayout.astro b/src/layouts/SubpageLayout.astro index ff4f9cf..3156d34 100644 --- a/src/layouts/SubpageLayout.astro +++ b/src/layouts/SubpageLayout.astro @@ -1,6 +1,7 @@ --- import BaseLayout from './BaseLayout.astro'; import SiteFooter from '../components/SiteFooter.astro'; +import { getNavigation } from '../data/home'; interface Props { title: string; @@ -29,7 +30,8 @@ const printDate = new Intl.DateTimeFormat('it-IT', { const printSource = Astro.url.href; const path = Astro.url.pathname; const localeMatch = path.match(/^\/(en|th)(\/|$)/); -const currentLocale = localeMatch?.[1] ?? 'it'; +const currentLocale = (localeMatch?.[1] ?? 'it') as 'it' | 'en' | 'th'; +const navigation = getNavigation(currentLocale); const strippedPath = path.replace(/^\/(en|th)(?=\/|$)/, '') || '/'; const localeHref = (locale: 'it' | 'en' | 'th') => { if (locale === 'it') return strippedPath; @@ -71,7 +73,7 @@ const langMeta = {
{langMeta[currentLocale].code} @@ -129,7 +131,7 @@ const langMeta = {
Contattaci{navigation.items[4]?.label ?? 'Contattaci'} diff --git a/src/pages/index.astro b/src/pages/index.astro index d83fa82..31603cc 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -6,21 +6,33 @@ import ContactFormInline from '../components/ContactFormInline.astro'; import CardBottomRightTexture from '../components/CardBottomRightTexture.astro'; import SiteFooter from '../components/SiteFooter.astro'; import { - siteMeta, - navigation, - hero, + getSiteMeta, + getNavigation, + getHero, stats, - services, - stackSection, + getServices, + getStackSection, productsSection, - faq, - cta, + getFaq, + getCta, } from '../data/home'; const infrastructureCarouselItems = stackSection.infrastructureCarousel.items; const path = Astro.url.pathname; const localeMatch = path.match(/^\/(en|th)(\/|$)/); -const currentLocale = localeMatch?.[1] ?? 'it'; +const currentLocale = (localeMatch?.[1] ?? 'it') as 'it' | 'en' | 'th'; +const navigation = getNavigation(currentLocale); +const siteMeta = getSiteMeta(currentLocale); +const hero = getHero(currentLocale); +const services = getServices(currentLocale); +const stackSection = getStackSection(currentLocale); +const faq = getFaq(currentLocale); +const cta = getCta(currentLocale); +const pageLabels = { + it: { focus: 'Focus' }, + en: { focus: 'Focus' }, + th: { focus: 'āļˆāļļāļ”āđ€āļ™āđ‰āļ™' }, +}[currentLocale]; const localize = (href: string) => { if (currentLocale === 'it') return href; if (href.startsWith(`/${currentLocale}`)) return href; @@ -64,7 +76,7 @@ const langMeta = {