Corretor Ortográfico

Este documento mostra como configurar idiomas para verificação ortográfica, adicionar ou remover palavras de um dicionário personalizado, desativar a verificação ortográfica e muito mais.

Por padrão, a verificação ortográfica está ativada. O corretor ortográfico analisa o texto e destaca todas as palavras mal escritas. Os corretores ortográficos estão associados aos perfis. Para acessar e configurar o corretor ortográfico para o Profile específico, utilize a classe SpellChecker:

SpellChecker spellChecker = profile.spellChecker();
val spellChecker = profile.spellChecker()

Outra opção é utilizar o método Engine.spellChecker() que retorna a instância da classe SpellChecker associada ao perfil padrão.

Ao contrário do Windows e do Linux, no macOS, o Chromium utiliza as definições de correção ortográfica e os dicionários fornecidos pelo sistema operacional. Portanto, o serviço SpellChecker comporta-se de forma diferente no macOS, como verá mais adiante neste guia.

Adicionar Idiomas

O corretor ortográfico pode verificar textos em diferentes línguas numa única página Web. No Windows e no Linux, é possível configurar os idiomas através do método SpellChecker.addLanguage(Language). O Chromium transfere os arquivos do dicionário automaticamente dos seus servidores e os salva no diretório de dados do usuário.

No macOS, este método apenas verifica se os dicionários necessários estão disponíveis no sistema operacional.

Independentemente do sistema operacional, este método lança uma LanguageNotAvailableException se o Chromium não conseguir encontrar o dicionário necessário.

Por exemplo:

spellChecker.addLanguage(Language.GERMAN);
spellChecker.addLanguage(Language.of("en", "au"));
spellChecker.addLanguage(Language.GERMAN)
spellChecker.addLanguage(Language.of("en", "au"))

A configuração e os dicionários das línguas ortográficas são armazenados no diretório dados do usuário. Assim, se você configurar o Engine para utilizar um diretório específico de dados do usuário, o Engine se lembrará das definições de idioma e vai restaurá-las da próxima vez que o criar e carregará automaticamente os dicionários correspondentes.

Remoção de Linguagens

No Windows e no Linux, utilize o método SpellChecker.removeLanguage(Language) para interromper a verificação ortográfica de um determinado idioma:

spellChecker.removeLanguage(Language.GERMAN);
spellChecker.removeLanguage(Language.GERMAN)

No macOS, este método não faz nada.

Dicionário Personalizado

O corretor ortográfico suporta o dicionário personalizado. É possível acessar um dicionário personalizado utilizando o método SpellChecker.getCustomDictionary().

Por exemplo:

Dictionary dictionary = spellChecker.customDictionary();
val dictionary = spellChecker.customDictionary()

Adicionar Palavra

É possível adicionar palavras ao dicionário personalizado utilizando o método add(String):

boolean success = dictionary.add("John");
val success = dictionary.add("John")

A palavra deve ser UTF-8, com um comprimento entre 1 e 99 bytes e sem espaços em branco ASCII à esquerda ou à direita.

Remoção de Palavras

Para remover uma palavra do dicionário personalizado, utilize o método remove(String):

boolean success = dictionary.remove("John");
val success = dictionary.remove("John")

Desativar a Correção Ortográfica

Por padrão, a verificação ortográfica está ativada. Para o desativar, utilize o seguinte código:

spellChecker.disable();
spellChecker.disable()

É possível apresentar um menu de contexto com sugestões quando um usuário clica com o botão direito do mouse na palavra com erro ortográfico destacada na página Web carregada. Utilize a chamada de retorno ShowContextMenuCallback para exibir um menu de contexto com sugestões e um item de menu que permite adicionar a palavra com erro ortográfico ao dicionário personalizado.

Swing

O exemplo seguinte demonstra como criar e apresentar o menu de contexto Swing com sugestões e o item de menu Adicionar ao dicionário. Utilizando este menu de contexto, pode substituir a palavra mal escrita por uma das sugestões ou adicioná-la ao dicionário personalizado.

browser.set(ShowContextMenuCallback.class, (params, tell) ->
        SwingUtilities.invokeLater(() -> {
            JPopupMenu popupMenu = new JPopupMenu();
            popupMenu.addPopupMenuListener(new PopupMenuListener() {
                ...
                @Override
                public void popupMenuCanceled(PopupMenuEvent e) {
                    tell.close();
                }
            });

            // Adicionar os itens do menu de sugestões.
            SpellCheckMenu spellCheckMenu = params.spellCheckMenu();
            List<String> suggestions = spellCheckMenu.dictionarySuggestions();
            suggestions.forEach(suggestion -> {
                JMenuItem menuItem = new JMenuItem(suggestion);
                menuItem.addActionListener(e -> {
                    browser.replaceMisspelledWord(suggestion);
                    tell.close();
                });
                popupMenu.add(menuItem);
            });

            // Adicionar separador de menu, se necessário.
            if (!suggestions.isEmpty()) {
                popupMenu.addSeparator();
            }

            // Adicionar o item de menu "Add to Dictionary".
            JMenuItem addToDictionary = new JMenuItem(
                    spellCheckMenu.addToDictionaryMenuItemText());
            addToDictionary.addActionListener(e -> {
                Dictionary dictionary =
                        engine.spellChecker().customDictionary();
                dictionary.add(spellCheckMenu.misspelledWord());
                tell.close();
            });
            popupMenu.add(addToDictionary);

            // Mostra o menu de contexto na localização especificada.
            Point location = params.location();
            popupMenu.show(view, location.x(), location.y());
        }));
