Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions echo/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ Follow `brand/STYLE_GUIDE.md` for all user-facing text.
- Never use bold for emphasis — use Royal Blue (`#4169e1`) or italics
- Say "participants/hosts", not "users"
- Dutch translations use informal "je/jij"; keep English terms when they sound better (Dashboard, Upload, Chat)
- Italian translations use informal "tu", target A2 reading level, sentence case for titles, active voice over passive — see `brand/STYLE_GUIDE.md` for the glossary

## UI Rules

Expand Down
54 changes: 54 additions & 0 deletions echo/brand/STYLE_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,59 @@ Logo files live in `logos/`. SVG preferred.

---

## Italian localization

Target reading level: A2 (general public, basic Italian). Short sentences, common words, present tense.

### Core rules

- Use "tu" - never "Lei" or "voi" (always informal, even in privacy/legal text)
- Natural phrasing, not word-for-word translation
- Prefer active voice ("Cancelliamo i dati") over passive ("I dati vengono cancellati")
- Prefer present tense over future where the meaning is the same ("Le domande arrivano" not "Riceverai le domande")
- Sentence case for titles, not Title Case ("Controllo microfono", not "Controllo Microfono")
- "dembrane" stays lowercase even at sentence start, even in Italian
- Keep English when it sounds better: Dashboard, Upload, Chat, Login, Wi-Fi
- Avoid subjunctive and conditional where a simple alternative works
- Short sentences. If a sentence has two ideas, split it

### Key glossary

| English | Italian |
|---------|---------|
| Dashboard | Dashboard |
| Upload | Carica / Caricamento |
| Chat | Chat |
| Conversation | Conversazione |
| Audio file | File audio |
| Participant | Partecipante |
| Host | Organizzatore |
| Recording | Registrazione |
| Settings | Impostazioni |
| Save | Salva |
| Delete | Elimina |
| Continue | Avanti |
| Back | Indietro |
| Privacy | Privacy |
| It's not working | Non funziona |
| We're fixing it | Stiamo sistemando |

### Examples

- Bad: "La preghiamo di caricare il suo file"
- Good: "Carica il tuo file"

- Bad: "Siamo lieti di informarLa che la funzionalità è stata ripristinata"
- Good: "La chat funziona di nuovo"

- Bad: "Le registrazioni vengono trascritte e analizzate per ottenere insight"
- Good: "Trascriviamo e analizziamo le registrazioni"

- Bad: "Riceverai le domande quando sarai nel portale"
- Good: "Le domande arrivano quando entri nel portale"

---

## Platform context

