拼写检查器
本文介绍如何配置拼写检查语言、向自定义词典中添加或移除单词、禁用拼写检查等内容。
默认情况下,拼写检查功能是启用状态。拼写检查器会分析文本内容,并高亮显示所有拼写错误的单词。拼写检查器与配置文件(Profile)相关联。要访问并配置特定 Profile 的拼写检查器,请使用 SpellChecker 类:
var spellChecker = profile.spellChecker();
val spellChecker = profile.spellChecker()
要禁用拼写检查,请使用 disable() 方法:
profile.spellChecker().disable();
profile.spellChecker().disable()
另一种方法是使用 Engine.spellChecker() 方法,它会返回与默认 Profile 关联的 SpellChecker 类实例。
与 Windows 和 Linux 不同,在 macOS 上,Chromium 使用操作系统提供的拼写检查设置和词典。因此,正如您将在本指南中看到的,SpellChecker 服务在 macOS 上的行为有所不同。
语言
拼写检查器可以在同一个网页上检查多种语言的文本。在 Windows 和 Linux 上,Chromium 会自动从其服务器下载词典文件,并将其存储在用户数据目录中。在 macOS 上,Chromium 使用操作系统提供的词典。
拼写检查语言及其对应词典的配置会保存在用户数据中。当你将 Engine 指向某个特定的用户数据目录时,这些设置会被保留,并在下次创建时重新加载相应的词典。
使用 SpellChecker.languages() 方法列出用于拼写检查的语言:
var languages = spellChecker.languages();
for (var language : languages) {
var code = language.code();
var region = language.region();
}
val languages = spellChecker.languages()
for (language in languages) {
val code = language.code()
val region = language.region()
}
添加语言
使用 SpellChecker.addLanguage(Language) 方法添加新的拼写检查语言:
spellChecker.addLanguage(Language.CHINESE);
spellChecker.addLanguage(Language.of("en", "au"));
spellChecker.addLanguage(Language.CHINESE)
spellChecker.addLanguage(Language.of("en", "au"))
如果 Chromium 找不到所需词典,此方法会抛出 LanguageNotAvailableException。
在 macOS 上,此方法仅检查操作系统中是否提供所需词典。
移除语言
在 Windows 和 Linux 上,使用 SpellChecker.removeLanguage(Language) 方法停止对某种特定语言的拼写检查:
spellChecker.removeLanguage(Language.of("en", "au"));
spellChecker.removeLanguage(Language.of("en", "au"))
在 macOS 上,此方法不起作用。
自定义词典
拼写检查器支持使用自定义词典。你可以通过 SpellChecker.customDictionary() 方法访问自定义词典。
例如:
var dictionary = spellChecker.customDictionary();
val dictionary = spellChecker.customDictionary()
你可以使用 add(…) 方法向自定义词典中添加单词,既可以逐个添加,也可以批量添加;对于多个单词,批量添加的效率更高。
// 添加一个单词:
var success = dictionary.add("John");
// 一次添加多个单词:
var words = Set.of("Fuzio", "Jiku", "HARDWARE_ACCELERATED");
List<SanitationError> errors = dictionary.add(words);
// 添加一个单词:
val success = dictionary.add("John")
// 一次添加多个单词:
val words = setOf("Fuzio", "Jiku", "HARDWARE_ACCELERATED")
val errors = dictionary.add(words)
单词必须为 UTF-8 编码,长度介于 1 到 99 字节之间,且不能包含前导或尾随的 ASCII 空白字符。
如需从自定义词典中移除单词,请使用 remove(String) 方法:
var success = dictionary.remove("John");
val success = dictionary.remove("John")
要检查词典中是否包含某个单词,请使用 has(String) 方法:
var isWordInDictionary = dictionary.has("John");
val isWordInDictionary = dictionary.has("John")
要获取自定义词典中存储的所有单词,请使用 words() 方法:
Collection<String> words = dictionary.words();
val words: Collection<String> = dictionary.words()
禁用拼写检查
默认情况下,拼写检查处于启用状态。要禁用它,请使用以下代码:
spellChecker.disable();
spellChecker.disable()
上下文菜单
当用户在已加载网页中的高亮拼写错误单词上右键单击时,你可以显示一个带建议项的上下文菜单。使用 ShowContextMenuCallback 回调来显示一个带建议项以及“添加到词典”菜单项的上下文菜单。
当鼠标指针位于拼写错误的单词上时,使用 Browser.replaceMisspelledWord(String) 可将其替换为某个建议词:
browser.replaceMisspelledWord("Scrumdiddlyumptious");
browser.replaceMisspelledWord("Scrumdiddlyumptious")
Swing
以下示例演示如何创建并显示一个包含建议项和添加到词典 (Add to Dictionary) 菜单项的 Swing 上下文菜单。使用此上下文菜单,你可以将拼写错误的单词替换为某个建议词,或者将其添加到自定义词典中。
browser.set(ShowContextMenuCallback.class, (params, tell) ->
invokeLater(() -> {
var popupMenu = new JPopupMenu();
popupMenu.addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
}
@Override
public void popupMenuCanceled(PopupMenuEvent e) {
tell.close();
}
});
// 添加建议菜单项。
var spellCheckMenu = params.spellCheckMenu();
var suggestions = spellCheckMenu.dictionarySuggestions();
suggestions.forEach(suggestion -> {
var menuItem = new JMenuItem(suggestion);
menuItem.addActionListener(e -> {
browser.replaceMisspelledWord(suggestion);
tell.close();
});
popupMenu.add(menuItem);
});
// 如果需要,添加菜单分隔符。
if (!suggestions.isEmpty()) {
popupMenu.addSeparator();
}
// 添加 "添加到词典" 菜单项。
var addToDictionary = new JMenuItem(
spellCheckMenu.addToDictionaryMenuItemText());
addToDictionary.addActionListener(e -> {
var dictionary = engine.spellChecker().customDictionary();
dictionary.add(spellCheckMenu.misspelledWord());
tell.close();
});
popupMenu.add(addToDictionary);
// 在指定位置显示上下文菜单。
var location = params.location();
popupMenu.show(view, location.x(), location.y());
}));
browser.register(ShowContextMenuCallback { params, tell ->
SwingUtilities.invokeLater {
val popupMenu = JPopupMenu()
popupMenu.addPopupMenuListener(object : PopupMenuListener {
override fun popupMenuWillBecomeVisible(e: PopupMenuEvent?) {
}
override fun popupMenuWillBecomeInvisible(e: PopupMenuEvent?) {
}
override fun popupMenuCanceled(e: PopupMenuEvent) {
tell.close()
}
})
// 添加建议菜单项。
val spellCheckMenu = params.spellCheckMenu()
val suggestions = spellCheckMenu.dictionarySuggestions()
suggestions.forEach { suggestion ->
val menuItem = JMenuItem(suggestion)
menuItem.addActionListener {
browser.replaceMisspelledWord(suggestion)
tell.close()
}
popupMenu.add(menuItem)
}
// 如果需要,添加菜单分隔符。
if (suggestions.isNotEmpty()) {
popupMenu.addSeparator()
}
// 添加 "添加到词典" 菜单项。
val addToDictionary = JMenuItem(spellCheckMenu.addToDictionaryMenuItemText())
addToDictionary.addActionListener {
val dictionary = engine.spellChecker().customDictionary()
dictionary.add(spellCheckMenu.misspelledWord())
tell.close()
}
popupMenu.add(addToDictionary)
// 在指定位置显示上下文菜单。
val location = params.location()
popupMenu.show(view, location.x(), location.y())
}
})
如果在拼写错误的单词上右键单击,将会显示以下上下文菜单:

