MsThai commited on
Commit
e84cf14
·
verified ·
1 Parent(s): 5ab3501

Upload folder using huggingface_hub

Browse files
app/clean.py ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Clean mode: mask swear words in subtitles/transcripts and leave them out of the voice-over.
2
+
3
+ Required for Teen mode (ages 13-17), optional for adults. Word lists: LDNOOBW (CC BY 4.0), 24 languages,
4
+ see app/profanity/SOURCE.txt. Languages without a list fall back to the English list (many videos mix in
5
+ English slang).
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import re
10
+ from functools import lru_cache
11
+ from pathlib import Path
12
+
13
+ DIR = Path(__file__).parent / "profanity"
14
+ FILE_FOR = {"tl": "fil", "zh-TW": "zh", "yue": "zh"}
15
+ NO_SPACES = {"zh", "ja", "th", "zh-TW", "yue", "lo", "km", "my"}
16
+
17
+
18
+ @lru_cache(maxsize=64)
19
+ def _pattern(lang: str):
20
+ words: set[str] = set()
21
+ for code in {FILE_FOR.get(lang, lang), "en"}:
22
+ f = DIR / f"{code}.txt"
23
+ if f.exists():
24
+ words |= {w.strip().lower() for w in f.read_text(encoding="utf-8").splitlines() if w.strip()}
25
+ if not words:
26
+ return None
27
+ alts = "|".join(re.escape(w) for w in sorted(words, key=len, reverse=True))
28
+ if lang in NO_SPACES:
29
+ return re.compile(f"({alts})", re.I)
30
+ return re.compile(rf"(?<![\w])({alts})(?![\w])", re.I)
31
+
32
+
33
+ def mask(text: str, lang: str) -> str:
34
+ """'fuck this' -> 'f*** this' (first letter kept so the sentence still reads)."""
35
+ p = _pattern(lang)
36
+ if not p or not text:
37
+ return text
38
+ return p.sub(lambda m: m.group(0)[0] + "*" * (len(m.group(0)) - 1), text)
39
+
40
+
41
+ def for_speech(text: str) -> str:
42
+ """Drop masked words entirely so the AI voice never says them."""
43
+ return re.sub(r"\s{2,}", " ", re.sub(r"\S\*{2,}\S*", "", text)).strip()
app/pipeline.py CHANGED
@@ -212,7 +212,8 @@ def _speech_sample(media: Path, segs: list[dict], out: Path, max_sec: float = 75
212
 
213
 
214
  def dub(media: Path, segs: list[dict], lang: str, out: Path, has_video: bool, duration: float,
215
- gender: str, voice_engine: str, work: Path, progress: Progress, clone: bool = False) -> None:
 
216
  parts = work / "voice"
217
  parts.mkdir(exist_ok=True)
218
  n = max(len(segs), 1)
@@ -227,7 +228,11 @@ def dub(media: Path, segs: list[dict], lang: str, out: Path, has_video: bool, du
227
  for k, s in enumerate(segs):
228
  progress(f"Voicing line {k + 1} of {len(segs)}", 0.70 + 0.15 * k / n)
229
  f = parts / f"{k:04}.mp3"
230
- engines.speak(s["tr"], lang, f, gender=gender, engine=voice_engine, voice_id=voice_id)
 
 
 
 
231
  files.append(f)
232
  finally:
233
  if voice_id:
@@ -273,7 +278,8 @@ def dub(media: Path, segs: list[dict], lang: str, out: Path, has_video: bool, du
273
  track[st:st + len(a)] += a[:len(track) - st]
274
  raw = work / "dub.raw"
275
  np.clip(track, -32768, 32767).astype(np.int16).tofile(raw)
276
- mix = ("[0:a]volume=0.12[bg];[1:a]aresample=48000,volume=1.6[vo];"
 
277
  "[bg][vo]amix=inputs=2:duration=first:normalize=0,alimiter=limit=0.95[a]")
278
  cmd = ["ffmpeg", "-y", "-loglevel", "error", "-i", str(media),
279
  "-f", "s16le", "-ar", str(SR), "-ac", "1", "-i", str(raw), "-filter_complex", mix]
@@ -290,7 +296,7 @@ def run(job_dir: Path, source_path: Path | None, url: str | None, target: str,
290
  source_lang: str | None = None, engine: str = "madlad", outputs: tuple = ("text", "subs", "dub"),
291
  quality: str = "fast", gender: str = "Female", voice_engine: str = "edge",
292
  max_minutes: float = 0, progress: Progress = lambda m, p: None,
293
- clone: bool = True, lipsync: bool = False) -> dict:
294
  languages.get(target)
295
  progress("Getting the media", 0.02)
296
  media = fetch_url(url, job_dir) if url else source_path
@@ -315,10 +321,14 @@ def run(job_dir: Path, source_path: Path | None, url: str | None, target: str,
315
  for s, t, h in zip(segs, trs, human):
316
  s["tr"] = t if h else engines.clean(t)
317
  s["human"] = h
 
 
 
 
318
 
319
  results: dict = {"source_lang": src, "source_name": languages.get(src)["name"],
320
  "target_lang": target, "target_name": languages.get(target)["name"],
321
- "detect_confidence": round(conf, 2), "auto_detected": not source_lang, "engine": engine,
322
  "duration": meta["duration"], "has_video": meta["has_video"],
323
  "segments": [{"s": round(s["s"], 2), "e": round(s["e"], 2),
324
  "original": s["t"], "translated": s["tr"], "human": s["human"]} for s in segs],
@@ -347,7 +357,7 @@ def run(job_dir: Path, source_path: Path | None, url: str | None, target: str,
347
  progress("Creating the voice-over", 0.70)
348
  name = "voiceover.mp4" if meta["has_video"] else "voiceover.m4a"
349
  dub(base, segs, target, job_dir / name, meta["has_video"], meta["duration"],
350
- gender, voice_engine, job_dir, progress, clone=clone)
351
  results["files"]["voiceover"] = name
352
  results["voice_cloned"] = clone
353
  if lipsync and meta["has_video"] and engines.lipsync_available():
 
212
 
213
 
214
  def dub(media: Path, segs: list[dict], lang: str, out: Path, has_video: bool, duration: float,
215
+ gender: str, voice_engine: str, work: Path, progress: Progress, clone: bool = False,
216
+ clean: bool = False) -> None:
217
  parts = work / "voice"
218
  parts.mkdir(exist_ok=True)
219
  n = max(len(segs), 1)
 
228
  for k, s in enumerate(segs):
229
  progress(f"Voicing line {k + 1} of {len(segs)}", 0.70 + 0.15 * k / n)
230
  f = parts / f"{k:04}.mp3"
231
+ text = s["tr"]
232
+ if clean:
233
+ from . import clean as cl
234
+ text = cl.for_speech(text) or "…"
235
+ engines.speak(text, lang, f, gender=gender, engine=voice_engine, voice_id=voice_id)
236
  files.append(f)
237
  finally:
238
  if voice_id:
 
278
  track[st:st + len(a)] += a[:len(track) - st]
279
  raw = work / "dub.raw"
280
  np.clip(track, -32768, 32767).astype(np.int16).tofile(raw)
281
+ bg = 0.05 if clean else 0.12 # keep the original speech faint (quieter still in Clean mode)
282
+ mix = (f"[0:a]volume={bg}[bg];[1:a]aresample=48000,volume=1.6[vo];"
283
  "[bg][vo]amix=inputs=2:duration=first:normalize=0,alimiter=limit=0.95[a]")
284
  cmd = ["ffmpeg", "-y", "-loglevel", "error", "-i", str(media),
285
  "-f", "s16le", "-ar", str(SR), "-ac", "1", "-i", str(raw), "-filter_complex", mix]
 
296
  source_lang: str | None = None, engine: str = "madlad", outputs: tuple = ("text", "subs", "dub"),
297
  quality: str = "fast", gender: str = "Female", voice_engine: str = "edge",
298
  max_minutes: float = 0, progress: Progress = lambda m, p: None,
299
+ clone: bool = True, lipsync: bool = False, clean: bool = False) -> dict:
300
  languages.get(target)
301
  progress("Getting the media", 0.02)
302
  media = fetch_url(url, job_dir) if url else source_path
 
321
  for s, t, h in zip(segs, trs, human):
322
  s["tr"] = t if h else engines.clean(t)
323
  s["human"] = h
324
+ if clean: # Clean mode (always on for Teen mode): mask swear words everywhere we output text
325
+ from . import clean as cl
326
+ for s in segs:
327
+ s["t"], s["tr"] = cl.mask(s["t"], src), cl.mask(s["tr"], target)
328
 
329
  results: dict = {"source_lang": src, "source_name": languages.get(src)["name"],
330
  "target_lang": target, "target_name": languages.get(target)["name"],
331
+ "detect_confidence": round(conf, 2), "auto_detected": not source_lang, "engine": engine, "clean": clean,
332
  "duration": meta["duration"], "has_video": meta["has_video"],
333
  "segments": [{"s": round(s["s"], 2), "e": round(s["e"], 2),
334
  "original": s["t"], "translated": s["tr"], "human": s["human"]} for s in segs],
 
357
  progress("Creating the voice-over", 0.70)
358
  name = "voiceover.mp4" if meta["has_video"] else "voiceover.m4a"
359
  dub(base, segs, target, job_dir / name, meta["has_video"], meta["duration"],
360
+ gender, voice_engine, job_dir, progress, clone=clone, clean=clean)
361
  results["files"]["voiceover"] = name
362
  results["voice_cloned"] = clone
363
  if lipsync and meta["has_video"] and engines.lipsync_available():
app/profanity/SOURCE.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ Word lists from "List of Dirty, Naughty, Obscene, and Otherwise Bad Words"
2
+ https://github.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words
3
+ License: CC BY 4.0 (Shutterstock). Used unmodified for Clean mode masking.
app/profanity/ar.txt ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ سكس
2
+ طيز
3
+ شرج
4
+ لعق
5
+ لحس
6
+ مص
7
+ تمص
8
+ بيضان
9
+ ثدي
10
+ بز
11
+ بزاز
12
+ حلمة
13
+ مفلقسة
14
+ بظر
15
+ كس
16
+ فرج
17
+ شهوة
18
+ شاذ
19
+ مبادل
20
+ عاهرة
21
+ جماع
22
+ قضيب
23
+ زب
24
+ لوطي
25
+ لواط
26
+ سحاق
27
+ سحاقية
28
+ اغتصاب
29
+ خنثي
30
+ احتلام
31
+ نيك
32
+ متناك
33
+ متناكة
34
+ شرموطة
35
+ عرص
36
+ خول
37
+ قحبة
38
+ لبوة
app/profanity/cs.txt ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ bordel
2
+ buzna
3
+ čumět
4
+ čurák
5
+ debil
6
+ do piče
7
+ do prdele
8
+ dršťka
9
+ držka
10
+ flundra
11
+ hajzl
12
+ hovno
13
+ chcanky
14
+ chuj
15
+ jebat
16
+ kokot
17
+ kokotina
18
+ koňomrd
19
+ kunda
20
+ kurva
21
+ mamrd
22
+ mrdat
23
+ mrdka
24
+ mrdník
25
+ oslošoust
26
+ piča
27
+ píčus
28
+ píchat
29
+ pizda
30
+ prcat
31
+ prdel
32
+ prdelka
33
+ sračka
34
+ srát
35
+ šoustat
36
+ šulin
37
+ vypíčenec
38
+ zkurvit
39
+ zkurvysyn
40
+ zmrd
41
+ žrát
app/profanity/da.txt ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ anus
2
+ bøsserøv
3
+ cock
4
+ fisse
5
+ fissehår
6
+ fuck
7
+ hestepik
8
+ kussekryller
9
+ lort
10
+ luder
11
+ pik
12
+ pikhår
13
+ pikslugeri
14
+ piksutteri
15
+ pis
16
+ røv
17
+ røvhul
18
+ røvskæg
19
+ røvspræke
20
+ shit
app/profanity/de.txt ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ analritter
2
+ arsch
3
+ arschficker
4
+ arschlecker
5
+ arschloch
6
+ bimbo
7
+ bratze
8
+ bumsen
9
+ bonze
10
+ dödel
11
+ fick
12
+ ficken
13
+ flittchen
14
+ fotze
15
+ fratze
16
+ hackfresse
17
+ hure
18
+ hurensohn
19
+ ische
20
+ kackbratze
21
+ kacke
22
+ kacken
23
+ kackwurst
24
+ kampflesbe
25
+ kanake
26
+ kimme
27
+ lümmel
28
+ MILF
29
+ möpse
30
+ morgenlatte
31
+ möse
32
+ mufti
33
+ muschi
34
+ nackt
35
+ neger
36
+ nigger
37
+ nippel
38
+ nutte
39
+ onanieren
40
+ orgasmus
41
+ penis
42
+ pimmel
43
+ pimpern
44
+ pinkeln
45
+ pissen
46
+ pisser
47
+ popel
48
+ poppen
49
+ porno
50
+ reudig
51
+ rosette
52
+ schabracke
53
+ schlampe
54
+ scheiße
55
+ scheisser
56
+ schiesser
57
+ schnackeln
58
+ schwanzlutscher
59
+ schwuchtel
60
+ tittchen
61
+ titten
62
+ vögeln
63
+ vollpfosten
64
+ wichse
65
+ wichsen
66
+ wichser
app/profanity/en.txt ADDED
@@ -0,0 +1,403 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 2g1c
2
+ 2 girls 1 cup
3
+ acrotomophilia
4
+ alabama hot pocket
5
+ alaskan pipeline
6
+ anal
7
+ anilingus
8
+ anus
9
+ apeshit
10
+ arsehole
11
+ ass
12
+ asshole
13
+ assmunch
14
+ auto erotic
15
+ autoerotic
16
+ babeland
17
+ baby batter
18
+ baby juice
19
+ ball gag
20
+ ball gravy
21
+ ball kicking
22
+ ball licking
23
+ ball sack
24
+ ball sucking
25
+ bangbros
26
+ bangbus
27
+ bareback
28
+ barely legal
29
+ barenaked
30
+ bastard
31
+ bastardo
32
+ bastinado
33
+ bbw
34
+ bdsm
35
+ beaner
36
+ beaners
37
+ beaver cleaver
38
+ beaver lips
39
+ beastiality
40
+ bestiality
41
+ big black
42
+ big breasts
43
+ big knockers
44
+ big tits
45
+ bimbos
46
+ birdlock
47
+ bitch
48
+ bitches
49
+ black cock
50
+ blonde action
51
+ blonde on blonde action
52
+ blowjob
53
+ blow job
54
+ blow your load
55
+ blue waffle
56
+ blumpkin
57
+ bollocks
58
+ bondage
59
+ boner
60
+ boob
61
+ boobs
62
+ booty call
63
+ brown showers
64
+ brunette action
65
+ bukkake
66
+ bulldyke
67
+ bullet vibe
68
+ bullshit
69
+ bung hole
70
+ bunghole
71
+ busty
72
+ butt
73
+ buttcheeks
74
+ butthole
75
+ camel toe
76
+ camgirl
77
+ camslut
78
+ camwhore
79
+ carpet muncher
80
+ carpetmuncher
81
+ chocolate rosebuds
82
+ cialis
83
+ circlejerk
84
+ cleveland steamer
85
+ clit
86
+ clitoris
87
+ clover clamps
88
+ clusterfuck
89
+ cock
90
+ cocks
91
+ coprolagnia
92
+ coprophilia
93
+ cornhole
94
+ coon
95
+ coons
96
+ creampie
97
+ cum
98
+ cumming
99
+ cumshot
100
+ cumshots
101
+ cunnilingus
102
+ cunt
103
+ darkie
104
+ date rape
105
+ daterape
106
+ deep throat
107
+ deepthroat
108
+ dendrophilia
109
+ dick
110
+ dildo
111
+ dingleberry
112
+ dingleberries
113
+ dirty pillows
114
+ dirty sanchez
115
+ doggie style
116
+ doggiestyle
117
+ doggy style
118
+ doggystyle
119
+ dog style
120
+ dolcett
121
+ domination
122
+ dominatrix
123
+ dommes
124
+ donkey punch
125
+ double dong
126
+ double penetration
127
+ dp action
128
+ dry hump
129
+ dvda
130
+ eat my ass
131
+ ecchi
132
+ ejaculation
133
+ erotic
134
+ erotism
135
+ escort
136
+ eunuch
137
+ fag
138
+ faggot
139
+ fecal
140
+ felch
141
+ fellatio
142
+ feltch
143
+ female squirting
144
+ femdom
145
+ figging
146
+ fingerbang
147
+ fingering
148
+ fisting
149
+ foot fetish
150
+ footjob
151
+ frotting
152
+ fuck
153
+ fuck buttons
154
+ fuckin
155
+ fucking
156
+ fucktards
157
+ fudge packer
158
+ fudgepacker
159
+ futanari
160
+ gangbang
161
+ gang bang
162
+ gay sex
163
+ genitals
164
+ giant cock
165
+ girl on
166
+ girl on top
167
+ girls gone wild
168
+ goatcx
169
+ goatse
170
+ god damn
171
+ gokkun
172
+ golden shower
173
+ goodpoop
174
+ goo girl
175
+ goregasm
176
+ grope
177
+ group sex
178
+ g-spot
179
+ guro
180
+ hand job
181
+ handjob
182
+ hard core
183
+ hardcore
184
+ hentai
185
+ homoerotic
186
+ honkey
187
+ hooker
188
+ horny
189
+ hot carl
190
+ hot chick
191
+ how to kill
192
+ how to murder
193
+ huge fat
194
+ humping
195
+ incest
196
+ intercourse
197
+ jack off
198
+ jail bait
199
+ jailbait
200
+ jelly donut
201
+ jerk off
202
+ jigaboo
203
+ jiggaboo
204
+ jiggerboo
205
+ jizz
206
+ juggs
207
+ kike
208
+ kinbaku
209
+ kinkster
210
+ kinky
211
+ knobbing
212
+ leather restraint
213
+ leather straight jacket
214
+ lemon party
215
+ livesex
216
+ lolita
217
+ lovemaking
218
+ make me come
219
+ male squirting
220
+ masturbate
221
+ masturbating
222
+ masturbation
223
+ menage a trois
224
+ milf
225
+ missionary position
226
+ mong
227
+ motherfucker
228
+ mound of venus
229
+ mr hands
230
+ muff diver
231
+ muffdiving
232
+ nambla
233
+ nawashi
234
+ negro
235
+ neonazi
236
+ nigga
237
+ nigger
238
+ nig nog
239
+ nimphomania
240
+ nipple
241
+ nipples
242
+ nsfw
243
+ nsfw images
244
+ nude
245
+ nudity
246
+ nutten
247
+ nympho
248
+ nymphomania
249
+ octopussy
250
+ omorashi
251
+ one cup two girls
252
+ one guy one jar
253
+ orgasm
254
+ orgy
255
+ paedophile
256
+ paki
257
+ panties
258
+ panty
259
+ pedobear
260
+ pedophile
261
+ pegging
262
+ penis
263
+ phone sex
264
+ piece of shit
265
+ pikey
266
+ pissing
267
+ piss pig
268
+ pisspig
269
+ playboy
270
+ pleasure chest
271
+ pole smoker
272
+ ponyplay
273
+ poof
274
+ poon
275
+ poontang
276
+ punany
277
+ poop chute
278
+ poopchute
279
+ porn
280
+ porno
281
+ pornography
282
+ prince albert piercing
283
+ pthc
284
+ pubes
285
+ pussy
286
+ queaf
287
+ queef
288
+ quim
289
+ raghead
290
+ raging boner
291
+ rape
292
+ raping
293
+ rapist
294
+ rectum
295
+ reverse cowgirl
296
+ rimjob
297
+ rimming
298
+ rosy palm
299
+ rosy palm and her 5 sisters
300
+ rusty trombone
301
+ sadism
302
+ santorum
303
+ scat
304
+ schlong
305
+ scissoring
306
+ semen
307
+ sex
308
+ sexcam
309
+ sexo
310
+ sexy
311
+ sexual
312
+ sexually
313
+ sexuality
314
+ shaved beaver
315
+ shaved pussy
316
+ shemale
317
+ shibari
318
+ shit
319
+ shitblimp
320
+ shitty
321
+ shota
322
+ shrimping
323
+ skeet
324
+ slanteye
325
+ slut
326
+ s&m
327
+ smut
328
+ snatch
329
+ snowballing
330
+ sodomize
331
+ sodomy
332
+ spastic
333
+ spic
334
+ splooge
335
+ splooge moose
336
+ spooge
337
+ spread legs
338
+ spunk
339
+ strap on
340
+ strapon
341
+ strappado
342
+ strip club
343
+ style doggy
344
+ suck
345
+ sucks
346
+ suicide girls
347
+ sultry women
348
+ swastika
349
+ swinger
350
+ tainted love
351
+ taste my
352
+ tea bagging
353
+ threesome
354
+ throating
355
+ thumbzilla
356
+ tied up
357
+ tight white
358
+ tit
359
+ tits
360
+ titties
361
+ titty
362
+ tongue in a
363
+ topless
364
+ tosser
365
+ towelhead
366
+ tranny
367
+ tribadism
368
+ tub girl
369
+ tubgirl
370
+ tushy
371
+ twat
372
+ twink
373
+ twinkie
374
+ two girls one cup
375
+ undressing
376
+ upskirt
377
+ urethra play
378
+ urophilia
379
+ vagina
380
+ venus mound
381
+ viagra
382
+ vibrator
383
+ violet wand
384
+ vorarephilia
385
+ voyeur
386
+ voyeurweb
387
+ voyuer
388
+ vulva
389
+ wank
390
+ wetback
391
+ wet dream
392
+ white power
393
+ whore
394
+ worldsex
395
+ wrapping men
396
+ wrinkled starfish
397
+ xx
398
+ xxx
399
+ yaoi
400
+ yellow showers
401
+ yiffy
402
+ zoophilia
403
+ 🖕
app/profanity/es.txt ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Asesinato
2
+ asno
3
+ bastardo
4
+ Bollera
5
+ Cabrón
6
+ Caca
7
+ Chupada
8
+ Chupapollas
9
+ Chupetón
10
+ concha
11
+ Concha de tu madre
12
+ Coño
13
+ Coprofagía
14
+ Culo
15
+ Drogas
16
+ Esperma
17
+ Fiesta de salchichas
18
+ Follador
19
+ Follar
20
+ Gilipichis
21
+ Gilipollas
22
+ Hacer una paja
23
+ Haciendo el amor
24
+ Heroína
25
+ Hija de puta
26
+ Hijaputa
27
+ Hijo de puta
28
+ Hijoputa
29
+ Idiota
30
+ Imbécil
31
+ infierno
32
+ Jilipollas
33
+ Kapullo
34
+ Lameculos
35
+ Maciza
36
+ Macizorra
37
+ maldito
38
+ Mamada
39
+ Marica
40
+ Maricón
41
+ Mariconazo
42
+ martillo
43
+ Mierda
44
+ Nazi
45
+ Orina
46
+ Pedo
47
+ Pendejo
48
+ Pervertido
49
+ Pezón
50
+ Pinche
51
+ Pis
52
+ Prostituta
53
+ Puta
54
+ Racista
55
+ Ramera
56
+ Sádico
57
+ Semen
58
+ Sexo
59
+ Sexo oral
60
+ Soplagaitas
61
+ Soplapollas
62
+ Tetas grandes
63
+ Tía buena
64
+ Travesti
65
+ Trio
66
+ Verga
67
+ vete a la mierda
68
+ Vulva
app/profanity/fa.txt ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ آب کیر
2
+ ارگاسم
3
+ برهنه
4
+ پورن
5
+ پورنو
6
+ تجاوز
7
+ تخمی
8
+ جق
9
+ جقی
10
+ جلق
11
+ جنده
12
+ چوچول
13
+ حشر
14
+ حشری
15
+ داف
16
+ دودول
17
+ ساک زدن
18
+ سکس
19
+ سکس کردن
20
+ سکسی
21
+ سوپر
22
+ شق کردن
23
+ شهوت
24
+ شهوتی
25
+ شونبول
26
+ فیلم سوپر
27
+ کس
28
+ کس دادن
29
+ کس کردن
30
+ کسکش
31
+ کوس
32
+ کون
33
+ کون دادن
34
+ کون کردن
35
+ کونکش
36
+ کونی
37
+ کیر
38
+ کیری
39
+ لاپا
40
+ لاپایی
41
+ لاشی
42
+ لخت
43
+ لش
44
+ منی
45
+ هرزه
app/profanity/fi.txt ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ alfred nussi
2
+ bylsiä
3
+ haahka
4
+ haista paska
5
+ haista vittu
6
+ hatullinen
7
+ helvetisti
8
+ hevonkuusi
9
+ hevonpaska
10
+ hevonperse
11
+ hevonvittu
12
+ hevonvitunperse
13
+ hitosti
14
+ hitto
15
+ huorata
16
+ hässiä
17
+ juosten kustu
18
+ jutku
19
+ jutsku
20
+ jätkä
21
+ kananpaska
22
+ koiranpaska
23
+ kuin esterin perseestä
24
+ kulli
25
+ kullinluikaus
26
+ kuppainen
27
+ kusaista
28
+ kuseksia
29
+ kusettaa
30
+ kusi
31
+ kusipää
32
+ kusta
33
+ kyrpiintynyt
34
+ kyrpiintyä
35
+ kyrpiä
36
+ kyrpä
37
+ kyrpänaama
38
+ kyrvitys
39
+ lahtari
40
+ lutka
41
+ molo
42
+ molopää
43
+ mulkero
44
+ mulkku
45
+ mulkvisti
46
+ muna
47
+ munapää
48
+ munaton
49
+ mutakuono
50
+ mutiainen
51
+ naida
52
+ nainti
53
+ narttu
54
+ neekeri
55
+ nekru
56
+ nuolla persettä
57
+ nussia
58
+ nussija
59
+ nussinta
60
+ paljaalla
61
+ palli
62
+ pallit
63
+ paneskella
64
+ panettaa
65
+ panna
66
+ pano
67
+ pantava
68
+ paska
69
+ paskainen
70
+ paskamainen
71
+ paskanmarjat
72
+ paskantaa
73
+ paskapuhe
74
+ paskapää
75
+ paskattaa
76
+ paskiainen
77
+ paskoa
78
+ pehko
79
+ pentele
80
+ perkele
81
+ perkeleesti
82
+ persaukinen
83
+ perse
84
+ perseennuolija
85
+ perseet olalla
86
+ persereikä
87
+ perseääliö
88
+ persläpi
89
+ perspano
90
+ persvako
91
+ pilkunnussija
92
+ pillu
93
+ pillut
94
+ pipari
95
+ piru
96
+ pistää
97
+ pyllyvako
98
+ reikä
99
+ reva
100
+ ripsipiirakka
101
+ runkata
102
+ runkkari
103
+ runkkaus
104
+ runkku
105
+ ryssä
106
+ rättipää
107
+ saatanasti
108
+ suklaaosasto
109
+ tavara
110
+ toosa
111
+ tuhkaluukku
112
+ tumputtaa
113
+ turpasauna
114
+ tussu
115
+ tussukka
116
+ tussut
117
+ vakipano
118
+ vetää käteen
119
+ viiksi
120
+ vittu
121
+ vittuilla
122
+ vittuilu
123
+ vittumainen
124
+ vittuuntua
125
+ vittuuntunut
126
+ vitun
127
+ vitusti
128
+ vituttaa
129
+ vitutus
130
+ äpärä
app/profanity/fil.txt ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ puta ka
2
+ putang ina
3
+ tang ina
4
+ tangina
5
+ burat
6
+ bayag
7
+ bobo
8
+ nognog
9
+ tanga
10
+ ulol
11
+ kantot
12
+ anak ka ng puta
13
+ ulol
14
+ jakol
app/profanity/fr.txt ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ baiser
2
+ bander
3
+ bigornette
4
+ bite
5
+ bitte
6
+ bloblos
7
+ bordel
8
+ bourré
9
+ bourrée
10
+ brackmard
11
+ branlage
12
+ branler
13
+ branlette
14
+ branleur
15
+ branleuse
16
+ brouter le cresson
17
+ caca
18
+ chatte
19
+ chiasse
20
+ chier
21
+ chiottes
22
+ clito
23
+ clitoris
24
+ con
25
+ connard
26
+ connasse
27
+ conne
28
+ couilles
29
+ cramouille
30
+ cul
31
+ déconne
32
+ déconner
33
+ emmerdant
34
+ emmerder
35
+ emmerdeur
36
+ emmerdeuse
37
+ enculé
38
+ enculée
39
+ enculeur
40
+ enculeurs
41
+ enfoiré
42
+ enfoirée
43
+ étron
44
+ fille de pute
45
+ fils de pute
46
+ folle
47
+ foutre
48
+ gerbe
49
+ gerber
50
+ gouine
51
+ grande folle
52
+ grogniasse
53
+ gueule
54
+ jouir
55
+ la putain de ta mère
56
+ MALPT
57
+ ménage à trois
58
+ merde
59
+ merdeuse
60
+ merdeux
61
+ meuf
62
+ nègre
63
+ negro
64
+ nique ta mère
65
+ nique ta race
66
+ palucher
67
+ pédale
68
+ pédé
69
+ péter
70
+ pipi
71
+ pisser
72
+ pouffiasse
73
+ pousse-crotte
74
+ putain
75
+ pute
76
+ ramoner
77
+ sac à foutre
78
+ sac à merde
79
+ salaud
80
+ salope
81
+ suce
82
+ tapette
83
+ tanche
84
+ teuch
85
+ tringler
86
+ trique
87
+ troncher
88
+ trou du cul
89
+ turlute
90
+ zigounette
91
+ zizi
app/profanity/hi.txt ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ aand
2
+ aandu
3
+ balatkar
4
+ balatkari
5
+ behen chod
6
+ beti chod
7
+ bhadva
8
+ bhadve
9
+ bhandve
10
+ bhangi
11
+ bhootni ke
12
+ bhosad
13
+ bhosadi ke
14
+ boobe
15
+ chakke
16
+ chinaal
17
+ chinki
18
+ chod
19
+ chodu
20
+ chodu bhagat
21
+ chooche
22
+ choochi
23
+ choope
24
+ choot
25
+ choot ke baal
26
+ chootia
27
+ chootiya
28
+ chuche
29
+ chuchi
30
+ chudaap
31
+ chudai khanaa
32
+ chudam chudai
33
+ chude
34
+ chut
35
+ chut ka chuha
36
+ chut ka churan
37
+ chut ka mail
38
+ chut ke baal
39
+ chut ke dhakkan
40
+ chut maarli
41
+ chutad
42
+ chutadd
43
+ chutan
44
+ chutia
45
+ chutiya
46
+ gaand
47
+ gaandfat
48
+ gaandmasti
49
+ gaandufad
50
+ gandfattu
51
+ gandu
52
+ gashti
53
+ gasti
54
+ ghassa
55
+ ghasti
56
+ gucchi
57
+ gucchu
58
+ harami
59
+ haramzade
60
+ hawas
61
+ hawas ke pujari
62
+ hijda
63
+ hijra
64
+ jhant
65
+ jhant chaatu
66
+ jhant ka keeda
67
+ jhant ke baal
68
+ jhant ke pissu
69
+ jhantu
70
+ kamine
71
+ kaminey
72
+ kanjar
73
+ kutta
74
+ kutta kamina
75
+ kutte ki aulad
76
+ kutte ki jat
77
+ kuttiya
78
+ loda
79
+ lodu
80
+ lund
81
+ lund choos
82
+ lund ka bakkal
83
+ lund khajoor
84
+ lundtopi
85
+ lundure
86
+ maa ki chut
87
+ maal
88
+ madar chod
89
+ madarchod
90
+ madhavchod
91
+ mooh mein le
92
+ mutth
93
+ mutthal
94
+ najayaz
95
+ najayaz aulaad
96
+ najayaz paidaish
97
+ paki
98
+ pataka
99
+ patakha
100
+ raand
101
+ randaap
102
+ randi
103
+ randi rona
104
+ saala
105
+ saala kutta
106
+ saali kutti
107
+ saali randi
108
+ suar
109
+ suar ke lund
110
+ suar ki aulad
111
+ tatte
112
+ tatti
113
+ teri maa ka bhosada
114
+ teri maa ka boba chusu
115
+ teri maa ki behenchod
116
+ teri maa ki chut
117
+ tharak
118
+ tharki
119
+ tu chuda
app/profanity/hu.txt ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ balfasz
2
+ balfaszok
3
+ balfaszokat
4
+ balfaszt
5
+ barmok
6
+ barmokat
7
+ barmot
8
+ barom
9
+ baszik
10
+ bazmeg
11
+ buksza
12
+ bukszák
13
+ bukszákat
14
+ bukszát
15
+ búr
16
+ búrok
17
+ csöcs
18
+ csöcsök
19
+ csöcsöket
20
+ csöcsöt
21
+ fasz
22
+ faszfej
23
+ faszfejek
24
+ faszfejeket
25
+ faszfejet
26
+ faszok
27
+ faszokat
28
+ faszt
29
+ fing
30
+ fingok
31
+ fingokat
32
+ fingot
33
+ franc
34
+ francok
35
+ francokat
36
+ francot
37
+ geci
38
+ gecibb
39
+ gecik
40
+ geciket
41
+ gecit
42
+ kibaszott
43
+ kibaszottabb
44
+ kúr
45
+ kurafi
46
+ kurafik
47
+ kurafikat
48
+ kurafit
49
+ kurva
50
+ kurvák
51
+ kurvákat
52
+ kurvát
53
+ leggecibb
54
+ legkibaszottabb
55
+ legszarabb
56
+ marha
57
+ marhák
58
+ marhákat
59
+ marhát
60
+ megdöglik
61
+ pele
62
+ pelék
63
+ picsa
64
+ picsákat
65
+ picsát
66
+ pina
67
+ pinák
68
+ pinákat
69
+ pinát
70
+ pofa
71
+ pofákat
72
+ pofát
73
+ pöcs
74
+ pöcsök
75
+ pöcsöket
76
+ pöcsöt
77
+ punci
78
+ puncik
79
+ segg
80
+ seggek
81
+ seggeket
82
+ segget
83
+ seggfej
84
+ seggfejek
85
+ seggfejeket
86
+ seggfejet
87
+ szajha
88
+ szajhák
89
+ szajhákat
90
+ szajhát
91
+ szar
92
+ szarabb
93
+ szarik
94
+ szarok
95
+ szarokat
96
+ szart
app/profanity/it.txt ADDED
@@ -0,0 +1,168 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ allupato
2
+ ammucchiata
3
+ anale
4
+ arrapato
5
+ arrusa
6
+ arruso
7
+ assatanato
8
+ bagascia
9
+ bagassa
10
+ bagnarsi
11
+ baldracca
12
+ balle
13
+ battere
14
+ battona
15
+ belino
16
+ biga
17
+ bocchinara
18
+ bocchino
19
+ bofilo
20
+ boiata
21
+ bordello
22
+ brinca
23
+ bucaiolo
24
+ budiùlo
25
+ busone
26
+ cacca
27
+ caciocappella
28
+ cadavere
29
+ cagare
30
+ cagata
31
+ cagna
32
+ casci
33
+ cazzata
34
+ cazzimma
35
+ cazzo
36
+ cesso
37
+ cazzone
38
+ checca
39
+ chiappa
40
+ chiavare
41
+ chiavata
42
+ ciospo
43
+ ciucciami il cazzo
44
+ coglione
45
+ coglioni
46
+ cornuto
47
+ cozza
48
+ culattina
49
+ culattone
50
+ culo
51
+ ditalino
52
+ fava
53
+ femminuccia
54
+ fica
55
+ figa
56
+ figlio di buona donna
57
+ figlio di puttana
58
+ figone
59
+ finocchio
60
+ fottere
61
+ fottersi
62
+ fracicone
63
+ fregna
64
+ frocio
65
+ froscio
66
+ goldone
67
+ guardone
68
+ imbecille
69
+ incazzarsi
70
+ incoglionirsi
71
+ ingoio
72
+ leccaculo
73
+ lecchino
74
+ lofare
75
+ loffa
76
+ loffare
77
+ mannaggia
78
+ merda
79
+ merdata
80
+ merdoso
81
+ mignotta
82
+ minchia
83
+ minchione
84
+ mona
85
+ monta
86
+ montare
87
+ mussa
88
+ nave scuola
89
+ nerchia
90
+ padulo
91
+ palle
92
+ palloso
93
+ patacca
94
+ patonza
95
+ pecorina
96
+ pesce
97
+ picio
98
+ pincare
99
+ pippa
100
+ pinnolone
101
+ pipì
102
+ pippone
103
+ pirla
104
+ pisciare
105
+ piscio
106
+ pisello
107
+ pistolotto
108
+ pomiciare
109
+ pompa
110
+ pompino
111
+ porca
112
+ porca madonna
113
+ porca miseria
114
+ porca puttana
115
+ porco
116
+ porco due
117
+ porco zio
118
+ potta
119
+ puppami
120
+ puttana
121
+ quaglia
122
+ recchione
123
+ regina
124
+ rincoglionire
125
+ rizzarsi
126
+ rompiballe
127
+ rompipalle
128
+ ruffiano
129
+ sbattere
130
+ sbattersi
131
+ sborra
132
+ sborrata
133
+ sborrone
134
+ sbrodolata
135
+ scopare
136
+ scopata
137
+ scorreggiare
138
+ sega
139
+ slinguare
140
+ slinguata
141
+ smandrappata
142
+ soccia
143
+ socmel
144
+ sorca
145
+ spagnola
146
+ spompinare
147
+ sticchio
148
+ stronza
149
+ stronzata
150
+ stronzo
151
+ succhiami
152
+ succhione
153
+ sveltina
154
+ sverginare
155
+ tarzanello
156
+ terrone
157
+ testa di cazzo
158
+ tette
159
+ tirare
160
+ topa
161
+ troia
162
+ trombare
163
+ vacca
164
+ vaffanculo
165
+ vangare
166
+ zinne
167
+ zio cantante
168
+ zoccola
app/profanity/ja.txt ADDED
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 3p
2
+ g スポット
3
+ s & m
4
+ sm
5
+ sm女王
6
+ xx
7
+ アジアのかわいい女の子
8
+ アスホール
9
+ アナリングス
10
+ アナル
11
+ いたずら
12
+ イラマチオ
13
+ エクスタシー
14
+ エスコート
15
+ エッチ
16
+ エロティズム
17
+ エロティック
18
+ オーガズム
19
+ オカマ
20
+ おしっこ
21
+ おしり
22
+ オシリ
23
+ おしりのあな
24
+ おっぱい
25
+ オッパイ
26
+ オナニー
27
+ オマンコ
28
+ おもらし
29
+ お尻
30
+ カーマスートラ
31
+ カント
32
+ クリトリス
33
+ グループ・セックス
34
+ グロ
35
+ クンニリングス
36
+ ゲイ・セックス
37
+ ゲイボーイ
38
+ ゴールデンシャワー
39
+ コカイン
40
+ ゴックン
41
+ サディズム
42
+ しばり
43
+ スウィンガー
44
+ スカートの中
45
+ スカトロ
46
+ ストラップオン
47
+ ストリップ劇場
48
+ スラット
49
+ スリット
50
+ セクシーな
51
+ セクシーな 10 代
52
+ セックス
53
+ ソドミー
54
+ ちんこ
55
+ ディープ・スロート
56
+ ディック
57
+ ディルド
58
+ デートレイプ
59
+ デブ
60
+ テレフォンセックス
61
+ ドッグスタイル
62
+ トップレス
63
+ なめ
64
+ ニガー
65
+ ヌード
66
+ ネオ・ナチ
67
+ ハードコア
68
+ パイパン
69
+ バイブレーター
70
+ バック・スタイル
71
+ パンティー
72
+ ビッチ
73
+ ファック
74
+ ファンタジー
75
+ フィスト
76
+ フェティッシュ
77
+ フェラチオ
78
+ ふたなり
79
+ ぶっかけ
80
+ フック
81
+ プリンス アルバート ピアス
82
+ プレイボーイ
83
+ ベアバック
84
+ ペニス
85
+ ペニスバンド
86
+ ボーイズラブ
87
+ ボールギャグ
88
+ ぽっちゃり
89
+ ホモ
90
+ ポルノ
91
+ ポルノグラフィー
92
+ ボンテージ
93
+ マザー・ファッカー
94
+ マスターベーション
95
+ まんこ
96
+ やおい
97
+ やりまん
98
+ ラティーナ
99
+ ラバー
100
+ ランジェリー
101
+ レイプ
102
+ レズビアン
103
+ ローター
104
+ ロリータ
105
+ 淫乱
106
+ 陰毛
107
+ 革抑制
108
+ 騎上位
109
+ 巨根
110
+ 巨乳
111
+ 強姦犯
112
+ 玉なめ
113
+ 玉舐め
114
+ 緊縛
115
+ 近親相姦
116
+ 嫌い
117
+ 後背位
118
+ 合意の性交
119
+ 拷問
120
+ 殺し方
121
+ 殺人事件
122
+ 殺人方法
123
+ 支配
124
+ 児童性虐待
125
+ 自己愛性
126
+ 射精
127
+ 手コキ
128
+ 獣姦
129
+ 女の子
130
+ 女王様
131
+ 女子高生
132
+ 女装
133
+ 新しいポルノ
134
+ 人妻
135
+ 人種
136
+ 性交
137
+ 正常位
138
+ 生殖器
139
+ 精液
140
+ 挿入
141
+ 足フェチ
142
+ 足を広げる
143
+ 大陰唇
144
+ 脱衣
145
+ 茶色のシャワー
146
+ 中出し
147
+ 潮吹き女
148
+ 潮吹き男性
149
+ 直腸
150
+ 剃毛
151
+ 貞操帯
152
+ 奴隷
153
+ 二穴
154
+ 乳首
155
+ 尿道プレイ
156
+ 覗き
157
+ 売春婦
158
+ 縛り
159
+ 噴出
160
+ 糞
161
+ 糞尿愛好症
162
+ 糞便
163
+ 平手打ち
164
+ 変態
165
+ 勃起する
166
+ 夢精
167
+ 毛深い
168
+ 誘惑
169
+ 幼児性愛者
170
+ 裸
171
+ 裸の女性
172
+ 乱交
173
+ 両性
174
+ 両性具有
175
+ 両刀
176
+ 輪姦
177
+ 卍
178
+ 宦官
179
+ 肛門
180
+ 膣
app/profanity/ko.txt ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 강간
2
+ 개새끼
3
+ 개자식
4
+ 개좆
5
+ 개차반
6
+ 거유
7
+ 계집년
8
+ 고자
9
+ 근친
10
+ 노모
11
+ 니기미
12
+ 뒤질래
13
+ 딸딸이
14
+ 때씹
15
+ 또라이
16
+ 뙤놈
17
+ 로리타
18
+ 망가
19
+ 몰카
20
+ 미친
21
+ 미친새끼
22
+ 바바리맨
23
+ 변태
24
+ 병신
25
+ 보지
26
+ 불알
27
+ 빠구리
28
+ 사까시
29
+ 섹스
30
+ 스와핑
31
+ 쌍놈
32
+ 씨발
33
+ 씨발놈
34
+ 씨팔
35
+ 씹
36
+ 씹물
37
+ 씹빨
38
+ 씹새끼
39
+ 씹알
40
+ 씹창
41
+ 씹팔
42
+ 암캐
43
+ 애자
44
+ 야동
45
+ 야사
46
+ 야애니
47
+ 엄창
48
+ 에로
49
+ 염병
50
+ 옘병
51
+ 유모
52
+ 육갑
53
+ 은꼴
54
+ 자위
55
+ 자지
56
+ 잡년
57
+ 종간나
58
+ 좆
59
+ 좆만
60
+ 죽일년
61
+ 쥐좆
62
+ 직촬
63
+ 짱깨
64
+ 쪽바리
65
+ 창녀
66
+ 포르노
67
+ 하드코어
68
+ 호로
69
+ 화냥년
70
+ 후레아들
71
+ 후장
72
+ 희쭈그리
app/profanity/nl.txt ADDED
@@ -0,0 +1,190 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ aardappels afgieten
2
+ achter het raam zitten
3
+ afberen
4
+ aflebberen
5
+ afrossen
6
+ afrukken
7
+ aftrekken
8
+ afwerkplaats
9
+ afzeiken
10
+ afzuigen
11
+ een halve man en een paardekop
12
+ anita
13
+ asbak
14
+ aso
15
+ bagger schijten
16
+ balen
17
+ bedonderen
18
+ befborstel
19
+ beffen
20
+ bekken
21
+ belazeren
22
+ besodemieterd zijn
23
+ besodemieteren
24
+ beurt
25
+ boemelen
26
+ boerelul
27
+ boerenpummel
28
+ bokkelul
29
+ botergeil
30
+ broekhoesten
31
+ brugpieper
32
+ buffelen
33
+ buiten de pot piesen
34
+ da's kloten van de bok
35
+ de ballen
36
+ de hoer spelen
37
+ de hond uitlaten
38
+ de koffer induiken
39
+ del
40
+ de pijp uitgaan
41
+ dombo
42
+ draaikont
43
+ driehoog achter wonen
44
+ drol
45
+ drooggeiler
46
+ droogkloot
47
+ een beurt geven
48
+ een nummertje maken
49
+ een wip maken
50
+ eikel
51
+ engerd
52
+ flamoes
53
+ flikken
54
+ flikker
55
+ gadverdamme
56
+ galbak
57
+ gat
58
+ gedoogzone
59
+ geilneef
60
+ gesodemieter
61
+ godverdomme
62
+ graftak
63
+ gras maaien
64
+ gratenkut
65
+ greppeldel
66
+ griet
67
+ hoempert
68
+ hoer
69
+ hoerenbuurt
70
+ hoerenloper
71
+ hoerig
72
+ hol
73
+ hufter
74
+ huisdealer
75
+ johny
76
+ kanen
77
+ kettingzeug
78
+ klaarkomen
79
+ klerebeer
80
+ klojo
81
+ klooien
82
+ klootjesvolk
83
+ klootoog
84
+ klootzak
85
+ kloten
86
+ knor
87
+ kont
88
+ kontneuken
89
+ krentekakker
90
+ kut
91
+ kuttelikkertje
92
+ kwakkie
93
+ liefdesgrot
94
+ lul
95
+ lul-de-behanger
96
+ lulhannes
97
+ lummel
98
+ mafketel
99
+ matennaaier
100
+ matje
101
+ mof
102
+ muts
103
+ naaien
104
+ naakt
105
+ neuken
106
+ neukstier
107
+ nicht
108
+ oetlul
109
+ opgeilen
110
+ opkankeren
111
+ oprotten
112
+ opsodemieteren
113
+ op z'n hondjes
114
+ op z'n sodemieter geven
115
+ opzouten
116
+ ouwehoer
117
+ ouwehoeren
118
+ ouwe rukker
119
+ paal
120
+ paardelul
121
+ palen
122
+ penoze
123
+ piesen
124
+ pijpbekkieg
125
+ pijpen
126
+ pik
127
+ pleurislaaier
128
+ poep
129
+ poepen
130
+ poot
131
+ portiekslet
132
+ pot
133
+ potverdorie
134
+ publiciteitsgeil
135
+ raaskallen
136
+ reet
137
+ reetridder
138
+ reet trappen, voor zijn
139
+ remsporen
140
+ reutelen
141
+ rothoer
142
+ rotzak
143
+ rukhond
144
+ rukken
145
+ schatje
146
+ schijt
147
+ schijten
148
+ schoft
149
+ schuinsmarcheerder
150
+ shit
151
+ slempen
152
+ slet
153
+ sletterig
154
+ slik mijn zaad
155
+ snol
156
+ spuiten
157
+ standje
158
+ standje-69
159
+ stoephoer
160
+ stootje
161
+ stront
162
+ sufferd
163
+ tapijtnek
164
+ teef
165
+ temeier
166
+ teringlijer
167
+ toeter
168
+ tongzoeng
169
+ triootjeg
170
+ trottoir prostituée
171
+ trottoirteef
172
+ vergallen
173
+ verkloten
174
+ verneuken
175
+ viespeuk
176
+ vingeren
177
+ vleesroos
178
+ voor jan lul
179
+ voor jan-met-de-korte-achternaam
180
+ watje
181
+ welzijnsmafia
182
+ wijf
183
+ wippen
184
+ wuftje
185
+ zaadje
186
+ zakkenwasser
187
+ zeiken
188
+ zeiker
189
+ zuigen
190
+ zuiplap
app/profanity/no.txt ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ asshole
2
+ dritt
3
+ drittsekk
4
+ faen
5
+ faen i helvete
6
+ fan
7
+ fanken
8
+ fitte
9
+ forbanna
10
+ forbannet
11
+ forjævlig
12
+ fuck
13
+ fy faen
14
+ føkk
15
+ føkka
16
+ føkkings
17
+ jævla
18
+ jævlig
19
+ helvete
20
+ helvetet
21
+ kuk
22
+ kukene
23
+ kuker
24
+ morraknuller
25
+ morrapuler
26
+ nigger
27
+ pakkis
28
+ pikk
29
+ pokker
30
+ ræva
31
+ ræven
32
+ satan
33
+ shit
34
+ sinnsykt
35
+ skitt
36
+ sotrør
37
+ ståpikk
38
+ ståpikkene
39
+ ståpikker
40
+ svartheiteste
app/profanity/pl.txt ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ burdel
2
+ burdelmama
3
+ chuj
4
+ chujnia
5
+ ciota
6
+ cipa
7
+ cyc
8
+ debil
9
+ dmuchać
10
+ do kurwy nędzy
11
+ dupa
12
+ dupek
13
+ duperele
14
+ dziwka
15
+ fiut
16
+ gówno
17
+ gówno prawda
18
+ huj
19
+ huj ci w dupę
20
+ jajco
21
+ jajko
22
+ ja pierdolę
23
+ jebać
24
+ jebany
25
+ kurwa
26
+ kurwy
27
+ kutafon
28
+ kutas
29
+ lizać pałę
30
+ obciągać chuja
31
+ obciągać fiuta
32
+ obciągać loda
33
+ pieprzyć
34
+ pierdolec
35
+ pierdolić
36
+ pierdolnąć
37
+ pierdolnięty
38
+ pierdoła
39
+ pierdzieć
40
+ pizda
41
+ pojeb
42
+ pojebany
43
+ popierdolony
44
+ robic loda
45
+ robić loda
46
+ ruchać
47
+ rzygać
48
+ skurwysyn
49
+ sraczka
50
+ srać
51
+ suka
52
+ syf
53
+ wkurwiać
54
+ zajebisty
app/profanity/pt.txt ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ aborto
2
+ amador
3
+ ânus
4
+ aranha
5
+ ariano
6
+ balalao
7
+ bastardo
8
+ bicha
9
+ biscate
10
+ bissexual
11
+ boceta
12
+ boob
13
+ bosta
14
+ braulio de borracha
15
+ bumbum
16
+ burro
17
+ cabrao
18
+ cacete
19
+ cagar
20
+ camisinha
21
+ caralho
22
+ cerveja
23
+ chochota
24
+ chupar
25
+ clitoris
26
+ cocaína
27
+ coito
28
+ colhoes
29
+ comer
30
+ cona
31
+ consolo
32
+ corno
33
+ cu
34
+ dar o rabo
35
+ dum raio
36
+ esporra
37
+ fecal
38
+ filho da puta
39
+ foda
40
+ foda-se
41
+ foder
42
+ frango assado
43
+ gozar
44
+ grelho
45
+ heroína
46
+ heterosexual
47
+ homem gay
48
+ homoerótico
49
+ homosexual
50
+ inferno
51
+ lésbica
52
+ lolita
53
+ mama
54
+ merda
55
+ paneleiro
56
+ passar um cheque
57
+ pau
58
+ peidar
59
+ pênis
60
+ pinto
61
+ porra
62
+ puta
63
+ puta que pariu
64
+ puta que te pariu
65
+ queca
66
+ sacanagem
67
+ saco
68
+ torneira
69
+ transar
70
+ vadia
71
+ vai-te foder
72
+ vai tomar no cu
73
+ veado
74
+ vibrador
75
+ xana
76
+ xochota
app/profanity/ru.txt ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ bychara
2
+ byk
3
+ chernozhopyi
4
+ dolboy'eb
5
+ ebalnik
6
+ ebalo
7
+ ebalom sch'elkat
8
+ gol
9
+ mudack
10
+ opizdenet
11
+ osto'eblo
12
+ ostokhuitel'no
13
+ ot'ebis
14
+ otmudohat
15
+ otpizdit
16
+ otsosi
17
+ padlo
18
+ pedik
19
+ perdet
20
+ petuh
21
+ pidar gnoinyj
22
+ pizda
23
+ pizdato
24
+ pizdatyi
25
+ piz'det
26
+ pizdetc
27
+ pizdoi nakryt'sja
28
+ pizd'uk
29
+ piz`dyulina
30
+ podi ku'evo
31
+ poeben
32
+ po'imat' na konchik
33
+ po'iti posrat
34
+ po khuy
35
+ poluchit pizdy
36
+ pososi moyu konfetku
37
+ prissat
38
+ proebat
39
+ promudobl'adsksya pizdopro'ebina
40
+ propezdoloch
41
+ prosrat
42
+ raspeezdeyi
43
+ raspizdatyi
44
+ raz'yebuy
45
+ raz'yoba
46
+ s'ebat'sya
47
+ shalava
48
+ styervo
49
+ sukin syn
50
+ svodit posrat
51
+ svoloch
52
+ trakhat'sya
53
+ trimandoblydskiy pizdoproyob
54
+ ubl'yudok
55
+ uboy
56
+ u'ebitsche
57
+ vafl'a
58
+ vafli lovit
59
+ v pizdu
60
+ vyperdysh
61
+ vzdrochennyi
62
+ yeb vas
63
+ za'ebat
64
+ zaebis
65
+ zalupa
66
+ zalupat
67
+ zasranetc
68
+ zassat
69
+ zlo'ebuchy
70
+ бздёнок
71
+ блядки
72
+ блядовать
73
+ блядство
74
+ блядь
75
+ бугор
76
+ во пизду
77
+ встать раком
78
+ выёбываться
79
+ гандон
80
+ говно
81
+ говнюк
82
+ голый
83
+ дать пизды
84
+ дерьмо
85
+ дрочить
86
+ другой дразнится
87
+ ёбарь
88
+ ебать
89
+ ебать-копать
90
+ ебло
91
+ ебнуть
92
+ ёб твою мать
93
+ жопа
94
+ жополиз
95
+ играть на кожаной флейте
96
+ измудохать
97
+ каждый дрочит как он хочет
98
+ какая разница
99
+ как два пальца обоссать
100
+ курите мою трубку
101
+ лысого в кулаке гонять
102
+ малофья
103
+ манда
104
+ мандавошка
105
+ мент
106
+ муда
107
+ мудило
108
+ мудозвон
109
+ наебать
110
+ наебениться
111
+ наебнуться
112
+ на фиг
113
+ на хуй
114
+ на хую вертеть
115
+ на хуя
116
+ нахуячиться
117
+ невебенный
118
+ не ебет
119
+ ни за хуй собачу
120
+ ни хуя
121
+ обнаженный
122
+ обоссаться можно
123
+ один ебётся
124
+ опесдол
125
+ офигеть
126
+ охуеть
127
+ охуительно
128
+ половое сношение
129
+ секс
130
+ сиськи
131
+ спиздить
132
+ срать
133
+ ссать
134
+ траxать
135
+ ты мне ваньку не валяй
136
+ фига
137
+ хапать
138
+ хер с ней
139
+ хер с ним
140
+ хохол
141
+ хрен
142
+ хуёво
143
+ хуёвый
144
+ хуем груши околачивать
145
+ хуеплет
146
+ хуило
147
+ хуиней страдать
148
+ хуиня
149
+ хуй
150
+ хуйнуть
151
+ хуй пинать
app/profanity/sv.txt ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ arsle
2
+ brutta
3
+ discofitta
4
+ dra åt helvete
5
+ fan
6
+ fitta
7
+ fittig
8
+ för helvete
9
+ helvete
10
+ hård
11
+ jävlar
12
+ knulla
13
+ kuk
14
+ kuksås
15
+ kötthuvud
16
+ köttnacke
17
+ moona
18
+ moonade
19
+ moonar
20
+ moonat
21
+ mutta
22
+ nigger
23
+ neger
24
+ olla
25
+ pippa
26
+ pitt
27
+ prutt
28
+ pök
29
+ runka
30
+ röv
31
+ rövhål
32
+ rövknulla
33
+ satan
34
+ skita
35
+ skit ner dig
36
+ skäggbiff
37
+ snedfitta
38
+ snefitta
39
+ stake
40
+ subba
41
+ sås
42
+ sätta på
43
+ tusan
app/profanity/th.txt ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ กระดอ
2
+ กระเด้า
3
+ กระหรี่
4
+ กะปิ
5
+ กู
6
+ ขี้
7
+ ควย
8
+ จิ๋ม
9
+ จู๋
10
+ เจ๊ก
11
+ เจี๊ยว
12
+ ดอกทอง
13
+ ตอแหล
14
+ ตูด
15
+ น้ําแตก
16
+ มึง
17
+ แม่ง
18
+ เย็ด
19
+ รูตูด
20
+ ล้างตู้เย็น
21
+ ส้นตีน
22
+ สัด
23
+ เสือก
24
+ หญิงชาติชั่ว
25
+ หลั่ง
26
+ ห่า
27
+ หํา
28
+ หี
29
+ เหี้ย
30
+ อมนกเขา
31
+ ไอ้ควาย
app/profanity/tr.txt ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ am
2
+ amcığa
3
+ amcığı
4
+ amcığın
5
+ amcık
6
+ amcıklar
7
+ amcıklara
8
+ amcıklarda
9
+ amcıklardan
10
+ amcıkları
11
+ amcıkların
12
+ amcıkta
13
+ amcıktan
14
+ amı
15
+ amlar
16
+ çingene
17
+ Çingenede
18
+ Çingeneden
19
+ Çingeneler
20
+ Çingenelerde
21
+ Çingenelerden
22
+ Çingenelere
23
+ Çingeneleri
24
+ Çingenelerin
25
+ Çingenenin
26
+ Çingeneye
27
+ Çingeneyi
28
+ göt
29
+ göte
30
+ götler
31
+ götlerde
32
+ götlerden
33
+ götlere
34
+ götleri
35
+ götlerin
36
+ götte
37
+ götten
38
+ götü
39
+ götün
40
+ götveren
41
+ götverende
42
+ götverenden
43
+ götverene
44
+ götvereni
45
+ götverenin
46
+ götverenler
47
+ götverenlerde
48
+ götverenlerden
49
+ götverenlere
50
+ götverenleri
51
+ götverenlerin
52
+ kaltağa
53
+ kaltağı
54
+ kaltağın
55
+ kaltak
56
+ kaltaklar
57
+ kaltaklara
58
+ kaltaklarda
59
+ kaltaklardan
60
+ kaltakları
61
+ kaltakların
62
+ kaltakta
63
+ kaltaktan
64
+ orospu
65
+ orospuda
66
+ orospudan
67
+ orospular
68
+ orospulara
69
+ orospularda
70
+ orospulardan
71
+ orospuları
72
+ orospuların
73
+ orospunun
74
+ orospuya
75
+ orospuyu
76
+ otuz birci
77
+ otuz bircide
78
+ otuz birciden
79
+ otuz birciler
80
+ otuz bircilerde
81
+ otuz bircilerden
82
+ otuz bircilere
83
+ otuz bircileri
84
+ otuz bircilerin
85
+ otuz bircinin
86
+ otuz birciye
87
+ otuz birciyi
88
+ saksocu
89
+ saksocuda
90
+ saksocudan
91
+ saksocular
92
+ saksoculara
93
+ saksocularda
94
+ saksoculardan
95
+ saksocuları
96
+ saksocuların
97
+ saksocunun
98
+ saksocuya
99
+ saksocuyu
100
+ sıçmak
101
+ sik
102
+ sike
103
+ siker sikmez
104
+ siki
105
+ sikilir sikilmez
106
+ sikin
107
+ sikler
108
+ siklerde
109
+ siklerden
110
+ siklere
111
+ sikleri
112
+ siklerin
113
+ sikmek
114
+ sikmemek
115
+ sikte
116
+ sikten
117
+ siktir
118
+ siktirir siktirmez
119
+ taşağa
120
+ taşağı
121
+ taşağın
122
+ taşak
123
+ taşaklar
124
+ taşaklara
125
+ taşaklarda
126
+ taşaklardan
127
+ taşakları
128
+ taşakların
129
+ taşakta
130
+ taşaktan
131
+ yarağa
132
+ yarağı
133
+ yarağın
134
+ yarak
135
+ yaraklar
136
+ yaraklara
137
+ yaraklarda
138
+ yaraklardan
139
+ yarakları
140
+ yarakların
141
+ yarakta
142
+ yaraktan
app/profanity/zh.txt ADDED
@@ -0,0 +1,319 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 13.
2
+ 13点
3
+ 三级片
4
+ 下三烂
5
+ 下贱
6
+ 个老子的
7
+ 九游
8
+ 乳
9
+ 乳交
10
+ 乳头
11
+ 乳房
12
+ 乳波臀浪
13
+ 交配
14
+ 仆街
15
+ 他奶奶
16
+ 他奶奶的
17
+ 他奶娘的
18
+ 他妈
19
+ 他妈ㄉ王八蛋
20
+ 他妈地
21
+ 他妈的
22
+ 他娘
23
+ 他马的
24
+ 你个傻比
25
+ 你他马的
26
+ 你全家
27
+ 你奶奶的
28
+ 你她马的
29
+ 你妈
30
+ 你妈的
31
+ 你娘
32
+ 你娘卡好
33
+ 你娘咧
34
+ 你它妈的
35
+ 你它马的
36
+ 你是鸡
37
+ 你是鸭
38
+ 你马的
39
+ 做爱
40
+ 傻比
41
+ 傻逼
42
+ 册那
43
+ 军妓
44
+ 几八
45
+ 几叭
46
+ 几巴
47
+ 几芭
48
+ 刚度
49
+ 刚瘪三
50
+ 包皮
51
+ 十三点
52
+ 卖B
53
+ 卖比
54
+ 卖淫
55
+ 卵
56
+ 卵子
57
+ 双峰微颤
58
+ 口交
59
+ 口肯
60
+ 叫床
61
+ 吃屎
62
+ 后庭
63
+ 吹箫
64
+ 塞你公
65
+ 塞你娘
66
+ 塞你母
67
+ 塞你爸
68
+ 塞你老师
69
+ 塞你老母
70
+ 处女
71
+ 外阴
72
+ 大卵子
73
+ 大卵泡
74
+ 大鸡巴
75
+ 奶
76
+ 奶奶的熊
77
+ 奶子
78
+ 奸
79
+ 奸你
80
+ 她妈地
81
+ 她妈的
82
+ 她马的
83
+ 妈B
84
+ 妈个B
85
+ 妈个比
86
+ 妈个老比
87
+ 妈妈的
88
+ 妈比
89
+ 妈的
90
+ 妈的B
91
+ 妈逼
92
+ 妓
93
+ 妓女
94
+ 妓院
95
+ 妳她妈的
96
+ 妳妈的
97
+ 妳娘的
98
+ 妳老母的
99
+ 妳马的
100
+ 姘头
101
+ 姣西
102
+ 姦
103
+ 娘个比
104
+ 娘的
105
+ 婊子
106
+ 婊子养的
107
+ 嫖娼
108
+ 嫖客
109
+ 它妈地
110
+ 它妈的
111
+ 密洞
112
+ 射你
113
+ 射精
114
+ 小乳头
115
+ 小卵子
116
+ 小卵泡
117
+ 小瘪三
118
+ 小肉粒
119
+ 小骚比
120
+ 小骚货
121
+ 小鸡巴
122
+ 小鸡鸡
123
+ 屁眼
124
+ 屁股
125
+ 屄
126
+ 屌
127
+ 巨乳
128
+ 干x娘
129
+ 干七八
130
+ 干你
131
+ 干你妈
132
+ 干你娘
133
+ 干你老母
134
+ 干你良
135
+ 干妳妈
136
+ 干妳娘
137
+ 干妳老母
138
+ 干妳马
139
+ 干您娘
140
+ 干机掰
141
+ 干死CS
142
+ 干死GM
143
+ 干死你
144
+ 干死客服
145
+ 幹
146
+ 强奸
147
+ 强奸你
148
+ 性
149
+ 性交
150
+ 性器
151
+ 性无能
152
+ 性爱
153
+ 情色
154
+ 想上你
155
+ 懆您妈
156
+ 懆您娘
157
+ 懒8
158
+ 懒八
159
+ 懒叫
160
+ 懒教
161
+ 成人
162
+ 我操你祖宗十八代
163
+ 扒光
164
+ 打炮
165
+ 打飞机
166
+ 抽插
167
+ 招妓
168
+ 插你
169
+ 插死你
170
+ 撒尿
171
+ 操你
172
+ 操你全家
173
+ 操你奶奶
174
+ 操你妈
175
+ 操你娘
176
+ 操你祖宗
177
+ 操你老妈
178
+ 操你老母
179
+ 操妳
180
+ 操妳全家
181
+ 操妳妈
182
+ 操妳娘
183
+ 操妳祖宗
184
+ 操机掰
185
+ 操比
186
+ 操逼
187
+ 放荡
188
+ 日他娘
189
+ 日你
190
+ 日你妈
191
+ 日你老娘
192
+ 日你老母
193
+ 日批
194
+ 月经
195
+ 机八
196
+ 机巴
197
+ 机机歪歪
198
+ 杂种
199
+ 浪叫
200
+ 淫
201
+ 淫乱
202
+ 淫妇
203
+ 淫棍
204
+ 淫水
205
+ 淫秽
206
+ 淫荡
207
+ 淫西
208
+ 湿透的内裤
209
+ 激情
210
+ 灨你娘
211
+ 烂货
212
+ 烂逼
213
+ 爛
214
+ 狗屁
215
+ 狗日
216
+ 狗狼养的
217
+ 玉杵
218
+ 王八蛋
219
+ 瓜娃子
220
+ 瓜婆娘
221
+ 瓜批
222
+ 瘪三
223
+ 白烂
224
+ 白痴
225
+ 白癡
226
+ 祖宗
227
+ 私服
228
+ 笨蛋
229
+ 精子
230
+ 老二
231
+ 老味
232
+ 老母
233
+ 老瘪三
234
+ 老骚比
235
+ 老骚货
236
+ 肉壁
237
+ 肉棍子
238
+ 肉棒
239
+ 肉缝
240
+ 肏
241
+ 肛交
242
+ 肥西
243
+ 色情
244
+ 花柳
245
+ 荡妇
246
+ 賤
247
+ 贝肉
248
+ 贱B
249
+ 贱人
250
+ 贱货
251
+ 贼你妈
252
+ 赛你老母
253
+ 赛妳阿母
254
+ 赣您娘
255
+ 轮奸
256
+ 迷药
257
+ 逼
258
+ 逼样
259
+ 野鸡
260
+ 阳具
261
+ 阳萎
262
+ 阴唇
263
+ 阴户
264
+ 阴核
265
+ 阴毛
266
+ 阴茎
267
+ 阴道
268
+ 阴部
269
+ 雞巴
270
+ 靠北
271
+ 靠母
272
+ 靠爸
273
+ 靠背
274
+ 靠腰
275
+ 驶你公
276
+ 驶你娘
277
+ 驶你母
278
+ 驶你爸
279
+ 驶你老师
280
+ 驶你老母
281
+ 骚比
282
+ 骚货
283
+ 骚逼
284
+ 鬼公
285
+ 鸡8
286
+ 鸡八
287
+ 鸡叭
288
+ 鸡吧
289
+ 鸡奸
290
+ 鸡巴
291
+ 鸡芭
292
+ 鸡鸡
293
+ 龟儿子
294
+ 龟头
295
+ 𨳒
296
+ 陰莖
297
+ 㞗
298
+ 尻
299
+ 𨳊
300
+ 鳩
301
+ 𡳞
302
+ 𨶙
303
+ 撚
304
+ 𨳍
305
+ 柒
306
+ 閪
307
+ 仆街
308
+ 咸家鏟
309
+ 冚家鏟
310
+ 咸家伶
311
+ 冚家拎
312
+ 笨實
313
+ 粉腸
314
+ 屎忽
315
+ 躝癱
316
+ 你老闆
317
+ 你老味
318
+ 你老母
319
+ 硬膠
app/server.py CHANGED
@@ -102,10 +102,16 @@ async def create_job(
102
  lipsync: str = Form("0"),
103
  agree: str = Form(""),
104
  voice_consent: str = Form(""),
 
 
105
  file: UploadFile | None = File(None),
106
  ):
 
 
107
  if agree != "1":
108
  raise HTTPException(400, "Please confirm you have the right to use this video and accept the Terms.")
 
 
109
  if clone == "1" and voice_consent != "1":
110
  clone = "0" # never clone a voice without the user's permission statement
111
  if target not in languages.LANGS:
@@ -141,14 +147,16 @@ async def create_job(
141
  job = {"id": job_id, "status": "queued", "step": "Waiting in line", "progress": 0.0,
142
  "created": time.time(), "input": file.filename if file and file.filename else url.strip(),
143
  "target": target, "ip": ip,
144
- "consent": {"terms": TERMS_VERSION, "rights": True, "voice": clone == "1", "time": time.time()}}
 
145
  JOBS[job_id] = job
146
  _save(job)
147
  kwargs = dict(source_path=src_path, url=url.strip() or None, target=target,
148
  source_lang=source or None, engine=engine,
149
  outputs=tuple(o for o in outputs.split(",") if o), quality=quality,
150
  gender=gender, voice_engine=voice_engine, max_minutes=MAX_MINUTES,
151
- clone=clone == "1", lipsync=lipsync == "1" and engines.lipsync_available())
 
152
  pool.submit(_work, job_id, kwargs)
153
  return {"id": job_id}
154
 
@@ -237,9 +245,14 @@ def teach_languages():
237
 
238
  @app.post("/api/teach")
239
  async def teach(request: Request, lang: str = Form(...), en: str = Form(...), text: str = Form(...),
240
- token: str = Form(""), agree: str = Form(""), audio: UploadFile | None = File(None)):
 
241
  if agree != "1":
242
  raise HTTPException(400, "Please accept how we use your sentence and recording.")
 
 
 
 
243
  if lang not in TEACH_LANGS:
244
  raise HTTPException(400, "Unknown language")
245
  en, text = en.strip()[:500], text.strip()[:500]
 
102
  lipsync: str = Form("0"),
103
  agree: str = Form(""),
104
  voice_consent: str = Form(""),
105
+ age: str = Form(""),
106
+ clean: str = Form("0"),
107
  file: UploadFile | None = File(None),
108
  ):
109
+ if age not in ("teen", "adult"):
110
+ raise HTTPException(400, "Please tell us your age group. SwitchLingo is for ages 13 and up.")
111
  if agree != "1":
112
  raise HTTPException(400, "Please confirm you have the right to use this video and accept the Terms.")
113
+ if age == "teen": # Teen mode (13-17): clean words, standard AI voice, no cloning/lip-sync/premium
114
+ clone, lipsync, clean, voice_engine = "0", "0", "1", "edge"
115
  if clone == "1" and voice_consent != "1":
116
  clone = "0" # never clone a voice without the user's permission statement
117
  if target not in languages.LANGS:
 
147
  job = {"id": job_id, "status": "queued", "step": "Waiting in line", "progress": 0.0,
148
  "created": time.time(), "input": file.filename if file and file.filename else url.strip(),
149
  "target": target, "ip": ip,
150
+ "consent": {"terms": TERMS_VERSION, "rights": True, "voice": clone == "1", "age": age,
151
+ "time": time.time()}}
152
  JOBS[job_id] = job
153
  _save(job)
154
  kwargs = dict(source_path=src_path, url=url.strip() or None, target=target,
155
  source_lang=source or None, engine=engine,
156
  outputs=tuple(o for o in outputs.split(",") if o), quality=quality,
157
  gender=gender, voice_engine=voice_engine, max_minutes=MAX_MINUTES,
158
+ clone=clone == "1", lipsync=lipsync == "1" and engines.lipsync_available(),
159
+ clean=clean == "1")
160
  pool.submit(_work, job_id, kwargs)
161
  return {"id": job_id}
162
 
 
245
 
246
  @app.post("/api/teach")
247
  async def teach(request: Request, lang: str = Form(...), en: str = Form(...), text: str = Form(...),
248
+ token: str = Form(""), agree: str = Form(""), age: str = Form(""),
249
+ audio: UploadFile | None = File(None)):
250
  if agree != "1":
251
  raise HTTPException(400, "Please accept how we use your sentence and recording.")
252
+ if age not in ("teen", "adult"):
253
+ raise HTTPException(400, "Please tell us your age group (13+).")
254
+ if age == "teen" and audio and audio.filename:
255
+ raise HTTPException(400, "Voice recordings are for ages 18+. You can still add the sentence as text.")
256
  if lang not in TEACH_LANGS:
257
  raise HTTPException(400, "Unknown language")
258
  en, text = en.strip()[:500], text.strip()[:500]
app/static/index.html CHANGED
@@ -70,6 +70,9 @@ td.t{white-space:nowrap;color:var(--muted);font-variant-numeric:tabular-nums;wid
70
  .prompt{font:600 18px Fraunces,Georgia,serif;margin:6px 0 10px}
71
  #install{display:none}
72
  .sw.hidden{display:none}
 
 
 
73
  .agree{display:flex;gap:10px;align-items:flex-start;font-size:14px;margin-top:12px;line-height:1.45}.agree input{margin-top:3px;flex:none;width:18px;height:18px}
74
  footer a{color:var(--muted)}
75
  @media (max-width:640px){
@@ -93,6 +96,10 @@ footer a{color:var(--muted)}
93
  </section>
94
 
95
  <section class="card">
 
 
 
 
96
  <h2>1. Add your video or audio</h2>
97
  <div class="tabs"><button id="tLink" class="on">🔗 Link</button><button id="tFile">📁 Upload</button><button id="tRec">🎤 Record</button></div>
98
  <div id="pLink"><input id="url" type="url" inputmode="url" placeholder="Facebook, Instagram, TikTok, YouTube, X, or any website with a video"></div>
@@ -116,9 +123,12 @@ footer a{color:var(--muted)}
116
  <label class="chk"><input type="checkbox" class="out" value="subs" checked> Subtitles on video</label>
117
  <label class="chk"><input type="checkbox" class="out" value="dub" checked> Voice-over</label>
118
  </div>
 
 
119
  <label class="sw"><span><b>🎙️ Keep the speaker's voice</b><small>Voice-over sounds like the person in the video</small></span><input type="checkbox" id="clone" checked></label>
120
  <label class="agree" id="vcWrap"><input type="checkbox" id="voiceConsent"> It's my own voice, or I have the speaker's permission to recreate their voice. I won't use it to impersonate or deceive anyone.</label>
121
  <label class="sw hidden" id="lipWrap"><span><b>👄 Lip-sync <span class="badge">PRO</span></b><small>Mouths move with the new language (takes ~2 min longer)</small></span><input type="checkbox" id="lipsync"></label>
 
122
 
123
  <details>
124
  <summary>Options</summary>
@@ -130,7 +140,7 @@ footer a{color:var(--muted)}
130
  <div><label class="lb" for="gender">Voice gender</label><select id="gender"><option>Female</option><option>Male</option></select></div>
131
  </div>
132
  </details>
133
- <label class="agree"><input type="checkbox" id="agree"> I'm 18+, I made this video, own it or have permission to use it, and I agree to the <a href="terms.html" target="_blank">Terms</a> and <a href="privacy.html" target="_blank">Privacy Policy</a>.</label>
134
  <button id="go" class="btn">Translate</button>
135
  <p class="muted" style="font-size:13px;margin:10px 0 0"><span id="limits"></span> Only use videos you have the right to share. Every video gets an "AI translated" label. AI voices, even cloned ones, are never the real person speaking. Translations can be wrong, so don't rely on them for medical, legal or immigration decisions.</p>
136
  <div id="formErr" class="err"></div>
@@ -169,7 +179,7 @@ footer a{color:var(--muted)}
169
  <div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:10px">
170
  <button type="button" class="btn ghost rec" id="recBtn">🎤 Record yourself saying it</button><audio id="recPlay" controls class="hidden" style="max-width:260px;margin:0"></audio>
171
  </div>
172
- <label class="agree"><input type="checkbox" name="agree" value="1" required> I'm 18+. SwitchLingo may store my sentence (and recording, if I made one) to improve translations. My recording won't be used to identify me, and I can ask to delete it anytime.</label>
173
  <button class="btn" type="submit">Add my sentence</button> <span id="teachMsg" class="muted"></span>
174
  </form>
175
  <p class="muted" style="font-size:13px" id="teachStats"></p>
@@ -240,6 +250,8 @@ async function init(){
240
  if(r.translators.includes("claude")) $("#engine").value="claude";
241
  if(r.lipsync) $("#lipWrap").classList.remove("hidden");
242
  const vc=()=>$("#vcWrap").style.display=$("#clone").checked?"flex":"none"; $("#clone").onchange=vc; vc();
 
 
243
  const qs=new URLSearchParams(location.search), shared=qs.get("url")||qs.get("text")||"";
244
  const m=shared.match(/https?:\/\/\S+/); if(m){ setMode("link"); $("#url").value=m[0]; $("#go").scrollIntoView({behavior:"smooth",block:"center"}); }
245
  initTeach();
@@ -258,7 +270,11 @@ $("#go").onclick=async()=>{
258
  quality:$("#quality").value,gender:$("#gender").value,voice_engine:$("#voice").value,
259
  clone:$("#clone").checked?"1":"0",lipsync:$("#lipsync").checked?"1":"0"}).forEach(([k,v])=>fd.append(k,v));
260
  if(!$("#agree").checked) return $("#formErr").textContent="Please check the box to confirm you have the right to use this video.";
261
- if($("#clone").checked && outs.includes("dub") && !$("#voiceConsent").checked) return $("#formErr").textContent="To keep the speaker's voice, confirm you have their permission (or turn that switch off).";
 
 
 
 
262
  fd.append("agree","1"); fd.append("voice_consent",$("#voiceConsent").checked?"1":"0");
263
  $("#go").disabled=true; $("#go").textContent="Uploading…";
264
  try{
@@ -322,6 +338,17 @@ async function loadJobs(){
322
  $("#reqForm").onsubmit=async e=>{ e.preventDefault();
323
  const r=await fetch("/api/language-requests",{method:"POST",body:new FormData(e.target)});
324
  $("#reqMsg").textContent=r.ok?"Thanks, request saved.":"Couldn't save, try again."; if(r.ok) e.target.reset(); };
 
 
 
 
 
 
 
 
 
 
 
325
  let recBlob=null, recorder=null, PROMPTS=[];
326
  async function initTeach(){
327
  const r=await (await fetch("/api/teach/languages")).json(); PROMPTS=r.prompts;
@@ -346,7 +373,8 @@ $("#recBtn").onclick=async()=>{
346
  }catch(e){ $("#teachMsg").textContent="Microphone not allowed. You can still type it."; }
347
  };
348
  $("#teachForm").onsubmit=async e=>{ e.preventDefault();
349
- const fd=new FormData(e.target); fd.append("token",ADMIN);
 
350
  if(recBlob) fd.append("audio",recBlob,"rec."+((recBlob.type.split("/")[1]||"webm").split(";")[0]));
351
  const r=await fetch("/api/teach",{method:"POST",body:fd});
352
  $("#teachMsg").textContent=r.ok?"Thank you! 🙏 Added.":"Couldn't save, try again.";
 
70
  .prompt{font:600 18px Fraunces,Georgia,serif;margin:6px 0 10px}
71
  #install{display:none}
72
  .sw.hidden{display:none}
73
+ .agebar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px}.agebar select{width:auto;min-width:150px}
74
+ .teen .adultOnly{display:none}.teen #recBtn{display:none}
75
+ .teenbadge{display:inline-block;background:var(--soft);color:var(--ok);border-radius:99px;padding:2px 10px;font-size:13px;font-weight:600}
76
  .agree{display:flex;gap:10px;align-items:flex-start;font-size:14px;margin-top:12px;line-height:1.45}.agree input{margin-top:3px;flex:none;width:18px;height:18px}
77
  footer a{color:var(--muted)}
78
  @media (max-width:640px){
 
96
  </section>
97
 
98
  <section class="card">
99
+ <div class="agebar"><label class="lb" for="age" style="margin:0">Your age</label>
100
+ <select id="age"><option value="">Choose…</option><option value="teen">13–17</option><option value="adult">18 or older</option><option value="kid">Under 13</option></select>
101
+ <span id="ageNote" class="muted"></span></div>
102
+ <div id="kidMsg" class="err hidden">Sorry, SwitchLingo is for ages 13 and up. Ask a parent or teacher to help you.</div>
103
  <h2>1. Add your video or audio</h2>
104
  <div class="tabs"><button id="tLink" class="on">🔗 Link</button><button id="tFile">📁 Upload</button><button id="tRec">🎤 Record</button></div>
105
  <div id="pLink"><input id="url" type="url" inputmode="url" placeholder="Facebook, Instagram, TikTok, YouTube, X, or any website with a video"></div>
 
123
  <label class="chk"><input type="checkbox" class="out" value="subs" checked> Subtitles on video</label>
124
  <label class="chk"><input type="checkbox" class="out" value="dub" checked> Voice-over</label>
125
  </div>
126
+ <label class="sw" id="cleanWrap"><span><b>🧼 Clean mode</b><small>Hides swear words in subtitles and skips them in the voice-over</small></span><input type="checkbox" id="clean"></label>
127
+ <div class="adultOnly">
128
  <label class="sw"><span><b>🎙️ Keep the speaker's voice</b><small>Voice-over sounds like the person in the video</small></span><input type="checkbox" id="clone" checked></label>
129
  <label class="agree" id="vcWrap"><input type="checkbox" id="voiceConsent"> It's my own voice, or I have the speaker's permission to recreate their voice. I won't use it to impersonate or deceive anyone.</label>
130
  <label class="sw hidden" id="lipWrap"><span><b>👄 Lip-sync <span class="badge">PRO</span></b><small>Mouths move with the new language (takes ~2 min longer)</small></span><input type="checkbox" id="lipsync"></label>
131
+ </div>
132
 
133
  <details>
134
  <summary>Options</summary>
 
140
  <div><label class="lb" for="gender">Voice gender</label><select id="gender"><option>Female</option><option>Male</option></select></div>
141
  </div>
142
  </details>
143
+ <label class="agree"><input type="checkbox" id="agree"> I made this video, own it or have permission to use it, and I agree to the <a href="terms.html" target="_blank">Terms</a> and <a href="privacy.html" target="_blank">Privacy Policy</a>.</label>
144
  <button id="go" class="btn">Translate</button>
145
  <p class="muted" style="font-size:13px;margin:10px 0 0"><span id="limits"></span> Only use videos you have the right to share. Every video gets an "AI translated" label. AI voices, even cloned ones, are never the real person speaking. Translations can be wrong, so don't rely on them for medical, legal or immigration decisions.</p>
146
  <div id="formErr" class="err"></div>
 
179
  <div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:10px">
180
  <button type="button" class="btn ghost rec" id="recBtn">🎤 Record yourself saying it</button><audio id="recPlay" controls class="hidden" style="max-width:260px;margin:0"></audio>
181
  </div>
182
+ <label class="agree"><input type="checkbox" name="agree" value="1" required> SwitchLingo may store my sentence (and recording, if I'm 18+ and made one) to improve translations. My recording won't be used to identify me, and I can ask to delete it anytime.</label>
183
  <button class="btn" type="submit">Add my sentence</button> <span id="teachMsg" class="muted"></span>
184
  </form>
185
  <p class="muted" style="font-size:13px" id="teachStats"></p>
 
250
  if(r.translators.includes("claude")) $("#engine").value="claude";
251
  if(r.lipsync) $("#lipWrap").classList.remove("hidden");
252
  const vc=()=>$("#vcWrap").style.display=$("#clone").checked?"flex":"none"; $("#clone").onchange=vc; vc();
253
+ try{ const a=localStorage.getItem("oxt_age"); if(a) $("#age").value=a; }catch(e){}
254
+ applyAge();
255
  const qs=new URLSearchParams(location.search), shared=qs.get("url")||qs.get("text")||"";
256
  const m=shared.match(/https?:\/\/\S+/); if(m){ setMode("link"); $("#url").value=m[0]; $("#go").scrollIntoView({behavior:"smooth",block:"center"}); }
257
  initTeach();
 
270
  quality:$("#quality").value,gender:$("#gender").value,voice_engine:$("#voice").value,
271
  clone:$("#clone").checked?"1":"0",lipsync:$("#lipsync").checked?"1":"0"}).forEach(([k,v])=>fd.append(k,v));
272
  if(!$("#agree").checked) return $("#formErr").textContent="Please check the box to confirm you have the right to use this video.";
273
+ const age=$("#age").value;
274
+ if(age==="kid") return $("#formErr").textContent="Sorry, SwitchLingo is for ages 13 and up.";
275
+ if(!age) return $("#formErr").textContent="Please choose your age group first.";
276
+ fd.append("age",age); fd.append("clean",(age==="teen"||$("#clean").checked)?"1":"0");
277
+ if(age==="adult" && $("#clone").checked && outs.includes("dub") && !$("#voiceConsent").checked) return $("#formErr").textContent="To keep the speaker's voice, confirm you have their permission (or turn that switch off).";
278
  fd.append("agree","1"); fd.append("voice_consent",$("#voiceConsent").checked?"1":"0");
279
  $("#go").disabled=true; $("#go").textContent="Uploading…";
280
  try{
 
338
  $("#reqForm").onsubmit=async e=>{ e.preventDefault();
339
  const r=await fetch("/api/language-requests",{method:"POST",body:new FormData(e.target)});
340
  $("#reqMsg").textContent=r.ok?"Thanks, request saved.":"Couldn't save, try again."; if(r.ok) e.target.reset(); };
341
+ function applyAge(){
342
+ const a=$("#age").value, teen=a==="teen";
343
+ document.body.classList.toggle("teen",teen);
344
+ $("#kidMsg").classList.toggle("hidden",a!=="kid");
345
+ $("#go").disabled=(a==="kid");
346
+ $("#clean").checked=teen?true:$("#clean").checked; $("#clean").disabled=teen;
347
+ $("#ageNote").innerHTML=teen?'<span class="teenbadge">Teen mode</span> Clean words · standard AI voice':(a==="adult"?"":"");
348
+ if(teen) $("#voice").value="edge";
349
+ try{ if(a==="teen"||a==="adult") localStorage.setItem("oxt_age",a); }catch(e){}
350
+ }
351
+ $("#age").onchange=applyAge;
352
  let recBlob=null, recorder=null, PROMPTS=[];
353
  async function initTeach(){
354
  const r=await (await fetch("/api/teach/languages")).json(); PROMPTS=r.prompts;
 
373
  }catch(e){ $("#teachMsg").textContent="Microphone not allowed. You can still type it."; }
374
  };
375
  $("#teachForm").onsubmit=async e=>{ e.preventDefault();
376
+ const age=$("#age").value; if(age!=="teen"&&age!=="adult"){ $("#teachMsg").textContent="Choose your age group at the top first (13+)."; return; }
377
+ const fd=new FormData(e.target); fd.append("token",ADMIN); fd.append("age",age);
378
  if(recBlob) fd.append("audio",recBlob,"rec."+((recBlob.type.split("/")[1]||"webm").split(";")[0]));
379
  const r=await fetch("/api/teach",{method:"POST",body:fd});
380
  $("#teachMsg").textContent=r.ok?"Thank you! 🙏 Added.":"Couldn't save, try again.";
app/static/privacy.html CHANGED
@@ -21,7 +21,10 @@
21
  <p>Hugging Face (hosting and the private dataset). Depending on the options you pick, text or audio may be sent to Microsoft (AI voices), Google (translation), Anthropic (Claude translation), ElevenLabs (premium voices; any cloned voice is deleted right after your job) or Replicate (lip-sync). They process data for us under their own terms.</p>
22
 
23
  <h2>What we never do</h2>
24
- <ul><li>Sell or share your personal information for advertising.</li><li>Use tracking or advertising cookies.</li><li>Knowingly collect data from anyone under 18.</li></ul>
 
 
 
25
 
26
  <h2>AI labels</h2>
27
  <p>Videos we create carry a visible "AI translated · SwitchLingo" label, plus hidden metadata saying the file is AI-generated, by which system and when.</p>
 
21
  <p>Hugging Face (hosting and the private dataset). Depending on the options you pick, text or audio may be sent to Microsoft (AI voices), Google (translation), Anthropic (Claude translation), ElevenLabs (premium voices; any cloned voice is deleted right after your job) or Replicate (lip-sync). They process data for us under their own terms.</p>
22
 
23
  <h2>What we never do</h2>
24
+ <ul><li>Sell or share your personal information for advertising.</li><li>Use tracking or advertising cookies.</li><li>Knowingly collect data from children under 13.</li></ul>
25
+
26
+ <h2>Teens (13–17)</h2>
27
+ <p>Teen mode never clones voices, never accepts voice recordings, never uses premium third-party voices, and always hides swear words. The age group you pick is saved only in your own browser and attached to your translation job (deleted after 24 hours), so we can apply the right protections.</p>
28
 
29
  <h2>AI labels</h2>
30
  <p>Videos we create carry a visible "AI translated · SwitchLingo" label, plus hidden metadata saying the file is AI-generated, by which system and when.</p>
app/static/terms.html CHANGED
@@ -5,7 +5,11 @@
5
  <p>SwitchLingo ("we") translates the speech in videos and audio with AI. By using it you agree to these terms, our <a href="privacy.html">Privacy Policy</a> and the Acceptable Use rules below.</p>
6
 
7
  <h2>1. Who can use SwitchLingo</h2>
8
- <p>You must be <b>18 or older</b>. SwitchLingo is not for children, and we don't knowingly collect information from anyone under 18.</p>
 
 
 
 
9
 
10
  <h2>2. Your videos and your rights</h2>
11
  <ul>
@@ -47,7 +51,7 @@
47
  <p>When you rate or fix a translation, or teach a sentence or recording, you let us store it and use it to improve SwitchLingo's translations and models. Don't include anyone's private information. You can ask us to delete your contributions with the <a href="report.html">report form</a> (choose "Privacy request").</p>
48
 
49
  <h2>8. Paid plans</h2>
50
- <p>When paid plans are offered, checkout will clearly show the price, how often you're billed, that the plan renews automatically until you cancel, and how to cancel. You'll be able to <b>cancel online at any time</b>, and we'll send the renewal and trial reminders required by law.</p>
51
 
52
  <h2>9. No warranty and limited liability</h2>
53
  <p>SwitchLingo is provided "as is" without warranties. To the fullest extent the law allows, we aren't liable for indirect or consequential damages, or for how you use translations or AI voices. Our total liability is limited to the amount you paid us in the last 12 months (or $50 if you paid nothing). You agree to cover claims that come from your content or your misuse of SwitchLingo.</p>
 
5
  <p>SwitchLingo ("we") translates the speech in videos and audio with AI. By using it you agree to these terms, our <a href="privacy.html">Privacy Policy</a> and the Acceptable Use rules below.</p>
6
 
7
  <h2>1. Who can use SwitchLingo</h2>
8
+ <ul>
9
+ <li><b>Ages 13–17 use Teen mode:</b> translation, subtitles and the standard AI voice, with Clean mode always on. Voice cloning, lip-sync, premium voices, voice recordings and payments aren't available in Teen mode. Teens should use SwitchLingo with a parent or guardian's knowledge.</li>
10
+ <li><b>18 and older</b> can use every feature.</li>
11
+ <li><b>Under 13:</b> SwitchLingo isn't for children under 13, and we don't knowingly collect information from them. If you believe a child under 13 used SwitchLingo, tell us through the <a href="report.html">report form</a> and we'll delete it.</li>
12
+ </ul>
13
 
14
  <h2>2. Your videos and your rights</h2>
15
  <ul>
 
51
  <p>When you rate or fix a translation, or teach a sentence or recording, you let us store it and use it to improve SwitchLingo's translations and models. Don't include anyone's private information. You can ask us to delete your contributions with the <a href="report.html">report form</a> (choose "Privacy request").</p>
52
 
53
  <h2>8. Paid plans</h2>
54
+ <p>Paid plans are for adults (18+). When paid plans are offered, checkout will clearly show the price, how often you're billed, that the plan renews automatically until you cancel, and how to cancel. You'll be able to <b>cancel online at any time</b>, and we'll send the renewal and trial reminders required by law.</p>
55
 
56
  <h2>9. No warranty and limited liability</h2>
57
  <p>SwitchLingo is provided "as is" without warranties. To the fullest extent the law allows, we aren't liable for indirect or consequential damages, or for how you use translations or AI voices. Our total liability is limited to the amount you paid us in the last 12 months (or $50 if you paid nothing). You agree to cover claims that come from your content or your misuse of SwitchLingo.</p>
docs/LEGAL-COMPLIANCE.md CHANGED
@@ -8,7 +8,7 @@
8
  | **DMCA §512(c)** (copyright safe harbor) | Users upload or link other people's videos. Safe harbor needs fast takedowns, a repeat-infringer policy, and a **designated agent registered with the Copyright Office** | Report form with all DMCA notice elements and a sworn statement; instant removal; blocklist of identical files; repeat-infringer policy in the Terms. ⏳ **Thai: register the agent** |
9
  | **TAKE IT DOWN Act** (FTC enforcement since May 2026; ~$53k per violation) | Sites that host user content must remove non-consensual intimate imagery (including AI fakes) within **48 hours** and remove identical copies | Public report form (no login); auto-removal on submission; SHA-256 blocklist for identical copies; good-faith removal |
10
  | **FTC Act §5** (deception) | Don't mislead people about AI voices or results | Visible "AI translated" label and metadata on every video; "never the real person" notices; accuracy disclaimer |
11
- | **COPPA** | Collecting data from under-13s needs parental consent | 18+ only (Terms + checkbox); no accounts |
12
  | **ROSCA** (online subscriptions) | Clear terms, express consent, easy cancellation | Built into the paid-plans section of the Terms; enforced when checkout is built |
13
 
14
  ## State
 
8
  | **DMCA §512(c)** (copyright safe harbor) | Users upload or link other people's videos. Safe harbor needs fast takedowns, a repeat-infringer policy, and a **designated agent registered with the Copyright Office** | Report form with all DMCA notice elements and a sworn statement; instant removal; blocklist of identical files; repeat-infringer policy in the Terms. ⏳ **Thai: register the agent** |
9
  | **TAKE IT DOWN Act** (FTC enforcement since May 2026; ~$53k per violation) | Sites that host user content must remove non-consensual intimate imagery (including AI fakes) within **48 hours** and remove identical copies | Public report form (no login); auto-removal on submission; SHA-256 blocklist for identical copies; good-faith removal |
10
  | **FTC Act §5** (deception) | Don't mislead people about AI voices or results | Visible "AI translated" label and metadata on every video; "never the real person" notices; accuracy disclaimer |
11
+ | **COPPA** | Collecting data from under-13s needs parental consent | Neutral age screen; under 13 blocked; 13–17 in Teen mode (no cloning, recordings, premium voices or payments; Clean mode forced, enforced on the server); 18+ full features |
12
  | **ROSCA** (online subscriptions) | Clear terms, express consent, easy cancellation | Built into the paid-plans section of the Terms; enforced when checkout is built |
13
 
14
  ## State