- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我制作了这个非常简化的翻译工具版本,类似于谷歌翻译。我们的想法是为瑞典的一种名为“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").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/
我最近更新了 ADT 插件,我的整个 Eclipse-Android 构建系统都停止工作了。从那以后,我尝试了我在互联网上可以找到的所有关于如何解决这个问题的方法。徒然。如果有人有确定的方法来解决此问
我已经知道有类似的话题,但对我来说没有任何帮助...... 这里是信息: 该应用程序始终在模拟器和设备上运行。我最近将该项目重命名为另一个名称。仍然工作得很好。今天我意识到它没有更改文件夹名称,然后它
在装有El Capitan的MacMini上,我无法再进行冲泡了。我收到以下错误: /usr/local/Library/Homebrew/config.rb:34:in `initialize':
是的,所以我不知道发生了什么。我一直在编写一个 AJAX 评论脚本,并且它可以工作,但它不再工作了。我从备份中恢复了它,以防万一我改变了任何东西,但没有运气。它转到表单的“操作”而不是 jQuery,
请原谅我的无能...我正在尝试在全局 var 阶段不再未定义后使用 Proxy 执行一些代码。这是我天真的尝试: ``` var stage = undefined let myObj; let st
我对 segues 了解不多,但我已经开始工作了..但突然间它不再工作了...... 我的代码似乎可以工作,但没有发生 segue: NSLog(@"login started"); if ([use
我已将以下重写规则添加到我的 web.config 中。它运行良好,阻止了所有提及的推荐垃圾邮件站点。然而,今天我突然注意到 social-buttons.com 突然出现在我的 Google Ana
在 C++ 中,可以在翻译单元中使用 static 关键字来影响符号(变量或函数声明)的可见性。 在 n3092 中,这已被弃用: Annex D.2 [depr.static] The use of
升级到 com.crashlytics.sdk.android:crashlytics:2.7.1@aar 后(从 2.6.8 开始),我无法再在 Firebase 应用中禁用 Crashlytics
您好,我遇到了一些障碍,我一直在为我的应用程序重新设计菜单导航。我设法做到了。但现在我的应用程序的一项功能已决定停止运行。 想法是你摇动你的手机,它会随机选择一张图片,与应用程序分开的代码工作正常,就
我有一行(容器)包含三个元素,我想水平显示它们之间的间距相等(并且行的左侧或右侧没有空格)。我正在使用带有 justify-content:space-between 的 flexbox。 这是在 F
直到最近,我才能够在 Windows 上使用 python 3.6.7 时安装 tensorflow 1.5.0 包。现在我不能,从下面的“来自版本”的消息来看,似乎根本没有可用的 tensorflo
不确定是否与最近的更新有关,但我突然无法在 Android Studio 编辑器中获得单行间距。如果我尝试将它更改为 1,它让我设置它,但当我按下“应用”时,它会迅速恢复为 1.5。用不同的字体试过,
我遵循了有关如何在 macOS 上安装 pip 的在线说明(例如 this、this 和 this)。 我看起来很简单,但它不适合我。 我的 python --version 是 2.7.10。 当我
Due to rounding errors, most floating-point numbers end up being slightly imprecise. https://www.flo
我试图让用户从他们在 Android 上的库中选择一张图片。但是当我使用 PictureChooser 插件时,它似乎不再起作用了 我看到这段代码可以工作,但现在不行了,我也不知道为什么。
自 .NET 4.5 起,Exception.HResult 的 setter/getter 现在是 public,但它曾经是 protected。 来自 MSDN: Starting with th
今天去处理一个较旧的 Python2.7 AppEngine 标准项目,但我似乎无法让端点工作。我下载了示例代码,看看我的项目是否是罪魁祸首,但该示例也不起作用。 https://cloud.goog
我是一名优秀的程序员,十分优秀!