Uno strumento di traduzione open-source online (installabile per il server di scelta) che può soddisfare le vostre esigenze è Pootle, che viene costruito sopra Translate Toolkit. Ho usato Pootle come traduttore per LibreCAD. Puoi sfogliare LibreCAD's Translation Server e vederlo in azione. LibreCAD utilizza Qt come framework di base e Pootle gestisce il caricamento e il download di file TS, che vengono utilizzati per le traduzioni in Qt. Avendo anche usato Transifex, posso dirti che Pootle non è così elegante (potresti vederlo da solo, anche se hai in mente che il server di traduzione di LibreCAD usa una versione precedente di Pootle), ma non è affatto male con cui lavorare. Devi solo stabilire che i file di cui la tua applicazione avrà bisogno per le traduzioni possono essere esportati (e possibilmente importati) da (e possibilmente a) il tuo server di traduzione. Puoi tradurre usando un browser web oppure puoi tradurre offline e poi procedere con l'upload dei tuoi file modificati e applicare in batch tutte le traduzioni modificate. Un altro strumento di traduzione basato sul web che sembra fornire un approccio simile ma più moderno di Pootle (sembra migliore e ha una stretta integrazione del controllo della versione), pur essendo basato su Translate Toolkit, è Weblate. Questo è anche open-source e può essere distribuito sul tuo server preferito.
Per fornire ulteriori informazioni, se si guarda a Translation Related File Formats, si avrà un'idea migliore di ciò che Pootle e Translate Toolkit sono in grado di esportare/importare. Da quella lista e dalla mia esperienza di traduzione, posso dirvi che i file INI sono usati per le traduzioni nel core Joomla!, gli array di traduzione PHP sono usati per le traduzioni nelle applicazioni Yii, e i file Qt Linguist TS sono usati, come accennato prima, per traduzioni in applicazioni Qt. Ho anche sperimentato con GNU gettext, che è supportato dalla libreria Free Software Foundation per la localizzazione.GNU gettext utilizza i file PO per le traduzioni, che possono essere gestiti da Translate Toolkit.
L'idea alla base di tutti gli approcci di localizzazione, indipendentemente dalla piattaforma, è più o meno la stessa. Disegni il tuo codice avendo in mente una lingua principale specifica e usa questa lingua nel tuo codice. L'inglese sarebbe la scelta ideale, ma non è necessario. Dovresti scegliere una lingua con cui tutti gli sviluppatori possono lavorare, un linguaggio che non rallenta lo sviluppo (mentre cerchi un paio di etichette per i pulsanti, non ti piacerebbe pensare a una sola etichetta per minuti), e una lingua che è usato dal tuo pubblico di destinazione principale, solo nel caso in cui esista un pubblico di destinazione principale e allo stesso tempo in via di sviluppo con un altro linguaggio, potrebbe rendere l'applicazione innaturale per il tuo pubblico di destinazione principale, dopo che è stata tradotta nell'obiettivo principale lingua del pubblico. Questa è anche la lingua in cui tutti i tuoi traduttori riceveranno le stringhe della lingua d'origine (e, quindi, avranno come punto di riferimento), al fine di tradurre in tutte le altre lingue di destinazione. Potrebbe essere necessario un compromesso, perché stiamo parlando di una sola lingua per lo sviluppo. Andando avanti, in qualsiasi momento durante lo sviluppo, che è necessario inserire una stringa di lingua nel codice, non lo si inserisce direttamente, ma lo si racchiude in una chiamata di funzione speciale specificata dalla piattaforma di localizzazione che si utilizza. In un'applicazione Qt, ad esempio, anziché QLabel *label = new QLabel("Password:");
, scrivere QLabel *label = new QLabel(tr("Password:"));
. Durante l'esecuzione dell'applicazione, la lingua dell'utente viene determinata all'interno della chiamata alla funzione tr
, viene sfogliato il file di lingua appropriato per la lingua dell'utente e viene recuperato e utilizzato come etichetta il messaggio tradotto corrispondente a "Password:"
per la lingua dell'utente. La determinazione/definizione della lingua è un meccanismo separato che essenzialmente ottiene/imposta una variabile globale/statica, quella che viene cercata quando viene chiamata la funzione tr
nell'esempio sopra. Ciò che può essere gestito appositamente da ciascuna piattaforma è costituito da forme plurali (traduzione condizionale basata su alcuni parametri). In Yii, ad esempio, potresti avere 'n==1#one book|n>1#many books'
come stringa di traduzione. Nell'applicazione si utilizza Yii::t('app', 'n==1#one book|n>1#many books', 1);
, ovvero si fornisce anche il numero effettivo come parametro, in modo che sia possibile utilizzare il modulo corretto (il parametro 'app'
utilizzato nella funzione di traduzione fa riferimento a una specifica categoria di traduzione denominata app
, poiché, in in ogni lingua, è possibile utilizzare diverse categorie di traduzione per parti della propria applicazione).
Per aggiungere alcune informazioni finali, l'utilizzo di un back-end comune generico per le traduzioni consente di riutilizzare la maggior parte delle stringhe tradotte, quando si esegue la migrazione da un framework a un altro o anche se esistono più implementazioni diverse per la stessa applicazione allo stesso tempo, ad es esiste un'applicazione basata su browser e un'applicazione nativa. Le forme plurali richiederebbero una gestione speciale e traduzioni separate per la stessa stringa di linguaggio a causa dell'essere realmente specifiche della piattaforma (ma, se necessario, la maggior parte delle forme plurali può essere eliminata spostando la condizione dal dominio della stringa di traduzione al dominio del codice). Ma la stragrande maggioranza delle traduzioni in un'applicazione sono mappature dirette di una stringa all'altra. Alcuni framework, come Qt, dispongono di strumenti per la scansione dei file di origine e l'aggiornamento dei file di traduzione in base ai nuovi usi della funzione di traduzione speciale (tr
in Qt). Se tale strumento esiste per il framework di tua scelta, non è necessario aggiungere manualmente un mapping di traduzione a un file di traduzione. Dopo la scansione dei file di origine, la mappatura verrà visualizzata nei file di traduzione, in modo predefinito alla stringa originale come traduzione e in attesa della stringa tradotta per sostituirla. Indagare i possibili flussi di lavoro prima di impegnarsi in un approccio.
Attualmente stiamo affrontando lo stesso problema. Sto iniziando a raggiungere la conclusione che fare la nostra è la soluzione più economica e migliore. Gli online sono in genere molto cari con più progetti e più lingue rispetto a creare il nostro. – Warpzit
@Warpzit Suppongo che nessuna risposta abbia fornito informazioni utili. Se possibile, ti preghiamo di comunicarci la tua decisione in merito a quale piattaforma, se esistente, da utilizzare. – xnakos
@xnakos, beh, in realtà hanno fornito più o meno informazioni preziose, ma non credo che ci sia stato abbastanza lavoro da parte di nessuno per distinguere il resto. Non so se AlexVogel si sente allo stesso modo :) – Warpzit