2011-06-24 12 views
17

Budujemy duże aplikacje ASP.NET do użytku w intranecie w wielu językach/kulturach. Korzystamy z Globalizacji z plikami RESX i używamy GetResourceText po stronie serwera, aby uzyskać zlokalizowane teksty.Jak zdobyć teksty z Resx do wykorzystania w JavaScript?

Ostatnio robimy coraz więcej logiki po stronie klienta z JQuery.

Jak uzyskać teksty RESX do wykorzystania w JavaScript?

  • np. teksty używane do sprawdzania poprawności, komunikaty dynamiczne itp.

Wszystkie nasze skrypty JavaScript znajdują się w plikach .JS, nie chcemy mieszać kodu HTML na stronie ASPX i blokach JavaScript.

Dzięki za pomoc.

+0

Firma Microsoft zapewnia lokalizację po stronie klienta w ramach środowiska ASP.NET AJAX. Powinieneś rzucić okiem na http://msdn.microsoft.com/en-us/magazine/cc135974.aspx i http://www.asp.net/web-forms/tutorials/aspnet-ajax/understanding-asp- net-ajax-localization –

Odpowiedz

6

Niestety, w zewnętrznym pliku JS kod serwera po stronie serwera nie jest przetwarzany przez serwer. Jednak widziałem obejście, gdzie można ustawić swój przetłumaczonych wartości w pola ukryte na stronie - w ten sposób twój JavaScript będzie mógł odczytać wartości w

Na przykład:

<%-- This goes into your page --%> 
<input type="hidden" id="translatedField" name="translatedField" value="<%=Resources.Resources.translatedText %>" /> 

i używać. wewnątrz twojego pliku javascript:

// This is the js file 
$(document).ready(function() { 
    alert($("#translatedField").attr("value")); 
}); 

Będziesz mógł oddzielić wartości i nadal je wyświetlać w swoim zewnętrznym pliku JS.

Istnieje również inne obejście, które tworzy plik .aspx, który wyprowadza jedynie Javascript zamiast HTML. Sprawdź poniższy link:

Using server side method in an external JavaScript file

+0

Dziękujemy za odpowiedź! Myślałem o bardziej ogólnym sposobie, nie tylko przekazywaniu pojedynczego tekstu do Javascript. Zamieszczony link jest interesujący, próbowałem również tej metody, ale w mojej grupie uważamy, że "brudne" jest używanie strony ASPX do utworzenia "pliku" Javascript. Mam nadzieję na jeszcze jedną metodę ... :-) wielkie dzięki! – PeterFromCologne

+0

To jest okropne. Jak za okropne. Rozważ stronę z setkami takich. Co zrobi z DOMem? Z pewnością rozpieszczają nas nowoczesne przeglądarki, które renderują się bardzo szybko. Ale dla wielu celów jest to bardzo, bardzo złe. Opublikowany link jest dużo lepszy. – zaitsman

+0

Jeśli masz tylko kilka rzeczy do przetłumaczenia, a to wszystko, co kiedykolwiek będzie, to jest bardzo zwięzłe, wydajne i łatwe w utrzymaniu. Jeśli rzeczy zaczną rosnąć poza garstką przetłumaczonych elementów, to zgadzam się, musi to być przeniesione do czegoś takiego jak idea konfiguracji sieci. – ouflak

2

Zawsze oddzielną funkcjonalność z czytelnej strun.

Jeśli tworzysz wtyczki jQuery, powinieneś być w stanie przekazać tablicę zlokalizowanych ciągów jako parametr podczas wywoływania różnych funkcji jQuery. Tablica może być zdefiniowana jako inline JavaScript bezpośrednio na stronie wzywającej różnych wtyczek jQuery czy można załadować z zasobów zewnętrznych w formacie /scripts/localization/strings.js?ci=en-US i zarejestrować Generic ASP.Net Handler w web.config, który odpowie na scripts/localization/strings.js

Kontrola DatePicker jest świetny przykład, jak zlokalizować tekst dla formantu danych jQuery - this js file jest dynamicznie tworzony z plików zasobów (resx) i kiedy jest zawarty na stronie, upewni się, że formant kalendarza będzie zawierał duński tekst.

0

Jeśli nie chcesz korzystać z ASP.NET do generowania głównego JavaScript, tu są dwie opcje:

  1. Wykorzystanie ASP.NET, aby wygenerować plik skryptu, który zawiera zmienną do łańcucha zadania, takie jak var mystring = 'my value';. Twój główny skrypt odwoływałby się do zlokalizowanego tekstu z nazwami zmiennych, a nie jako wartości osadzone.Jeśli nadal jest to dla ciebie zbyt "brudne", możesz zakodować ciągi jako JSON, a nie jako przypisania zmiennych, używając raczej HttpHandler niż prostego .aspx.

  2. Czy Twój kod JavaScript wydaje wywołanie Ajax, aby pobrać tablicę lub listę zlokalizowanych ciągów z serwera. Część wywołania po stronie serwera pobierze tekst z plików resx.

