Usually I check English grammar, driving chunks of phrases into Google, and see what happens.
If many options are found, then the phrase is correct, if not very much - then it is wrong.

Here, I
wrote a service that sends requests to Google, and he highlights, "correctly" or "incorrectly" pieces of a sentence are written, and in some places even prompts - which word can be put on that or another place in the sentence.
He also shows in which context the word is found.
')
What is great is that he doesn’t care what language you check.
You enter a phrase in the text field and the check starts automatically. The checked phrase is displayed below the input field, and for some words, suggestions are given. Inappropriate words are highlighted in red.
The logic of validation is simple. The phrase is broken into pieces covering it, which is further verified. For example, from the phrase “Masha loves Sasha very much” we will receive, including a piece “Loves Sasha very much.” For him there will be two checking requests: "loves * very much" and "loves Sasha very much." And if the query “loves * very much” gives a thousand times more answers than “loves Sasha very much”, it means that “Sasha” does not fit here, and you need to choose some other option.
When you hover on an option, it shows the context in which it occurs. If you click on an option, it will replace the corresponding word in the sentence. When you hover the word in the phrase itself, statistics are shown by the word: how many documents were found by an asterisk, and how many by exact match.

There is no my server part at all, that is, the page is written exclusively in html + javascript.
It is clear that she checks the grammar is far from perfect, and sometimes does not check at all. But you can see if words fit well or poorly, conveniently look at the statistics, pay attention to possible inconsistencies, find other matching words, or use them for something else.
PS
I still have a few questions about the google search api license agreement. (I read the English version, because the Russian almost google translate is written)
1. Is it necessary to put a link to the site on which the content was found (I did not find exactly such lines, although I put the link)?
2. What are the restrictions on the number (officially they are not there, but it is obvious that they should be. For each phrase of n words I send 2n + 4 requests. I have caching during one page load (though there is no cache reset for a long time) you sit :)), but it will not save as a whole.)
Initially, the service was not supposed to go to sites from which the content was taken. But in my opinion, this possibility should be given, since other people's materials are still used, albeit indirectly.
So far, to realize this opportunity so that it does not spoil the interface, I did not succeed.
So I did the links, but except using the tab, you can't get to them :).
Pps
I also forgot to write that there is a limit on the length of the phrase - about 25 words.
Also, the layout is not designed for long phrases, it goes if the phrase gets out of the window.
So far, I don’t even know whether it is necessary to do something with it, or it can simply prevent the user from typing too many words,
because the service is not designed for long phrases or texts.
Rather - to check small offers :)