2009-07-06 24 views
13

Chcę, aby kod JavaScript był oddzielony od widoków.
mam wymóg wdrożenia lokalizację dla prostego przycisku obrazu generowanego przez javascript:Jak radzić sobie z lokalizacją w plikach JavaScript?

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

Jaki jest najlepszy sposób, aby zlokalizować tytuł to?

PS: Znalazłem a solution od Ayende. To jest właściwy kierunek.

Edytuj:
Mam klasę pomocniczą Localization, która udostępnia metodę rozszerzenia Controller.Resource('foo').

Zastanawiam się nad jego rozszerzeniem (pomocnikiem), aby mógł zwrócić wszystkie zasoby JavaScript (z podfolderu "ClientSideResources" w App_LocalResources) dla określonego kontrolera według jego nazwy. Następnie - zadzwoń w BaseController, dodaj go do ViewData i wyślij w Layout.

Czy to byłby dobry pomysł?

Odpowiedz

9

EDIT

Rozważ pisanie niezbędnych zlokalizowanych zasobów do obiektu JavaScript (hash), a następnie używając go do odnośnika za swoimi dynamicznie tworzonych obiektów. Myślę, że to lepsze niż powrót do serwera w poszukiwaniu tłumaczeń. Jest to podobne do dodawania go przez viewdata, ale może być trochę bardziej elastyczne. FWIW, mógłbym uważać zasoby lokalizacyjne za część widoku, a nie część kontrolera.

w widoku:

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

które wyświetli coś jak:

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

Bez argumentów byłoby wyjście całą tłumaczenie skrótu. Używanie argumentów daje możliwość dostosowania go do widoku.

Można by następnie używać go w plikach JavaScript jak:

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

Właściwie nie jestem zbyt wybrzydzały o utrzymanie mój kod JavaScript z moimi poglądami jak długo kod JavaScript jest zlokalizowana w kontenerze . Zazwyczaj ustawię stronę wzorcową w 4 obszarach: tytuł, nagłówek, główne i skrypty. Tytuł, nagłówek i główne przejdź do miejsca, w którym można się spodziewać, a obszar skryptów idzie na dno ciała.

Umieściłem wszystkie moje JavaScript obejmuje, w tym wszelkie dla viewusercontrols, do kontenera skryptów. Wyświetlany kod JavaScript jest dostępny po uwzględnieniu. W razie potrzeby odsyłaję udostępniony kod do skryptów. Zastanawiałem się nad użyciem metody kontrolera do zestawiania skryptów, to znaczy obejmują wiele skryptów za pomocą pojedynczego żądania, ale jeszcze do tego nie doszło.

Ma to tę zaletę, że kod JavaScript jest oddzielny dla czytelności, ale pozwala także w łatwy sposób wstrzyknąć model lub wyświetlić dane do kodu JavaScript w razie potrzeby.

+0

== "Również dobra praktyka, aby zachować javascript oddzielnie od twojej oceny.". <= i to jest problem, dlaczego <%= foo %> nie będzie działać. –

+0

Btw, dlaczego dołączanie obsługi onclick do JS onload jest lepsze? –

+0

Brakowało mi części pytania "generowane przez JS" - właśnie zeskanowane tuż nad nią. W tym przypadku rozważałbym zapisanie zlokalizowanych danych do widoku i ładowanie javascripta z lokalnego obiektu. Napisze ponownie. – tvanfosson

1

Jeśli nalegać na utrzymanie go oddzielić, można zrobić coś takiego:

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

Pamiętaj, że jeśli używasz kodu JavaScript zainicjować dowolny tekst elementów, witryna będzie degradować potwornie gdzie JavaScript nie jest dostępny .

+0

Cholera ... Zapomniałem jeszcze raz o możliwym braku wsparcia dla javascript. :( –

Powiązane problemy