Подтвердить что ты не робот

Как получить тексты из Resx для использования в Javascript?

Мы создаем большие приложения ASP.NET для использования интрасети на нескольких языках/культурах. Мы используем глобализацию с файлами RESX и используем GetResourceText на стороне сервера, чтобы получить локализованные тексты.

В последнее время мы делаем все больше и больше клиентской логики с JQuery.

Как получить тексты RESX для использования в Javascript?

  • например. тексты, используемые для проверки, динамические сообщения и т.д.

Все наши Javascripts находятся в файлах .JS, мы не хотим смешивать HTML на странице ASPX и блоках Javascript.

Спасибо за вашу помощь.

4b9b3361

Ответ 1

К сожалению, во внешнем JS файле серверный код не обрабатывается сервером. Однако я видел обходное решение, в котором вы можете установить переведенные значения в скрытые поля на странице - таким образом ваш javascript сможет прочитать значения в.

Например:

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

и используйте это в своем файле javascript:

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

Вы сможете отделить значения и увидеть их во внешнем JS файле.

Существует также другое обходное решение, которое создает файл .aspx, который выводит только Javascript вместо HTML. Посмотрите ссылку ниже:

Использование метода на стороне сервера во внешнем файле JavaScript

Ответ 2

Всегда отделяйте функциональность от читаемых пользователем строк.

Если вы создаете jQuery-плагины, вы можете передать массив локализованных строк в качестве параметра, когда вы вызываете свои разные функции jQuery. Массив может быть определен как встроенный javascript непосредственно на странице, вызывающей разные плагины jQuery, или вы можете загрузить внешний ресурс в формате /scripts/localization/strings.js?ci=en-US и зарегистрировать Generic ASP.Net Handler в web.config, который ответил бы на scripts/localization/strings.js

Элемент DatePicker - прекрасный пример того, как локализовать текст для элемента управления датой jQuery - этот js файл динамически создается из файлов ресурсов (resx), и когда он включен на странице, он будет следить за тем, чтобы элемент управления календарем имел датский текст.

Ответ 3

Создайте HttpHandler (файл .ashx) и верните JSON со строками текстового ресурса.

Вы также можете "опубликовать" его в глобальном пространстве имен, т.е.

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

настроить HTML как:

<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>

и применяйте такие тексты:

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

Ответ 4

Если вы не хотите использовать ASP.NET для генерации основного JavaScript, вот еще два варианта:

  • Используйте ASP.NET для создания файла script, который содержит назначения переменной в строку, например var mystring = 'my value';. Ваш основной script будет ссылаться на локализованный текст с именами переменных, а не на встроенные значения. Если это все еще слишком "грязно" для вас, вы можете кодировать строки как JSON, а не как переменные назначения, используя HttpHandler, а не прямой .aspx.

  • У вашего кода JavaScript возникает вызов Ajax для извлечения массива или списка локализованных строк с сервера. На стороне сервера вызов будет извлекать текст из ваших файлов resx.

Ответ 5

Рассматривали ли вы использование $.ajax в сочетании с ASP.NET WebMethods? Трудно предложить более конкретное решение этой проблемы, не понимая, как ваш JavaScript/jQuery будет потреблять/обрабатывать ресурсы. Я предполагаю, что они организованы в логические группы (или могут быть), где вы можете вернуть несколько строк ресурсов, которые принадлежат одной странице.

Предполагая, что вы можете написать очень простой класс С# или использовать Dictionary<string, string> - для возврата данных из вашего WebMethod ASP.NET. Результаты выглядят примерно так:

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

Я всегда выделяю свои вызовы AJAX в отдельные .js файлы/объекты; это будет выглядеть так:

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);
        }
    });

Затем в .js, выполненном на странице, вы сможете использовать такие данные, как:

// 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);
    }
}

Ответ 6

Я знаю это в последнее время, но хочу поделиться своим опытом в этой задаче)

Я использую AjaxMin. Он может вставлять значения ключей resx в js файл в событии сборки. Это не обычный способ, но он хранит html без ненужных блоков script и может быть выполнен во время процесса миниатюризации, если он у вас есть.

Он работает следующим образом:

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

Также вам нужно сделать то же самое для локали ech, если у вас их много. Здесь написано синтаксис для написания ключей ресурсов в js (а также css):

Локализация Js

Локализация Css

Ответ 7

Как насчет того, чтобы вводить его как часть инициализации управления javascript? я делаю следующее:

У меня есть автономный элемент управления javascript - назовите его CRMControl, у которого есть метод init, называемый setupCRMControl, к которому я передаю объект настроек. Когда я инициализирую его, я передаю объект, содержащий все ресурсы, которые мне нужны внутри javascript, следующим образом:

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'
 }
});

Затем внутри этого элемента управления javascript:

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

и всякий раз, когда я хочу показать ресурс, я говорю (например, покажите предупреждение "Готово" ):

alert(crmSettings.Resources.Done);

Вы можете назвать это "R", чтобы сделать его короче или чем-то, но это мой подход. Возможно, это может не сработать, если у вас целая цепочка строк, но для управляемых случаев это может сработать.