2009-07-06 17 views
13

Desidero che il codice JavaScript sia separato dalle viste.
ho avuto l'obbligo di attuare la localizzazione per un semplice pulsante di immagine generata da JavaScript:Come gestire la localizzazione nei file JavaScript?

<img src="..." onclick="..." title="Close" /> 

Qual è la tecnica migliore per localizzare il titolo di esso?

PS: Ho trovato a solution di Ayende. Questa è la giusta direzione.

Modifica:
Ho ottenuto la classe helper di localizzazione che fornisce il metodo di estensione Controller.Resource('foo').

Sto pensando di estenderlo (helper) in modo che possa restituire tutte le risorse JavaScript (dalla sottocartella "ClientSideResources" in App_LocalResources) per il controller specificato con il suo nome. Quindi, chiamalo in BaseController, aggiungilo a ViewData e rendilo in Layout.

Sarebbe una buona idea?

risposta

9

EDIT

non crei le necessarie risorse localizzate a un oggetto JavaScript (hash) e poi utilizzarlo per la ricerca per gli oggetti creati in modo dinamico. Penso che sia meglio che tornare al server per le traduzioni. Questo è simile ad aggiungerlo tramite viewdata, ma potrebbe essere un po 'più flessibile. FWIW, potrei considerare le risorse di localizzazione come parte della vista, non parte del controller.

Nella Vista:

<script type="text/javascript" 
     src='<%= Url.Content("~/Resources/Load?translate=Close,Open" %>'></script> 

che sarebbe uscita una cosa del genere:

var local = {}; 
local.Close = "Close"; 
local.Open = "Open"; 

Senza argomenti sarebbe uscita l'intera hash traduzione. L'utilizzo degli argomenti ti dà la possibilità di personalizzarlo per visualizzazione.

Si potrebbe quindi utilizzare nelle vostre file JavaScript come:

$(function(){ 
    $('#button').click(function() { 
     $("<img src=... title='" + local.Close + "' />") 
      .appendTo("#someDiv") 
      .click(function() { ... }); 
    }); 
}); 

In realtà, io non sono troppo coccolato di mantenere il mio codice JavaScript dalle mie vedute fino a quando il codice JavaScript è localizzato in un contenitore . In genere imposterò la mia pagina master con 4 aree di contenuto: titolo, intestazione, main e script. Titolo, intestazione e main vanno dove ti aspetteresti e l'area degli script va nella parte inferiore del corpo.

Inserisco tutti i miei JavaScript inclusi, inclusi quelli per viewusercontrols, nel contenitore degli script. Il codice JavaScript specifico della vista viene dopo gli include. Rifaccio il codice condiviso di nuovo agli script, se necessario. Ho pensato di utilizzare un metodo di controllo per la raccolta di script include, cioè, includere più script utilizzando una singola richiesta, ma non ci siamo ancora riusciti.

Questo ha il vantaggio di mantenere separato il codice JavaScript per la leggibilità, ma consente anche di iniettare facilmente il modello o visualizzare i dati nel codice JavaScript, se necessario.

+0

"Voglio javascript per essere separato dal punti di vista." == "Anche una buona pratica per mantenere il tuo javascript separato dal tuo mark up.". <= e questo è il problema del perché <%= foo %> non funzionerà. –

+0

Btw, perché è preferibile associare il gestore onclick su JS onload? –

+0

Mi è mancata la parte "generata da JS" della tua domanda - è stata appena scansionata. In questo caso, prenderei in considerazione la scrittura dei dati localizzati sulla vista e il javascript che lo carica da un oggetto locale. Riscriverà – tvanfosson

1

Se ti ostini a tenendoli separati, si potrebbe fare qualcosa di simile:

//keep all of your localised vars somewhere 
var title = '{title_from_server}'; 
document.getElementById('someImage').title = title; 

ricordate, se si utilizza il codice JavaScript per inizializzare qualsiasi testo di elementi, il tuo sito sarà degradano orribilmente in cui JavaScript non è disponibile .

+0

Dannazione ... Dimenticato di nuovo sulla possibile mancanza di supporto javascript. :( –

Problemi correlati