ECHO is event-driven, not daily-use software. Hosts run discrete engagement sessions: workshops, consultations, civic forums, employee feedback rounds.
Expand Down Expand Up @@ -382,3 +435,4 @@ Before shipping any UI:
- [ ] Have I avoided bold text?
- [ ] Are error states helpful, not scary?
- [ ] Does it work in Dutch?
- [ ] Does it work in Italian (at A2 reading level)?
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,29 @@ const ParticipantOnboardingCards = ({
],
},
],
"it-IT": [
...getSystemCards("it-IT", tutorialSlug, legalBasis, privacyPolicyUrl),
{
section: "Controllo microfono",
slides: [
{
component: MicrophoneTestComponent,
content: "Controlliamo se ti sentiamo bene.",
title: "Controllo microfono",
type: "microphone",
},
],
},
{
section: "Tutto pronto?",
slides: [
{
component: InitiateFormComponent,
title: "Tutto pronto?",
},
],
},
],
"nl-NL": [
...getSystemCards("nl-NL", tutorialSlug, legalBasis, privacyPolicyUrl),
{
Expand Down Expand Up @@ -377,7 +400,9 @@ const ParticipantOnboardingCards = ({
className="basis-1/2"
{...testId("portal-onboarding-mic-back-button")}
>
<Trans id="participant.button.back.microphone">Back</Trans>
<Trans id="participant.button.back.microphone">
Back
</Trans>
</Button>
)}
<Button
Expand Down
111 changes: 54 additions & 57 deletions echo/frontend/src/components/participant/hooks/useOnboardingCards.ts
Original file line number Diff line number Diff line change
Expand Up @@ -306,34 +306,33 @@ export const useOnboardingCards = () => {
slides: [
{
content:
"Registra la tua voce per rispondere alle domande e avere un impatto.",
"Registra la tua voce per rispondere alle domande e dire la tua.",
cta: "Andiamo!",
extraHelp:
"Questo è un mini-tutorial. Usa i pulsanti precedente e successivo per navigare. Al termine entrerai nel portale di registrazione.",
title: "Benvenuto su Dembrane!",
"Questo è un breve tutorial. Usa i pulsanti per andare avanti e indietro. Alla fine entri nel portale di registrazione.",
title: "Benvenuto su dembrane",
},
{
content:
"Dembrane aiuta a raccogliere facilmente contributi da grandi gruppi.",
content: "dembrane aiuta a raccogliere idee da gruppi grandi.",
cta: "Dimmi di più",
extraHelp:
"Che si tratti di feedback per un comune, di input sul lavoro o di partecipazione a una ricerca, la tua voce conta!",
title: "Cos'è Dembrane?",
"Feedback per il comune, idee al lavoro, ricerca: la tua voce conta.",
title: "Cos'è dembrane?",
},
{
content:
"Rispondi alle domande a tuo ritmo parlando o scrivendo.",
"Rispondi alle domande a tuo ritmo, parlando o scrivendo.",
cta: "Avanti",
extraHelp:
"La voce è la modalità principale perché permette risposte più naturali e ricche. Scrivere è sempre disponibile come alternativa.",
title: "Dì semplicemente ciò che pensi",
"Parlare è il modo principale: le risposte sono più naturali. Ma puoi anche scrivere.",
title: "Di' cosa pensi",
},
{
content: "Dembrane è più divertente in gruppo!",
content: "dembrane è più bello in gruppo.",
cta: "Avanti",
extraHelp:
"È ancora meglio se trovi qualcuno con cui discutere le domande e registrare la conversazione. Non possiamo sapere chi ha detto cosa, solo quali idee sono state condivise.",
title: "Da soli o in gruppo",
"Trova qualcuno per parlare insieme delle domande e registrare la conversazione. Non sappiamo chi ha detto cosa, solo quali idee sono state condivise.",
title: "Da solo o in gruppo",
},
],
},
Expand All @@ -342,22 +341,22 @@ export const useOnboardingCards = () => {
slides: [
{
content:
"Riceverai le domande quando sarai nel portale di registrazione.",
"Le domande arrivano quando entri nel portale di registrazione.",
cta: "Capito",
extraHelp:
"Le domande variano in base alle esigenze dell'host. Possono riguardare temi della comunità, esperienze di lavoro o ricerca. Se non ci sono domande specifiche, puoi condividere qualsiasi pensiero o preoccupazione.",
title: "È il momento delle domande",
"Le domande dipendono dall'host. Possono parlare di temi della comunità, lavoro o ricerca. Se non ci sono domande, puoi condividere qualsiasi pensiero o preoccupazione.",
title: "Le domande",
},
],
},
{
section: "Privacy",
slides: [
{
content: "Come registratore, controlli tu ciò che condividi.",
content: "Scegli tu cosa condividere.",
cta: "Dimmi di più",
extraHelp:
"Evita di condividere dettagli che non vuoi rendere noti all'host. Chiedi sempre il consenso prima di registrare altre persone.",
"Non condividere dettagli che non vuoi far sapere all'host. Chiedi sempre il permesso prima di registrare altre persone.",
title: "La privacy conta",
},
],
Expand Down Expand Up @@ -884,34 +883,33 @@ export const useOnboardingCards = () => {
slides: [
{
content:
"Registra la tua voce per rispondere alle domande e avere un impatto.",
"Registra la tua voce per rispondere alle domande e dire la tua.",
cta: "Andiamo!",
extraHelp:
"Questo è un mini-tutorial. Usa i pulsanti precedente e successivo per navigare. Al termine entrerai nel portale di registrazione.",
title: "Benvenuto su Dembrane!",
"Questo è un breve tutorial. Usa i pulsanti per andare avanti e indietro. Alla fine entri nel portale di registrazione.",
title: "Benvenuto su dembrane",
},
{
content:
"Dembrane aiuta a raccogliere facilmente contributi da grandi gruppi.",
content: "dembrane aiuta a raccogliere idee da gruppi grandi.",
cta: "Dimmi di più",
extraHelp:
"Che si tratti di feedback per un comune, di input sul lavoro o di partecipazione a una ricerca, la tua voce conta!",
title: "Cos'è Dembrane?",
"Feedback per il comune, idee al lavoro, ricerca: la tua voce conta.",
title: "Cos'è dembrane?",
},
{
content:
"Rispondi alle domande a tuo ritmo parlando o scrivendo.",
"Rispondi alle domande a tuo ritmo, parlando o scrivendo.",
cta: "Avanti",
extraHelp:
"La voce è la modalità principale perché permette risposte più naturali e ricche. Scrivere è sempre disponibile come alternativa.",
title: "Dì semplicemente ciò che pensi",
"Parlare è il modo principale: le risposte sono più naturali. Ma puoi anche scrivere.",
title: "Di' cosa pensi",
},
{
content: "Dembrane è più divertente in gruppo!",
content: "dembrane è più bello in gruppo.",
cta: "Avanti",
extraHelp:
"È ancora meglio se trovi qualcuno con cui discutere le domande e registrare la conversazione. Non possiamo sapere chi ha detto cosa, solo quali idee sono state condivise.",
title: "Da soli o in gruppo",
"Trova qualcuno per parlare insieme delle domande e registrare la conversazione. Non sappiamo chi ha detto cosa, solo quali idee sono state condivise.",
title: "Da solo o in gruppo",
},
],
},
Expand All @@ -920,54 +918,53 @@ export const useOnboardingCards = () => {
slides: [
{
content:
"Riceverai le domande quando sarai nel portale di registrazione.",
"Le domande arrivano quando entri nel portale di registrazione.",
cta: "Capito",
extraHelp:
"Le domande variano in base alle esigenze dell'host. Possono riguardare temi della comunità, esperienze di lavoro o ricerca. Se non ci sono domande specifiche, puoi condividere qualsiasi pensiero o preoccupazione.",
title: "È il momento delle domande",
"Le domande dipendono dall'host. Possono parlare di temi della comunità, lavoro o ricerca. Se non ci sono domande, puoi condividere qualsiasi pensiero o preoccupazione.",
title: "Le domande",
},
],
},
{
section: "Privacy",
slides: [
{
content: "Come registratore, controlli tu ciò che condividi.",
content: "Scegli tu cosa condividere.",
cta: "Dimmi di più",
extraHelp:
"Evita di condividere dettagli che non vuoi rendere noti all'host. Chiedi sempre il consenso prima di registrare altre persone.",
"Non condividere dettagli che non vuoi far sapere all'host. Chiedi sempre il permesso prima di registrare altre persone.",
title: "La privacy conta",
},
...(getPrivacyCard("it-IT", legalBasis, privacyPolicyUrl)?.slides ||
[]),
],
},
{
section: "Migliori Pratiche",
section: "Consigli utili",
slides: [
{
content:
"Immagina che Dembrane sia in vivavoce con te. Se riesci a sentirti, sei a posto.",
"Pensa che dembrane sia in vivavoce con te. Se senti la tua voce, va bene.",
cta: "Capito",
extraHelp:
"Un po' di rumore di fondo va bene, purché sia chiaro chi sta parlando.",
title: "Riduci il Rumore di Fondo",
"Un po' di rumore va bene. Importante: deve essere chiaro chi parla.",
title: "Riduci il rumore di fondo",
},
{
content:
"Assicurati di avere una connessione stabile per una registrazione fluida.",
content: "Usa una connessione stabile per registrare bene.",
cta: "Pronto!",
extraHelp:
"Wi-Fi o buoni dati mobili funzionano meglio. Se la connessione cade, non preoccuparti. Puoi sempre riprendere da dove avevi interrotto.",
title: "Connessione Internet Forte",
"Wi-Fi o dati mobili buoni vanno bene. Se la connessione cade, non preoccuparti: puoi continuare da dove hai lasciato.",
title: "Connessione stabile",
},
{
content:
"Evita interruzioni mantenendo il dispositivo sbloccato. Se si blocca, sbloccalo semplicemente e continua.",
cta: "Okay",
"Tieni il telefono sbloccato. Se si blocca, sbloccalo e continua.",
cta: "Ok",
extraHelp:
"Dembrane cerca di mantenere il dispositivo attivo, ma a volte i dispositivi possono sovrascrivere questa impostazione. Puoi regolare le impostazioni del dispositivo per rimanere sbloccato più a lungo se necessario.",
title: "Non bloccare il dispositivo!",
"dembrane prova a tenere il telefono attivo. A volte non funziona: puoi cambiare le impostazioni del telefono per stare sbloccato più a lungo.",
title: "Non bloccare il telefono",
},
],
},
Expand Down Expand Up @@ -1241,11 +1238,11 @@ export const useOnboardingCards = () => {
slides: [
{
content:
"L'organizzatore è responsabile di come vengono utilizzati i tuoi dati in questa sessione. dembrane elabora la tua conversazione per suo conto.",
"L'organizzatore decide come usare i tuoi dati in questa sessione. dembrane lavora per lui.",
cta: "Ho capito",
extraHelp:
"Le registrazioni vengono trascritte e analizzate per ottenere insight. I tuoi dati sono archiviati su server sicuri in Europa, non vengono utilizzati per addestrare modelli di IA e vengono eliminati entro 30 giorni dalla fine del progetto.\n\nDomande sulla tua privacy? Contatta direttamente l'organizzatore.",
title: "Titolare del trattamento, utilizzo e sicurezza.",
"Trascriviamo e analizziamo le registrazioni per ottenere informazioni utili. I tuoi dati restano su server sicuri in Europa. Non li usiamo per addestrare modelli di IA. Li cancelliamo entro 30 giorni dalla fine del progetto.\n\nHai domande sulla privacy? Scrivi direttamente all'organizzatore.",
title: "I tuoi dati: chi, come, sicurezza",
},
],
},
Expand Down Expand Up @@ -1398,14 +1395,14 @@ export const useOnboardingCards = () => {
{
checkbox: {
label:
"Acconsento alla registrazione e al trattamento della mia conversazione.",
"Accetto che la mia conversazione sia registrata e trattata.",
required: true,
},
content:
"L'organizzatore è responsabile di come vengono utilizzati i tuoi dati in questa sessione. dembrane elabora la tua conversazione per suo conto.",
"L'organizzatore decide come usare i tuoi dati in questa sessione. dembrane lavora per lui.",
cta: "Ho capito",
extraHelp:
"Le registrazioni vengono trascritte e analizzate per ottenere insight. I tuoi dati sono archiviati su server sicuri in Europa, non vengono utilizzati per addestrare modelli di IA e vengono eliminati entro 30 giorni dalla fine del progetto.\n\nDomande sulla tua privacy? Contatta direttamente l'organizzatore.",
"Trascriviamo e analizziamo le registrazioni per ottenere informazioni utili. I tuoi dati restano su server sicuri in Europa. Non li usiamo per addestrare modelli di IA. Li cancelliamo entro 30 giorni dalla fine del progetto.\n\nHai domande sulla privacy? Scrivi direttamente all'organizzatore.",
...(policyUrl
? {
link: {
Expand All @@ -1415,7 +1412,7 @@ export const useOnboardingCards = () => {
},
}
: {}),
title: "Titolare del trattamento, utilizzo e sicurezza.",
title: "I tuoi dati: chi, come, sicurezza",
},
],
},
Expand Down Expand Up @@ -1556,10 +1553,10 @@ export const useOnboardingCards = () => {
slides: [
{
content:
"dembrane registra e analizza questa conversazione sulla base del nostro legittimo interesse: acquisire le discussioni in modo accurato, fornire informazioni affidabili e sviluppare la nostra piattaforma.",
"dembrane registra e analizza questa conversazione. Lo facciamo per legittimo interesse: registrare bene le discussioni, dare informazioni affidabili, migliorare la nostra piattaforma.",
cta: "Ho capito",
extraHelp:
"Le registrazioni e le trascrizioni vengono eliminate entro 30 giorni dalla chiusura della sessione. I dati sono archiviati su server sicuri in Europa e non vengono utilizzati per addestrare modelli di IA.\n\nDomande o vuoi opporti? Contattaci a info@dembrane.com o consulta la nostra informativa sulla privacy.",
"Cancelliamo registrazioni e trascrizioni entro 30 giorni dalla fine della sessione. I dati restano su server sicuri in Europa. Non li usiamo per addestrare modelli di IA.\n\nHai domande o vuoi opporti? Scrivi a info@dembrane.com o leggi l'informativa sulla privacy.",
link: {
label: "Leggi l'informativa sulla privacy completa",
url: dembranePrivacyUrl,
Expand Down
8 changes: 4 additions & 4 deletions echo/frontend/src/locales/it-IT.po
Original file line number Diff line number Diff line change
Expand Up @@ -3325,7 +3325,7 @@ msgstr "Failed to remove logo"

#: src/routes/project/report/ProjectReportRoute.tsx:583
msgid "Failed to reschedule. Please choose a time further in the future and try again."
msgstr "Riprogrammazione fallita. Scegli un orario piu lontano e riprova."
msgstr "Riprogrammazione non riuscita. Scegli un orario più avanti e riprova."

#: src/components/conversation/hooks/index.ts:645
msgid "Failed to retranscribe conversation. Please try again."
Expand Down Expand Up @@ -4764,7 +4764,7 @@ msgstr "No conversations were processed. This may happen if all conversations ar

#: src/components/report/CreateReportForm.tsx:149
msgid "No conversations yet. You can schedule a report now and conversations will be included once they are added."
msgstr "Ancora nessuna conversazione. Puoi programmare un report ora e le conversazioni verranno incluse una volta aggiunte."
msgstr "Ancora nessuna conversazione. Puoi programmare un report ora. Le aggiungiamo quando arrivano."

#: src/components/chat/TemplatesModal.tsx:686
#~ msgid "No custom templates yet. Create one to get started."
Expand Down Expand Up @@ -8497,7 +8497,7 @@ msgstr ""

#: src/routes/project/chat/ProjectChatRoute.tsx:638
msgid "Welcome to Dembrane Chat! Use the sidebar to select resources and conversations that you want to analyse. Then, you can ask questions about the selected resources and conversations."
msgstr "Benvenuto in dembrane Chat! Usa la barra laterale per selezionare le risorse e le conversazioni che vuoi analizzare. Poi potrai fare domande sulle risorse e conversazioni selezionate."
msgstr "Benvenuto in dembrane Chat. Usa la barra laterale per scegliere risorse e conversazioni da analizzare. Poi puoi fare domande su quello che hai selezionato."

#: src/components/common/DembraneLoadingSpinner/index.tsx:23
msgid "Welcome to Dembrane!"
Expand All @@ -8509,7 +8509,7 @@ msgstr "Welcome to Dembrane!"

#: src/routes/project/chat/ProjectChatRoute.tsx:637
msgid "Welcome to Overview Mode! I have summaries of all your conversations loaded. Ask me about patterns, themes, and insights across your data. For exact quotes, start a new chat in Specific Context mode."
msgstr "Benvenuto nella modalità Panoramica! Ho caricato i riassunti di tutte le tue conversazioni. Chiedimi di schemi, temi e approfondimenti nei tuoi dati. Per citazioni esatte, avvia una nuova chat in modalità Contesto Specifico."
msgstr "Benvenuto nella modalità Panoramica. Ho caricato i riassunti di tutte le tue conversazioni. Chiedimi schemi, temi o approfondimenti nei tuoi dati. Per citazioni esatte, apri una nuova chat in modalità Contesto Specifico."

#: src/components/report/CreateReportForm.tsx:80
#~ msgid "Welcome to Reports!"
Expand Down
2 changes: 1 addition & 1 deletion echo/frontend/src/locales/it-IT.ts

Large diffs are not rendered by default.

Loading