Ho deciso di fare dei cambiamenti al codice per la traduzione dei post in Blogger di cui parlavo nell’articolo: Post multilingua in Blogger. Sebbene a mio parere questo sia un miglioramento, dal punto di vista logico più che a livello di funzionalità, ciò non toglie che il vecchio codice continui ad essere valido.
→ La seconda funzione legge il valore selezionato nel select grazie al quale ricava il div con quella classe (lingua). A questo punto nasconde il testo dell’intero articolo (quindi tutti i div ecc.) e mostra solo il div scelto.
Il div principale ora ha classe “default”
Il perché chiamo questo cambiamento “logico” è che in teoria posso scrivere un articolo anche in altre lingue diverse dall’italiano e quindi sarebbe scorretto scrivere, ad esempio, un post in inglese nel div con classe “lang:italian” (il div con classe lang:italian viene utilizzato nell’altro codice come div principale). Quindi, piuttosto che come div primario avere un<div class="lang:italian">, ho preferito avere un <div class="default">, ad indicare cioè la lingua (qualsiasi essa sia) di default dell’articolo. Poi, se presenti, gli altri div con classi english, italiano, français stanno ad indicare rispettivamente i contenuti tradotti dal div di default in inglese, italiano e francese.Per correttezza lascio nei vari div l’attributo “lang="..." ” ad indicare comunque la lingua utilizzata all’interno (es. <div class="default" lang="it">).
<script type="text/javascript">
var def = document.getElementsByClassName('default');
var en = document.getElementsByClassName('english');
var it = document.getElementsByClassName('italiano');
var fr = document.getElementsByClassName('français');
var languages = [def, en, it, fr];
var langus = {default: "--", english: "English", français: "Français", italiano: "Italiano"}
for (var lan in languages) {
if (languages[lan] !== null) {
var sel = document.getElementById('translateSelect');
var fragment = document.createDocumentFragment();
var opt = document.createElement('option');
opt.innerHTML = langus[languages[lan][0].className];
opt.value = languages[lan][0].className;
fragment.appendChild(opt);
sel.appendChild(fragment);
}
}
function translateIn() {
var language = document.getElementById('translateSelect').value;
var x = document.getElementsByClassName(language);
languages.forEach(function(entry) {
for(i = 0; i < entry.length; i++) {
entry[i].style.display = 'none';
}
});
for(i = 0; i < x.length; i++) {
x[i].style.display = 'block';
}
}
</script>
Lo script sopra è da inserire prima del tag di chiusura del body mentre il codice sotto, ossia il select, potete inserirlo dove volete.
<select id='translateSelect' onChange='translateIn()'/>
Lo script in breve
Nella prima parte abbiamo le variabili def, en, it, fr che rappresentano, se presenti, i div con le classi 'default', 'english' e così via. var languages è un Array i quali elementi sono le variabili prima descritte. var langus è invece un dizionario; la particolarità di quest’ultimo è che le key corrispondono esattamente, a livello di nomi, alle classi dei div.Nella seconda parte invece abbiamo due funzioni. → La prima è addetta a popolare il nostro select che come avrete notato è vuoto. Quindi controlla se esistono i div dei contenuti (le varie variabili) e, se sono presenti, aggiunge le option al select con dentro i valori del dizionario (cioè le lingue “scritte per bene” es. English, Français... )→ La seconda funzione legge il valore selezionato nel select grazie al quale ricava il div con quella classe (lingua). A questo punto nasconde il testo dell’intero articolo (quindi tutti i div ecc.) e mostra solo il div scelto.
Dai uno sguardo a questo script che ho creato per scaricare automaticamente il pezzo di contenuto. In questo modo puoi caricarlo online in Google Translator Toolkit e tradurlo, senza fare copia-incolla.