2

Utwórz plik HttpHandler (plik .ashx) i zwróć JSON za pomocą ciągów zasobów tekstowych.

Możesz także "publikuje" to do globalnej przestrzeni nazw, tj

Response.Write("window.Resources="); 
Response.Write((new JavaScriptSerializer()).Serialize(strings)); 

skonfigurować HTML jak:

<script src="Resx.ashx?lang=en-US" /> 

<button class="LogoutButtonResourceId OtherButtonClasses">(generic logout text)</button> 
<a href="#"><span class="SomeLinkTextResourceId OtherClasses"> 
    (generic link text) 
</span></a> 

i zastosować teksty tak:

$(document).ready(function() { 
    for(var resId in Resources){ 
    $("."+resId).html(Resources[resId]); 
    } 
}); 
0

Mają cię rozważyć użycie $.ajax w połączeniu z ASP.NET WebMethods? Trudno zasugerować bardziej konkretne rozwiązanie tego problemu bez zrozumienia, w jaki sposób Twój JavaScript/jQuery zużyje/przetworzy zasoby. Zakładam, że są zorganizowane w logiczne grupy (lub mogą być), w których można zwrócić kilka ciągów zasobów, które należą do jednej strony.

Zakładając, że możesz napisać bardzo prostą klasę C# lub użyć Dictionary<string, string> - aby zwrócić dane z ASP.NET WebMethod. Wyniki wyglądałyby tak:

[WebMethod] 
public Dictionary<string, string> GetPageResources(string currentPage) 
{ 
    // ... Organizational stuff goes here. 
} 

Zawsze rozdziela moje wywołania AJAX na osobne pliki/obiekty .js; że będzie wyglądać następująco:

function GetPageResources (page, callback) 
    $.ajax({ // Setup the AJAX call to your WebMethod 
     data: "{ 'currentPage':'" + page + "' }", 
     url: /Ajax/Resources.asmx/GetPageResources, // Or similar. 
     success: function (result) { // To be replaced with .done in jQuery 1.8 
      callback(result.d); 
     } 
    }); 

Następnie w js zawartych na stronie, powinieneś być w stanie konsumować, że dane takie jak:

// Whatever first executes when you load a page and its JS files 
// -- I assume that you aren't using something like $(document).ready(function() {}); 
GetPageResources(document.location, SetPageResources); 

function SetPageResources(resources) { 
    for (currentResource in resources) { 
     $("#" + currentResource.Key).html(currentResource.Value); 
    } 
} 
0

wiem, że to za późno, ale chcę podzielić się moim doświadczeniem w tym zadaniu)

Używam AjaxMin. Może wstawiać wartości kluczy resx do pliku js w zdarzeniu kompilacji. To nie jest zwykły sposób, ale utrzymuje html bez niepotrzebnych bloków skryptów i można go wykonać podczas procesu minimalizacji, jeśli go masz.

To działa tak:

ajaxmin.exe test.js -RES:Strings resource.resx -o test.min.js 

Również trzeba zrobić to samo dla lokalizacji ECH jeśli masz wiele. Składnia napisać klucze zasobów w JS (a także CSS) jest napisane:

Js localization

Css localization

0

Jak o wstrzykiwanie go jako część javascript inicjowania kontroli? co mogę zrobić jest następujący:

Mam samodzielne sterowanie javascript - nazwij go CRMControl, który ma metodę init o nazwie setupCRMControl, do której przekazuję obiekt ustawień.Kiedy go zainicjować, i przekazać obiekt zawierający wszystkie zasoby muszę wewnątrz javascript następująco:

CRMControl.setupCRMControl({ 
numOfCRMs: 3, 
maxNumOfItems: 10, 

// then i pass a resources object with the strings i need inside 
Resources: { 
    Cancel: '@Resources.Cancel', 
    Done: '@Resources.Done', 
    Title: '@Resources.Title' 
} 
}); 

Następnie wewnątrz tej kontroli javascript:

var crmSettings = {}; 
this.setupCRMControl(settings) { 
    crmSettings = settings; 
}; 

i kiedy chcę pokazać zasobu mówię (na przykład wyświetlić alert mówiąc „Gotowe”):

alert(crmSettings.Resources.Done); 

można to nazwać „R”, aby ją skrócić lub coś, ale to jest moje podejście. Może to nie zadziała, jeśli masz całą masę napisów, ale w możliwych do opanowania przypadkach może to zadziałać.

Powiązane problemy