il8n = {
'en-us':{
hello:"Hello Everyone",
goodbye:"See ya later",
welcome:"Hello how are you?",
design:"Kandi Designs"
}
};
function translate(){
var userLang = navigator.language || navigator.userLanguage;
var body = document.body || document.getElementsByTagName('body')[0];
var html = body.innerHTML;
body.innerHTML = body.innerHTML.replace(/({T_(.*?)})/g, il8n[userLang.toLowerCase()][$1.replace(/{T_|},'').toLowerCase()]);
}
translate();
基本上我想做的就是摆脱{T_Hello}
到Hello Everyone
,但是因为我在正则表达式上吮吸我的捕获组并使用$1
我无法正确理解这一点。任何人都可以协助这一点吗?
答案 0 :(得分:2)
你有正确的想法。但是,1美元不是您使用它的变量。将第二个参数更改为replace
:
function (match, $1) {
return il8n[userLang.toLowerCase()][$1.toLowerCase()];
}
replace
can take a function as an argument。然后,将正则表达式中的捕获组缩短为:
/{T_(.*?)}/g
这样可以在replace函数中省去一些不必要的字符串处理。在一个不相关的说明中,关于性能,您可能希望服务器基于il8n
标头发送相应的Accept-Language
对象,或者更好的是,插入本身而不是依赖于片状和慢速客户端 - 代码(使其可缓存)。
答案 1 :(得分:0)
根据您的il8n对象键,您可以检查T_
后跟任何大写字母。
/T_([A-Z]+)/
您也可以为其添加小写字母或数字:
/T_([A-Za-z0-9]+)/
答案 2 :(得分:0)
这应该有效:
body.innerHTML = body.innerHTML.replace(
/({T_(.*?)})/g,
function (s) { return il8n [userLang.toLowerCase()] [s.replace(/{T_|}/g,'').toLowerCase()]; }
);
replace()
的第二个参数可以是一个字符串或一个函数,它接受的参数与正则表达式中的() - groups一样多,在您的情况下是一个。
确实,如果你写
s.replace (/a/g, 'b')
然后,显然,replace()
收到两个字符串。但是,如果你写
s.replace (/a/g, f(x))
然后再次,replace()
收到两个字符串,第二个是从f(x)
返回的字符串,所以如果f(x)
返回'b'
,那么上面的两个表达式是等价的。由于f(x)
在replace()
有机会看到它之前执行,因此它不能使用$1
之类的特殊变量,因为在调用时它们没有被定义。
如果您希望代码由replace()
执行,那么它应该是可执行代码:
replace (/a/g, function (x) { return ' [' + x + '] found! '; } )
这样在调用时,形成了函数对象,并且每次使用参数$ 1在replace
内调用此函数(注意正则表达式中的全局修饰符g)。
请注意,只有在文本下方或调用onload()而不是文本上方时,您的代码才有效:
<body>
{T_hello} reader!
<script>
your code
</script>
<body>
有效,但
<body>
<script>
your code
</script>
{T_hello} reader!
<body>
没有,因为当它被执行时,<body>
中仍然没有任何内容。最好的地方是<body onload='translate()'>
。
我还更正了代码中的拼写错误:s.replace(/{T_|}
应为s.replace(/{T_|}/
。
您的代码中的另一个错误是:s.replace(/{T_|}/
应为s.replace(/{T_|}/g
,因为它应该进行两次替换,而不是一次。