Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使翻译功能不再翻译结果_Javascript_Jquery_Regex - Fatal编程技术网

Javascript 使翻译功能不再翻译结果

Javascript 使翻译功能不再翻译结果,javascript,jquery,regex,Javascript,Jquery,Regex,我制作了一个非常简化的翻译工具,类似于谷歌翻译。这个想法是为瑞典的一种少数民族语言jamska建立这个简单的工具。该应用程序使用一个函数构建,该函数从ID为svenska的textarea获取字符串,并使用RegExp替换字符串中的单词 我制作了一个名为arr的数组,它在函数的for循环中用作字典。每个数组项如下所示:var arr=[[eldröd,eillrau],[oväder,over]…]。每个数组项中的第一个单词是瑞典语,第二个单词是jamska。如果RegExp在循环中找到匹配的单

我制作了一个非常简化的翻译工具,类似于谷歌翻译。这个想法是为瑞典的一种少数民族语言jamska建立这个简单的工具。该应用程序使用一个函数构建,该函数从ID为svenska的textarea获取字符串,并使用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.keyupfunction{translate;}

然后将转换后的字符串指定为另一个ID为jamska的textarea的值。到目前为止,一切顺利

不过我有一个问题:如果jamska中的翻译词也是瑞典语中的一个词,那么函数也会翻译这个词。发生此问题的原因是,我正在使用:str=str.replace,$1+replaceWith+'$2';,将变量str分配给同一变量的翻译版本;。函数反复使用相同的变量来执行转换

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


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

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

//var arr=[[eldröd,eillrau],[oväder,over]…] //我最好用字典而不是数组来定义你的字典 变量dict={ 埃尔德:奥维德, 艾尔劳:结束 // ... }; var str=eldröd test eillrau eillrau oväder over; var translated=str.replace/[a-z0-9åäö]+/ig,函数M{ var-word=m.toLowerCase; var trans=dict[单词]; 返回trans==未定义?字:trans; };
console.logtranslated;重述您的问题并省略所有细节,如jamska、jquery和对DOM的引用,这将使它对未来的读者更有用,并帮助您更快地吸引更好的答案。您可能会在此处找到答案:@leum you's right!我会在将来考虑这个问题。只是尝试了一下你的代码,它看起来像预期的那样工作。我会尝试一下,然后回来!非常感谢@维克托斯特里夫:对不起,我不太明白你的意思。你是说角色类中那些混乱的0-9吗?它们是从OP示例中继承的,所以我将它们作为一个隐含的要求,尽管我不太清楚。@DmitryEgorov:没关系,我不知道为什么自定义边界会在OP正则表达式中使用。@WiktorStribiżew我使用自定义边界,因为瑞典语和jamska都使用åäö。Regex似乎认为åäö是特殊字符,因此我在翻译以åäö开头或结尾的单词时遇到了问题。@DmitryEgorov在我提供的代码示例中,数组按长度降序排列,因此较长的短语优先于较短的短语。例如,句子varken bättre eller sämre应该翻译成väråint viller,因为数组项的设置如下:[varken bättre eller sämre,väråint viller]。通过你的代码,这句话会被翻译成varken likar ell näppar,因为有些对象会说{bättre:likar}等等。我知道我应该在我的代码中提供这个事实,所以我不希望你给出解决方案:但也许有人知道?