JavaFX
以下示例演示了如何创建并显示一个带建议项和 Add to Dictionary 菜单项的 JavaFX 上下文菜单。使用此上下文菜单,你可以将拼写错误的单词替换为某个建议词,或者将其添加到自定义词典中。
browser.set(ShowContextMenuCallback.class, (params, tell) ->
runLater(() -> {
var contextMenu = new ContextMenu();
contextMenu.setAutoHide(true);
contextMenu.setOnHidden(event -> {
if (!tell.isClosed()) {
tell.close();
}
});
view.setOnMousePressed(event -> {
if (contextMenu.isShowing()) {
contextMenu.hide();
}
});
// 添加建议菜单项。
var spellCheckMenu = params.spellCheckMenu();
var suggestions = spellCheckMenu.dictionarySuggestions();
suggestions.forEach(suggestion -> {
var item = new MenuItem(suggestion);
item.setOnAction(event -> {
browser.replaceMisspelledWord(suggestion);
tell.close();
});
contextMenu.getItems().add(item);
});
//如果需要,添加菜单分隔符。
if (!suggestions.isEmpty()) {
contextMenu.getItems().add(new SeparatorMenuItem());
}
// 添加 "Add to Dictionary" 菜单项。
var addToDictionary = new MenuItem(
spellCheckMenu.addToDictionaryMenuItemText()
);
addToDictionary.setOnAction(event -> {
var spellChecker = engine.spellChecker();
var dictionary = spellChecker.customDictionary();
dictionary.add(spellCheckMenu.misspelledWord());
tell.close();
});
contextMenu.getItems().add(addToDictionary);
// 在屏幕上的指定位置显示上下文菜单。
var location = params.location();
var locationOnScreen = view.localToScreen(location.x(), location.y());
contextMenu.show(view, locationOnScreen.getX(), locationOnScreen.getY());
}));
browser.register(ShowContextMenuCallback { params, tell ->
Platform.runLater {
val contextMenu = ContextMenu()
contextMenu.isAutoHide = true
contextMenu.setOnHidden {
if (!tell.isClosed) {
tell.close()
}
}
view.setOnMousePressed {
if (contextMenu.isShowing) {
contextMenu.hide()
}
}
// 添加建议菜单项。
val spellCheckMenu = params.spellCheckMenu()
val suggestions = spellCheckMenu.dictionarySuggestions()
suggestions.forEach { suggestion ->
val item = MenuItem(suggestion)
item.setOnAction {
browser.replaceMisspelledWord(suggestion)
tell.close()
}
contextMenu.items.add(item)
}
// 如果需要,添加菜单分隔符。
if (suggestions.isNotEmpty()) {
contextMenu.items.add(SeparatorMenuItem())
}
// 添加 "Add to Dictionary" 菜单项。
val addToDictionary = MenuItem(spellCheckMenu.addToDictionaryMenuItemText())
addToDictionary.setOnAction {
val spellChecker = engine.spellChecker()
val dictionary = spellChecker.customDictionary()
dictionary.add(spellCheckMenu.misspelledWord())
tell.close()
}
contextMenu.items.add(addToDictionary)
// 在屏幕上的指定位置显示上下文菜单。
val location = params.location()
val locationOnScreen = view.localToScreen(location.x().toDouble(), location.y().toDouble())
contextMenu.show(view, locationOnScreen.getX(), locationOnScreen.getY())
}
})
如果在拼写错误的单词上右键单击,将显示以下上下文菜单:

拼写检查器事件
当已加载网页上的文本字段或文本区域获得焦点时,拼写检查器会自动检查文本并高亮显示拼写错误的单词。要在文本检查完成后接收通知,请使用 SpellCheckCompleted 事件。
例如:
browser.on(SpellCheckCompleted.class, event -> {
// 已检查的文本。
var text = event.checkedText();
// 拼写检查结果列表。
event.results().forEach(spellCheckingResult -> {
// 在已检查文本中,被拼写检查器认为是拼写错误的单词的第一个符号的位置。
var location = spellCheckingResult.location();
// 已检查文本中拼写错误单词的长度。
var length = spellCheckingResult.length();
});
});
browser.subscribe<SpellCheckCompleted> { event ->
// 已检查的文本。
val text = event.checkedText()
// 拼写检查结果列表。
event.results().forEach { spellCheckingResult ->
// 在已检查文本中,被拼写检查器认为是拼写错误的单词的第一个符号的位置。
val location = spellCheckingResult.location()
// 已检查文本中拼写错误单词的长度。
val length = spellCheckingResult.length()
}
}

