1

我想用 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?我的想法是用正则表达式过滤掉我的特殊语法,然后在每个键上运行 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 而是过滤掉语法,然后通过分组或类似的方式收集密钥。

任何人都可以帮忙吗?

4

4 回答 4

2

只需使用String.replace方法调用指定为第二个参数的函数来生成替换文本并使用匹配您的语法的正则表达式进行全局替换:

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))

结果:您好,先生,很高兴见到您。

当然,当您的替换列表变大时,您最好使用查找对象而不是查找函数中的一系列 if,但您真的可以在那里做任何您想做的事情。

于 2012-04-25T08:57:46.780 回答
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 文档的正文 onload 事件中调用“main()”

于 2012-04-25T08:19:45.893 回答
1

你可以试试这个来找到所有的事件:

var re = new RegExp('#\\[([^\\]]+?)\\]', 'gi'),
    str = '#[value1] plain text #[value2]',
    match;

while (match = re.exec(str)) {
    console.log(match);
}
于 2012-04-25T08:36:20.147 回答
0

我可以将您的要求与“在内容中解析模板文本”进行比较。如果使用 Jquery 可行,您应该尝试Handlebars.js

于 2012-04-25T08:23:39.400 回答