From 2c787eb32a4579320197ade2a4938d056f93fd44 Mon Sep 17 00:00:00 2001 From: Jason Pierce Date: Fri, 27 Dec 2024 11:30:41 -0600 Subject: [PATCH 1/4] Standardize quotes --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 13e4fe4..4046e0b 100644 --- a/README.md +++ b/README.md @@ -58,17 +58,17 @@ By default, this is set to `['en']` (English). You can change the default to any ```JavaScript const profanity = new Profanity({ - languages: ["en", "de"], + languages: ['en', 'de'], }); ``` You can override this option by specifying the languages in `exists` or `censor`: ```JavaScript -profanity.exists('Je suis un connard', ["fr"]); +profanity.exists('Je suis un connard', ['fr']); // true -profanity.censor('I like big butts and je suis un connard', CensorType.Word, ["en", "de", "fr"]); +profanity.censor('I like big butts and je suis un connard', CensorType.Word, ['en', 'de', 'fr']); // I like big @#$%&! and je suis un @#$%&! ``` From eca4cf11db2e647a928fa02125d69c180c550e94 Mon Sep 17 00:00:00 2001 From: Jason Pierce Date: Fri, 27 Dec 2024 16:45:26 -0600 Subject: [PATCH 2/4] Add translate script for generating translations via Libre Translate --- .npmignore | 1 + contribute.md | 34 +++++++ docker-compose.yml | 24 +++++ package-lock.json | 120 ++++++++++++++++++++++- package.json | 4 +- src/scripts/translate.ts | 203 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 381 insertions(+), 5 deletions(-) create mode 100644 docker-compose.yml create mode 100644 src/scripts/translate.ts diff --git a/.npmignore b/.npmignore index 8d2ecd4..816e370 100644 --- a/.npmignore +++ b/.npmignore @@ -11,4 +11,5 @@ tests/ .nvmrc .prettierignore .prettierrc.json +docker-compose.yml tsconfig.json diff --git a/contribute.md b/contribute.md index 81a0d7d..2605240 100644 --- a/contribute.md +++ b/contribute.md @@ -43,6 +43,40 @@ Start app in watch mode: `npm run local` - Fix lint errors: `npm run lint:fix` - Fix formatting errors: `npm run format` +## Translations + +We utilize a self-hosted instance of the Open Source [LibreTranslate](https://github.com/LibreTranslate/LibreTranslate) lib to translate the core English list of profane words. + +### Steps to Run Translations + +1. Open a terminal. +2. Start Docker: `docker-compose up`. +3. Run the translation script: `npm run translate`. + +### Available Languages + +By default, the LibreTranslate service is configured to include all available target languages from [argos-translate](https://github.com/argosopentech/argos-translate). This configuration affects: + +- **Startup Time**: Initial service startup. Depending on your system, this can take ~5 minutes. +- **Translation Time**: Translating across all languages increases processing time. +- **Library Size**: The final size of the Profanity library. + +To optimize performance, we limit the target languages by configuring the `LT_LOAD_ONLY` environment variable: + +#### Configure Target Languages +1. Open the `./docker-compose.yml` file. +2. Add a comma-separated list of the [supported language codes](https://github.com/argosopentech/argos-translate/blob/master/argostranslate/languages.csv) you wish to include. Ensure English (`en`) is included, as it serves as the source language. + +**Example Configuration:** +```yaml +environment: + LT_LOAD_ONLY: "en,es,fr,de" +``` + +> **Note:** +> - To add a new language, remove existing language codes from `LT_LOAD_ONLY` +> - To update existing languages after changes to the core English list, include their language codes in `LT_LOAD_ONLY` + ## Appendix ### Dev Tools diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4835c38 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,24 @@ +version: "3" +services: + libretranslate: + image: libretranslate/libretranslate:latest-cuda + ports: + - "5000:5000" + environment: + - LT_LOAD_ONLY=en,ar,zh,fr,de,hi,ja,ko,pt,ru,es + - NVIDIA_VISIBLE_DEVICES=all + - CUDA_LAUNCH_BLOCKING=0 + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: 1 + capabilities: [gpu] + limits: + memory: 5G + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:5000/languages"] + interval: 30s + timeout: 10s + retries: 3 diff --git a/package-lock.json b/package-lock.json index d28745c..99938d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "@types/node": "^22.5.2", "@typescript-eslint/eslint-plugin": "^8.4.0", "@typescript-eslint/parser": "^8.4.0", + "axios": "^1.7.9", "benchmark": "^2.1.4", "chai": "^4.5.0", "eslint": "^9.9.1", @@ -186,10 +187,11 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", - "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", + "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "levn": "^0.4.1" }, @@ -709,6 +711,25 @@ "node": "*" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "dev": true, @@ -915,6 +936,19 @@ "dev": true, "license": "MIT" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "12.1.0", "dev": true, @@ -934,7 +968,9 @@ "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -989,6 +1025,16 @@ "dev": true, "license": "MIT" }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/diff": { "version": "5.2.0", "dev": true, @@ -1419,6 +1465,42 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "dev": true, @@ -1956,6 +2038,29 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "4.0.0", "dev": true, @@ -2406,6 +2511,13 @@ "node": ">=6.0.0" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, "node_modules/pstree.remy": { "version": "1.1.8", "dev": true, diff --git a/package.json b/package.json index da29b66..e2d52c5 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,8 @@ "lint:fix": "eslint . --fix", "format": "prettier . --write", "prepublishOnly": "npm run lint && npm test", - "prepare": "husky" + "prepare": "husky", + "translate": "ts-node src/scripts/translate.ts" }, "repository": { "type": "git", @@ -60,6 +61,7 @@ "@types/node": "^22.5.2", "@typescript-eslint/eslint-plugin": "^8.4.0", "@typescript-eslint/parser": "^8.4.0", + "axios": "^1.7.9", "benchmark": "^2.1.4", "chai": "^4.5.0", "eslint": "^9.9.1", diff --git a/src/scripts/translate.ts b/src/scripts/translate.ts new file mode 100644 index 0000000..d0dfc21 --- /dev/null +++ b/src/scripts/translate.ts @@ -0,0 +1,203 @@ +import axios from "axios"; +import * as fs from "fs"; +import * as path from "path"; +import { profaneWords } from "../data/profane-words"; + +interface TranslationResponse { + translatedText: string; +} + +interface LanguageInfo { + code: string; + name: string; + targets: string[]; +} + +const LIBRE_TRANSLATE_URL = "http://localhost:5000"; +const BATCH_SIZE = 50; + +async function getTargetLanguages(): Promise { + let attempts = 0; + + while (true) { + attempts++; + try { + const response = await axios.get(`${LIBRE_TRANSLATE_URL}/languages`); + const englishInfo = response.data.find((lang) => lang.code === "en"); + + if (!englishInfo) { + throw new Error("English language support not found in API"); + } + + process.stdout.write("\n"); // Clear the retry line + // Filter out 'en' from targets + return englishInfo.targets.filter((lang) => lang !== "en"); + } catch (error) { + // Check if it's a connection error + if (error.code === "ECONNREFUSED" || error.code === "ECONNRESET" || error.message.includes("socket hang up")) { + process.stdout.write(`\rWaiting for LibreTranslate API to come online... (Attempt ${attempts})`); + await delay(5000); // Wait 5 seconds before retry + continue; + } + + // If it's not a connection error, rethrow + console.error("Error fetching supported languages:", error.message); + throw error; + } + } +} + +function normalizeWord(word: string): { normalized: string; hasSpaces: boolean } { + const hasSpaces = word.includes(" "); + // Remove spaces and underscores from words like "f u c k" or "f_u_c_k" + const normalized = word.replace(/[\s_]+/g, ""); + return { normalized, hasSpaces }; +} + +async function translateWord(word: string, targetLang: string): Promise { + const { normalized, hasSpaces } = normalizeWord(word); + + // If the word had spaces, and removing them makes it match another word in our list, + // just use the spaced version of that word in the target language + if (hasSpaces) { + // Skip translation for spaced words, keep original format + return word; + } + + try { + const response = await axios.post(`${LIBRE_TRANSLATE_URL}/translate`, { + q: normalized, + source: "en", + target: targetLang, + format: "text", + }); + + const translatedText = response.data.translatedText.toLowerCase(); + + // Check if the translated text is just asterisks and spaces + if (/^[\s*]+$/.test(translatedText)) { + return word; // Return original word if translation is just asterisks and spaces + } + + // Check for unexpected content that might indicate an error + if (["error", "not found", "invalid", "translation"].some((keyword) => translatedText.includes(keyword))) { + console.warn(`Unexpected translation result for "${word}" to ${targetLang}: "${translatedText}"`); + return word; // Return original word if translation seems to be an error message + } + + return translatedText; + } catch (error) { + console.error(`Error translating "${word}" to ${targetLang}:`, error.message); + return word; // Return original word on error + } +} + +async function delay(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +async function translateBatch(words: string[], targetLang: string): Promise { + const translations: string[] = []; + const totalBatches = Math.ceil(words.length / BATCH_SIZE); + + for (let i = 0; i < words.length; i += BATCH_SIZE) { + const batch = words.slice(i, i + BATCH_SIZE); + + // Add retry logic for failed batches + let retries = 3; + let batchTranslations: string[] = []; + + while (retries > 0) { + try { + batchTranslations = await Promise.all(batch.map((word) => translateWord(word, targetLang))); + break; // Success, exit retry loop + } catch (error) { + retries--; + if (retries === 0) { + console.error(`\nBatch translation failed after 3 attempts, using original words`, error); + batchTranslations = batch; // Use original words on complete failure + } else { + console.error(`\nRetrying batch translation (${retries} attempts remaining)`, error); + await delay(1000); // Wait 1 second before retry + } + } + } + + translations.push(...batchTranslations); + + const currentBatch = Math.floor(i / BATCH_SIZE) + 1; + const percentage = ((currentBatch / totalBatches) * 100).toFixed(1); + const progress = `[${currentBatch}/${totalBatches}]`; + const wordRange = `[${i + 1}-${Math.min(i + BATCH_SIZE, words.length)}/${words.length}]`; + process.stdout.write(`\r${progress} English to ${targetLang} ${percentage}% ${wordRange}`); + } + + process.stdout.write("\n"); + return translations; +} + +async function main() { + // Fetch supported target languages + console.log("Fetching supported languages..."); + const targetLanguages = await getTargetLanguages(); + console.log(`Found ${targetLanguages.length} supported target languages\n${targetLanguages}\n`); + + const englishWords = profaneWords.get("en") || []; + + if (englishWords.length === 0) { + throw new Error("No English words found in profaneWords map"); + } + + // Check for duplicates in English list + const uniqueEnglishWords = [...new Set(englishWords)]; + const duplicateCount = englishWords.length - uniqueEnglishWords.length; + + if (duplicateCount > 0) { + console.log(`Found ${duplicateCount} duplicates in English word list`); + console.log(`Original count: ${englishWords.length}, Unique count: ${uniqueEnglishWords.length}`); + } + + console.log(`${uniqueEnglishWords.length} English words to translate`); + + // Translate to each target language + const translations = new Map(); + + for (let i = 0; i < targetLanguages.length; i++) { + const lang = targetLanguages[i]; + const langProgress = `[${i + 1}/${targetLanguages.length}]`; + console.log(`\n${langProgress} Translating ${lang}...`); + const translatedWords = await translateBatch(uniqueEnglishWords, lang); + // Clean up translations - remove quotes, invalid characters, and duplicates + const cleanedWords = [...new Set(translatedWords.map((word) => word.replace(/["""]/g, "").trim()).filter((word) => word.length > 0))]; + translations.set(lang, cleanedWords); + console.log(`Removed ${translatedWords.length - cleanedWords.length} duplicates`); + } + + // Combine new translations with existing ones + const combinedTranslations = new Map([...profaneWords, ...translations]); + combinedTranslations.delete("en"); + + const sortedTranslations = Array.from(combinedTranslations.entries()).sort(([langA], [langB]) => langA.localeCompare(langB)); + + // Generate new content + let newContent = "// WARNING: this file contains profanity. The below list of profane words is necessary for this tool to function properly.\n"; + newContent += "// Do not read below this line if you do not wish to be exposed to lots of profane words\n\n"; + newContent += "export const profaneWords: Map = new Map([\n"; + + // Add English words first + newContent += ` ["en", [\n "${uniqueEnglishWords.join('",\n "')}"\n ]],\n`; + + // Add sorted translations + for (const [lang, words] of sortedTranslations) { + newContent += ` ["${lang}", [\n "${words.join('",\n "')}"\n ]],\n`; + } + + newContent += "]);\n"; + + // Write back to file + const filePath = path.join(__dirname, "../data/profane-words.ts"); + fs.writeFileSync(filePath, newContent); + console.log("\nTranslation complete! Updated profane-words.ts"); +} + +main().catch(console.error); From 4fb8e5064a19e1cc8c52317d989143d5e49543a5 Mon Sep 17 00:00:00 2001 From: Jason Pierce Date: Fri, 27 Dec 2024 16:46:03 -0600 Subject: [PATCH 3/4] Add translations for: ar,zh,hi,ja,ko,pt,ru --- src/data/profane-words.ts | 3541 +++++++++++++++++++++++++++++++++---- supported-languages.md | 23 +- 2 files changed, 3168 insertions(+), 396 deletions(-) diff --git a/src/data/profane-words.ts b/src/data/profane-words.ts index 7a7de59..2807d4f 100644 --- a/src/data/profane-words.ts +++ b/src/data/profane-words.ts @@ -2,156 +2,6 @@ // Do not read below this line if you do not wish to be exposed to lots of profane words export const profaneWords: Map = new Map([ - [ - "de", - [ - "abspritzen", - "abstand", - "abtreiben", - "abtreibung", - "anal", - "anus", - "arsch", - "arschficker", - "arschloch", - "arschlöcher", - "balltasche", - "bastard", - "bellend", - "beschissen", - "besoffen", - "bestial", - "bestialität", - "blasen", - "blutig", - "bollok", - "boob", - "brüste", - "buceta", - "busen", - "bälle", - "cipa", - "cunillingus", - "deich", - "dildo", - "dildos", - "dink", - "duche", - "dödel", - "ejakulation", - "ejakulieren", - "ejakuliert", - "esel", - "fagging", - "fanny", - "felching", - "fellatio", - "ficken", - "ficker", - "fickt", - "flansch", - "fotze", - "fotzen", - "fuck", - "fudge packer", - "gammler", - "gefickt", - "geil", - "geschissen", - "gott verdammt", - "gottverdammt", - "hintern", - "hoden", - "hodensack", - "hore", - "hundeficker", - "hure", - "hurensohn", - "hölle", - "hündin", - "hündinnen", - "kacke", - "kacken", - "kippe", - "klitoris", - "kock", - "lust", - "lüstern", - "masochist", - "masturbieren", - "mist", - "muschi", - "muschis", - "mutter ficker", - "nazi", - "nigger", - "nutte", - "nutten", - "onanieren", - "orgasim", - "orgasmen", - "orgasmus", - "pecker", - "penis", - "piss", - "pisse", - "pissen", - "pisser", - "pissoff", - "pisst", - "poop", - "porno", - "pornographie", - "prostituierte", - "pube", - "rektum", - "rimming", - "sadist", - "samen", - "schamlippen", - "scheisse", - "scheiße", - "scheißen", - "schlampe", - "schlampen", - "schluchzen", - "schmutz", - "schnappen", - "schrauben", - "schwanz", - "schwanzlutscher", - "schwuchtel", - "schwuchteln", - "schwänze", - "sex", - "shag", - "shagging", - "smegma", - "spalt", - "sperma", - "stechen", - "stiche", - "teppichmuncher", - "tit", - "titt", - "titte", - "titten", - "transen", - "turd", - "vagina", - "verdammt", - "vergewaltigen", - "vergewaltiger", - "verzögern", - "viagra", - "vulva", - "wang", - "waschbär", - "wichsen", - "x bewertet", - "xxx", - ], - ], [ "en", [ @@ -607,264 +457,3175 @@ export const profaneWords: Map = new Map([ ], ], [ - "es", - [ - "aborto", - "anal", - "ano", - "culo", - "follador de culo", - "culos", - "estúpido", - "bolsa de pelota", - "bolas", - "bastardo", - "campana", - "bestial", - "bestialidad", - "perra", - "perras", - "quejas", - "sangriento", - "mamada", - "bollok", - "teta", - "tetas", - "los pechos", - "buceta", - "extremo", - "muncher alfombra", - "grieta", - "cipa", - "clítoris", - "polla", - "chupar la polla", - "gallos", - "mapache", - "mierda", - "semen", - "corrida", - "cunillingus", - "coño", - "maldita sea", - "consolador", - "consoladores", - "tonto", - "perro follador", - "duche", - "dique", - "eyacular", - "eyaculado", - "eyacula", - "eyaculación", - "maricón", - "fagging", - "maricones", - "felching", - "felación", - "brida", - "follada", - "cabron", - "folladores", - "maldito", - "carajo", - "folla", - "fudge packer", - "maldito sea", - "infierno", - "hore", - "córneo", - "tirón", - "kock", - "labios vaginales", - "lujuria", - "masoquista", - "masturbarse", - "madre folladora", - "nazi", - "negro", - "niggers", - "orgasimo", - "orgasmo", - "orgasmos", - "pájaro carpintero", - "pene", - "mear", - "molesto", - "pisser", - "orinando", - "enojado", - "pornografía", - "porno", - "pinchazo", - "pinchazos", - "pube", - "coños", - "violación", - "violador", - "recto", - "retardar", - "rimming", - "sádico", - "atornillar", - "escroto", - "sexo", - "pelusa", - "follar", - "transexual", - "cagadas", - "cagado", - "cagando", - "de mierda", - "skank", - "puta", - "putas", - "smegma", - "tizón", - "arrebatar", - "hijo de puta", - "espacio", - "agallas", - "testículo", - "zurullo", - "vagina", - "viagra", - "vulva", - "wang", - "hacerse una paja", - "x clasificado", - "xxx", - ], - ], - [ - "fr", + "ar", [ - "avortement", + "4r5e", + "5h1t", + "5hit", + "a55", "anal", "anus", - "cul", - "enculer", - "culs", - "connard", - "connards", - "sac de billes", - "des balles", - "bellend", - "bestial", - "bestialité", - "chienne", - "chiennes", - "salope", - "sanglant", - "pipe", + "ar5e", + "الحصان", + "المؤخرات", + "مؤخرة", + "الوغد", + "الحمير", + "assfukka", + "أحمق", + "حمقى", + "الأحمق", + "دولار", + "كدولارات", + "(ب)", + "b00bs", + "b17ch", + "b1tch", + "الكرة", + "الكرات", + "كرات", + "الوحشية", + "الجرس", + "الأفضلية", + "b+ch", + "biatch", + "الكلبة", + "الكلبات", + "العاهرات", + "اللعنة", + "blow job", + "عمل فاسد", + "أعمال تفجيرية", + "boiolas", + "هراء", "bollok", - "boob", - "seins", - "les seins", + "العظام", + "صدر", + "الثدي", + "البوق", + "عصيان", + "البوووب", "buceta", - "clochard", - "bout", - "tapis muncher", - "fente", + "حشرة", + "bum", + "buttplug", + "c0ck", + "c0cksucker", + "carpet muncher", + "مقهى", "cipa", + "cl1t", + "clit", "clitoris", - "coq", - "suceuse", - "coqs", - "nègre", - "merde", - "sperme", - "éjaculation", + "clits", + "cnut", + "قضيب", + "وغد", + "وجهك", + "القضيب", + "كوكر", + "أيها الوغد", + "سحقًا", + "صراخ", + "cocksuka", + "cocksukka", + "كوك", + "cokmuncher", + "كوكاكوتا", + "coon", + "كوكس", + "حثالة", + "cummer", + "الطهي", + "cumshot", + "cunilingus", "cunillingus", - "chatte", - "zut", - "queue", - "godemiché", - "godes", - "tremper", - "baiseur de chien", - "duché", - "digue", - "éjaculer", - "éjaculé", - "éjacule", - "éjaculant", - "pédé", - "fagging", + "cunnilingus", + "cuntlick", + "النقر", + "العبث", + "الحمقى", + "cyalis", + "الإنترنت(ج)", + "الفضاء الإلكتروني", + "الملاعين السيبرانيين", + "تسلل عبر الإنترنت", + "d1ck", + "dildo", + "dildos", + "دينك", + "dirsa", + "♪", + "الكلب اللعين", + "الكلب", + "حبوب منع الحمل", + "doosh", + "duche", + "dyke", + "الإيجاز", + "ejaculated", + "الجزيئات", + "ejaculating", + "الهرجات", + "القذف", + "ejakulate", + "f u c k", + "f u c k e r", + "f4nny", + "fag", + "زائفة", + "الشاذ", + "الشواذ", "fagot", "fagots", - "penchant", - "fellation", - "bride", - "baisée", - "enfoiré", - "baiseurs", - "putain de", - "fuckings", - "baise", - "emballeur de fudge", - "damné", - "putain", - "enfer", + "الكلاب", + "فاني", + "fannyflaps", + "الملاعين", + "الخيال", + "الدهون", + "fcuk", + "متعهد", + "الحضانات", + "feck", + "فاسد", + "المهرجان", + "سقط", + "fellatio", + "قبضة لعينة", + "flange", + "fook", + "fooker", + "مارس الجنس مع", + "اللعين", + "سخيف", + "أيها اللعين", + "fudge packer", + "حمأة", + "فوك", + "فوكر", + "fukkin", + "صمامات", + "فوكوهي", + "فوكويت", + "الثعلب", + "fux0r", + "gangbang", + "العصابات", + "مثلي الجنس", + "الماعز", + "يا إلهي", + "صلبة", + "الرأس", + "hoar", + "hoare", + "hoer", + "hoes", + "homo", "hore", - "corné", - "se branler", - "kock", - "les lèvres", + "الأشقر", + "مثارة", + "مثير", + "(جاك أوف)", + "(جاك)", + "jap", + "jiz", + "jizm", + "jizz", + "kawk", + "knobead", + "حبس", + "knobend", + "knobhead", + "knobjocky", + "knobjokey", + "kondum", + "الكوندوم", + "kum", + "kummer", + "الكم", + "kums", + "kunilingus", + "l3i+ch", + "l3itch", + "المختبرات", + "شهوة", + "الإغراء", + "m0f", + "m0fo", + "m45terbate", + "ma5terb8", + "الماجستير", + "مسوخ", + "درجة الماجستير", + "الماجستير(ب)", + "المناقشة العامة*", + "المناقشة الرئيسية 3", + "سيدي", + "التحفة", + "الاستمناء", + "mo-fo", + "mof0", + "mofo", + "موثا", + "mothafucka", + "mothafuckas", + "mothafuckaz", + "مضاجعة", + "mothafuckin", + "الأوغاد", + "لعين", + "muff", + "muthafecker", + "ملاعين", + "n1gga", + "n1gger", + "نازي", + "nigg3r", + "nigg4h", + "زنجي", + "الزنوج", + "nob", + "nob jokey", + "nobhead", + "نابوكي", + "nobjokey", + "الراهبات", + "مجنون", + "النشوة", + "الأورام", + "p0rn", + "الرهن", + "بيكر", + "الهواتف الجنسية", + "phuck", + "phuk", + "رشاش", + "رهبان", + "phukked", + "الفوكة", + "phuks", + "phuq", + "القواد", + "بول", + "سكران غاضب", + "البول", + "تبول", + "poop", + "porn", + "porno", + "المواد الإباحية", + "pornos", + "الخوخ", + "pron", + "حانة", + "نقية", + "pussi", + "الجبناء", + "جبان", + "إعادة التشكيل", + "المتخلفون", + "rimjaw", + "قذف", + "s hit", + "s.o.b.", + "سادي", + "schlong", + "scroat", + "scrote", + "scrotum", + "semen", + "الجنس", + "ش", + "sh1t", + "shag", + "شجر", + "shaggin", + "shemale", + "shi+", + "القرف", + "skank", + "عاهرة", + "عاهرات", + "smegma", + "smut", + "snatch", + "ابن العاهرة", + "spac", + "سافل", + "t1tt1e5", + "t1tties", + "teets", + "teez", + "اختباري", + "خصية", + "tit", + "أيها الحقير", + "tittie5", + "tittywank", + "titwank", + "toser", + "tw4t", + "twat", + "twathead", + "twatty", + "توان", + "v14gra", + "v1gra", + "vagina", + "viagra", + "vulva", + "w00se", + "وانغ", + "wank", + "wanker", + "wanky", + "الويلات", + "ويلي", + ], + ], + [ + "de", + [ + "4r5e", + "5h1t", + "5hit", + "a55", + "anal", + "anus", + "ar5e", + "arrse", + "arse", + "arses", + "arsch", + "arschficker", + "esel", + "assfukka", + "arschloch", + "arschlöcher", + "arschganz", + "a$$", + "in %", + "a$s", + "b.tch", + "b00bs", + "b17ch", + "b1tch", + "kugelbeutel", + "eier", + "bälle", + "bastard", + "beastial", + "beastialität", + "glocke", + "bestial", + "bestialität", + "bi+ch", + "biatch", + "schlampe", + "hündchen", + "metzger", + "schlampen", + "bitchin", + "bitching", + "verdammt", + "blow job", + "blasen", + "boiolas", + "bollock", + "bollok", + "knochen", + "titten", + "brüste", + "buhn", + "boooobs", + "boooooobs", + "buceta", + "fehler", + "schwachsinn", + "bum", + "hintern", + "buttmuch", + "buttplug", + "c0ck", + "c0cksucker", + "carpet muncher", + "kacke", + "chink", + "cipa", + "cl1t", + "klitoris", + "cnut", + "schwanz", + "schwanzsauger", + "schwanzkopf", + "schwanzlutscher", + "hahnmacher", + "schwänze", + "kokos", + "kokmuncher", + "koksucka", + "coon", + "cox", + "mist", + "cum", + "kümmel", + "cumming", + "cums", + "cumshot", + "cunilingus", + "cunillingus", + "cunnilingus", + "fotze", + "cuntlicker", + "cuntlicking", + "stiche", + "cyalis", + "cyberfuc", + "cyberfuck", + "cyberfickt", + "cyberfucker", + "cyberficker", + "cyberficken", + "d1ck", + "dildo", + "dildos", + "dink", + "dinks", + "dirsa", + "dlck", + "hundeficker", + "doggin", + "hunde", + "eselibber", + "doosh", + "duche", + "dyke", + "ejakulat", + "ejakuliert", + "ejaculate", + "ejakulation", + "f u c k", + "f u c k e r", + "f4nny", + "schwuchtel", + "schwuchteln", + "fagot", + "fanny", + "fannyflaps", + "fannyfucker", + "phantasievoll", + "fettass", + "fcuk", + "fcuker", + "fcuking", + "feck", + "fecker", + "felching", + "flat", + "fellatio", + "fingerfick", + "fingerfickt", + "fingerficker", + "fingerficken", + "fistfuck", + "fistfickt", + "fistfucker", + "fistficken", + "scheiße", + "flansch", + "fook", + "fooker", + "fick", + "fucka", + "gefickt", + "wichser", + "scheißkerle", + "scheißkerl", + "fick mich", + "ficks", + "fuckwit", + "fudge packer", + "fudgepacker", + "fuk", + "fuker", + "fukker", + "fokkin", + "fuks", + "fukwhit", + "fukwit", + "fux", + "fux0r", + "gangbang", + "gangbanged", + "gangbangs", + "gaylord", + "gaysex", + "ziegen", + "gott-dam", + "hardcoresex", + "headass", + "hor", + "hoare", + "hoer", + "huhn", + "homo", + "hore", + "horniest", + "geil", + "hotsex", + "ausleger", + "knüppel", + "jap", + "idiot", + "jisma", + "jiz", + "jizm", + "jizz", + "kawk", + "knospead", + "geknallt", + "knaufende", + "knopfkopf", + "knospen", + "knowjokey", + "kock", + "kondum", + "kum", + "kummer", + "kumming", + "kums", + "kunilingus", + "l3i+ch", + "l3itch", + "labia", + "lust", + "lustig", + "m0f0", + "m0fo", + "m45terbat", + "ma5terb8", + "ma5terbat", + "masochist", + "master-bate", + "masterb8", + "masterbat*", + "masterbat3", + "masterbat", + "masterbation", + "masterbationen", + "masturbieren", + "mo-fo", + "mof0", + "mofo", + "mothafuck", + "mothafucka", + "mothafuckas", + "mothafuckaz", + "mottafucked", + "mothafucker", + "mothafuckin", + "mothafucking", + "mothafuckings", + "mothafucks", + "verfickt", + "muff", + "muthafecker", + "muthafuckker", + "mutherfucker", + "n1gga", + "n1gger", + "nazi", + "nigg3r", + "nigg4h", + "nigga", + "niggas", + "niggaz", + "nigger", + "nob", + "nob jokey", + "nobhead", + "nobjocky", + "nobjokey", + "nüsse", + "nussack", + "orgasim", + "orgasime", + "orgasmus", + "orgasmen", + "p0rn", + "pfoten", + "pecker", + "penis", + "penisfucker", + "telefonsex", + "phuck", + "phuk", + "phuking", + "phukked", + "phukking", + "phuks", + "phuq", + "schweinefucker", + "pimpis", + "pisse", + "pissed", + "pisser", + "pissflaps", + "pissin", + "pissen", + "pisseff", + "poop", + "porno", + "pornografie", + "pornos", + "pricks", + "pron", + "pube", + "pusse", + "pussi", + "muschis", + "muschi", + "pussys", + "rektum", + "verzögert", + "rimjaw", + "felgen", + "s hit", + "s.o.b.", + "sadist", + "schlong", + "schrauben", + "skroat", + "skrote", + "skrotum", + "samen", + "geschlecht", + "sh!+", + "sh!t", + "sh1t", + "shag", + "shagger", + "shaggin", + "transen", + "shi+", + "shit", + "shited", + "schlitten", + "scheißkopf", + "shitter", + "splitter", + "scherben", + "shank", + "smegma", + "smut", + "snatch", + "spac", + "spunk", + "t1tt1e5", + "t1tties", + "teets", + "teez", + "hoden", + "tit", + "titfuck", + "titt", + "tittie5", + "tittiefucker", + "tittyfuck", + "tittywank", + "titwank", + "tosser", + "dord", + "tw4t", + "twat", + "twathead", + "twatty", + "twunt", + "twunter", + "v14gra", + "v1gra", + "vagina", + "viagra", + "vulva", + "w00se", + "wang", + "wank", + "wahnsinn", + "hure", + "willies", + "willy", + ], + ], + [ + "es", + [ + "4r5e", + "5h1t", + "5hit", + "a55", + "anal", + "aus", + "ar5e", + "culo", + "culos", + "culo de mierda", + "idiota", + "assfukka", + "imbécil", + "idiotas", + "culo completo", + "a dólares", + "a)", + "b!tch", + "b00bs", + "b17ch", + "b1tch", + "bolsa de bolas", + "bolas", + "bastardo", + "bestia", + "bellend", + "bestial", + "bestialidad", + "bi+ch", + "biatch", + "perra", + "puta", + "putas", + "perras", + "¡maldita sea", + "blow job", + "mamada", + "mamadas", + "boiolas", + "bollock", + "bollok", + "hueso", + "tetas", + "booobs", + "boooobs", + "booooobs", + "booooooobs", + "senos", + "buceta", + "negro", + "mierda", + "bum", + "butt", + "buttmuch", + "buttplug", + "c0ck", + "c0cksucker", + "carpet muncher", + "cawk", + "chink", + "cipa", + "cl1t", + "entendido", + "clítoris", + "clits", + "cnut", + "polla", + "polla-sucker", + "masturbación", + "pene", + "gallos", + "pollas", + "polla grande", + "pollasucked", + "chupavergas", + "chupa pollas", + "penes negros grandes", + "cocksuka", + "cocksukka", + "cok", + "cokmuncher", + "coksucka", + "coon", + "cox", + "cum", + "cummer", + "colibrí", + "semen", + "corrida", + "cunilingus", + "cunillingus", + "cunnilingus", + "cuñada", + "cuntlick", + "cuntlicker", + "cuntlicking", + "cuñas", + "cyalis", + "cyberfuc", + "ciberpolvo", + "cibernético", + "¡mierda", + "los ciberdelincuentes", + "ciberdelincuente", + "d1ck", + "maldita sea", + "dildo", + "consoladores", + "dink", + "dinks", + "dirsa", + "♪", + "perro mierda", + "perro", + "donkeyribber", + "doosh", + "duche", + "dyke", + "eyaculado", + "eyaculada", + "eyaculados", + "eyaculando", + "eyaculaciones", + "eyaculación", + "eyakulate", + "f u c k", + "f u c k e r", + "f4nny", + "maricón", + "maricas", + "faggit", + "faggs", + "fanny", + "fannyflaps", + "fannyfucker", + "fanyy", + "grasa", + "fcuk", + "fcuker", + "fcuting", + "feck", + "fecker", + "felching", + "caído", + "♪♪", + "dedo", + "¡dedo", + "dedos de mierda", + "dedo de mierda", + "dedos", + "fistfuck", + "fistfucking", + "fistfucker", + "fistfuckers", + "fistfuckings", + "fistfucks", + "brida", + "fook", + "fooker", + "follada", + "hijo de puta", + "mierdas", + "puta mierda", + "mierda mierda mierda madre mierda mierda mierda", + "maldición", + "fudge packer", + "fudgepacker", + "fuk", + "fuker", + "fukker", + "fukkin", + "fusibles", + "fukwhit", + "fukwit", + "fux", + "fux0r", + "gangbang", + "gangbanged", + "gangbangs", + "gaylord", + "gaysex", + "cabra", + "maldito", + "hardcoresex", + "headass", + "hoar", + "hoare", + "hoer", + "hoes", + "homo", + "hore", + "más caliente", + "caliente", + "hotsex", + "jack-off", + "jackoff", + "jap", + "jism", + "jiz", + "jizm", + "jizz", + "kawk", + "kno", + "knobed", + "knobend", + "knobhead", + "knobjocky", + "knobjokey", + "kock", + "kondum", + "kondums", + "kum", + "kummer", + "kumming", + "kums", + "kunilingus", + "l3i+ch", + "l3itch", + "labia", + "lujuria", + "m0f0", + "m0fo", + "m45terbate", + "ma5terb8", + "ma5terbate", + "masoquista", + "master-bate", + "masterb8", + "masterbat*", + "masterbat3", + "masterbate", + "masterbation", + "masterbations", + "mo-fo", + "mof0", + "mofo", + "mothafuck", + "mothafucka", + "mothafuckas", + "mothafuckaz", + "mothafucking", + "mothafucker", + "bigotes", + "mothafuckin", + "mothafucks", + "hijos de puta", + "madre mierda", + "muff", + "muthafecker", + "muthafuckker", + "mutherfucker", + "n1gga", + "n1gger", + "nazi", + "nigg3r", + "nigg4h", + "niggah", + "niggas", + "niggaz", + "negros", + "nob", + "nob jokey", + "nobhead", + "nobjocky", + "nobjokey", + "nueces", + "orgasim", + "orgasims", + "orgasmo", + "orgasmos", + "p0rn", + "peón", + "pecker", + "chupa penes", + "teléfonosex", + "phuk", + "phuked", + "phuking", + "phukked", + "phukking", + "phuks", + "phuq", + "cabrón", + "chulos", + "orinar", + "enojada", + "meandos", + "meadas", + "pispa", + "orina", + "meando", + "poop", + "porno", + "pornografía", + "pornos", + "pron", + "pube", + "pusse", + "pussi", + "pussies", + "vagina", + "vaginas", + "recto", + "retardado", + "rimjaw", + "rimming", + "s hit", + "s.o.b.", + "sadista", + "schlong", + "tornillo", + "scroat", + "scrote", + "escroto", + "sexo", + "sh!+", + "sh", + "sh1t", + "shag", + "shagger", + "shaggin", + "temblando", + "transexual", + "shi+", + "skank", + "smegma", + "smut", + "snatch", + "spac", + "sunk", + "t1t1e5", + "t1tties", + "teets", + "teez", + "testículo", + "titular", + "titfuck", + "tit", + "tittie5", + "tittie", + "tittyfuck", + "tittywank", + "titwank", + "tosser", + "turd", + "tw4t", + "twat", + "twathead", + "twatty", + "twunt", + "twunter", + "v14gra", + "v1gra", + "viagra", + "vulva", + "w00se", + "wang", + "wank", + "wanker", + "wanky", + "whoar", + "willies", + "willy", + ], + ], + [ + "fr", + [ + "4r5e", + "5h1t", + "5 heures", + "a55", + "anal", + "anus", + "ar5e", + "arrs", + "cul", + "ânes", + "enculé de cul", + "culs", + "enfoiré", + "assfukka", + "trou du cul", + "gros cul", + "a$", + "en dollars", + "c'est ça", + "b00bs", + "b17ch", + "b1tch", + "sac à bille", + "boules", + "sac à billes", + "bâtard", + "bête", + "bêteté", + "clocher", + "bestial", + "bestialité", + "bi+ch", + "biatch", + "salope", + "les salopes", + "salopes", + "sanglant", + "blow job", + "pipe", + "pipes", + "boiolas", + "cliquetis", + "bollok", + "osseux", + "sein", + "seins", + "bouchons", + "les nichons", + "boucliers", + "booooooobs", + "poitrines", + "buceta", + "enculé", + "des conneries", + "bum", + "fesses", + "mégots", + "gros plan", + "plug anal", + "c0ck", + "c0cksucker", + "carpet muncher", + "cawk", + "chine", + "cipa", + "cl1t", + "clito", + "clitoris", + "clits", + "nut", + "coq", + "suceur de bite", + "visage de coq", + "tête de coq", + "munche de coq", + "coq-muncher", + "coqs", + "sucre de bite", + "bites sucées", + "coqsucks", + "cocksuka", + "cocksukka", + "cok", + "cokmuncher", + "coksucka", + "coon", + "cox", + "sperme", + "pomme", + "cumming", + "spermes", + "éjaculation", + "cunilingus", + "cunillingus", + "cunnilingus", + "pâte", + "lèche-cul", + "chattes", + "cyalis", + "cyberfuc", + "cyberfuck", + "cyberfucked", + "les cyber-fuckers", + "cyberdépannage", + "d1ck", + "putain", + "bite", + "tête de bite", + "gode", + "godes", + "évier", + "éviers", + "dirsa", + "dlck", + "enculé de chien", + "chienne", + "levrette", + "d'ânes", + "doux", + "duché", + "dyke", + "éjaculations", + "éjaculate", + "f u c k", + "f u c k e r", + "pour", + "pédé", + "signalisation", + "foggitt", + "peaux", + "fagot", + "fagots", + "pédés", + "fanny", + "les fannyflaps", + "fany", + "gras", + "fcuk", + "fcuker", + "fcuking", + "feu", + "fecker", + "feuillage", + "infesté", + "taux de chute", + "culotte", + "avec les doigts", + "enfoirés", + "fucking des doigts", + "bouchées de doigts", + "fuck", + "farcis", + "frappe de poing", + "frappes de poing", + "fusils", + "bride", + "fook", + "fooker", + "merde", + "baisée", + "enculés", + "espèce d'enfoiré", + "crétins", + "putains", + "fils de pute", + "baise-moi", + "connard", + "fudge packer", + "fudgepacker", + "fuk", + "fuker", + "fukker", + "fukkin", + "fuks", + "fukwhit", + "fukwit", + "fux", + "fox0r", + "un gangbang", + "bandes", + "des gangs", + "gaylord", + "gaysexe", + "caprins", + "seigneur", + "dieu maudit", + "nom de dieu", + "hardcoresexe", + "tête de cul", + "arnaque", + "hoare", + "attaque", + "sabots", + "homo", + "thorax", + "les plus excités", + "excité", + "sexe chaud", + "décollage", + "jap", + "branleur", + "le jisme", + "jiz", + "jizm", + "jizz", + "kawk", + "boutons", + "boutonné", + "bouton", + "tête de bouton", + "jocky", + "boutonjokey", + "kock", + "kondum", + "kondums", + "kum", + "kummer", + "le kumming", + "des kums", + "kunilingus", + "l3i+ch", + "3 points", + "labia", "luxure", - "convoitise", + "lustre", + "m0f0", + "m0fo", + "m45terbate", + "m5terb8", + "ma5terbate", "masochiste", - "masturber", - "mère enculée", + "maître-bateau", + "maîtreb8", + "maître-bat*", + "maîtrise3", + "maître", + "masterbation", + "masterbations", + "masturbe", + "les", + "mof0", + "mofo", + "mothafuck", + "mothafucka", + "mothafuckas", + "mothafuckaz", + "mothafucked", + "mothafucker", + "mothafucks", + "mothafuckin", + "mothafucking", + "mothafuckings", + "merdeux", + "muff", + "le muthafecker", + "muthafuckker", + "n1gga", + "n1gger", + "nazi", + "4 h", + "negga", + "niggué", + "niggas", + "niggaz", + "nègre", + "nègres", + "nob", + "nob jokey", + "tête de noeud", + "nobjocky", + "nobjokey", + "engourdissements", + "sac à noix", + "orgasim", + "orgasims", + "orgasme", + "orgasmes", + "p0rn", + "sur gage", + "pic", + "pénis", + "suceur de pénis", + "téléphonex", + "purée", + "phuk", + "ouvrés", + "le phuking", + "phukked", + "ouvrage", + "les phuks", + "phuq", + "maquereau", + "pisse", + "en colère", + "pisser", + "les pisseurs", + "pousses de pisse", + "caca", + "porno", + "pornographie mettant en scène des enfants", + "pornos", + "pique", + "les briques", + "tablier", + "pube", + "pusse", + "pousse", + "chatte", + "rectum", + "retard", + "rimjaw", + "jante", + "s hit", + "s.o.b.", + "sadique", + "schlong", + "vissage", + "scroat", + "scrotte", + "scrotum", + "sexe", + "sh!+", + "- oui", + "s'il vous plaît", + "shagger", + "shaggin", + "sciages", + "transexuelle", + "shi+", + "merdique", + "crétin", + "des merdes", + "sankk", + "smegma", + "smut", + "snatch", + "spac", + "croûte", + "t1tt1e5", + "t1tiétés", + "tétons", + "et toi", + "testique", + "testicule", + "tit", + "titfuck", + "titre", + "titre5", + "tittyfuck", + "tittywank", + "titwank", + "lancer", + "tuyau", + "tw4t", + "twat", + "twathead", + "twatty", + "twunt", + "détecteur", + "v14gra", + "v1gra", + "vagin", + "viagra", + "vulve", + "w00se", + "wang", + "gland", + "branlé", + "souris", + "pute", + "walies", + "willy", + ], + ], + [ + "hi", + [ + "4r5e", + "5h1t", + "5hit", + "a55", + "गुदामैथुन", + "एनस", + "ar5e", + "arrse", + "आर्सेना", + "शस्त्र", + "ass", + "ass-fucker", + "assfucker", + "assfukka", + "asshole", + "assholes", + "asswhole", + "$$", + "$", + "b", + "b00b", + "b17ch", + "b1tch", + "बॉलबैग", + "गेंद", + "गेंदों", + "बस्टर्ड", + "जानवर", + "समानता", + "घंटी", + "श्रेष्ठ", + "श्रेष्ठता", + "bi+ch", + "बिच", + "बिटच", + "चूंचियां", + "बिटचर", + "बिट्च", + "बिटचिन", + "बिटिंग", + "खूनी", + "blow job", + "blowjob", + "बियोला", + "बोल्क", + "बोललोक", + "हड्डी", + "शराब", + "स्तन", + "booooobs", + "buceta", + "बगीचा", + "हिन्दी", + "bum", + "बट", + "बटहोल", + "बटमच", + "buttplug", + "c0ck", + "c0cksucker", + "carpet muncher", + "चिंक", + "cipa", + "cl1t", + "क्लिट", + "क्लिटोरिस", + "अखरोट", + "मुर्गा", + "मुर्गा चूसने वाला", + "कॉकफेस", + "कॉक", + "मुर्गा चूसने", + "कोक", + "cokmuncher", + "coksucka", + "कोन", + "केकड़ा", + "सह", + "cummer", + "cumming", + "कमशॉट", + "गुलगुला", + "cunillingus", + "हिंदी", + "चाचा", + "cuntlick", + "cuntlicker", + "cuntlicking", + "cunts", + "cyalis", + "साइबरफ़ुक", + "साइबर बकवास", + "d1ck", + "damn", + "डिक", + "dickhead", + "डिल्डो", + "dildos", + "गुत्थी", + "डंक", + "कुत्ते-fucker", + "कुत्ते", + "dogging", + "गधा", + "डोष", + "डच", + "डाइक", + "ejaculate", + "ejaculated", + "ejaculation", + "ejaculations", + "ejakulate", + "f u c k", + "f u c k e r", + "f4nny", + "फ़ैग", + "छूत", + "चुभोना", + "fagot", + "फैनी", + "फैनीफ्लैप", + "कट्टर", + "वसा", + "fcuk", + "fcuker", + "fcuking", + "fecker", + "गिरना", + "गिरती", + "उंगली करना", + "fingerfucked", + "उंगलियों", + "मुट्ठीकरना", + "fistfucked", + "fistfucker", + "fistfuckers", + "fistfucking", + "fistfuck", + "फुहार", + "चॉकर", + "भाड़ में जाओ", + "बकवास", + "गड़बड़", + "मुख-मैथुन", + "fuckheads", + "कमबख्त", + "fuckingshitmotherfucker", + "fudge packer", + "fudgepacker", + "fuk", + "fucker", + "fukkin", + "फक", + "फूहड़", + "fux0r", + "गिरोह बैंग", + "gangbanged", + "समलैंगिक", + "बकरी", + "देवता", + "देवी", + "कट्टरसेक्स", + "सिर", + "होर", + "हो", + "होम", + "सींग का", + "सेक्सी", + "जैक ऑफ", + "जैकपॉट", + "जैप", + "मरोड़ते", + "jism", + "जिज़", + "जिज़्म", + "कावा", + "घुंडी", + "knobjocky", + "kock", + "कोंडोम", + "कोन्डम", + "कुम्भ", + "kumming", + "गुनगुना", + "l3i+ch", + "l3itch", + "लैबिया", + "चमकना", + "m0f0", + "m0fo", + "m45terbate", + "ma5terb8", + "ma5terbate", + "मैसोचिस्ट", + "मास्टर-बेट", + "मास्टरब8", + "मास्टरबैट*", + "मास्टरबैट3", + "मास्टरबेट", + "masterbation", + "हस्तमैथुन", + "mo-fo", + "mof0", + "साइटमैप", + "mothafucka", + "mothafuckaz", + "mothafucked", + "mothafucker", + "mothafuckin", + "mothafucking", + "माँ", + "motherfucked", + "motherfucker", + "motherfuckers", + "motherfuckin", + "motherfucking", + "motherfuckka", + "माताओं", + "माफ", + "muthafecker", + "muthafuckker", + "mutherfucker", + "n1gga", + "n1gger", + "नाज़ी", + "nigg3r", + "nigg4h", + "निगा", + "निगाह", + "नागा", + "nigger", + "niggers", + "नोब", + "nob jokey", + "नोबहेड", + "nobjocky", + "nobjokey", + "नट्सैक", + "orgasim", + "संभोग सुख", + "p0", + "मोहन", + "पेकर", + "पेनिस", + "penisfucker", + "फोनसेक्स", + "चक", + "फुक", + "फुकेत", + "phuq", + "pigfucker", + "पिम्पिस", + "पेशाब", + "pissed", + "pissing", + "पेशाब करना", + "पोप", + "अश्लील", + "पोर्नोग्राफी", + "ट्रिक", + "pricks", + "प्रोन", + "पुसी", + "बिल्ली", + "राशि", + "मंदिर", + "रिमजॉ", + "rimming", + "s hit", + "s.o.b.", + "sadist", + "schlong", + "पेंच", + "झरना", + "घूंघट", + "अंडकोष", + "वीर्य", + "सेक्स", + "sh!+", + "sh!t", + "sh1t", + "shag", + "shagger", + "shaggin", + "shagging", + "shemale", + "शि +", + "shitfuck", + "shitful", + "शिटिंग", + "पतला", + "शिथिल", + "शिटर", + "शिट्टी", + "skank", + "गुदगुदी", + "smegma", + "smut", + "छीनना", + "बेटा", + "स्पेक", + "टट्टू", + "t1t1e5", + "टी1टी", + "टी", + "टीज़", + "वृषण", + "तैसा", + "टिट्स", + "टिट", + "tittie5", + "tittiefucker", + "titties", + "tittyfuck", + "tittywank", + "titwank", + "toser", + "turd", + "tw4t", + "twat", + "twathead", + "twatty", + "ट्वंट", + "ट्वंटर", + "v14gra", + "v1gra", + "योनि", + "वियाग्रा", + "vulva", + "w00se", + "वांग", + "wank", + "wanker", + "wanky", + "whoar", + "whore", + "इच्छा", + ], + ], + [ + "ja", + [ + "4r5eの", + "5h1t", + "5ヒット", + "の55", + "アナル", + "ログイン", + "ar5eの", + "アルス", + "トピックス", + "ass fucker", + "アコース", + "assfucker", + "アスフッカ", + "アスホール", + "$$$$", + "アスドル", + "a$s", + "b!パッチ", + "b00bsの", + "b17chの", + "b1tchの", + "ボールバッグ", + "ボールボール", + "ボールバック", + "バスタード", + "ビーストリアル", + "獣性", + "ベルン", + "ベスト", + "人気カテゴリー", + "bi+chの", + "バイアッチ", + "ビットチェボーイ", + "ビットチャー", + "ビットチャーズ", + "ビットチェス", + "ビットキャッシュ", + "blow job", + "ブロージョブ", + "ボヨラス", + "ボルロック", + "ボロク", + "ボブ", + "ブーブ", + "ブーブス", + "ブーツ", + "ブームーブ", + "ブームーブス", + "ブラストス", + "ボセタ", + "バッガー", + "ブルシット", + "バム", + "バッツ", + "バトール", + "バッチュ", + "パスワード", + "c0cksuckerの", + "carpet muncher", + "チンク", + "プリカ", + "クラス1t", + "クライストリ", + "クルミ", + "コック", + "コックサッカー", + "コックフェイス", + "コックヘッド", + "コックムンチャー", + "コックサック", + "コック吸う", + "コックキャッキング", + "コックスカ", + "コックスッカ", + "コクンチャー", + "コクサッカ", + "コックス", + "クムマー", + "つぶやき", + "カムス", + "cuntlicking", + "シアリス", + "サイバーフック", + "サイバーfuck", + "サイバーfucked", + "サイバーファッカー", + "サイバーファッキング", + "d1ckの", + "ダムン", + "dickheadの", + "ディルドー", + "ディルドス", + "ダイニング", + "ディルサ", + "ダック", + "犬 fucker", + "ドッグギン", + "ドッギング", + "ドオッシュ", + "デュチェ", + "ダイケ", + "エジャキュレート", + "ejaculated(エジャキュレーション)", + "電子メール", + "ejaculating(エジャカルト)", + "ejaculating(エジャキュレーション)", + "ejakulateの", + "f u c k", + "f u c k e r", + "おばあさん", + "ファグ", + "ファッギング", + "ファゴット", + "ファグス", + "ファンニー", + "ファンニーフラップ", + "ファンニーfucker", + "脂肪マッサージ", + "フォーク", + "フィードバック", + "フェッカー", + "落ち着き", + "フィンガーfuck", + "指fucked", + "フィンガーファイヤー", + "フィンガーファッカー", + "指fucking", + "フィンガーfucks", + "フィストfuck", + "fistfucked", + "fistfucker", + "フィストfuckers", + "fistfucking", + "fistfuckings", + "fistfucks", + "フランジ", + "フーカー", + "クソ", + "フラッシャー", + "クソヘッド", + "fuckingshitmotherfucker", + "fuckwhitさん", + "fuckwitの", + "fudge packer", + "ファッジパック", + "フューカー", + "フクカー", + "フクキン", + "ファクシミリ", + "fukwitの", + "ギャングバン", + "ギャング", + "ギャングバング", + "ガールフレンド", + "ゲイsexsex", + "ヤギ", + "ゴッドダム", + "神秘的な被害を受けた", + "ゴダメン", + "ハードコアsexsex", + "ヘッドサス", + "ふりがな", + "ホーンシーズ", + "ホーンシー", + "ホットsex", + "ジャックオフ", + "ジャークオフ", + "ジャーミー", + "カウク", + "ノビーズ", + "ノベット", + "ノベンド", + "ノブヘッド", + "ノブジョキー", + "コンドム", + "コンダム", + "クマー", + "クムス", + "l3i+chの", + "l3itchの", + "ラボリア", + "プロフィール", + "m0f0", + "m0foの", + "m45terbateの", + "マ5terb8", + "ma5terbateの", + "マゾキスト", + "マスター・リベート", + "マスターb8", + "マスターバット*", + "マスターバット3", + "マスターリベート", + "マスタービング", + "マスターブレーション", + "masturbate", + "モフォ", + "モフ0", + "mothafuck", + "モタクソファ", + "mothafuckas", + "mothafuckaz", + "mothafucked", + "mothafucker", + "モタクソファー", + "mothafuckin", + "mothafucking", + "mothafuckings", + "mothafucks", + "母fuck", + "母fucked", + "母fucker", + "母fuckers", + "母fuckin", + "母fucking", + "母fuckings", + "母fuckka", + "母fucks", + "マフ", + "n1ggaの", + "n1ガー", + "ナジ", + "ニグ3r", + "ニグ4h", + "ニグガ", + "ナイガス", + "ニガー", + "ノブ", + "nob jokey", + "ノブジョーキー", + "ナムナッツ", + "ナッツマック", + "オーガスム", + "オルガスム", + "p0rnの", + "プーン", + "ペッカー", + "ペニス", + "penisfucker", + "電話sex", + "ファック", + "フクウク", + "フィッシング", + "ピッキング", + "プーク", + "ピクチャー", + "ピンピス", + "小便", + "放尿", + "小便小便", + "pissflaps", + "プッシー", + "ポップ", + "恋物癖", + "パトリック", + "プロン", + "パブ", + "パッシー", + "パスシス", + "リクルート", + "リタード", + "リムジャウ", + "リミング", + "s hit", + "s.o.b.", + "サディスト", + "シュロン", + "スクリュー", + "セメン", + "性別", + "お問い合わせ", + "ツイート", + "sh1tの", + "シェーグ", + "シャガール", + "シャギン", + "シェーディング", + "シーメール", + "シープラス", + "サイトマップ", + "インタビュー", + "シッター", + "インフォメーション", + "スカンク", + "ソリューション", + "スメグマ", + "スムート", + "スナッチ", + "息子-of-a-bitch", + "スパク", + "t1tt1e5の特長", + "t1タイ", + "テッツ", + "テエズ", + "リファレンス", + "アクティシクル", + "タイ5", + "tittiefucker", + "ティワンク", + "titwankの", + "トッサー", + "タード", + "tw4tの", + "タワトヘッド", + "トワット", + "トウランター", + "v14graの", + "v1graの", + "バギーナ", + "ビアグラ", + "w00se", + "ワンク", + "ワンカー", + "ワンキー", + "スタッフ", + "パーティー", + "メニュー", + ], + ], + [ + "ko", + [ + "4r5e를", + "1시간", + "5열", + "a55's 수", + "뚱 베어", + "한국어", + "사이트맵", + "카테고리", + "장바구니", + "₢ 킹", + "회사 소개", + "제품 정보", + "볼랙", + "배틀그라운드", + "제품정보", + "채용 정보", + "인기있는", + "blow job", + "채용정보", + "스낵 바", + "뼈", + "carpet muncher", + "프로젝트", + "바퀴 슈커", + "큰 가슴", + "채용공고", + "인기 카테고리", + "cyalis의", + "사이버후크", + "사이버감사", + "사이버fucker", + "사이버fuckers", + "이름 *", + "언어: 한국어", + "개 게이", + "개진", + "관련 기사", + "f u c k", + "f u c k e r", + "팟캐스트", + "모든 새", + "뚱뚱뚱", + "· fcuk", + "털이 많은", + "주먹질", + "중년부인", + "옵션 정보", + "빌어 먹을hitmotherfucker", + "fudge packer", + "펌웨어", + "갱뱅", + "게이주", + "게이sex", + "신담", + "뉴스 레터", + "신담n", + "하드코어sex", + "맨 위로", + "가장 핫한", + "핫 성별", + "잭 오프", + "잭오프", + "주 메뉴", + "칼 머리", + "칼조키", + "엄마5terb8", + "마스터베이트", + "마스터b8", + "마스터 배트*", + "마스터배트3", + "모thafuck", + "모thafucka", + "모thafuckas", + "모thafuckaz", + "모thafucked", + "모thafucker", + "모thafuckers", + "모thafuckin", + "모thafucking", + "모thafucks", + "엄마", + "엄마fuckka", + "모든 인기있는", + "노브", + "nob jokey", + "노브조키", + "메뉴 닫기", + "견과류", + "오르가즘", + "페커", + "페니스", + "오줌싸기", + "pussys 소개", + "핥기", + "s hit", + "사이트맵.", + "관련 제품", + "쉬메일", + "·", + "전체장편", + "스카크", + "스크랩", + "아들의 a-bitch", + "스펀지", + "t1티", + "시험대", + "가슴5", + "tittiefucker의", + "tittyfuck의", + "tittywank, 영국", + "titwank의", + "v14그라", + "v1그라", + "뱅커", + ], + ], + [ + "pt", + [ + "4r5e", + "5h1t", + "5", + "a55", + "anal", + "anus", + "ar5e", + "arrumos", + "arse", + "arses", + "bunda", + "filho da puta", + "julgo", + "o quê", + "idiota", + "idiotas", + "- o quê", + "$$", + "como $", + "a $s", + "b!tch", + "b00", + "b17ch", + "b1", + "saco de bola", + "bolas", + "sacana", + "bestial", + "bestialidade", + "amigos", + "bi-ch", + "biatch", + "cabrão", + "putas", + "cadelas", + "sangrento", + "blow job", + "broche", + "broches", + "boa sorte", + "bolo", + "osso", + "mamas", + "peitos", + "buceta", + "bugger", + "merda", + "bum", + "mas..", + "bundas", + "mastplug", + "c0m", + "c0cksucker", + "carpet muncher", + "cawk", + "chink", + "cipa", + "não", + "claire", + "clitoris", + "clérigos", + "amendoim", + "caralho", + "cara de pau", + "cabeça de pau", + "galão", + "carpinteiro", + "paus", + "pausucked", + "pausucking", + "pausuka", + "cok", + "colheitadeira", + "o que é que se passa", + "cláudia", + "cox", + "porra", + "de verão", + "cumming", + "cums", + "com licença", + "cunilingus", + "cunillingus", + "cúpula", + "não sei", + "o que é isso", + "incômodo", + "cúmplices", + "cialis", + "cyberfuc", + "cyberfuck", + "cyberfucked", + "cibercriminoso", + "os cibercriminosos", + "cyberfucking", + "maldição", + "pauzinho", + "dildo", + "dildos", + "dink", + "dinks", + "dirsança", + "dl", + "cãozinho", + "- não", + "duquesa", + "dyke", + "ejaculações", + "ejaculada", + "ejaculando", + "ejaculação", + "ejaculação interna", + "f u c k", + "f u c k e r", + "f4b", + "fagão", + "fagging", + "faggit", + "faggs", + "fagot", + "fagots", + "fags", + "fantoche", + "fannyflaps", + "fany", + "gorda", + "fcuk", + "fcuker", + "fcuking", + "pateta", + "fecker", + "felching", + "caído", + "fodido", + "filhos da puta", + "fistfucked", + "fistfucker", + "fistfuckers", + "fistfucking", + "fistfuckings", + "foda-se", + "flange", + "fook", + "fooker", + "fodida", + "cabrões", + "caralhos", + "fodas", + "fudge packer", + "fudgepacker", + "fuk", + "fuker", + "fukker", + "cortina", + "fuks", + "eu sei", + "fux", + "gangbang", + "gangbanged", + "jogos de vestir", + "gay", + "gaysex", + "cabras", + "raios", + "maldito", + "hardcoresex", + "headass", + "hoar", + "hoare", + "hoer", + "hoes", + "homo", + "hore", + "excitado", + "sexo quente", + "jack-off", + "jackoff", + "tudo bem", + "jismo", + "júnior", + "jizm", + "jizz", + "kawk", + "botão", + "cabeça de cabeça", + "- sim", + "kum", + "kummer", + "kums", + "i3i+ch", + "i3", + "laboratório", + "brilho", + "lustrando", + "m0f0", + "m0fo", + "m45terbate", + "o que fazer", + "ma5terbate", + "masoquista", + "mestre-bate", + "masterb8", + "masterbat", + "masterbat3", + "masterbate", + "masterbação", + "masterbations", + "masturbar-se", + "mo-fo", + "o que se passa", + "mofo", + "mothafuckers", + "que se lixe", + "fodendo", + "mothafuckings", + "merdas", + "filho da mãe", + "muthafecer", + "fode-se", + "n1gga", "nazi", - "nègres", + "o que foi", + "nigga", + "os pretos", + "o que é", + "preto", + "pretos", + "no", + "nob jokey", + "nobjocky", + "boa noite", + "nozes", "orgasim", - "orgasme", - "orgasmes", - "quéquette", - "pénis", - "pisse", - "bourré", - "pisser", - "faire chier", - "caca", - "porno", - "pornographie", - "piquer", - "piqûres", - "pube", - "chattes", - "râpé", - "violeur", - "rectum", - "retard", - "rimming", - "sadique", - "scrotum", - "sexe", - "baiser", - "transexuelle", - "chier", - "chié", - "merdique", + "orgasims", + "orgasmo", + "orgasmos", + "p0rn", + "pão", + "pecker", + "pênis", + "pênisfucker", + "telefonesex", + "phuck", + "phuk", + "phuked", + "a tremer", + "phukked", + "phukking", + "phuras", + "phuq", + "pimpos", + "miúda", + "miúdo", + "pissers", + "pias", + "pissflaps", + "imposição", + "mijando", + "cocó", + "pornô", + "por favor", + "pornografia", + "pimba", + "cricks", + "pron", + "bar", + "puxa", + "puxas", + "cona", + "conas", + "recto", + "retirada", + "bordas", + "s hit", + "s.o.b.", + "sádico", + "schlong", + "parafusos", + "scroat", + "scrote", + "escroto", + "sémen", + "sexo", + "mais", + "shag", + "shagger", + "shaggin", + "shagging", + "shema", + "brilhante", "skank", - "salopes", + "puta", "smegma", - "cochonneries", - "arracher", - "fils de pute", - "espacer", - "cran", - "testicule", - "mésange", - "titt", - "vagin", - "viagra", - "vulve", + "snatch", + "spac", + "t1t1e5", + "t1t", + "tetas", + "testículo", + "t", + "não te metas", + "titã", + "titãs", + "que merda", + "turva", + "tw4t", + "twat", + "twathead", + "twatty", + "twunt", + "twunter", + "v14g", + "v1gra", + "vagina", + "via satélite", + "vulva", "wang", - "branler", - "x évalué", - "xxx", + "vamos", + "wanker", + "wanky", + "willies", + "willy", + ], + ], + [ + "ru", + [ + "4r5e", + "5h1t", + "5хит", + "55", + "анальный", + "анус", + "ar5e", + "аррс", + "задница", + "задницы", + "ублюдок", + "асфукка", + "придурок", + "придурки", + "полный", + "$$", + "как $", + "$", + "б/ч", + "00бс", + "17ч", + "b1tch", + "мешок с мячом", + "шары", + "мешок", + "звериный", + "звериность", + "колокольчик", + "скотство", + "би+ч", + "двустворчатый", + "сука", + "сукин сын", + "шлюха", + "шлюхи", + "стервы", + "стерва", + "кровавый", + "blow job", + "минет", + "буйвол", + "боллок", + "буллок", + "костлявый", + "сиська", + "сиськи", + "болваны", + "грудь", + "буцета", + "говнюк", + "дерьмо", + "бродяга", + "болван", + "затвор", + "вес", + "мудак", + "carpet muncher", + "топор", + "ерунда", + "шипа", + "cl1t", + "клит", + "клитор", + "клиты", + "кнут", + "член", + "петух", + "лицо члена", + "членоголовый", + "членосос", + "петухи", + "хулиган", + "сосать член", + "членсука", + "кокс", + "кумунчер", + "кексука", + "кун", + "кум", + "колоть", + "кумминг", + "кумс", + "кумшот", + "кунилингус", + "куниллингус", + "куннилингус", + "пизда", + "щекотать", + "щекотливый", + "пиздец", + "циалис", + "киберфук", + "кибер-трах", + "киберпроклятый", + "киберпреступник", + "киберпреступники", + "кибер-ебать", + "1кк", + "проклятый", + "фаллоимитатор", + "ворчать", + "помойка", + "дирша", + "собачий", + "собака", + "оселовоз", + "душ", + "герцог", + "дамба", + "эякулировать", + "эякулированный", + "эякулирует", + "эякулирующий", + "эякуляция", + "f u c k", + "f u c k e r", + "4nny", + "педик", + "педикюр", + "педики", + "фагот", + "фаготы", + "фанатичный", + "фаннифлапс", + "толстый", + "фук", + "засранец", + "грязь", + "хуй", + "сволочь", + "откидывание", + "сорняк", + "фелляция", + "сраный пальцем", + "ублюдки", + "гребаный палец", + "пальчики", + "сраный", + "долбаный", + "фланцеобразный", + "обман", + "фукер", + "ебать", + "трахаться", + "ебаный", + "гребаный", + "чертов ублюдок", + "блядь", + "fudge packer", + "фуккин", + "фуквист", + "приправа", + "fux0r", + "бандаж", + "бандитизм", + "бандиты", + "гей-лорд", + "гейсекс", + "козел", + "черт возьми", + "хардкорекс", + "голова", + "хриплый", + "кабак", + "горшок", + "мотыга", + "гомо", + "обнимать", + "самый роговой", + "роговой", + "секс", + "отсрочка", + "рывок", + "яблочный", + "джизм", + "джиза", + "бегство", + "шипение", + "лаять", + "бездельник", + "ручка", + "тупица", + "неряшливый", + "кнопка", + "стучать", + "кондум", + "кондумы", + "куммер", + "l3i+ch", + "3ч", + "лабиринт", + "похоть", + "m0f0", + "m0fo", + "m45terterate", + "ma5terb8", + "ма5тербат", + "мазохист", + "мастер-бит", + "мастер8", + "мастербат", + "мастерить", + "мастербирование", + "мастербации", + "мастурбировать", + "мофо", + "мафия", + "фото", + "молоток", + "мотафук", + "мотафак", + "мотылек", + "усатый", + "мотафакер", + "мотафакеры", + "мотафакин", + "молохвост", + "кекс", + "мутхафекер", + "n1gga", + "n1gger", + "нацистский", + "nigg3r", + "nigg4h", + "нигга", + "ниггер", + "ниггеры", + "ниггаз", + "негр", + "ноб", + "nob jokey", + "нобджоки", + "бежокей", + "обезболивающие", + "гайка", + "оргазм", + "рог", + "пешка", + "пенис", + "пенисовец", + "телефоны", + "фак", + "обожженный", + "пыхтение", + "пьяный", + "пьянство", + "паук", + "сутенер", + "моча", + "разозленный", + "порох", + "поршни", + "сосульки", + "пессина", + "отстой", + "какашка", + "порно", + "порнография", + "уколы", + "наклон", + "лоб", + "гной", + "пусси", + "киска", + "прямая кишка", + "отсталый", + "римжа", + "обрамление", + "s hit", + "с.о.б.", + "садист", + "шлонг", + "облажаться", + "горло", + "писать", + "мошонка", + "сперма", + "ше! +", + "блин", + "шт", + "дрожать", + "шаггин", + "женщина", + "ши+", + "дерьмовый", + "говнюки", + "смегма", + "смута", + "похищать", + "пак", + "отрыжка", + "t1tt1e5", + "т1тис", + "трость", + "тез", + "тестовый", + "яичко", + "сиськи5", + "чокнутый", + "титванк", + "тоссер", + "tw4t", + "v14гра", + "v1гра", + "влагалище", + "виагра", + "вульва", + "00се", + "ван", + "дрочить", + "вялый", + "вор", + "мухи", + "волей", + ], + ], + [ + "zh", + [ + "4r5e (4r5e) (韩语)", + "5小时1小时", + "5发", + "a55个", + "肛门", + "轨道5e", + "皮肤", + "屁股", + "他妈的", + "驴", + "阿斯福卡语name", + "混帐", + "屁股整齐", + "(单位:美元)", + "作为美元", + "ch", + "页:1", + "b17ch (英语)", + "b1吨级", + "球囊", + "球头", + "鸡巴", + "杂种", + "兽形", + "兽性", + "铃声", + "最佳状态", + "质量", + "双倍径", + "双节", + "贱人", + "婊子们", + "骂人", + "该死的", + "blow job", + "吹箫", + "bo", + "胡说", + "波罗克", + "骨头", + "嘘声", + "乳头", + "嘘嘘", + "布鲁塞塔", + "可恶", + "废话", + "流浪汉", + "臀部", + "屁眼", + "枪托", + "c0ck (英语)", + "carpet muncher", + "aw", + "中国", + "齐巴", + "cl1t 键", + "阴蒂", + "果实", + "鸡巴脸", + "鸡头", + "鸡尾酒", + "公鸡", + "鸡鸡", + "库克", + "库克门彻", + "库克萨", + "铜", + "缩写", + "积分", + "弯曲", + "累积射击", + "阴囊", + "库尼灵格斯", + "阴间", + "贱货", + "低调", + "ya", + "网络福克", + "网络操", + "网络他妈的", + "网络混蛋", + "d1ck (英语)", + "蠢货", + "迪尔多", + "二极管", + "叮当", + "日数a", + "烂透了", + "狗娘养的", + "狗语", + "养狗", + "驴肋架", + "杜许", + "杜彻", + "堤坝", + "射线", + "射精术", + "标记", + "f u c k", + "f u c k e r", + "f4ny (英语)", + "同性恋", + "发牢骚", + "粪便", + "风扇", + "扇形叶片", + "你个混蛋", + "迷恋", + "肥猪", + "fcuk (英语)", + "鸡肉", + "欢呼", + "呕吐", + "堕落", + "口交时", + "手指他妈的", + "指头", + "拳头操", + "拳头他妈的", + "拳头", + "他妈的拳头", + "花纹", + "恶棍", + "他妈的混蛋", + "他妈的我", + "妈的", + "fudge packer", + "软糖包装机", + "乌克", + "福尔克", + "乌克金", + "烟花", + "乌克维特", + "阴茎", + "furx0r (英语)", + "黑帮", + "帮派", + "同性恋者", + "山羊队", + "天杀的", + "硬核性行为", + "头部", + "桨", + "爱", + "吼声", + "鹅", + "高尔", + "角最强", + "角质", + "热性", + "骗局", + "贾宝玉", + "jism 语句", + "吉兹", + "坐标", + "键", + "针叶", + "已锁定", + "旋钮", + "旋钮头", + "键盘", + "鸡", + "宽度", + "库姆", + "ku", + "单位", + "库林斯", + "l3i+ch 键", + "ưμ㼯a", + "阴唇", + "欲望", + "淫荡", + "m0f0 时", + "m0fo 数据", + "m45 位点", + "ma5terb8 键", + "半径", + "虐恋狂", + "主减法", + "主机b8", + "高级项目*", + "高级bat3", + "高级", + "掌握", + "手淫", + "mo", + "摩尔福", + "调味料", + "摩塔他妈的", + "灭鼠机", + "马夫", + "变种人", + "无", + "n1gger (英语)", + "纳粹", + "零点3r", + "ni4h", + "黑鬼", + "唉哟", + "黑鬼们", + "纳吉", + "黑头", + "nob jokey", + "头", + "无趣", + "无名", + "麻核", + "疯子", + "质子", + "矫形", + "高潮", + "p0rn 语录", + "啄木鸟", + "电话", + "发球", + "福尔", + "划开", + "摇摆", + "发声", + "p", + "猪头", + "皮条客", + "撒尿", + "愤怒", + "尿裤子", + "撒尿器", + "小便便便便便时", + "细小的叶片", + "神经病", + "便便", + "色情电影", + "色情制品", + "刺头", + "专业", + "普丝", + "猫咪", + "娘们", + "阴道", + "直肠", + "迟钝", + "连环画", + "旋转", + "s hit", + "绍乙.", + "虐待狂", + "长", + "划伤", + "切开", + "精液", + "性别", + "嘘 +", + "嘘", + "小时", + "萨格", + "抖动", + "变形", + "做爱", + "女同性恋", + "shi+ 键", + "拉屎了", + "屎东西", + "乱七八糟", + "大便师", + "乱七八糟的", + "荡妇", + "斯迈格马", + "闪烁", + "抢", + "沉积", + "t1tt1e5 键", + "吨数", + "垫子", + "泰兹语name", + "测试", + "睾丸", + "奶头", + "奶头5", + "奶妈", + "掷掷器", + "tw4吨级", + "wa", + "wa头", + "watt", + "v14gra (英语)", + "v1 颜色", + "via草", + "转数", + "黄", + "闲着", + "虚无", + "妇人", + "威尔", ], ], ]); diff --git a/supported-languages.md b/supported-languages.md index bc1eed2..a6abb82 100644 --- a/supported-languages.md +++ b/supported-languages.md @@ -1,8 +1,19 @@ # Profanity Supported Languages -| **Language** | **Locale** | -|--------------|------------| -| German | `de` | -| English | `en` | -| Spanish | `es` | -| French | `fr` | \ No newline at end of file +There are many more [languages](https://github.com/argosopentech/argos-translate/blob/master/argostranslate/languages.csv) that Profanity _can_ support, however each additional language incorporated into the Profanity library increases the overall size of the library. To maintain performance and usability, we've limited translations to the following languages: + +| **Language** | **Locale** | +|-----------------------|------------| +| Arabic | `ar` | +| Chinese | `zh` | +| English | `en` | +| French | `fr` | +| German | `de` | +| Hindi | `hi` | +| Japanese | `ja` | +| Korean | `ko` | +| Portuguese | `pt` | +| Russian | `ru` | +| Spanish | `es` | + +If you'd like to request a language not currently supported by Profanity, please submit your suggestion via our [GitHub issues page](https://github.com/2Toad/Profanity/issues). Keep in mind that Profanity's architecture already supports all languages through its [Customize Wordlist](https://github.com/2Toad/Profanity?tab=readme-ov-file#customize-the-word-list) feature, allowing you to add as many words or translations as you like during runtime. \ No newline at end of file From 30d8802b82fc50bbac4826532451c6c96fcd3e1b Mon Sep 17 00:00:00 2001 From: Jason Pierce Date: Fri, 27 Dec 2024 16:52:54 -0600 Subject: [PATCH 4/4] Move Translations to Appendix --- contribute.md | 60 +++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/contribute.md b/contribute.md index 2605240..200369c 100644 --- a/contribute.md +++ b/contribute.md @@ -43,17 +43,43 @@ Start app in watch mode: `npm run local` - Fix lint errors: `npm run lint:fix` - Fix formatting errors: `npm run format` -## Translations +## Appendix + +### Dev Tools + +The following section includes optional dev tools that enhance the Profanity development experience, but are not necessary. + +#### NVM + +The Profanity project includes an .nvmrc file, so you can run `nvm use` to switch to the required version of Node. + +##### Setup + +1. Install nvm: https://github.com/nvm-sh/nvm +2. Install the Node.js version required by this app: `nvm install` + 1. NVM will determine the required Node version using the .nvmrc file + 2. NVM will install the required Node version if it isn't installed + 3. NVM will set your current Node version to the one required + +#### Git Hooks + +The Profanity project includes Husky for running Git Hooks. Running `git commit` will trigger `lint-staged` which will lint all files currently staged in Git. If linting fails, the commit will be cancelled + +### Dependencies + +- `chai`: we must use v4.x because v5.x is pure ESM, and we require CommonJS modules + +### Translations We utilize a self-hosted instance of the Open Source [LibreTranslate](https://github.com/LibreTranslate/LibreTranslate) lib to translate the core English list of profane words. -### Steps to Run Translations +#### Steps to Run Translations 1. Open a terminal. 2. Start Docker: `docker-compose up`. 3. Run the translation script: `npm run translate`. -### Available Languages +#### Available Languages By default, the LibreTranslate service is configured to include all available target languages from [argos-translate](https://github.com/argosopentech/argos-translate). This configuration affects: @@ -63,7 +89,7 @@ By default, the LibreTranslate service is configured to include all available ta To optimize performance, we limit the target languages by configuring the `LT_LOAD_ONLY` environment variable: -#### Configure Target Languages +##### Configure Target Languages 1. Open the `./docker-compose.yml` file. 2. Add a comma-separated list of the [supported language codes](https://github.com/argosopentech/argos-translate/blob/master/argostranslate/languages.csv) you wish to include. Ensure English (`en`) is included, as it serves as the source language. @@ -77,32 +103,6 @@ environment: > - To add a new language, remove existing language codes from `LT_LOAD_ONLY` > - To update existing languages after changes to the core English list, include their language codes in `LT_LOAD_ONLY` -## Appendix - -### Dev Tools - -The following section includes optional dev tools that enhance the Profanity development experience, but are not necessary. - -#### NVM - -The Profanity project includes an .nvmrc file, so you can run `nvm use` to switch to the required version of Node. - -##### Setup - -1. Install nvm: https://github.com/nvm-sh/nvm -2. Install the Node.js version required by this app: `nvm install` - 1. NVM will determine the required Node version using the .nvmrc file - 2. NVM will install the required Node version if it isn't installed - 3. NVM will set your current Node version to the one required - -#### Git Hooks - -The Profanity project includes Husky for running Git Hooks. Running `git commit` will trigger `lint-staged` which will lint all files currently staged in Git. If linting fails, the commit will be cancelled - -### Dependencies - -- `chai`: we must use v4.x because v5.x is pure ESM, and we require CommonJS modules - ### Deployment Deployments to Prod consist of building and publishing the Profanity lib to NPM, and are automated through our Continuous Deployment workflow.