Unprofane
DocsLanguages

Languages: what is covered and how well it is measured

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#

Each covered language: the word forms on its list, its items and F1 on the Scunthorpe Test's public split with the rules alone, and its toxic and clean texts on the judged development set in balanced mode
LanguageWord formsScunthorpe Test, public split, rules aloneJudged development set, balanced
ItemsF1Toxic textsCaughtClean textsFlagged
Arabic (العربية) ar5,138720.94719787.8%24912.0%
Chinese (中文) zh2,924Not in the split20291.6%2263.5%
Dutch (Nederlands) nl3,698440.92313994.2%2270.9%
English (English) en4,34913,7540.91722496.4%2508.4%
French (Français) fr2,694351.00016795.2%2404.2%
German (Deutsch) de3,803530.93817891.0%2115.7%
Hebrew (עברית) he2,469700.8676091.7%1234.1%
Hindi (हिन्दी) hi3,048320.84621389.2%2217.7%
Indonesian (Indonesia) id2,752510.96816693.4%2388.0%
Italian (Italiano) it2,436390.98719191.1%2255.8%
Japanese (日本語) ja3,608470.9559191.2%1221.6%
Korean (한국어) ko5,735Not in the split12684.1%1702.4%
Polish (Polski) pl3,612460.97723592.3%2112.4%
Portuguese (Português) pt2,245330.96813494.0%2332.1%
Russian (Русский) ru3,367830.9699096.7%1363.7%
Spanish (Español) es2,931510.97819394.3%2191.8%
Turkish (Türkçe) tr3,473290.9829181.3%1766.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.

Texts checked as usernames under the standard policy by the rules alone, with the language named, on engine 2026-10-18
TextLanguage namedThe rulesWhy
aqTurkishCaughtTurkish swearing, counted because Turkish is named
aqautoLeft to the modelTwo letters that show no language
negroSpanishLeft to the modelSpanish for black
negroautoCaughtNo language shown, so read strictly: the French slur
négroSpanishCaughtNot how Spanish writes the word
negr0SpanishCaughtA disguise
sale negrosSpanishCaughtFrench around it
niggaGermanCaughtAn 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.

Texts checked as comments by the rules alone, with a country named where the word is ordinary, where it is rude, and with none, on engine 2026-10-18
TextWhere it is ordinaryWhere it is rudeNo country
¡Te voy a coger!"ES" Allowed: I’ll catch you"MX" Held for review: I’ll fuck youHeld for review
La polla del sábado"CL" Allowed: Saturday’s lottery"ES" Held for review: Saturday’s dickHeld for review
Que pinche calor (kids)"ES" Allowed: a pinche is a kitchen hand"MX" Blocked: this fucking heatBlocked
Hace un frío de la chucha (kids)"CO" Allowed: a chucha is an opossum"CL" Blocked: fucking freezingBlocked
És uma rapariga muito simpática"PT" Allowed: you’re a very nice girl"BR" Blocked: you’re a very nice whoreBlocked
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 dickAllowed
spunk (kids)"US" Allowed: courage"GB" Blocked: semenBlocked

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 country
  • fanny (English): rude in Australia, United Kingdom, Ireland, and New Zealand, ordinary where you name another country
  • spunk (English): rude in United Kingdom and Ireland, ordinary where you name another country
  • bicho (Spanish): read only where you name Puerto Rico, ordinary everywhere else and with no country
  • cajeta (Spanish): rude in Argentina, Paraguay, and Uruguay, ordinary where you name another country
  • chucha (Spanish): rude in Bolivia, Chile, Ecuador, and Peru, ordinary where you name another country
  • cipote (Spanish): rude in Spain, ordinary where you name another country
  • cógeme (Spanish): ordinary in Spain, rude elsewhere
  • cogerte (Spanish): ordinary in Spain, rude elsewhere
  • concha (Spanish): rude in Argentina, Chile, Peru, and Uruguay, ordinary where you name another country
  • cuero (Spanish): read only where you name Dominican Republic and Puerto Rico, ordinary everywhere else and with no country
  • me la quiero coger (Spanish): ordinary in Spain, rude elsewhere
  • papaya (Spanish): read only where you name Cuba, ordinary everywhere else and with no country
  • pija (Spanish): rude in Argentina, Paraguay, and Uruguay, ordinary where you name another country
  • pinche (Spanish): rude in Guatemala, Honduras, Mexico, Nicaragua, and El Salvador, ordinary where you name another country
  • polla (Spanish): rude in Spain, ordinary where you name another country
  • te voy a coger (Spanish): ordinary in Spain, rude elsewhere
  • gosses (French): read only where you name Canada, ordinary everywhere else and with no country
  • tabernacle (French): read only where you name Canada, ordinary everywhere else and with no country
  • banci (Indonesian): ordinary in Malaysia and Singapore, rude elsewhere
  • butuh (Indonesian): read only where you name Brunei, Malaysia, and Singapore, ordinary everywhere else and with no country
  • gampang (Indonesian): read only where you name Malaysia, ordinary everywhere else and with no country
  • bicha (Portuguese): ordinary in Portugal, rude elsewhere
  • cacete (Portuguese): rude in Brazil, ordinary where you name another country
  • pila (Portuguese): rude in Portugal, ordinary where you name another country
  • rapariga (Portuguese): rude in Brazil, ordinary where you name another country
  • seu 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 language on a request when you know the language your texts are in (what it settles), and country when 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.