我为我正在开发的项目提出了一些自定义本地化解决方案。我的想法是我的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,怎么办呢?
答案 0 :(得分:4)
我认为您的问题是您实际上是在JavaScript中嵌入JavaScript(这违反了unobtrusive JavaScript原则)。
在我的位置,我会添加一个额外的l18n-params.js
文件,其中包含以下内容:
var dataL10Nparams = {
HELLO = ['Visitor', new Date()]
}
现在不是从HTML属性中读取params而只是评估调用:
dataL10Nparams['HELLO']
答案 1 :(得分:2)
如果您只在HTML属性中提供参数化值,请考虑使用JSON.parse()而不是评估。