gpt4 book ai didi

javascript - 使翻译功能不再翻译结果

转载 作者:行者123 更新时间:2023-12-03 04:41:32 25 4
gpt4 key购买 nike

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

我创建了一个名为 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);

}

然后,当 #svenska textarea 获取 keyup 时,在事件处理程序中调用 translate() >,像这样:$("#svenska").keyup(function() {translate(); });

然后将翻译后的字符串指定为 ID 为 #jamska 的另一个 textarea 的值。到目前为止,一切都很好。

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

示例:瑞典语单词“brydd”在 jamska 中是“fel”。 “Fel”也是瑞典语中的一个单词,因此我翻译后得到的单词是“felht”,因为瑞典语单词“fel” em> 在 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åäö]) Lookbehind 有助于过滤掉紧跟字母的短语(例如 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);

关于javascript - 使翻译功能不再翻译结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43067542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com