Which languages does Unprofane support? 17 languages, each with its own word list: Arabic, Chinese, Dutch, English, French, German, Hebrew, Hindi, Indonesian, Italian, Japanese, Korean, Polish, Portuguese, Russian, Spanish, and Turkish. The rules read the words, spellings and disguises of those languages, and in balanced mode the model reads the rest. A text in another language has no list: the rules read only the covered languages' words in it, and it is not measured. How well each language is measured differs, and the table below says by how much.
Each language, its list and its measures#
| Language | Word forms | Scunthorpe Test, public split, rules alone | Judged development set, balanced | ||||
|---|---|---|---|---|---|---|---|
| Items | F1 | Toxic texts | Caught | Clean texts | Flagged | ||
Arabic (العربية) ar | 5,138 | 72 | 0.947 | 197 | 87.8% | 249 | 12.0% |
Chinese (中文) zh | 2,924 | Not in the split | 202 | 91.6% | 226 | 3.5% | |
Dutch (Nederlands) nl | 3,698 | 44 | 0.923 | 139 | 94.2% | 227 | 0.9% |
English (English) en | 4,349 | 13,754 | 0.917 | 224 | 96.4% | 250 | 8.4% |
French (Français) fr | 2,694 | 35 | 1.000 | 167 | 95.2% | 240 | 4.2% |
German (Deutsch) de | 3,803 | 53 | 0.938 | 178 | 91.0% | 211 | 5.7% |
Hebrew (עברית) he | 2,469 | 70 | 0.867 | 60 | 91.7% | 123 | 4.1% |
Hindi (हिन्दी) hi | 3,048 | 32 | 0.846 | 213 | 89.2% | 221 | 7.7% |
Indonesian (Indonesia) id | 2,752 | 51 | 0.968 | 166 | 93.4% | 238 | 8.0% |
Italian (Italiano) it | 2,436 | 39 | 0.987 | 191 | 91.1% | 225 | 5.8% |
Japanese (日本語) ja | 3,608 | 47 | 0.955 | 91 | 91.2% | 122 | 1.6% |
Korean (한국어) ko | 5,735 | Not in the split | 126 | 84.1% | 170 | 2.4% | |
Polish (Polski) pl | 3,612 | 46 | 0.977 | 235 | 92.3% | 211 | 2.4% |
Portuguese (Português) pt | 2,245 | 33 | 0.968 | 134 | 94.0% | 233 | 2.1% |
Russian (Русский) ru | 3,367 | 83 | 0.969 | 90 | 96.7% | 136 | 3.7% |
Spanish (Español) es | 2,931 | 51 | 0.978 | 193 | 94.3% | 219 | 1.8% |
Turkish (Türkçe) tr | 3,473 | 29 | 0.982 | 91 | 81.3% | 176 | 6.8% |
Word forms: the lexicon 7fd3a314370b this site was built with. Scunthorpe Test: public split, run of , engine 2026-10-18. Judged development set: method, read on , engine 2026-09-29 as it stood that day, standard policy. The measures are defined under what the numbers mean.
What the table does not show#
- The development set flatters the engine. Unprofane was tuned on it, so its per-language numbers are higher than a fresh set would give. The held-back judged set, the headline measure, is read as totals only, never by language, so that a group read from it is not a second look.
- The Scunthorpe Test is mostly English. 13,754 of its 15,550 items are English; the other languages have tens of items each, mostly generated disguises of listed words, so an F1 there says the list and the disguises work, not how real text in that language is judged. Chinese and Korean are not in the split.
- A few hundred texts a language is a small sample. A difference of a few points between two languages is within what another sample could move.
- A text in a language that is not listed is not measured at all. The rules read only the covered languages' words in it; in balanced mode the model reads it, unmeasured.
The language you name#
Set language when you know the language your texts are in. It settles only what a text leaves open, and never overrules a text that shows another language. It reads both ways: a word that counts only beside its language counts once you name it, and from engine 2026-10-18 a slur of another language that is an ordinary word of yours is that word. "negro" named Spanish or Portuguese is black, left to the model to read in balanced mode, as one word typed as the language writes it. A disguise, another spelling or a sentence in another language is still caught, and with auto a bare word is read strictly. Earlier versions read a bare "negro" as the slur whatever language is named.
| Text | Language named | The rules | Why |
|---|---|---|---|
aq | Turkish | Caught | Turkish swearing, counted because Turkish is named |
aq | auto | Left to the model | Two letters that show no language |
negro | Spanish | Left to the model | Spanish for black |
negro | auto | Caught | No language shown, so read strictly: the French slur |
négro | Spanish | Caught | Not how Spanish writes the word |
negr0 | Spanish | Caught | A disguise |
sale negros | Spanish | Caught | French around it |
nigga | German | Caught | An English word, which every language borrows |
Each text checked as a username under the standard policy, by the rules alone, on engine 2026-10-18.
The country you name#
Set country to where your users are, as a two-letter code (MX, ES, BR). A word rude in some countries and ordinary in yours is then read as yours reads it; a word rude everywhere is rude whatever you name. Without country, a word counts as rude as it is anywhere, except a word ordinary to nearly everyone who writes its language (Malay butuh is "need" in Indonesian): that one is read only where you name a country it is rude in. The rules read it, and drop a word that is ordinary where your users are before the model is asked about it; in balanced mode the model still reads the whole text as written. A project can set a default country in the dashboard. Engine 2026-09-29 ignores the field.
| Text | Where it is ordinary | Where it is rude | No country |
|---|---|---|---|
¡Te voy a coger! | "ES" Allowed: I’ll catch you | "MX" Held for review: I’ll fuck you | Held for review |
La polla del sábado | "CL" Allowed: Saturday’s lottery | "ES" Held for review: Saturday’s dick | Held for review |
Que pinche calor (kids) | "ES" Allowed: a pinche is a kitchen hand | "MX" Blocked: this fucking heat | Blocked |
Hace un frío de la chucha (kids) | "CO" Allowed: a chucha is an opossum | "CL" Blocked: fucking freezing | Blocked |
És uma rapariga muito simpática | "PT" Allowed: you’re a very nice girl | "BR" Blocked: you’re a very nice whore | Blocked |
Que cacete! (kids) | "PT" Allowed: a cacete is a club, or a loaf | "BR" Blocked: damn it! | Blocked |
Saya butuh bantuan | "ID" Allowed: I need help | "MY" Held for review: butuh is a dick | Allowed |
spunk (kids) | "US" Allowed: courage | "GB" Blocked: semen | Blocked |
Each text checked as a comment under the standard policy, or the one named beside it, by the rules alone, on engine 2026-10-18.
The words the engine reads by country today:
pudern(German): read only where you name Austria, ordinary everywhere else and with no countryfanny(English): rude in Australia, United Kingdom, Ireland, and New Zealand, ordinary where you name another countryspunk(English): rude in United Kingdom and Ireland, ordinary where you name another countrybicho(Spanish): read only where you name Puerto Rico, ordinary everywhere else and with no countrycajeta(Spanish): rude in Argentina, Paraguay, and Uruguay, ordinary where you name another countrychucha(Spanish): rude in Bolivia, Chile, Ecuador, and Peru, ordinary where you name another countrycipote(Spanish): rude in Spain, ordinary where you name another countrycógeme(Spanish): ordinary in Spain, rude elsewherecogerte(Spanish): ordinary in Spain, rude elsewhereconcha(Spanish): rude in Argentina, Chile, Peru, and Uruguay, ordinary where you name another countrycuero(Spanish): read only where you name Dominican Republic and Puerto Rico, ordinary everywhere else and with no countryme la quiero coger(Spanish): ordinary in Spain, rude elsewherepapaya(Spanish): read only where you name Cuba, ordinary everywhere else and with no countrypija(Spanish): rude in Argentina, Paraguay, and Uruguay, ordinary where you name another countrypinche(Spanish): rude in Guatemala, Honduras, Mexico, Nicaragua, and El Salvador, ordinary where you name another countrypolla(Spanish): rude in Spain, ordinary where you name another countryte voy a coger(Spanish): ordinary in Spain, rude elsewheregosses(French): read only where you name Canada, ordinary everywhere else and with no countrytabernacle(French): read only where you name Canada, ordinary everywhere else and with no countrybanci(Indonesian): ordinary in Malaysia and Singapore, rude elsewherebutuh(Indonesian): read only where you name Brunei, Malaysia, and Singapore, ordinary everywhere else and with no countrygampang(Indonesian): read only where you name Malaysia, ordinary everywhere else and with no countrybicha(Portuguese): ordinary in Portugal, rude elsewherecacete(Portuguese): rude in Brazil, ordinary where you name another countrypila(Portuguese): rude in Portugal, ordinary where you name another countryrapariga(Portuguese): rude in Brazil, ordinary where you name another countryseu puto(Portuguese): rude in Brazil, ordinary where you name another country
A word your users read differently that is not here goes to the feedback endpoint, or to your project's lists today.
Next#
- Set
languageon a request when you know the language your texts are in (what it settles), andcountrywhen you know where your users are (which words it turns). Every language is still read; the API reference has both fields. - Run your own texts in each language you serve through a test key before launch, and send what it gets wrong with the feedback endpoint.
- Words your users use that the list lacks, or innocent ones it flags: your project's lists.