Я придумал какое-то нестандартное решение для локализации проекта, над которым я работаю.Идея состоит в том, что мой HTML может содержать следующее:
<h2 data-l10n="HELLO" data-l10n-params="['Visitor', new Date()]"></h2>
Когда страница запускается, запускается функция javascript, подобная этой:
localizeAll: function(sel) {
var selector = sel || document,
$o = $(selector);
$o.find('[data-l10n]').each(
function() {
var $t = $(this),
val = $t.attr('data-l10n'),
params = $t.attr('data-l10n-params'),
po = null;
if (typeof params !== 'undefined') {
po = eval(params);
log(params, po);
}
var res = doLocalize(val, po);
if (res[0] !== '<') {
$t.text(res);
} else {
$t.text(val);
}
});
}
Так что в основном мы ищем любые элементы, которые имеютdata-l10n
-атрибут и вызов doLocalize()
для каждого из этих объектов.Кроме того, элемент может иметь data-l10n-params
-атрибут, который является просто строковым литералом, который может быть проанализирован в массиве.Эта строка оценивается (params
строка становится po
массивом), а po
передается в doLocalize()
в качестве необязательного второго параметра.
Следовательно, вывод в Firebug (из оператора log(params, po);
):
['Vistor', new Date()] ["Vistor", Date {Thu Nov 17 2011 10:10:31 GMT+0100 (CET)}]
Так что да, я использую eval.И да, я знаю, что "Eval - это зло".Но иногда мне нужно передать параметр в doLocalize()
.
Как это можно сделать без eval?