L’interfaccia di amministrazione di EmDash è traducibile utilizzando Lingui per l’estrazione dei messaggi e Lunaria per il monitoraggio del progresso delle traduzioni. Tutte le traduzioni sono memorizzate in file PO (gettext) — uno per locale.
Stato delle traduzioni
Consulta la dashboard delle traduzioni per il progresso attuale di tutti i locale.
Chi può tradurre
Le traduzioni devono provenire da madrelingua o parlanti fluenti. Non accettiamo traduzioni generate da macchina. Se utilizzi strumenti di IA per assisterti, devi verificare ogni stringa manualmente e testare il risultato nel contesto (vedi Testare le tue traduzioni qui sotto).
Preferiamo che una stringa resti non tradotta piuttosto che tradotta male. Una traduzione sbagliata è peggiore della visualizzazione del testo inglese come fallback — induce attivamente in errore gli utenti.
Struttura dei file
I cataloghi di traduzione si trovano in packages/admin/src/locales/:
packages/admin/src/locales/
├── en/
│ └── messages.po # English (source)
├── de/
│ └── messages.po # German
└── ...
Ogni file .po contiene coppie msgid/msgstr. Il msgid è il testo sorgente in inglese; il msgstr è la tua traduzione. Un msgstr vuoto significa “non ancora tradotto” — Lingui utilizzerà l’inglese come fallback in fase di esecuzione.
Tradurre le stringhe
-
Consulta la dashboard delle traduzioni per vedere cosa necessita di lavoro. Controlla le PR aperte per evitare duplicazioni.
-
Fai il fork del repository e crea un branch:
git checkout -b i18n/de -
Apri il file PO del tuo locale (es.,
packages/admin/src/locales/de/messages.po). -
Inserisci le traduzioni. Ogni voce ha questo aspetto:
#: packages/admin/src/components/LoginPage.tsx:304 msgid "Sign in with Passkey" msgstr ""Compila il
msgstr:#: packages/admin/src/components/LoginPage.tsx:304 msgid "Sign in with Passkey" msgstr "Mit Passkey anmelden" -
Testa le tue traduzioni (vedi sotto).
-
Apri una PR con target
main. Formato del titolo:i18n(de): add/update German translations.
Cosa tradurre
- Il valore
msgstrdi ogni voce.
Cosa NON tradurre
- I valori
msgid— sono chiavi di ricerca. - I segnaposto di interpolazione come
{error},{email},{label}— mantienili esattamente come sono. - I tag in stile XML come
<0>,</0>— avvolgono elementi interattivi (link, pulsanti). Mantieni i tag e traduci il testo tra di essi. - I commenti che iniziano con
#:— sono riferimenti al codice sorgente aggiunti da Lingui.
Interpolazione e tag
Alcune stringhe contengono segnaposto e tag:
msgid "Authentication error: {error}"
msgstr "Authentifizierungsfehler: {error}"
msgid "Don't have an account? <0>Sign up</0>"
msgstr "Noch kein Konto? <0>Registrieren</0>"
msgid "If an account exists for <0>{email}</0>, we've sent a sign-in link."
msgstr "Falls ein Konto für <0>{email}</0> existiert, haben wir einen Anmeldelink gesendet."
I segnaposto ({error}, {email}) vengono sostituiti con valori dinamici in fase di esecuzione. I tag (<0>...</0>) avvolgono componenti React. Entrambi devono apparire nella tua traduzione esattamente come nel testo sorgente — stessi nomi, stessa annidamento.
Testare le tue traduzioni
-
Compila ed esegui la demo:
pnpm run locale:compile pnpm build pnpm --filter emdash-demo dev -
Cambia locale nella pagina Impostazioni dell’amministrazione e verifica che le tue traduzioni appaiano correttamente nel contesto.
Locale pseudo
EmDash include un locale pseudo che trasforma tutte le stringhe avvolte in caratteri accentati simili — "Dashboard" diventa "Ðàšĥƀöàřð", e così via. Qualsiasi stringa che appare in inglese normale mentre il locale pseudo è attivo manca di un wrapper t..“ oppure proviene dall’esterno del catalogo.
Per attivarlo, aggiungi quanto segue al tuo file .env nella directory della demo:
EMDASH_PSEUDO_LOCALE=1
Poi riavvia il server di sviluppo. Il locale pseudo appare come Pseudo nel selettore di lingua nella pagina di accesso e nelle Impostazioni. Passa ad esso per individuare a colpo d’occhio le stringhe non avvolte.
Aggiungere una nuova lingua
Se la tua lingua non ha ancora un file PO:
-
Aggiungi il locale a
packages/admin/src/locales/locales.ts:export const LOCALES: LocaleDefinition[] = [ { code: "en", label: "English", enabled: true }, { code: "de", label: "Deutsch", enabled: true }, // ... { code: "ja", label: "日本語", enabled: false }, // add yours ];Questa è l’unica fonte di verità —
lingui.config.ts,lunaria.config.tse il runtime dell’amministrazione derivano tutti le loro liste di locale da questo file. Impostaenabled: falsea meno che le tue traduzioni non abbiano una copertura del 100% — lo abiliteremo quando la traduzione raggiungerà una copertura sufficiente. -
Esegui l’estrazione per generare il file PO vuoto:
pnpm run locale:extractQuesto crea
packages/admin/src/locales/{your-locale}/messages.pocon tutte le stringhe pronte per la traduzione. -
Traduci e testa seguendo i passaggi sopra.
Standard di traduzione
Accuratezza
Le traduzioni devono riflettere fedelmente il testo sorgente in inglese a livello di madrelingua. Non aggiungere, rimuovere o reinterpretare il significato. Se una stringa sorgente è ambigua, controlla il commento #: per la posizione del file sorgente — leggi il codice del componente per comprendere il contesto.
Coerenza
Usa una terminologia coerente all’interno del tuo locale. Se traduci “collection” come “Sammlung” in un punto, non passare a “Kollektion” altrove. Se la tua lingua ha già delle traduzioni, leggi il file PO esistente prima di iniziare per allinearti alla terminologia stabilita.
Tono
L’interfaccia di amministrazione usa un tono diretto e professionale. Adotta lo stesso tono nella tua lingua — evita formulazioni eccessivamente formali o eccessivamente informali.
Traduzioni assistite dall’IA
Puoi usare strumenti di IA per redigere bozze di traduzioni, ma:
- Devi verificare ogni stringa personalmente. Gli strumenti di IA commettono errori sottili che solo un parlante fluente noterebbe — registro sbagliato, formulazioni innaturali, termini tecnici errati.
- Devi testare il risultato nell’interfaccia di amministrazione in esecuzione. Gli strumenti di IA non sono consapevoli dei vincoli di layout né del contesto dell’interfaccia.
- Dichiara l’uso dell’IA nella descrizione della tua PR.
- Le PR con traduzioni automatiche palesemente non verificate verranno chiuse.
Traduzioni parziali
Le traduzioni parziali sono benvenute. Non è necessario tradurre tutte le stringhe in una singola PR — qualsiasi progresso è utile. Le stringhe non tradotte utilizzeranno l’inglese come fallback in fase di esecuzione.