Как получить тексты из Resx для использования в Javascript?
Мы создаем большие приложения ASP.NET для использования интрасети на нескольких языках/культурах. Мы используем глобализацию с файлами RESX и используем GetResourceText на стороне сервера, чтобы получить локализованные тексты.
В последнее время мы делаем все больше и больше клиентской логики с JQuery.
Как получить тексты RESX для использования в Javascript?
- например. тексты, используемые для проверки, динамические сообщения и т.д.
Все наши Javascripts находятся в файлах .JS, мы не хотим смешивать HTML на странице ASPX и блоках Javascript.
Спасибо за вашу помощь.
Ответы
Ответ 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", чтобы сделать его короче или чем-то, но это мой подход. Возможно, это может не сработать, если у вас целая цепочка строк, но для управляемых случаев это может сработать.