Как обрабатывать локализацию в файлах JavaScript?

Я хочу, чтобы код JavaScript был отделен от представлений.
Я получил требование реализовать локализацию для простой кнопки изображения, сгенерированной JavaScript:

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

Какая лучшая техника для локализации названия?

PS: Я нашел решение от Ayende. Это правильное направление.

Edit:
Я получил класс-помощник Localization, который предоставляет метод расширения Controller.Resource('foo').

Я собираюсь расширить его (помощник), чтобы он мог вернуть все ресурсы JavaScript (из подпапки "ClientSideResources" в App_LocalResources) для указанного контроллера по его имени. Затем - вызовите его в BaseController, добавьте его в ViewData и отрисуйте в Layout.

Будет ли это хорошей идеей?

Ответы

Ответ 1

ИЗМЕНИТЬ

Рассмотрите возможность записи необходимых локализованных ресурсов на объект JavaScript (хэш), а затем используйте его для поиска ваших динамически создаваемых объектов. Я думаю, что это лучше, чем возвращение на сервер для переводов. Это похоже на добавление его через viewdata, но может быть немного более гибким. FWIW, я мог бы рассматривать ресурсы локализации как часть представления, а не часть контроллера.

В представлении:

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

который выводит что-то вроде:

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

Без аргументов он выводит весь хэш перевода. Использование аргументов дает вам возможность настроить его для каждого вида.

Затем вы использовали бы его в своих файлах JavaScript, например:

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

На самом деле, я не слишком суетился о том, чтобы оставить код JavaScript вне моих представлений, пока код JavaScript локализован в контейнере. Обычно я устанавливаю свою главную страницу с 4 областью содержимого: заголовок, заголовок, основной и скрипты. Заголовок, заголовок и главная страница идут туда, где вы ожидаете, и область скриптов идет в нижней части тела.

Я помещаю все мои JavaScript, включая любые для viewusercontrols, в контейнер скриптов. После включения включает код JavaScript для просмотра. Я реорганизую общий код обратно в сценарии по мере необходимости. Я думал об использовании метода контроллера для сопоставления script включает, то есть включать несколько сценариев, используя один запрос, но еще не добрался до этого.

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

Ответ 3

Если вы настаиваете на том, чтобы держать его отдельным, вы могли бы сделать что-то вроде:

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

Помните, что если вы используете код JavaScript для инициализации любого текста элементов, ваш сайт будет ужасно ухудшаться, где JavaScript недоступен.