browser.set(ShowContextMenuCallback::class.java, ShowContextMenuCallback { params, tell ->
    SwingUtilities.invokeLater {
        val popupMenu = JPopupMenu()
        popupMenu.addPopupMenuListener(object: PopupMenuListener {
            ...
            override fun popupMenuCanceled(e: PopupMenuEvent) {
                tell.close()
            }
        })

        // Adicionar os itens de menu de sugestões.
        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)
        }

        // Adicionar separador de menu, se necessário.
        if (!suggestions.isEmpty()) {
            popupMenu.addSeparator()
        }

        // Adicionar o item de menu "Adicionar ao Dicionário".
        val addToDictionary = JMenuItem(spellCheckMenu.addToDictionaryMenuItemText())
        addToDictionary.addActionListener {
            val dictionary = engine.spellChecker().customDictionary()
            dictionary.add(spellCheckMenu.misspelledWord())
            tell.close()
        }
        popupMenu.add(addToDictionary)

        // Mostra o menu de contexto na localização especificada.
        val location = params.location()
        popupMenu.show(view, location.x(), location.y())
    }
})

Se clicar com o botão direito do mouse numa palavra mal escrita, será apresentado o seguinte menu de contexto: Menu de Contexto Swing Corretor Ortográfico

JavaFX

O exemplo seguinte demonstra como criar e apresentar um menu de contexto JavaFX com sugestões e o item de menu Adicionar ao dicionário. Utilizando este menu de contexto, você pode substituir a palavra mal escrita por uma das sugestões ou adicioná-la ao dicionário personalizado.

browser.set(ShowContextMenuCallback.class, (params, tell) ->
        Platform.runLater(() -> {
            ContextMenu contextMenu = new ContextMenu();
            contextMenu.setAutoHide(true);
            contextMenu.setOnHidden(event -> {
                if (!tell.isClosed()) {
                    tell.close();
                }
            });
            view.setOnMousePressed(event -> {
                if (contextMenu.isShowing()) {
                    contextMenu.hide();
                }
            });
            // Adicionar os itens de menu de sugestões.
            SpellCheckMenu spellCheckMenu = params.spellCheckMenu();
            List<String> suggestions = spellCheckMenu.dictionarySuggestions();
            suggestions.forEach(suggestion -> {
                MenuItem item = new MenuItem(suggestion);
                item.setOnAction(event -> {
                    browser.replaceMisspelledWord(suggestion);
                    tell.close();
                });
                contextMenu.getItems().add(item);
            });

            // Adicionar separador de menu, se necessário.
            if (!suggestions.isEmpty()) {
                contextMenu.getItems().add(new SeparatorMenuItem());
            }

            // Adicionar o item de menu "Add to Dictionary".
            MenuItem addToDictionary = new MenuItem(
                    spellCheckMenu.addToDictionaryMenuItemText());
            addToDictionary.setOnAction(event -> {
                SpellChecker spellChecker = engine.spellChecker();
                Dictionary dictionary = spellChecker.customDictionary();
                dictionary.add(spellCheckMenu.misspelledWord());
                tell.close();
            });
            contextMenu.getItems().add(addToDictionary);

            // Mostra o menu de contexto na localização especificada no ecrã.
            Point location = params.location();
            Point2D locationOnScreen = 
                    view.localToScreen(location.x(), location.y());
            contextMenu.show(view, locationOnScreen.getX(), 
                    locationOnScreen.getY());
        }));
browser.set(ShowContextMenuCallback::class.java, 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()
            }
        }
        // Adicionar os itens de menu de sugestões.
        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)
        }

        // Adicionar separador de menu, se necessário.
        if (!suggestions.isEmpty()) {
            contextMenu.items.add(SeparatorMenuItem())
        }

        // Adiciona o item de menu "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)

        // Mostra o menu de contexto na localização especificada no ecrã.
        val location = params.location()
        val locationOnScreen = view.localToScreen(location.x(), location.y())
        contextMenu.show(view, locationOnScreen.getX(), locationOnScreen.getY())
    }
})

Se clicar com o botão direito do mouse numa palavra mal escrita, será apresentado o seguinte menu de contexto: Menu de Contexto JavaFX Corretor Ortográfico

Eventos do Corretor Ortográfico

Quando um campo de texto ou área de texto na página Web carregada recebe o foco, o corretor ortográfico verifica automaticamente o texto e destaca as palavras mal escritas. Para receber notificações quando o texto tiver sido verificado, utilize o evento SpellCheckCompleted.

Por exemplo:

browser.on(SpellCheckCompleted.class, event -> {
    // O texto que foi verificado.
    String text = event.checkedText();
    // A lista dos resultados da correção ortográfica.
    event.results().forEach(spellCheckingResult -> {
        // A localização do primeiro símbolo na palavra mal escrita 
        // no texto verificado que é considerado mal escrito 
        // pelo corretor ortográfico.
        int location = spellCheckingResult.location();
        // O comprimento da palavra mal escrita no texto verificado
        int length = spellCheckingResult.length();
    });
});
browser.on(SpellCheckCompleted::class.java) { event -> 
    // O texto que foi verificado.
    val text = event.checkedText()
    // A lista dos resultados da verificação ortográfica.
    event.results().forEach { spellCheckingResult -> 
        // A localização do primeiro símbolo na palavra mal escrita 
        // no texto verificado que é considerado mal escrito 
        // pelo corretor ortográfico.
        val location = spellCheckingResult.location()
        // O comprimento da palavra mal escrita no texto verificado
        val length = spellCheckingResult.length()
    }
}
Go Top