使翻译功能不再翻译结果



我制作了这个非常简化的翻译工具版本,类似于谷歌翻译。这个想法是为瑞典一种名为"jamska"的少数民族语言构建这个简单的工具。该应用程序由一个函数构建而成,该函数从具有 ID#svenskatextarea中获取字符串,并使用 RegEx 替换字符串中的单词。

我制作了一个名为arr的数组,该数组在函数的 for 循环中用作字典。每个数组项如下所示:var arr = [["eldröd", "eillrau"], ["oväder", "over"] ...]。每个数组项中的第一个单词是瑞典语,第二个单词是 jamska。如果 RegExp 在循环中找到匹配的单词,它将使用以下代码替换该单词:

function translate() {
var str = $("#svenska").val();
var newStr = "";
for (var i = 0; i < arr.length; i++) {
var replace = arr[i][0];
var replaceWith = arr[i][1];
var re = new RegExp('(^|[^a-z0-9åäö])' + replace + '([^a-z0-9åäö]|$)', 'ig');
str = str.replace(re, "$1" + replaceWith + '$2');
}
$("#jamska").val(str);
}

然后在事件处理程序中调用translate(),当#svenskatextarea获得keyup时,如下所示:$("#svenska").keyup(function() { translate(); });

然后,转换后的字符串被分配为另一个 ID 为#jamskatextarea的值。目前为止,一切都好。

不过我有一个问题:如果jamska中的翻译单词也是瑞典语中的单词,则该函数也会翻译该单词。出现此问题是因为我将变量str分配给同一变量的翻译版本,使用:str = str.replace(re, "$1" + replaceWith + '$2');。该函数一遍又一遍地使用相同的变量来执行转换。

示例:瑞典语单词"brydd">在jamska中是"fel"。">Fel"也是瑞典语中的一个词,所以我在翻译后得到的词是"felht",因为瑞典语单词">fel">在jamska中是"felht"。

有没有人知道如何解决这个问题?

与其在输入中查找每个 Jamska 单词并用相应的翻译替换它们,我建议在您的文本中找到任何单词 ([a-z0-9åäö]+),如果词典中找到,则用它的翻译替换这个词,否则用它自己替换

//var arr = [["eldröd", "eillrau"], ["oväder", "over"] ...]
// I'd better use dictionary instead of array to define your dictionary 
var dict = {
eldröd: "oväder",
eillrau: "over"
// ...
};
var str = "eldröd test eillrau eillrau oväder over";
var translated = str.replace(/[a-z0-9åäö]+/ig, function(m) {
var word = m.toLowerCase();
var trans = dict[word];
return trans === undefined ? word : trans;
});
console.log(translated);


更新:

如果字典键可以用短语表示(即在技术上显示为带空格的字符串),则应扩展正则表达式以显式包含所有这些短语。所以最终的正则表达式看起来像

(?:phrase 1|phrase 2|etc...)(?![a-z0-9åäö])|[a-z0-9åäö]+

它将尝试先显式匹配其中一个短语,然后只匹配单个单词。(?![a-z0-9åäö])后视有助于过滤掉紧跟字母的短语(例如varken bättre eller sämreåäö)。

紧靠字母的短语被以下事实隐式过滤掉:匹配项要么是第一个(因此前面没有任何字母),要么不是第一个,因此前一个与当前匹配被一些空格隔开。

//var arr = [["eldröd", "eillrau"], ["oväder", "over"] ...]
// I'd better use dictionary instead of array to define your dictionary 
var dict = {
eldröd: "oväder",
eillrau: "over",
bättre: "better",
"varken bättre eller sämre": "vär å int viller",
"test test": "double test"
// ...
};
var str = "eldröd test eillrau eillrau oväder over test test ";
str += "varken bättre eller sämre ";
str += "don't trans: varken bättre eller sämreåäö";
str += "don't trans again: åäövarken bättre eller sämre";
var phrases = Object.keys(dict)
.filter(function(k) { return /s/.test(k); })
.sort(function(a, b) { return b.length - a.length; })
.join('|');
var re = new RegExp('(?:' + phrases + ')(?![a-z0-9åäö])|[a-z0-9åäö]+', 'ig');
var translated = str.replace(re, function(m) {
var word = m.toLowerCase();
var trans = dict[word];
return trans === undefined ? word : trans;
});
console.log(translated);

最新更新