2012-10-15 11 views
7

Sto utilizzando la traduce il widget di su uno dei miei siti con il seguente google forniti di codice:Google Translate Widget - Traduzione di callback completa

<div id="google_translate_element"></div><script type="text/javascript"> 
function googleTranslateElementInit() { 
    new google.translate.TranslateElement({pageLanguage: 'en', layout: google.translate.TranslateElement.InlineLayout.SIMPLE}, 'google_translate_element'); 
} 
</script><script type="text/javascript" src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> 

<script> 

Il mio problema: Il traduce corre dopo che la pagina è stata caricata, ma io ha anche uno script che dimensiona automaticamente i miei elementi di navigazione principali in base alla loro larghezza.

Viene eseguito prima del termine della conversione, quindi viene ridimensionato in base alle etichette inglesi non tradotte. Una volta che il traduttore ha modificato il testo di navigazione, gli elementi di navigazione devono essere ridimensionati per adattarsi alle parole appena tradotte poichè potrebbero essere di dimensioni diverse (larghezza) rispetto all'inglese.

Ho provato a chiamare il codice di traduzione di Google prima di eseguire il codice per ridimensionare la navigazione principale, ma il traduttore viene eseguito in modo asincrono, quindi il mio codice viene eseguito prima che il traduttore sia completo.

C'è un evento di richiamata generato quando la traduzione è completa (o un modo per rilevare quando la traduzione è completa), quindi posso aspettare prima che tenti di ridimensionare la navigazione?

Inoltre, ho bisogno di eseguire uno script DOPO che la pagina ha finito di tradurre.

+0

Non ho alcun esempio, ma potresti provare ad aggiungere una chiamata di funzione all'interno di googleTranslateElementInit ..? Cioè function googleTranslateElementInit() { new google.translate.TranslateElement (...); myFuncInvocation(); } – EricG

+0

Provato quel Eric, lo stesso problema con la chiamata di google tradurre prima del mio codice. Esegue in modo asincrono quindi ritorna immediatamente dalla chiamata google.translate.TranslateElement() (cioè prima che la traduzione sia finita) - aggiornerò la mia domanda – RichardAtHome

+0

Onestamente preferirei vedere un esempio in cui viene eseguito. Quello che puoi fare è inserire un punto di interruzione nel "nuovo google.translate .." nel webkit e provare a eseguire il debug e vedere se è possibile aggiungere gestori o facoltativi gestori esistenti predefiniti che potrebbero essere richiamati. – EricG

risposta

6

Ecco la correzione ho finito per usare:

jQuery(function(){ 
    firstMenu = $("#nav li:first").text(); 

    setTimeout(waitNav, 500); 
}); 

function waitNav() { 

    if (firstMenu != $('#nav li:first').text()) { 

     initNav(); 
     firstMenu = $('#nav li:first').text(); 
     setTimeout(waitNav, 500); 

    } 
    else { 
     setTimeout(waitNav, 500); 
    } 

} 

In sostanza, mantenere il controllo se un pezzo noto di testo è cambiato (in questo caso è la prima voce nel blocco di navigazione).

Se è stato modificato significa che il traduttore è stato eseguito, eseguire il codice che è necessario eseguire dopo la traduzione (initNav() qui).

Continuo a controllare le modifiche nel caso in cui l'utente selezioni un'altra lingua.

Non è perfetto, ma funziona per me :-)

+1

Nota: in molte situazioni una parte di testo (specialmente le voci di menu) potrebbe rimanere invariata dopo la traduzione ad esempio: "contact" potrebbe scrivere lo stesso in più di un semplice Inglese. Non sono sicuro se questo trucco funzionerà allora. – frnhr

0

È possibile rilevare i cambiamenti in questo modo:

$('#some-translatable-element').bind('DOMSubtreeModified', function() { 
    yourCallback(); 
}); 

Lo svantaggio è che l'evento è beeing sparato più volte da google traduttore fa multipla cambiamenti nel processo.

Un suggerimento è quello di rilevare le modifiche sull'ultimo elemento della pagina, perché poi sai che tutti gli elementi sopra sono tradotti.

+1

C'è un modo intelligente per ottenere la lingua selezionata ??? –

Problemi correlati