All pages

Languages

Which languages the word lists cover, which the model covers, and what a clean answer means outside both.

Two different things run on your content, and they do not cover the same languages. It is worth knowing which is which before you decide what a clean answer means.

What it reads
The model ("ai": true)Whatever it reads, which is far more than the list below and includes scripts we have no word lists for at all. It is the part that understands a sentence rather than matching one.
The free detectors (every call)The word and phrase lists below. Structural checks are language-independent and work everywhere: links, wallet addresses, card and IBAN checksums, repetition, image fingerprints.

The word lists

English, Spanish, Portuguese, French, Italian, German, Catalan and Dutch. That covers the vocabulary side of toxicity, harassment, hate, sexual, violence, self_harm, scam, the pile-on check, the minor safety patterns, and the scam shapes: borrowed accounts, deals taken off the platform, rentals, jobs, romances, fake reviews and discriminatory job ads.

Say this one out loud: a language that is not on that list is not half-covered, it is not covered at all by the free path. The answer comes back clean, and a clean answer from a detector that has no words for the language is not evidence that there was nothing to find. On a site in a language we do not list, send "ai": true for anything that matters.

What you do not have to spell out

Within a covered language, the spellings are handled for you and you should not add them to any list. f*ck, f u c k, fυck with a Greek upsilon, fuck, a zero-width space in the middle, leetspeak, missing accents: all of it folds to the same word before anything is searched for. That applies to your own policy terms too: write competidor once, not eleven spellings of it.

The fold is careful in the direction that matters: it never transliterates Chinese, Arabic, Hebrew, Japanese or Korean, and it unmasks a word only when the word itself is mixing scripts. Otherwise ordinary Russian would come back reported as maximally disguised.

Telling us what to expect

locales is not what selects the word lists. Those are all searched, always, because a comment in Portuguese arrives on a Spanish forum every day. It is what makes two other checks possible: a wall of an unexpected alphabet, and a message in a language your site is not in. Both exist to be quiet, with a fifteen-character alphabet floor and a sixty-character floor for the language check, because a confident guess about a short message is worse than no guess.

Your own words, and your own language

Anything the lists miss, you can add yourself, and it lands in the same place with the same normalisation:

Policy termsYour block, review and allow lists, per account, in any language. This is the answer for a community whose language is not listed above: the words that matter to you, in your words.
TopicsSubjects rather than harms, defined by the words that name them.

On a self-hosted deployment the shipped lists themselves are two data files, terms.php and phrases.php, both keyed by language, and MODERATION_TERMS_PATH and MODERATION_PHRASES_PATH point at replacements kept outside the repository. Adding a language is a column in those files, not a change to any detector.