Recentemente ho faticato con lo stesso problema.
Trovare un modo pulito per fare questo è stata una vera sfida - la maggior parte delle alternative erano o ..
1) duplicare i vostri base di codice per ogni locale (WTH)
2) Scaricare file localizzati imperativi ciascuna della vostra componenti (manutenzione inferno? Che dire dei poveri traduttori?)
3) Utilizzare/generare un file statico contenente traduzioni e fare riferimento ad esso (tutte le lingue vengono scaricate? Passo aggiuntivo per generarlo? Come tenerle sincronizzate? ?)
ho cercato di ottenere il migliore dei mondi possibili e si è conclusa con una classe di utilità responsabile:
1) Caricare i file di traduzione ExtJS (che si applicano essenzialmente sostituzioni per i componenti ExtJS base)
2) Caricamento di un resourcebundle delle proprietà specifiche della locale (specificando le impostazioni locali da caricare) dal server.
3) Prototipazione stringa con un metodo translate() che interroga l'archivio caricato (contenente il pacchetto di messaggi dal server) e restituisce la traduzione in base al valore della stringa.
Questo è il senso delle cose:
Bundle & prototipazione:
localeStore.load({
callback : function(records, operation, success) {
// Define translation function (NB! Must be defined before any components which want to use it.)
function translate() {
var record = localeStore.getById(this.valueOf()) ;
if(record === null) {
alert('Missing translation for: ' + this.valueOf()); // Key is not found in the corresponding messages_<locale>.properties file.
return this.valueOf(); // Return key name as placeholder
} else {
var value = record.get('value');
}
return value;
}
String.prototype.translate = translate;
callback.call(); // call back to caller(app.js/Ext.Application), loading rest of application
}
});
Come esempio da una vista:
this.copyButton = Ext.create('Ext.button.Button', {
disabled: true,
text: 'DOCUMENT_LIBRARY_MENU_COPYTO_BUTTON'.translate(),
action: 'openCopyDialog'
});
Bundle sul server (mesages_en.properties): DOCUMENT_LIBRARY_MENU_COPYTO_BUTTON = Copia file e tc ..
Pro:
codice
- senza fronzoli, 'Your_key'.translate() lo rende facile da leggere e consapevoli che questo è una stringa localizzata
- Nessuno/poco overhead di manutenzione (Keeping un file override per ogni locale? Gesù ..)
- Carica solo il locale di cui hai bisogno, non l'intero shabang.
- Se lo si desidera, è possibile anche avere la propria traduzione per i file internazionali ExtJS nello stesso pacchetto.
- Si potrebbe scrivere unit test per assicurare che tutti i bundle contengono gli stessi tasti, evitando così traduzioni orfani in seguito
Contro:
- sincrono - il negozio deve essere caricato prima i tuoi principale inizia app. Ho risolto questo problema aggiungendo un callback dalla classe di utilità che è stata chiamata una volta caricati tutti i testi.
- No popolazione in tempo reale dei testi .. anche se non ho voglia di fare i miei utenti sovraccaricare il server sia: P
Finora il mio approccio ha funzionato abbastanza bene per le mie esigenze. Il carico del sito non è notevolmente più lento ei pacchetti (contenenti ~ 200 chiavi/valori per fascio) misurano a ~ 10kb durante il caricamento.
Grazie a JaySee, un buon approccio a questo prototipo, rende il codice un piacere da leggere e fornisce ancora un approccio di traduzione semplice! – Paul
Grazie per la soluzione elegante. Se usi [Ext.ux.Cache] (https://market.sencha.com/extensions/ext-ux-cache) che Cons può essere cambiato in Pro – Pencroff