Sono stato alle prese con questa domanda per alcuni mesi ormai, ma non sono stato in una situazione che avevo bisogno di esplorare tutte le possibili opzioni prima. In questo momento, sento che è tempo di conoscere le possibilità e creare le mie preferenze personali da utilizzare nei miei prossimi progetti.
Vorrei prima fare uno schizzo della situazione che sto cercando
Sto per aggiornare / riqualificare un sistema di gestione dei contenuti che utilizzo da un po 'di tempo. Tuttavia, ritengo che il multi-linguaggio sia un grande miglioramento di questo sistema. Prima non ho usato alcun framework ma ho intenzione di usare Laraval4 per il prossimo progetto. Laravel sembra la scelta migliore di un modo più pulito per codificare PHP. Sidenote: Laraval4 should be no factor in your answer
. Sto cercando modi generali di traduzione indipendenti dalla piattaforma / dal framework.
Cosa dovrebbe essere tradotto
Poiché il sistema che sto cercando deve essere il più intuitivo possibile, il metodo di gestione della traduzione dovrebbe essere all'interno del CMS. Non dovrebbe essere necessario avviare una connessione FTP per modificare i file di traduzione o qualsiasi modello analizzato html / php.
Inoltre, sto cercando il modo più semplice per tradurre più tabelle di database forse senza la necessità di creare tabelle aggiuntive.
Cosa mi è venuto in mente
Come ho già cercato, letto e provato le cose da solo. Ci sono un paio di opzioni che ho. Ma ancora non mi sento come se avessi raggiunto un metodo di buone pratiche per quello che sto veramente cercando. In questo momento, questo è quello che ho escogitato, ma questo metodo ha anche effetti collaterali.
- PHP Parsed Templates : il sistema di template dovrebbe essere analizzato da PHP. In questo modo sono in grado di inserire i parametri tradotti nell'HTML senza dover aprire i modelli e modificarli. Oltre a ciò, i template analizzati PHP mi danno la possibilità di avere 1 template per il sito web completo invece di avere una sottocartella per ogni lingua (che ho avuto prima). Il metodo per raggiungere questo obiettivo può essere Smarty, TemplatePower, Laravel's Blade o qualsiasi altro parser di template. Come ho già detto, questo dovrebbe essere indipendente dalla soluzione scritta.
- Database Driven : forse non ho bisogno di menzionarlo di nuovo. Ma la soluzione dovrebbe essere guidata dal database. Il CMS ha lo scopo di essere orientato agli oggetti e MVC, quindi dovrei pensare a una struttura di dati logica per le stringhe. Come i miei modelli sarebbero stati strutturati: templates / Controller / view.php forse tale struttura avrebbe più senso:
Controller.View.parameter
. La tabella del database avrebbe questi campi a lungo con unvalue
campo. All'interno dei template potremmo usare alcuni metodi di ordinamento comeecho __('Controller.View.welcome', array('name', 'Joshua'))
e il parametro contieneWelcome, :name
. Quindi il risultato èWelcome, Joshua
. Questo sembra un buon modo per farlo, perché i parametri come: name sono facili da capire dall'editor. - Basso carico del database : ovviamente il sistema sopra riportato causerebbe un carico del carico del database se queste stringhe vengono caricate in movimento. Pertanto, avrei bisogno di un sistema di memorizzazione nella cache che esegua nuovamente il rendering dei file della lingua non appena vengono modificati / salvati nell'ambiente di amministrazione. Poiché i file vengono generati, è necessario anche un buon layout del file system. Immagino che possiamo andare con
languages/en_EN/Controller/View.php
o .ini, qualunque cosa ti si adatti meglio. Forse un .ini viene persino analizzato più velocemente alla fine. Questo dovrebbe contenere i dati nel fileformat parameter=value;
. Immagino che questo sia il modo migliore per farlo, dal momento che ogni vista renderizzata può includere il proprio file di lingua se esiste. Quindi i parametri della lingua dovrebbero essere caricati in una vista specifica e non in un ambito globale per evitare che i parametri si sovrascrivano l'un l'altro. - Traduzione della tabella del database : questa è la cosa di cui mi preoccupo di più. Sto cercando un modo per creare traduzioni di notizie / pagine / ecc. il più rapidamente possibile. Avere due tabelle per ogni modulo (per esempio
News
eNews_translations
) è un'opzione, ma è come lavorare molto per ottenere un buon sistema. Una delle cose che mi è venuta in mente è basata su undata versioning
sistema che ho scritto: esiste un nome di tabella del databaseTranslations
, questa tabella ha una combinazione unica dilanguage
,tablename
eprimarykey
. Ad esempio: en_En / News / 1 (riferito alla versione inglese della notizia con ID = 1). Ma ci sono 2 enormi svantaggi di questo metodo: prima di tutto questa tabella tende a diventare piuttosto lunga con molti dati nel database e in secondo luogo sarebbe un lavoro infernale usare questa configurazione per cercare la tabella. Ad esempio, la ricerca della lumaca SEO dell'articolo sarebbe una ricerca full-text, che è piuttosto stupida. Ma d'altra parte: è un modo rapido per creare contenuti traducibili in ogni tabella molto velocemente, ma non credo che questo professionista superi le truffe. - Lavoro front-end : anche il front-end avrebbe bisogno di un pensiero. Ovviamente archiviamo le lingue disponibili in un database e (de) attiviamo quelle di cui abbiamo bisogno. In questo modo lo script può generare un menu a discesa per selezionare una lingua e il back-end può decidere automaticamente quali traduzioni possono essere fatte usando il CMS. La lingua scelta (ad es. En_EN) verrebbe quindi utilizzata quando si ottiene il file della lingua per una vista o per ottenere la traduzione corretta per un elemento di contenuto sul sito Web.
Quindi eccoli. Le mie idee finora. Non includono ancora opzioni di localizzazione per date, ecc., Ma poiché il mio server supporta PHP5.3.2 + l'opzione migliore è usare l'estensione intl come spiegato qui: http://devzone.zend.com/1500/internationalization-in -php-53 / - ma questo sarebbe utile in qualsiasi stadio di sviluppo successivo. Per ora il problema principale è come avere le migliori pratiche di traduzione del contenuto in un sito Web.
Oltre a tutto ciò che ho spiegato qui, ho ancora un'altra cosa che non ho ancora deciso, sembra una domanda semplice, ma in realtà mi sta dando mal di testa:
Traduzione URL? Dovremmo farlo o no? e in che modo?
Quindi .. se ho questo url: http://www.domain.com/about-us
e l'inglese è la mia lingua predefinita. Dovrei tradurre questo URL http://www.domain.com/over-ons
quando scelgo l'olandese come lingua? O dovremmo seguire la strada facile e cambiare semplicemente il contenuto della pagina visibile su /about
. L'ultima cosa non sembra un'opzione valida perché genererebbe più versioni dello stesso URL, l'indicizzazione del contenuto fallirà nel modo giusto.
Un'altra opzione sta usando http://www.domain.com/nl/about-us
invece. Questo genera almeno un URL univoco per ciascun contenuto. Inoltre, sarebbe più semplice andare in un'altra lingua, ad esempio, http://www.domain.com/en/about-us
e l'URL fornito è più facile da capire sia per i visitatori di Google che per quelli umani. Usando questa opzione, cosa facciamo con le lingue predefinite? La lingua predefinita dovrebbe rimuovere la lingua selezionata per impostazione predefinita? Quindi reindirizzare http://www.domain.com/en/about-us
a http://www.domain.com/about-us
... Ai miei occhi questa è la soluzione migliore, perché quando il CMS è impostato per una sola lingua non è necessario avere questa identificazione della lingua nell'URL.
E una terza opzione è una combinazione di entrambe le opzioni: usando "lingua-identificazione-less" -URL ( http://www.domain.com/about-us
) per la lingua principale. E usa un URL con una lumaca SEO tradotta per le lingue secondarie: http://www.domain.com/nl/over-ons
&http://www.domain.com/de/uber-uns
Spero che la mia domanda ti rompa la testa, hanno sicuramente rotto la mia! Mi ha già aiutato a risolvere le cose come una domanda qui. Mi ha dato la possibilità di rivedere i metodi che ho usato prima e l'idea che sto avendo per il mio CMS imminente.
Vorrei ringraziarvi già per aver dedicato del tempo a leggere questo mucchio di testo!
// Edit #1
:
Ho dimenticato di menzionare: la funzione __ () è un alias per tradurre una determinata stringa. All'interno di questo metodo dovrebbe esserci ovviamente una sorta di metodo di fallback in cui viene caricato il testo predefinito quando non ci sono ancora traduzioni disponibili. Se la traduzione non è presente, deve essere inserita o il file di traduzione deve essere rigenerato.