Inizia con un cambio di lingua alla radice dell'app e collegalo a un provider che memorizza la lingua corrente e carica i messaggi. Use a selectbox to present options and connect its change evento per aggiornare la localizzazione.
In typescript progetti, praticamente define messaggi come una mappa per lingua, registrati them with the i18n provider, e esporre un traduttore attraverso binding on your page templates.
Use converters per formattare numeri e date e per gestire la gestione del plurale, in modo che le stringhe dell'interfaccia utente rimangano corrette tra le lingue. Costruire un piccolo, locale messaggi catalogare e caricarlo all'avvio per evitare il lampeggio di testo non tradotto.
Quando l'utente seleziona una lingua nel language-switch, l'app aggiorna la località e ricarica messaggi. Se la località diventa undefined, ricadere all'inglese. Se tu wanted l'app per riflettere immediatamente le modifiche, innescare un changed event e riassociazione dei componenti interessati.
Mantenere organizzate le traduzioni: archiviare le chiavi in un singolo namespace, utilizzare una luce page layout, e just scrivi test che esercitino registrati and binding flows. If you want per accelerare l'integrazione, definisci un dizionario condiviso per frasi comuni e documenta le tue lingue supportate. Aggiorna messaggi and converters man mano che la tua app cresce.
Step 1: Installa il plugin aurelia-i18n e aggiungi un translation.json
Install aurelia-i18n plugin and add a translation.json to your project now to enable i18n from the start. Use jspm to align with a bundled workflow or npm for modern builds: jspm install aurelia-i18n --dev; npm i aurelia-i18n --save.
Crea un wrapper leggero che collega il plugin al ciclo di vita di Aurelia. Il wrapper gestisce il caricamento dei dati di localizzazione ed espone una semplice funzione di traduzione. Aspettati dei convertitori per formattare numeri e date, e collegali al binding in modo che un singolo converter handles common formatting while converters può essere esteso per esigenze speciali.
Posiziona translation.json accanto al tuo punto di ingresso e fai riferimento ad esso tramite il loader. Un percorso tipico è src/assets/i18n/translation.json, e il file dovrebbe essere incluso nell'app per garantire che sia disponibile all'avvio, inclusi su Safari dove la memorizzazione nella cache offline può influire sul caricamento.
Example structure for translation.json: { "messages": { "greeting": "Hello, {name}!" }, "labels": { "save": "Save" } }
Note sulla strategia: utilizzare chiavi indefinite per stringhe ampie e riutilizzabili e chiavi specifiche per frammenti dell'interfaccia utente. Le chiavi selezionate si mappano alle parti necessarie dell'interfaccia utente, quindi le frasi desiderate rimangono leggibili nel codice e i traduttori possono restituire risultati accurati. Il progetto dovrebbe evolvere aggiungendo nuove chiavi sotto messages e labels man mano che le funzionalità cambiano, senza interrompere le traduzioni esistenti.
Se utilizzi aureliavalidation-i18n, allinea i messaggi di validazione in translation.json in modo che il wrapper possa fornire un feedback intuitivo all'utente. Esegui test su diversi browser, tra cui Safari, per confermare che le risorse aggregate vengano caricate correttamente e che le modifiche della localizzazione vengano riflesse immediatamente nell'interfaccia utente; la situazione dovrebbe diventare chiara.
Passo 2: Crea cartelle e file (src/i18n, locales, app.js, main.js)
Crea le cartelle e i file ora e collega aurelia-i18n alla tua app Aurelia, in modo che la localizzazione venga caricata all'avvio tramite un backend che fornisce dati di localizzazione. Posiziona la logica i18n di origine in src/i18n e organizza le traduzioni in locales; mantieni le convenzioni di denominazione di aurelia per evitare conflitti.
- Struttura delle cartelle e scopo
- src/i18n: contiene la configurazione, i convertitori e qualsiasi adattatore i18n personalizzato.
- locales: memorizza pacchetti JSON specifici per lingua, caricati con un pattern filesglob come locales/**/*.json.
- app.js: export a
configurafunzione che registra il plugin i18n, il backend e una locale predefinita (selezionata). - main.js: bootstrap Aurelia, registra il plugin i18n e avvia l'app con binding per impostare la lingua e i messaggi della località.
- app.js configuration
- Funzione esportata:
export function configure(aurelia){ ... } - Fornire un loader backend per recuperare file di localizzazione dal percorso delle localizzazioni, utilizzando
filesgloblikelocales/**/*.json. - Register
aurelia-i18nand set default locale viaselected. - Esporre un
formathelper o convertitori se hai bisogno di formattazioni personalizzate di date o numeri.
- Funzione esportata:
- Principale punto di ingresso e binding a runtime
- main.js avvia Aurelia e crea il binding per un elemento selettore di lingua, ad esempio, un
<selectbox>legato aselected. - Use
labelchiavi dalocalesper rendere testo dinamico:${firstname}dai dati vincolati (firstname proviene dal tuo view-model). - Restituisce l'istanza dell'app configurata in modo che la navigazione e il routing funzionino con contenuti localizzati.
- main.js avvia Aurelia e crea il binding per un elemento selettore di lingua, ad esempio, un
- Messaggi e binding a runtime
- Nei tuoi modelli di visualizzazione, associa alle chiavi i18n tramite un binding o un helper, ad esempio,
t('messages.greeting', { firstname: firstname }). - Fornire alcune traduzioni denominate, come
orderandselected, per dimostrare il cambio di locale senza un ricaricamento completo. - Definisci i segnaposto e la formattazione in
messaggiper supportare valori dinamici comefirstnameandaureliasnaming.
- Nei tuoi modelli di visualizzazione, associa alle chiavi i18n tramite un binding o un helper, ad esempio,
Esempio di organizzazione in località
- locales/en-US.json
- locales/de-DE.json
- locales/ru-RU.json
Suggerimento: usa filesglob per caricare automaticamente tutte le traduzioni, ad esempio, locales/**/*.json. Nei tuoi messaggi, mantieni le chiavi piatte o raggruppate sotto label and messaggi, così un vincolo come binding="i18n.t('messages.welcome', { firstname: firstname })" rimane pulito e specifico.
Step 3: Use a plugin with TypeScript and Aurelia's loader
Install aurelia-i18nt and register it with Aurelia's loader in your TypeScript bootstrap to enable dynamic translation loading. This setup lets the loader fetch translation bundles on demand, so you don't ship all strings upfront. Use the option backend with a loadPath che punta al tuo server o file statici, e imposta un valore predefinito fallbackLocale.
Configure il backend in modo che il loader possa richiedere file per namespace, come /i18n/en/common.json o /i18n/en/home.json. Se una chiave manca, potrebbe essere undefined, così puoi mostrare la chiave originale o un fallback amichevole. Gestisci gli errori con un blocco try/catch attorno alla richiesta e registrali in window.console per il debug.
Examplein un template, associa le traduzioni con il servizio i18n. Usa chiavi come firstname to render the user's given name and support a namespace greeting. Example: binding with i18n.t('greeting.firstname') or i18n.t('home:firstname') covers different contexts.
Suggerimento TypeScript: fornire accesso tipizzato alle chiavi dichiarando una piccola interfaccia e avvolgendo la chiamata t(). Questo diventa specific to your project and helps with binding in templates. Se si compila con strict mode, i controlli non definiti diventano visibili al momento della compilazione.
Gestione eventiascolta le modifiche della località tramite l'evento del plugin, quindi chiama un metodo di aggiornamento per ricaricare i bundle del namespace. Questa modifica si propaga attraverso il tuo binding aggiornamenti, in modo che i componenti riflettano la nuova lingua senza manipolazione manuale del DOM.
Opzioni backendospita le traduzioni su un backend dedicato, oppure servile come asset statici. In una configurazione semplice, effettui una request per scaricare /locales/{lng}/{ns}.json e memorizzare i risultati in memoria per un accesso rapido. Il loader would provide un ritorno di fallimento quando la risorsa richiesta non viene trovata. Questo diventerebbe potente quando ti connetti a un backend reale, e puoi search chiavi tra i namespace caricati per coprire i casi che gli utenti hanno indicato nell'interfaccia utente.
Consigli per le prestazionicaricare i namespace comuni durante l'avvio dell'app, memorizzare nella cache i risultati ed evitare chiamate di rete ripetute. Usa around la startup per recuperare bundle essenziali, quindi cover others on demand. Quando testi, verifica che la chiave firstname si risolve correttamente tra i componenti, e che una chiave sconosciuta mostra il valore di fallback o la chiave stessa.
Passaggio 4: Strutturare il file JSON di traduzione e le chiavi
Adottare un singolo file di traduzione per la localizzazione inglese e posizionarlo in una cartella 'locales'. Caricare frammenti aggiuntivi con uno schema simile a un glob in modo che gli aggiornamenti rimangano centralizzati senza modifiche manuali. Mantenere l'albero poco profondo e logico per supportare ricerche rapide durante il rendering dell'interfaccia utente.
Organizza per aree funzionalità: header, contenuto e azioni. All'interno di ogni area, assegna etichette brevi per le stringhe dell'interfaccia utente. Esempio:
{
"header": { "title": "Welcome", "subtitle": "App Guide" },
"content": { "welcome": "Hello" },
"actions": { "submit": "Submit" }
}
Crea un tipo TypeScript che rispecchi la forma del JSON. Questo tipo chiarisce la struttura e gli editor offrono il completamento automatico. Un approccio compatto mantiene allineati sia i controlli a runtime che quelli a compile-time.
Handle date-like strings with simple placeholders and a separate formatting utility. Example: "today": "Today is {date}". The runtime applies a date formatter or a dedicated function, keeping strings readable and plain.
Quando compaiono nuove schermate, estendi l'albero esistente per mantenere la coerenza. Utilizza un file di mapping centrale come fonte di verità e mantieni un piccolo set di sezioni radice.
Caricamento note: utilizzare un loader per recuperare il JSON ed applicare stringhe tramite percorso come header.title o content.welcome.
Esempio di frammento:
{
"header": { "title": "Welcome", "subtitle": "App Guide" },
"content": { "welcome": "Hello" }
}
Passaggio 5: Impostare la localizzazione e implementare una casella di selezione della localizzazione
Associa un controllo di cambio lingua alla località attiva e attiva una modifica sul provider i18n quando l'utente seleziona una nuova lingua.
Configura l'i18n con i18next-xhr-backend e un filesglob in modo che le traduzioni vengano caricate senza problemi in tutto il progetto. Questo approccio copre il caricamento di file JSON per ogni locale, mantiene organizzate le chiavi e supporta date e messaggi specifici per la località. Usa il provider per mantenere persistita la lingua scelta, in modo che gli utenti vedano il contenuto corretto nelle richieste successive.
Implementation details
// View-model
import { I18N } from 'aurelia-i18n';
export class App {
static inject = [I18N];
constructor(i18n) {
this.i18n = i18n;
this.locale = localStorage.getItem('locale') || 'en';
}
changeLocale(locale) {
this.locale = locale;
this.i18n.setLocale(locale);
localStorage.setItem('locale', locale);
}
}
<select value.bind="locale" change.delegate="changeLocale(locale)">
<option value="en">English</option>
<option value="ru">Русский</option>
<option value="es">Español</option>
</select>
Nella configurazione del backend, utilizza i18next-xhr-backend con un loadPath e filesglob per coprire tutti i file di localizzazione. Esempio: backend: { loadPath: '/locales/{{lng}}/{{ns}}.json', filesGlob: '**/*.json' }. Questa configurazione supporta bundle linguistici specifici ed evita la mancanza di chiavi durante le richieste. Per i messaggi di validazione e le date, integra aureliavalidation-i18n nei tuoi moduli in modo che il feedback si adatti alla località corrente e assicurati che il provider rimanga l'unica fonte di verità per i dati linguistici.
Step 6: Visualizza, Unit Test e ricerche salvate per filtrare i risultati
Vincola tutte le etichette dell'interfaccia utente alle chiavi di localizzazione ed espone un pannello di ricerche salvate per filtrare i risultati. Esiste un percorso chiaro tramite jspm per caricare aurelia-i18n e i polyfill di windowintl, quindi estendere il loader confezionato per recuperare i bundle di localizzazione da un backend o file statici. Con questa configurazione, l'interfaccia si aggiorna in modo naturale quando la localizzazione cambia, c'è un ritorno fluido ai filtri precedenti e la vita dell'interfaccia utente rimane coerente. Utilizza un oggetto opzioni per condividere la lingua, la regione e i formati di data in tutta la vista in modo che l'esperienza risulti coesa.
Per mantenere veloce la visualizzazione, implementare un valueconverter per date e numeri e collegarlo alla locale corrente. Esempio: un DateValueConverter formatta le date tramite windowintl quando disponibile; altrimenti ricade su ISO. Le sorgenti typescript in aurelia-framework gestiscono la logica del converter, e si può registrare il converter globalmente. Le chiavi delle etichette guidano tutte le stringhe, e anche il pannello delle ricerche salvate utilizza etichette sensibili alla locale. Questo approccio sarebbe semplice da adattare in un altro modulo e scalerebbe con più locali.
Binding dell'interfaccia utente e convertitori di valori
Nell'aurelia-framework, associa il testo alle chiavi i18n utilizzando il binding 't' o 'i18n.bind', e utilizza valueconverter per formattare le date con formati scelti dalla localizzazione. Il loader può caricare risorse da asset raggruppati o da un backend, e puoi usare jspm per gestire le dipendenze a runtime. Assicurati che date e valute vengano renderizzate in modo coerente su Safari includendo i polyfill necessari e testando con windowintl. I file di localizzazione di esempio (en.json, fr.json) mantengono i valori delle etichette in semplici stringhe in modo che le traduzioni rimangano gestibili.
Test unitari e ricerche salvate
Scrivi unit test con aurelia-testing per verificare che la vista renda stringhe localizzate e che le ricerche salvate filtrino correttamente i risultati. Estendi i test per coprire DateValueConverter attraverso le impostazioni locali e valida che le ricerche salvate persistano in localStorage e vengano ripristinate al ricaricamento. Usa un backend simulato nei test se necessario e verifica che il loader restituisca bundle per ogni impostazione locale. Una volta terminato, esegui i test nel tuo runner preferito; questo ridurrebbe il rischio di regressione e ti aiuterebbe ad estendere la copertura i18n lì e ritorno.




