我想在javascript中构建自己的翻译功能。 我已经有一个函数language.lookup(key)来翻译一个单词或表达式:
var frenchHello = language.lookup('hello') //'bonjour'
现在我想写一个函数,它接受一个html字符串并用我的查找函数进行翻译。在html字符串中,我将有一个特殊的语法,例如#[translationkey],它将指出该单词应该被翻译。
这是我想要的结果:
var html = '<div><span>#[hello]</span><span>#[sir]</span>'
language.translate(html) //'<div><span>bonjour</span><span>monsieur</span>
我怎么写language.translate? 我的想法是用regex过滤掉我的特殊语法,然后在每个键上运行language.lookup。也许用字符串替换或其他东西。
当涉及到正则表达式时,我很糟糕,我只提出了一个非常不完整的例子,但无论如何我都包括它,所以也许有人知道我想要做什么。然后,如果有一个更好但完全不同的解决方案,这是非常受欢迎的。
var value = "#[hello], nice to see you.";
lookup = function(word){
return "bonjour";
};
var res = new RegExp( "\\b(hello)\\b", "gi" ).exec(value)
for (var c1 = 0; c1 < res.length; c1++){
value = value.replace(res[c1], lookup(res[c1]))
}
alert(value) //#[bonjour], nice to see you.
正则表达式当然不应过滤掉单词hello而是过滤掉语法,然后通过分组或类似方法收集密钥。
有人可以帮忙吗?
答案 0 :(得分:2)
只需使用String.replace方法调用指定为第二个参数的函数来生成替换文本,并使用符合语法的regexp进行全局替换:
var value = "#[hello], #[sir], nice to see you.";
lookup = function(full_match, word){
if(word == 'hello')
return "bonjour";
if(word == 'sir')
return "monsieur"
};
console.log(value.replace(/#\[(.+?)\]/gi, lookup))
结果: bonjour,先生,很高兴见到你。
当然,当您的替换列表变大时,您最好使用查找对象而不是查找功能中的一系列ifs,但您可以在那里做任何您想做的事。
答案 1 :(得分:1)
您可以使用以下内容:
#\\[[^\\]]*\\]
哪个匹配哈希后跟一个左方括号后跟零个或多个字符,不包括结束方括号,后跟一个封闭的方括号。
或者,也许最好在服务器端处理翻译(甚至可能通过模板引擎)并将已翻译的响应发送回客户端。否则,(取决于您当然要处理的具体问题),您最终可能会向浏览器发送大量数据,这可能会使您的应用程序响应缓慢。
编辑: 这是一段代码:
var q="This #[ANIMAL1] was eaten by that #[ANIMAL2]";
var u = {"#[ANIMAL1]":"Lion","#[ANIMAL2]":"Frog"};
function insertAnimal(aString, lookup){
var res = (new RegExp("#\\[[^\\]]*\\]", "gi"))
while (m = res.exec(aString)){
aString = aString.replace(m, lookup[m])
}
return aString;
}
function main(){
alert(insertAnimal(q,u));
}
您可以从HTML文档的body onload事件中调用“main()”
答案 2 :(得分:1)
您可以尝试此操作来查找所有事件:
var re = new RegExp('#\\[([^\\]]+?)\\]', 'gi'),
str = '#[value1] plain text #[value2]',
match;
while (match = re.exec(str)) {
console.log(match);
}
答案 3 :(得分:0)
我可以将您的要求与在内容中解析模板文本进行比较。如果使用Jquery是可行的,你应该尝试Handlebars.js