Skip to content

feat: add 13 new languages (2B+ speakers), unified pipeline, word quality infrastructure#149

Merged
Hugo0 merged 22 commits into
mainfrom
worktree-add-languages
Mar 14, 2026
Merged

feat: add 13 new languages (2B+ speakers), unified pipeline, word quality infrastructure#149
Hugo0 merged 22 commits into
mainfrom
worktree-add-languages

Conversation

@Hugo0
Copy link
Copy Markdown
Owner

@Hugo0 Hugo0 commented Mar 14, 2026

Summary

Major language expansion adding 13 new languages covering 2B+ speakers, with infrastructure improvements for word quality at scale.

New languages (13)

Language Code Main Supplement Daily Speakers Script
Hindi hi 17,481 34,799 15 600M Devanagari (grapheme)
Bengali bn 8,119 22,196 2,000 230M Bengali (grapheme)
Urdu ur 6,564 22,332 2,000 230M Arabic script
Japanese ja 21,584 2,000 125M Hiragana (JMdict source)
Punjabi pa 12,467 2,553 2,000 113M Gurmukhi (grapheme)
Marathi mr 432 83M Devanagari (grapheme)
Hausa ha 5,325 435 77M Latin
Yoruba yo 4,326 896 47M Latin (tone marks)
Indonesian id 7,459 16,875 1,994 43M Latin
Uzbek uz 567 34M Latin
Tagalog tl 3,865 6,128 1,992 28M Latin
Malay ms 7,698 6,165 1,995 19M Latin
Albanian sq 6,855 8,430 2,000 7.5M Latin

Word quality improvements

  • Unified pipeline: One code path for all languages (previously fragmented between FrequencyWords and ad-hoc Leipzig scripts with different filters)
  • Dictionary verification gate: Daily words must appear in kaikki.org, Leipzig, or Hunspell — prevents brands (Tesla), politicians (Obama), tech junk (MySQL) from becoming daily answers
  • wordfreq as primary frequency source: Multi-source blend (Wikipedia + Reddit + Twitter + Google Books + OpenSubtitles) instead of OpenSubtitles alone
  • English contamination filter: Flags words more common in English than the target language
  • Global profanity blocklist: 98 entries, applied across all languages
  • Supplement expansion: +495K valid guess words across 56 languages via Leipzig + wordfreq

Infrastructure

  • Grapheme mode (graphemes.ts): Correct character counting for Devanagari/Bengali/Gurmukhi scripts
  • Word history freeze: Two-layer safety — past daily words cached to disk + pre-frozen to git. Word list changes never alter past puzzles.
  • Korean daily words: 1,981 frequency-ranked daily words (first time Korean has a curated daily pool)
  • Japanese from JMdict: 21K words sourced from JMdict dictionary with strict expression filtering, frequency-ranked by wordfreq
  • Architecture plan: docs/WORD_DATA_ARCHITECTURE.md — design for future YAML migration, multi-mode support, LLM curation

Safety — existing languages

No main word list was modified for any existing language. All changes to existing languages:

  • Supplements grew (more valid guesses, never fewer)
  • Daily words got cleaner (brands/names filtered out by dictionary gate)
  • Word history safety files added
  • Past daily words are frozen and unchanged

Top language overlap with previous daily words:

  • English: UNCHANGED (not processed)
  • Finnish: UNCHANGED (not processed)
  • Arabic: 100% overlap
  • Hebrew: 100% overlap
  • Portuguese: 98%
  • French: 96%
  • German: 93% (lost: "cyber", "tesla", "bosch" — brands correctly filtered)
  • Spanish: 90%
  • Italian: 87%

Known limitations (to address in follow-up)

  • Hindi has only 15 daily words (grapheme-mode words don't match dictionary sources well)
  • Indonesian/Tagalog have some English loanword contamination (legitimate loanwords vs contamination is ambiguous — LLM curation planned)
  • Word history files have duplicates from freeze script bug (positional, can't deduplicate without shifting future days)
  • Japanese word list has ~7% phrase fragments (LLM curation will clean these)
  • SOURCES.md incomplete for some new languages (uz, yo)

Files changed

  • 247 files across 78 language directories
  • 13 new language directories
  • 56 languages with expanded supplements
  • New scripts: add_language.py, download_sources.py, freeze_past_words.py
  • Frontend: grapheme mode support
  • Docs: WORD_DATA_ARCHITECTURE.md (future migration plan)

Test plan

  • `uv run pytest tests/` — 2472 passed, 305 skipped, 0 failed
  • `pnpm test` — 81 passed
  • Manual: verify new languages load and are playable
  • Manual: verify grapheme mode (hi, bn, pa)
  • Manual: verify Japanese hiragana keyboard
  • Manual: spot-check daily words for quality in top 10 languages

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 14, 2026

📝 Walkthrough

Walkthrough

Adds grapheme-cluster aware processing and a per-language grapheme_mode flag across frontend, server, tests, and tooling; introduces grapheme utilities; updates word-loading/QA to respect grapheme_mode; and adds many new language data assets, keyboards, curated schedules, and language-management scripts.

Changes

Cohort / File(s) Summary
Frontend grapheme support
frontend/src/game.ts, frontend/src/graphemes.ts, frontend/src/types/index.ts
Add splitWord(word, graphemeMode) and grapheme_mode config; switch game logic to operate on grapheme clusters (targetChars/canonicalChars) for matching, normalization, and display.
Server / webapp integration
webapp/app.py, webapp/data/.../language_config.json (multiple langs)
Change load_words(lang, lang_config=None) and reorder init so language_config is available; apply grapheme-length QA when grapheme_mode enabled.
Tests
tests/conftest.py, tests/test_daily_word.py, tests/test_word_lists.py
Add grapheme-aware helpers and adapt tests to validate 5 grapheme-cluster words when grapheme_mode is true.
Language data & keyboards
webapp/data/languages/*/* (bn, hi, mr, id, sq, tl, ms, ur, uz, yo, …)
Add many language folders: language_config.json (some with grapheme_mode: true), character lists, keyboard JSONs, 5-word/main/daily lists, SOURCES.md, and many generated *_curated_schedule.txt files.
Language tooling scripts
scripts/add_language.py, scripts/download_sources.py, scripts/improve_word_lists.py, scripts/freeze_past_words.py, scripts/profanity_blocklist.txt
Add language bootstrap, multi-source downloads/extraction, wordlist improvement (profanity and contamination filters), schedule freezing, and a profanity blocklist.
Packaging
pyproject.toml
Add grapheme>=0.6.0 dependency.
Large wordlist edits
many webapp/data/languages/*/*_daily_words.txt, *_5words.txt, supplement files
Massive data-only additions/edits across many language wordlists and daily lists (insertions, deletions, and replacements).

Sequence Diagram(s)

sequenceDiagram
    participant Player as Player (Client)
    participant Frontend as Frontend (game.ts)
    participant Server as Webapp (app.py)
    participant Data as Language Data
    rect rgba(100,149,237,0.5)
    Player->>Frontend: Submit guess
    Frontend->>Frontend: splitWord(guess, graphemeMode)\nsplitWord(target, graphemeMode)
    Frontend->>Frontend: First-pass exact matches\nSecond-pass presence checks (targetChars)
    Frontend->>Server: POST normalized guess / result
    Server->>Data: load_words(lang, lang_config)\nuses grapheme_mode for QA
    Server-->>Frontend: validation / response
    Frontend-->>Player: show colored feedback (canonical display rebuilt by grapheme clusters)
    end
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

Poem

🐰 I nibbled a cluster beneath moonlight,

Graphemes in rows, each hug and each bite,
New keyboards and tongues join the play,
Clusters hop in—hooray for today!
Thump-thump, the rabbit codes away.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch worktree-add-languages

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 17

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

🟡 Minor comments (8)
webapp/data/languages/ms/ms_5words_supplement.txt-1-1 (1)

1-1: ⚠️ Potential issue | 🟡 Minor

Empty supplement file is handled gracefully by the backend.

The supplement file can safely be empty—the loading function catches FileNotFoundError and returns an empty list. However, verify the file contains no blank lines, as the current filtering logic would add empty strings to the word list if blank lines are present. Either ensure the file is completely empty (0 bytes) or add a check to exclude empty strings:

supplemental_words = [
    word.strip() for word in f 
    if word.strip()  # Filter out empty lines
    if all([char in language_characters[lang] for char in word.strip()])
]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/ms/ms_5words_supplement.txt` at line 1, The supplement
loader currently can add blank lines as empty strings into supplemental_words;
update the list comprehension that builds supplemental_words (the one using
language_characters[lang]) to call word.strip() once, skip any entries where
word.strip() is falsy, and then validate characters, e.g., compute s =
word.strip() and use if s and all(char in language_characters[lang] for char in
s) so blank lines are excluded.
webapp/data/languages/ms/ms_daily_words.txt-72-72 (1)

72-72: ⚠️ Potential issue | 🟡 Minor

Possible OCR/transcription errors in word list.

Several entries appear to be OCR errors or subtitle transcription artifacts rather than valid Malay words:

  • Line 72: aslng (likely "asing"?)
  • Line 146: begku
  • Line 147: beium (likely "belum"?)
  • Line 201: boieh (likely "boleh"?)

Consider running a spell-check or validation against a Malay dictionary to clean up these entries.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/ms/ms_daily_words.txt` at line 72, The word list
contains probable OCR/transcription errors (entries 'aslng', 'begku', 'beium',
'boieh'); run a validation pass against a Malay dictionary or spell-checker and
either correct these tokens to their likely forms ('aslng' → 'asing', 'beium' →
'belum', 'boieh' → 'boleh') or remove ambiguous entries (e.g., verify 'begku' —
correct to 'beku' or 'beguk' only after confirmation). Update the
ms_daily_words.txt entries accordingly and add a short unit/scripted check that
flags non-dictionary tokens (so future OCR artifacts are caught) referencing
these tokens as examples.
webapp/data/languages/tl/tl_daily_words.txt-367-367 (1)

367-367: ⚠️ Potential issue | 🟡 Minor

Remove duplicate entries to avoid selection bias.

konde (Line 367 and Line 904) and sukat (Line 1703 and Line 1710) are duplicated. If this file is sampled directly, duplicates over-weight those words.

Also applies to: 904-904, 1703-1703, 1710-1710

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/tl/tl_daily_words.txt` at line 367, Remove duplicated
word entries to prevent sampling bias: delete the extra occurrences of "konde"
and "sukat" so each appears only once in the tl_daily_words word list; locate
the duplicate tokens "konde" and "sukat" (the second occurrences in the file)
and remove those duplicate lines, leaving one canonical instance of each word
and preserving file encoding/newline conventions.
webapp/data/languages/yo/yo_5words.txt-88-88 (1)

88-88: ⚠️ Potential issue | 🟡 Minor

Deduplicate repeated entries in the word list.

okuta and ijẹbu each appear twice (Line 88/765 and Line 121/404). Deduping prevents uneven selection weighting.

Also applies to: 121-121, 404-404, 765-765

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/yo/yo_5words.txt` at line 88, Remove duplicate word
entries from the Yoruba word list by locating the repeated tokens "ọkuta" and
"ijẹbu" and deleting the extra occurrences so each word appears only once;
ensure you perform a file-wide de-duplication (compare full normalized lines,
trimming whitespace) and preserve one canonical instance of each duplicate to
avoid skewing selection weights.
webapp/data/languages/tl/language_config.json-40-58 (1)

40-58: ⚠️ Potential issue | 🟡 Minor

Missing UI localization keys in Tagalog config.

The ui section is missing 8 keys compared to other language configs: guess_distribution, haptic_feedback, haptic_feedback_desc, install_app_desc, report_issue, sound_effects, sound_effects_desc, and view_source. Without fallback handling, these labels will render as undefined in the UI.

Add these missing translations to maintain key parity with other language configs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/tl/language_config.json` around lines 40 - 58, The
Tagalog language_config.json's "ui" object is missing eight keys present in
other language configs (guess_distribution, haptic_feedback,
haptic_feedback_desc, install_app_desc, report_issue, sound_effects,
sound_effects_desc, view_source); add these keys to the "ui" object in
language_config.json with appropriate Tagalog translations (or temporary English
fallbacks) so the UI won't display undefined for those labels—update the same
"ui" block that contains settings, dark_mode, keyboard_layout, etc., ensuring
key names exactly match the other language files.
webapp/data/languages/ur/ur_5words_supplement.txt-1-1 (1)

1-1: ⚠️ Potential issue | 🟡 Minor

Add supplemental 5-letter words to ur_5words_supplement.txt.

The file is empty despite containing only a blank line. While the main ur_5words.txt has 6,564 valid Urdu words and the application gracefully handles empty supplements, this creates a content gap. Related languages with Perso-Arabic script—particularly Arabic with 43,798 supplemental words—indicate that additional 5-letter word variants should be available. Consider populating this file with supplemental Urdu words from frequency corpora to improve word variety and consistency with the pattern used for most other languages in the project.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/ur/ur_5words_supplement.txt` at line 1, The
supplemental Urdu 5-letter word file ur_5words_supplement.txt is empty; add a
curated list of additional 5-letter Urdu words (one per line) to supplement
ur_5words.txt so the app has broader coverage—use high-frequency corpora and
wordlists (e.g., news corpora, OSCAR, or internal frequency lists) to extract
valid 5-character Perso‑Arabic script tokens, deduplicate against
webapp/data/languages/ur/ur_5words.txt, normalize Unicode shaping/diacritics
consistently with ur_5words.txt, and save the final sorted, newline-separated
set back into ur_5words_supplement.txt.
webapp/data/languages/ur/ur_keyboard.json-5-5 (1)

5-5: ⚠️ Potential issue | 🟡 Minor

Use native-script label for Urdu keyboard.

Line 5 uses "Urdu"; this should be localized (e.g., "اردو") to match native UI expectations.

🌐 Suggested patch
-            "label": "Urdu",
+            "label": "اردو",
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/ur/ur_keyboard.json` at line 5, Update the "label"
value for the Urdu keyboard entry to use the native-script name instead of the
English word; locate the JSON object containing the "label" key (currently
`"label": "Urdu"`) in ur_keyboard.json and replace the value with the
native-script string (e.g., `"اردو"`) so the keyboard displays the localized
name in the UI.
webapp/app.py-162-165 (1)

162-165: ⚠️ Potential issue | 🟡 Minor

Missing lowercase normalization for grapheme_mode languages.

When use_graphemes is True (line 163), words are filtered but not lowercased, unlike the non-grapheme path (line 165) which applies word.lower(). This inconsistency could cause issues if the word list contains uppercase characters.

🐛 Proposed fix
     if use_graphemes:
-        _5words = [word for word in _5words if word.strip() and word_len(word) == 5]
+        _5words = [word.lower() for word in _5words if word.strip() and word_len(word) == 5]
     else:
         _5words = [word.lower() for word in _5words if word_len(word) == 5 and word.isalpha()]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/app.py` around lines 162 - 165, When use_graphemes is True the list
comprehension for _5words filters by word.strip() and word_len(word) == 5 but
does not normalize case; update the grapheme branch that constructs _5words to
also lowercase entries (e.g., apply word.lower() or call .casefold() on the
retained word) so normalization matches the non-grapheme branch; touch the list
comprehension that references use_graphemes, _5words, and word_len to
incorporate the lowercasing.
🧹 Nitpick comments (5)
webapp/data/languages/uz/uz_characters.txt (1)

26-26: Verify Uzbek apostrophe codepoint consistency (ʻ vs vs ').

Line 26 uses U+02BB. If Uzbek word lists or keyboard JSON use different apostrophe codepoints, valid words can become untypeable or mismatched during validation.

Run this read-only check to confirm all Uzbek assets use a single apostrophe variant:

#!/bin/bash
set -euo pipefail

# Scan Uzbek language assets for apostrophe-like codepoints.
fd 'uz_.*\.(txt|json)$' | while read -r file; do
  python - "$file" <<'PY'
import sys, pathlib
p = pathlib.Path(sys.argv[1])
text = p.read_text(encoding="utf-8")
variants = {
    "U+02BB (ʻ)": "\u02bb",
    "U+2019 (’)": "\u2019",
    "U+0027 (')": "'",
    "U+02BC (ʼ)": "\u02bc",
}
counts = {name: text.count(ch) for name, ch in variants.items() if text.count(ch) > 0}
if counts:
    print(f"{p}: {counts}")
PY
done

Expected result: one canonical apostrophe codepoint used consistently in Uzbek *_characters.txt, keyboard, and word-list files.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/uz/uz_characters.txt` at line 26, Line 26 of
uz_characters.txt uses U+02BB (ʻ) while other Uzbek assets may use U+2019 (’) or
U+0027 (') or U+02BC (ʼ); run the provided scan across all Uzbek assets (uz_*
.txt and keyboard/word-list JSONs) to detect which apostrophe codepoints appear,
choose the canonical codepoint your project uses (e.g. the one already present
in keyboard JSONs or word lists), and replace all non-canonical variants with
that canonical codepoint (including updating uz_characters.txt line 26) so all
Uzbek character/keyboard/word-list files use a single apostrophe codepoint
consistently.
tests/test_daily_word.py (1)

19-19: Use shared word_length helper to avoid duplicated grapheme logic.

At Line 19 and Lines 129-136, this reimplements logic already centralized in tests/conftest.py::word_length, which increases maintenance drift risk.

♻️ Proposed refactor
-from tests.conftest import ALL_LANGUAGES, load_language_config, load_word_list
+from tests.conftest import ALL_LANGUAGES, load_word_list, word_length
@@
-        config = load_language_config(lang)
-        if config and config.get("grapheme_mode") == "true":
-            import grapheme
-
-            wlen = grapheme.length(word)
-        else:
-            wlen = len(word)
+        wlen = word_length(word, lang)
         assert wlen == 5, f"{lang}: Daily word '{word}' is {wlen} units (expected 5)"

Also applies to: 129-136

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/test_daily_word.py` at line 19, The test duplicates
grapheme/character-count logic that already exists as the word_length helper in
tests/conftest.py; remove the duplicated grapheme logic in
tests/test_daily_word.py (both where it appears around the top import area and
again at lines 129-136) and instead import and call word_length from
tests.conftest (add word_length to the from tests.conftest import ... list
alongside ALL_LANGUAGES, load_language_config, load_word_list) where length
calculation is needed, ensuring any variable names (e.g., the local length
variable) match the helper's return.
tests/conftest.py (1)

122-125: Make is_grapheme_mode tolerant to boolean config values.

At Line 125, only the string "true" is accepted. A JSON boolean true would be treated as disabled.

💡 Proposed refactor
 def is_grapheme_mode(lang_code: str) -> bool:
     """Check if a language uses grapheme-cluster counting (e.g., Hindi)."""
     config = load_language_config(lang_code)
-    return bool(config and config.get("grapheme_mode") == "true")
+    if not config:
+        return False
+    value = config.get("grapheme_mode")
+    return value is True or (isinstance(value, str) and value.lower() == "true")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/conftest.py` around lines 122 - 125, The function is_grapheme_mode
currently only recognizes the literal string "true" from load_language_config,
so JSON boolean true or other truthy values are ignored; update is_grapheme_mode
to read the grapheme_mode value into a variable and accept both boolean True and
case-insensitive string "true" (and generally truthy values returned by the
config) when returning True; reference the is_grapheme_mode function and the
config.get("grapheme_mode") lookup to implement this tolerant check.
webapp/app.py (1)

149-151: Consider moving grapheme import to module level.

While the function-level import works since load_words is only called at startup, moving import grapheme to the module level alongside other imports would be more idiomatic and avoid repeated import lookups.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/app.py` around lines 149 - 151, The grapheme import is inside
load_words, which is suboptimal; move the import to module level with the other
imports and remove the local import inside the function. Update the top of the
module to include "import grapheme" (or alias as _grapheme if that convention is
used elsewhere) and then use that module inside load_words (function name:
load_words) instead of re-importing it locally.
tests/test_word_lists.py (1)

42-45: Consider moving grapheme import to module level.

The import grapheme inside the conditional means it's re-imported on each test invocation for grapheme-mode languages. Since grapheme is already a project dependency, moving it to the top-level imports would be cleaner.

♻️ Suggested refactor
 import pytest
+import grapheme

 from scripts.improve_word_lists import is_roman_numeral

Then update line 45:

-            import grapheme
-
             invalid = [(w, grapheme.length(w)) for w in words if grapheme.length(w) != 5]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/test_word_lists.py` around lines 42 - 45, Move the inline import of the
grapheme module to the top-level imports of tests/test_word_lists.py so it isn't
re-imported on each test run; remove the in-function "import grapheme" and leave
the conditional that uses grapheme.length unchanged (the variable invalid and
the config check can remain), ensuring grapheme is imported once at module scope
and referenced by name in the existing block.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@scripts/add_language.py`:
- Around line 598-615: The merge steps for Kaikki and Leipzig (functions
load_kaikki_words and load_leipzig_words, and the all_words merge loops) add
words but do not record those feeds in the provenance output (SOURCES.md);
update the source-tracking logic the code uses for other feeds (the same
mechanism that records FrequencyWords and wordfreq) to also add "Kaikki" and
"Leipzig Corpora" when their loaders return non-empty results (e.g., push into
the sources list/set used when writing SOURCES.md), and ensure the final
SOURCES.md writer includes those two entries so generated assets list all
contributing feeds.
- Around line 718-738: generate_config currently only emits a fixed set of
fields so top-level flags like grapheme_mode are dropped; update
generate_config(lang, lang_def) to propagate any extra top-level keys from
lang_def into the returned config (except the known/reserved keys "name",
"native", "timezone", "rtl", "diacritic_map", and "config") and avoid
overwriting fields already set, so flags such as grapheme_mode are preserved
when serializing; keep special handling for diacritic_map and the merged
"config" sections as-is.
- Around line 699-715: The current generation filters characters with
c.isalpha(), which drops Unicode combining marks (Mn, Mc) needed for Devanagari
and other Indic scripts; update the filtering in the chars list comprehension to
keep both letter and mark categories (use unicodedata.category and include
characters where category starts with 'L' or 'M') so vowel signs, anusvara,
visarga, etc. are preserved when building rows, leaving the rest of the row
logic (row_size, rows, adding "⇨"/"⌫", and returning the layouts) unchanged.
- Around line 542-556: Replace the codepoint-based filters in
_get_wordfreq_5letter (the len(w) == 5 and w.isalpha() checks) with
grapheme-cluster-aware logic: import the third-party regex module and compute
clusters = regex.findall(r'\X', w); require len(clusters) == 5 and that each
cluster contains at least one letter (check characters' Unicode category
startswith 'L' via unicodedata.category) to allow base+combining-mark graphemes;
if regex isn't available, fall back to the existing behavior or log and skip
gracefully. This keeps the function name and overall loop intact while ensuring
Hindi/Marathi/Bengali words with combining marks are counted correctly.

In `@scripts/download_sources.py`:
- Around line 347-349: The current filter uses len(w) == 5 and w.isalpha() which
breaks on grapheme clusters and combining marks; change the length check to
count Unicode grapheme clusters (e.g., use regex.findall(r'\X', w) and check
len(...) == 5) and replace isalpha() with a check that allows base letters plus
combining marks (e.g., all(c.isalpha() or unicodedata.combining(c) for c in w));
also use casefold() instead of lower() for safer case comparison (w ==
w.casefold()). Apply these replacements to the words = sorted(...) extraction
and the other identical filter sites in the file where the same
len/isalpha/lower pattern is used.

In `@scripts/improve_word_lists.py`:
- Around line 282-291: The _load_word_file helper currently uses codepoint-based
checks (len(w) == 5 and w.isalpha()) which rejects valid grapheme-mode words;
change _load_word_file to accept a grapheme_mode: bool parameter and, when true,
validate length by counting grapheme clusters (e.g. using the regex module's \X
or a grapheme library) and validate characters using Unicode categories (letters
+ combining marks) instead of str.isalpha(); keep the existing fast codepath for
grapheme_mode=False. Then update callers (load_kaikki_words,
load_hunspell_words, load_kbbi_words) to pass grapheme_mode based on the
language configuration (e.g., languages in EXTRA_SOURCES that require
grapheme-mode) so grapheme-mode languages like Hindi are handled correctly.

In `@tests/test_word_lists.py`:
- Around line 40-47: Both test_supplement_words_are_5_letters and
test_daily_words_are_5_letters currently use len(w) and need the same
grapheme-aware logic as test_all_words_are_5_letters: load the language config
via load_language_config(lang), check config.get("grapheme_mode") == "true",
import grapheme when needed, and compute invalid = [(w, grapheme.length(w)) for
w in words if grapheme.length(w) != 5] otherwise fall back to invalid = [(w,
len(w)) for w in words if len(w) != 5]; update those two tests to use the same
config/grapheme handling (referencing variables/functions config,
load_language_config, grapheme, words, and invalid).

In `@webapp/data/languages/id/id_daily_words.txt`:
- Line 196: Remove the offensive entries 'bitch', 'nigga', and 'pussy' from the
Indonesian daily word list (delete those exact tokens from the list), ensure the
file remains properly newline-separated with no extra blank lines, run a quick
grep/search to confirm no other profane tokens remain, and commit the cleaned
file with a clear message indicating removal of profanity.
- Around line 224-326: The id_daily_words.txt list contains English/foreign
words (e.g., break, clear, count, cream, cross and others noted) causing "daily
contamination" — remove or replace all non-Indonesian entries from
webapp/data/languages/id/id_daily_words.txt; specifically scan for and delete
the listed offenders (break, clear, count, cream, cross, force, front, human,
music, until, etc.), re-run the provided verification regexes to confirm no
common English tokens remain, and ensure the file only contains valid Indonesian
words so the "0% daily contamination" claim holds.

In `@webapp/data/languages/ms/ms_daily_words.txt`:
- Line 192: Remove or replace the six English tokens found in the Malay daily
word list: "bitch", "didnt", "doesn", "pussy", "thats", and "youre" in
ms_daily_words.txt; either delete them or substitute each with a valid Malay
word of equivalent form, preserving the file's plain-text line-per-word format
and encoding, and ensure any downstream word-counts or validation scripts still
pass after the change.

In `@webapp/data/languages/sq/language_config.json`:
- Line 8: The "right_to_left" field in language_config.json is currently a
string ("false"); change its value to a boolean false (right_to_left: false) so
consumers performing boolean checks receive the correct type; update the
"right_to_left" entry in webapp/data/languages/sq/language_config.json (and
verify other language_config.json files for similar stringified booleans) to use
the boolean literal instead of a quoted string.

In `@webapp/data/languages/tl/tl_daily_words.txt`:
- Line 263: The daily word list contains clear non-Tagalog/noise entries such as
the token "bitch" in tl_daily_words.txt (and similar entries at the other
reported positions); remove these non-Tagalog/noise tokens from the file and
instead re-run the generation pipeline with the language-filtering step enabled
so the file is regenerated systematically (ensure the filter logic that
validates Tagalog tokens is applied before writing tl_daily_words.txt and that
the pipeline emits only validated entries).

In `@webapp/data/languages/ur/ur_daily_words.txt`:
- Around line 1-2000: Daily answer pool contains OCR/noise-corrupted tokens that
must be removed or flagged; scan webapp/data/languages/ur/ur_daily_words.txt and
prune entries matching the example corrupt tokens (e.g., "أہغاد", "اطءلہ",
"اپددر", "خہجءز", "ضآؤاط", "وففوہ", "ھمممم", "یلئڈی") by either deleting them or
moving them to a QA bucket, add an automated validation step (Unicode
script/regex) to warn on non-standard Urdu/Arabic letter sequences and
punctuation, and regenerate the list so only valid lexical tokens remain (keep
records of pruned tokens for manual review).

In `@webapp/data/languages/uz/SOURCES.md`:
- Around line 1-2: The SOURCES.md currently only contains a header and lacks
dataset provenance; update webapp/data/languages/uz/SOURCES.md to list each
Uzbek dataset used with its name, canonical source URL, license identifier
(e.g., CC-BY-4.0, CC0), and attribution/contributor info so licensing can be
audited; ensure each entry follows a consistent bullet or table format and
include any dataset-specific notes (e.g., subset, preprocessing) to make
provenance unambiguous.

In `@webapp/data/languages/uz/uz_5words.txt`:
- Around line 1-567: The uz_5words.txt file contains 18 entries that use the
modifier letter apostrophe (U+02BB) and therefore are 6 codepoints (e.g. toʻrt,
oʻyin, doʻst, oʻlar, oʻtov, urugʻ, boʻsh, gʻozi, gʻarb, boʻri, etc.), violating
the 5-codepoint constraint; fix by either replacing each listed 6-codepoint word
with a true 5-codepoint Uzbek word (ensure replacements are 5 Unicode codepoints
exactly) or enable grapheme-aware length handling for Uzbek so sequences like oʻ
and gʻ are treated as single graphemes (adjust the validator/config to set
grapheme_mode for Uzbek); update the entries for the specific words mentioned
(toʻrt, oʻyin, doʻst, oʻlar, oʻtov, urugʻ, boʻsh, gʻozi, gʻarb, boʻri and the
remaining problematic tokens) accordingly.

In `@webapp/data/languages/yo/SOURCES.md`:
- Around line 1-2: The SOURCES.md for Yoruba currently only contains a header
and lacks provenance; update webapp/data/languages/yo/SOURCES.md to include
per-asset source entries (source URL, license, extraction date),
processing/normalization steps applied (tokenization, filtering, deduplication,
scripts used), and a mapping from each Yoruba asset filename to its source entry
so the dataset is auditable and reproducible; use the existing "# Yoruba
Language Data — Sources" header as the anchor and follow the proposed template
fields (source URL, license, extraction date, normalization steps) for each
listed asset.

In `@webapp/data/languages/yo/yo_keyboard.json`:
- Around line 30-42: The keyboard JSON row currently containing
"⇨","z","x","c","v","b","n","m","ẹ","ọ","ṣ","⌫" needs to include Yoruba tonal
vowels (à, á, è, é, ì, í, ò, ó, ù, ú) and their uppercase forms so users can
type marked words; update webapp/data/languages/yo/yo_keyboard.json to add those
characters into the appropriate rows (near the vowel keys where "ẹ","ọ","ṣ"
appear) and also update the character set file yo_characters.txt to include all
tonal vowels and their capital variants (À, Á, È, É, Ì, Í, Ò, Ó, Ù, Ú) alongside
existing characters so the game recognizes them.

---

Minor comments:
In `@webapp/app.py`:
- Around line 162-165: When use_graphemes is True the list comprehension for
_5words filters by word.strip() and word_len(word) == 5 but does not normalize
case; update the grapheme branch that constructs _5words to also lowercase
entries (e.g., apply word.lower() or call .casefold() on the retained word) so
normalization matches the non-grapheme branch; touch the list comprehension that
references use_graphemes, _5words, and word_len to incorporate the lowercasing.

In `@webapp/data/languages/ms/ms_5words_supplement.txt`:
- Line 1: The supplement loader currently can add blank lines as empty strings
into supplemental_words; update the list comprehension that builds
supplemental_words (the one using language_characters[lang]) to call
word.strip() once, skip any entries where word.strip() is falsy, and then
validate characters, e.g., compute s = word.strip() and use if s and all(char in
language_characters[lang] for char in s) so blank lines are excluded.

In `@webapp/data/languages/ms/ms_daily_words.txt`:
- Line 72: The word list contains probable OCR/transcription errors (entries
'aslng', 'begku', 'beium', 'boieh'); run a validation pass against a Malay
dictionary or spell-checker and either correct these tokens to their likely
forms ('aslng' → 'asing', 'beium' → 'belum', 'boieh' → 'boleh') or remove
ambiguous entries (e.g., verify 'begku' — correct to 'beku' or 'beguk' only
after confirmation). Update the ms_daily_words.txt entries accordingly and add a
short unit/scripted check that flags non-dictionary tokens (so future OCR
artifacts are caught) referencing these tokens as examples.

In `@webapp/data/languages/tl/language_config.json`:
- Around line 40-58: The Tagalog language_config.json's "ui" object is missing
eight keys present in other language configs (guess_distribution,
haptic_feedback, haptic_feedback_desc, install_app_desc, report_issue,
sound_effects, sound_effects_desc, view_source); add these keys to the "ui"
object in language_config.json with appropriate Tagalog translations (or
temporary English fallbacks) so the UI won't display undefined for those
labels—update the same "ui" block that contains settings, dark_mode,
keyboard_layout, etc., ensuring key names exactly match the other language
files.

In `@webapp/data/languages/tl/tl_daily_words.txt`:
- Line 367: Remove duplicated word entries to prevent sampling bias: delete the
extra occurrences of "konde" and "sukat" so each appears only once in the
tl_daily_words word list; locate the duplicate tokens "konde" and "sukat" (the
second occurrences in the file) and remove those duplicate lines, leaving one
canonical instance of each word and preserving file encoding/newline
conventions.

In `@webapp/data/languages/ur/ur_5words_supplement.txt`:
- Line 1: The supplemental Urdu 5-letter word file ur_5words_supplement.txt is
empty; add a curated list of additional 5-letter Urdu words (one per line) to
supplement ur_5words.txt so the app has broader coverage—use high-frequency
corpora and wordlists (e.g., news corpora, OSCAR, or internal frequency lists)
to extract valid 5-character Perso‑Arabic script tokens, deduplicate against
webapp/data/languages/ur/ur_5words.txt, normalize Unicode shaping/diacritics
consistently with ur_5words.txt, and save the final sorted, newline-separated
set back into ur_5words_supplement.txt.

In `@webapp/data/languages/ur/ur_keyboard.json`:
- Line 5: Update the "label" value for the Urdu keyboard entry to use the
native-script name instead of the English word; locate the JSON object
containing the "label" key (currently `"label": "Urdu"`) in ur_keyboard.json and
replace the value with the native-script string (e.g., `"اردو"`) so the keyboard
displays the localized name in the UI.

In `@webapp/data/languages/yo/yo_5words.txt`:
- Line 88: Remove duplicate word entries from the Yoruba word list by locating
the repeated tokens "ọkuta" and "ijẹbu" and deleting the extra occurrences so
each word appears only once; ensure you perform a file-wide de-duplication
(compare full normalized lines, trimming whitespace) and preserve one canonical
instance of each duplicate to avoid skewing selection weights.

---

Nitpick comments:
In `@tests/conftest.py`:
- Around line 122-125: The function is_grapheme_mode currently only recognizes
the literal string "true" from load_language_config, so JSON boolean true or
other truthy values are ignored; update is_grapheme_mode to read the
grapheme_mode value into a variable and accept both boolean True and
case-insensitive string "true" (and generally truthy values returned by the
config) when returning True; reference the is_grapheme_mode function and the
config.get("grapheme_mode") lookup to implement this tolerant check.

In `@tests/test_daily_word.py`:
- Line 19: The test duplicates grapheme/character-count logic that already
exists as the word_length helper in tests/conftest.py; remove the duplicated
grapheme logic in tests/test_daily_word.py (both where it appears around the top
import area and again at lines 129-136) and instead import and call word_length
from tests.conftest (add word_length to the from tests.conftest import ... list
alongside ALL_LANGUAGES, load_language_config, load_word_list) where length
calculation is needed, ensuring any variable names (e.g., the local length
variable) match the helper's return.

In `@tests/test_word_lists.py`:
- Around line 42-45: Move the inline import of the grapheme module to the
top-level imports of tests/test_word_lists.py so it isn't re-imported on each
test run; remove the in-function "import grapheme" and leave the conditional
that uses grapheme.length unchanged (the variable invalid and the config check
can remain), ensuring grapheme is imported once at module scope and referenced
by name in the existing block.

In `@webapp/app.py`:
- Around line 149-151: The grapheme import is inside load_words, which is
suboptimal; move the import to module level with the other imports and remove
the local import inside the function. Update the top of the module to include
"import grapheme" (or alias as _grapheme if that convention is used elsewhere)
and then use that module inside load_words (function name: load_words) instead
of re-importing it locally.

In `@webapp/data/languages/uz/uz_characters.txt`:
- Line 26: Line 26 of uz_characters.txt uses U+02BB (ʻ) while other Uzbek assets
may use U+2019 (’) or U+0027 (') or U+02BC (ʼ); run the provided scan across all
Uzbek assets (uz_* .txt and keyboard/word-list JSONs) to detect which apostrophe
codepoints appear, choose the canonical codepoint your project uses (e.g. the
one already present in keyboard JSONs or word lists), and replace all
non-canonical variants with that canonical codepoint (including updating
uz_characters.txt line 26) so all Uzbek character/keyboard/word-list files use a
single apostrophe codepoint consistently.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 545a75c9-ea2f-4473-9c16-d7f4616cb056

📥 Commits

Reviewing files that changed from the base of the PR and between 0295a36 and a68ac2a.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (71)
  • frontend/src/game.ts
  • frontend/src/graphemes.ts
  • frontend/src/types/index.ts
  • pyproject.toml
  • scripts/add_language.py
  • scripts/download_sources.py
  • scripts/improve_word_lists.py
  • tests/conftest.py
  • tests/test_daily_word.py
  • tests/test_word_lists.py
  • webapp/app.py
  • webapp/data/languages/bn/SOURCES.md
  • webapp/data/languages/bn/bn_5words.txt
  • webapp/data/languages/bn/bn_characters.txt
  • webapp/data/languages/bn/bn_keyboard.json
  • webapp/data/languages/bn/language_config.json
  • webapp/data/languages/hi/SOURCES.md
  • webapp/data/languages/hi/hi_5words.txt
  • webapp/data/languages/hi/hi_characters.txt
  • webapp/data/languages/hi/hi_keyboard.json
  • webapp/data/languages/hi/language_config.json
  • webapp/data/languages/id/SOURCES.md
  • webapp/data/languages/id/id_5words.txt
  • webapp/data/languages/id/id_5words_supplement.txt
  • webapp/data/languages/id/id_characters.txt
  • webapp/data/languages/id/id_daily_words.txt
  • webapp/data/languages/id/id_keyboard.json
  • webapp/data/languages/id/language_config.json
  • webapp/data/languages/mr/SOURCES.md
  • webapp/data/languages/mr/language_config.json
  • webapp/data/languages/mr/mr_5words.txt
  • webapp/data/languages/mr/mr_characters.txt
  • webapp/data/languages/mr/mr_keyboard.json
  • webapp/data/languages/ms/SOURCES.md
  • webapp/data/languages/ms/language_config.json
  • webapp/data/languages/ms/ms_5words.txt
  • webapp/data/languages/ms/ms_5words_supplement.txt
  • webapp/data/languages/ms/ms_characters.txt
  • webapp/data/languages/ms/ms_daily_words.txt
  • webapp/data/languages/ms/ms_keyboard.json
  • webapp/data/languages/sq/SOURCES.md
  • webapp/data/languages/sq/language_config.json
  • webapp/data/languages/sq/sq_5words.txt
  • webapp/data/languages/sq/sq_5words_supplement.txt
  • webapp/data/languages/sq/sq_characters.txt
  • webapp/data/languages/sq/sq_daily_words.txt
  • webapp/data/languages/sq/sq_keyboard.json
  • webapp/data/languages/tl/SOURCES.md
  • webapp/data/languages/tl/language_config.json
  • webapp/data/languages/tl/tl_5words.txt
  • webapp/data/languages/tl/tl_5words_supplement.txt
  • webapp/data/languages/tl/tl_characters.txt
  • webapp/data/languages/tl/tl_daily_words.txt
  • webapp/data/languages/tl/tl_keyboard.json
  • webapp/data/languages/ur/SOURCES.md
  • webapp/data/languages/ur/language_config.json
  • webapp/data/languages/ur/ur_5words.txt
  • webapp/data/languages/ur/ur_5words_supplement.txt
  • webapp/data/languages/ur/ur_characters.txt
  • webapp/data/languages/ur/ur_daily_words.txt
  • webapp/data/languages/ur/ur_keyboard.json
  • webapp/data/languages/uz/SOURCES.md
  • webapp/data/languages/uz/language_config.json
  • webapp/data/languages/uz/uz_5words.txt
  • webapp/data/languages/uz/uz_characters.txt
  • webapp/data/languages/uz/uz_keyboard.json
  • webapp/data/languages/yo/SOURCES.md
  • webapp/data/languages/yo/language_config.json
  • webapp/data/languages/yo/yo_5words.txt
  • webapp/data/languages/yo/yo_characters.txt
  • webapp/data/languages/yo/yo_keyboard.json

Comment thread scripts/add_language.py
Comment on lines +542 to +556
def _get_wordfreq_5letter(lang_code: str) -> dict[str, float]:
"""Get 5-letter words from wordfreq. Lighter than improve_word_lists version
(no char_set needed since we filter by script pattern instead)."""
try:
from wordfreq import top_n_list, zipf_frequency
except ImportError:
print(" wordfreq not installed, skipping")
return {}

words = {}
try:
for w in top_n_list(lang_code, 200000):
w = w.lower()
if len(w) == 5 and w.isalpha():
words[w] = zipf_frequency(w, lang_code)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

for code in hi mr bn; do
  file="$(fd -a "^${code}_5words\.txt$" webapp/data/languages | head -n1 || true)"
  [[ -n "${file}" ]] || continue

  python - "$code" "$file" <<'PY'
import sys, unicodedata
from pathlib import Path

code = sys.argv[1]
path = Path(sys.argv[2])

for raw in path.read_text(encoding="utf-8").splitlines():
    word = raw.strip()
    if word and (len(word) != 5 or not word.isalpha()):
        cats = [unicodedata.category(ch) for ch in word]
        print(f"{code}: current filter would skip {word!r} len={len(word)} isalpha={word.isalpha()} categories={cats}")
        break
PY
done

rg -n 'len\(w\) == 5|len\(word\) == 5|isalpha\(\)' scripts/add_language.py

Repository: Hugo0/wordle

Length of output: 654


🏁 Script executed:

#!/bin/bash
# Check context around problematic lines
echo "=== Line 56 context ==="
sed -n '50,65p' scripts/add_language.py

echo -e "\n=== Lines 542-556 (original range) ==="
sed -n '542,556p' scripts/add_language.py

echo -e "\n=== Lines 565-578 (also applies range) ==="
sed -n '565,578p' scripts/add_language.py

echo -e "\n=== Lines 700-710 (keyboard context) ==="
sed -n '700,710p' scripts/add_language.py

Repository: Hugo0/wordle

Length of output: 2378


Finish the bootstrapper's grapheme-aware word filtering.

len(...) == 5 and isalpha() are codepoint-based, so valid 5-grapheme Hindi/Marathi/Bengali entries with combining marks get dropped. Test data confirms words like 'अपलाभिया' (8 codepoints with Mc/Mn categories), 'तक्षशिला' (8 codepoints), and 'স্পাইগিরি' (9 codepoints) fail these filters and cannot appear in the generated word lists. This prevents the bootstrapper from recreating the grapheme-mode languages added in this PR.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/add_language.py` around lines 542 - 556, Replace the codepoint-based
filters in _get_wordfreq_5letter (the len(w) == 5 and w.isalpha() checks) with
grapheme-cluster-aware logic: import the third-party regex module and compute
clusters = regex.findall(r'\X', w); require len(clusters) == 5 and that each
cluster contains at least one letter (check characters' Unicode category
startswith 'L' via unicodedata.category) to allow base+combining-mark graphemes;
if regex isn't available, fall back to the existing behavior or log and skip
gracefully. This keeps the function name and overall loop intact while ensuring
Hindi/Marathi/Bengali words with combining marks are counted correctly.

Comment thread scripts/add_language.py
Comment thread scripts/add_language.py
Comment on lines +699 to +715
else:
# Devanagari / other: generate alphabetical keyboard from characters
# Group into rows of ~10-12 chars
rows = []
chars = [c for c in characters if c.isalpha()]
row_size = max(10, len(chars) // 3)
for i in range(0, len(chars), row_size):
rows.append(chars[i : i + row_size])
# Add enter/backspace to last row
if rows:
rows[-1] = ["⇨"] + rows[-1] + ["⌫"]
else:
rows = [["⇨", "⌫"]]
return {
"default": "alphabetical",
"layouts": {"alphabetical": {"label": "Alphabetical", "rows": rows}},
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

for code in hi mr bn; do
  file="$(fd -a "^${code}_characters\.txt$" webapp/data/languages | head -n1 || true)"
  [[ -n "${file}" ]] || continue

  python - "$code" "$file" <<'PY'
import sys, unicodedata
from pathlib import Path

code = sys.argv[1]
path = Path(sys.argv[2])

dropped = []
for ch in path.read_text(encoding="utf-8").splitlines():
    if ch and not ch.isalpha():
        dropped.append(f"{ch!r} {unicodedata.name(ch, 'UNKNOWN')} {unicodedata.category(ch)}")

if dropped:
    print(f"{code}: characters current generator would drop")
    for item in dropped[:10]:
        print(f"  {item}")
PY
done

rg -n 'chars = \[c for c in characters if c\.isalpha\(\)\]' scripts/add_language.py

Repository: Hugo0/wordle

Length of output: 1247


Don't strip combining marks from generated non-Latin keyboards.

c.isalpha() filters out diacritical marks essential for Indian scripts. Hindi, Marathi, and Bengali character files all contain vowel signs, anusvara, visarga, and other combining marks (Unicode categories Mn, Mc) that are stripped by this filter, making auto-generated keyboards unable to type words present in the generated word list.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/add_language.py` around lines 699 - 715, The current generation
filters characters with c.isalpha(), which drops Unicode combining marks (Mn,
Mc) needed for Devanagari and other Indic scripts; update the filtering in the
chars list comprehension to keep both letter and mark categories (use
unicodedata.category and include characters where category starts with 'L' or
'M') so vowel signs, anusvara, visarga, etc. are preserved when building rows,
leaving the rest of the row logic (row_size, rows, adding "⇨"/"⌫", and returning
the layouts) unchanged.

Comment thread scripts/add_language.py
Comment on lines +347 to +349
try:
data = json.loads(json_file.read_text(encoding="utf-8"))
words = sorted(w for w in data.keys() if len(w) == 5 and w.isalpha() and w == w.lower())
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

for code in hi mr bn; do
  file="$(fd -a "^${code}_5words\.txt$" webapp/data/languages | head -n1 || true)"
  [[ -n "${file}" ]] || continue

  python - "$code" "$file" <<'PY'
import sys, unicodedata
from pathlib import Path

code = sys.argv[1]
path = Path(sys.argv[2])

for raw in path.read_text(encoding="utf-8").splitlines():
    word = raw.strip()
    if word and (len(word) != 5 or not word.isalpha()):
        cats = [unicodedata.category(ch) for ch in word]
        print(f"{code}: current extractor would skip {word!r} len={len(word)} isalpha={word.isalpha()} categories={cats}")
        break
PY
done

rg -n 'len\(w\) == 5|len\(word\) == 5|isalpha\(\)' scripts/download_sources.py

Repository: Hugo0/wordle

Length of output: 961


Make Kaikki extraction grapheme-aware too.

The len(...) == 5 and isalpha() filters discard valid entries with combining marks. Real examples from the data: Hindi 'अपलाभिया' (len=8 with Mc marks), Marathi 'तक्षशिला' (len=8 with Mn/Mc), Bengali 'স্পাইগিরি' (len=9 with Mn/Mc) all fail these checks despite being legitimate words. These are lost at download/extraction time; fixing only the app-side loader cannot recover them.

Also applies to lines 367, 398, 423.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/download_sources.py` around lines 347 - 349, The current filter uses
len(w) == 5 and w.isalpha() which breaks on grapheme clusters and combining
marks; change the length check to count Unicode grapheme clusters (e.g., use
regex.findall(r'\X', w) and check len(...) == 5) and replace isalpha() with a
check that allows base letters plus combining marks (e.g., all(c.isalpha() or
unicodedata.combining(c) for c in w)); also use casefold() instead of lower()
for safer case comparison (w == w.casefold()). Apply these replacements to the
words = sorted(...) extraction and the other identical filter sites in the file
where the same len/isalpha/lower pattern is used.

Comment on lines +1 to +2000
آؤنگا
آئندہ
آئینی
آبادی
آبشار
آتشیں
آجاتا
آرائش
آرسیی
آرڈمر
آریئر
آزادی
آسانی
آسمان
آفیسر
آمادہ
آمدنی
آمدید
آنتوں
آوروں
آکٹپس
آگئیں
آہستہ
آہنگی
أہغاد
ابتدا
ابرار
ابلاغ
اتارو
اتحاد
اترتے
اترنا
اترنے
اتفاق
اتوار
اثاثہ
اثرات
اثناء
اجارہ
اجازت
اجزاء
اجلاس
اجمود
اجنبی
احاطہ
احساس
احکام
اخبار
اخروٹ
ادارے
ادخال
ادراک
ادھار
ارادہ
اربوں
اردنی
ارسال
ارکان
ازارہ
اسامہ
استاد
اسرار
اسلئے
اسلام
اسلحہ
اسلیے
اسناد
اسٹار
اسٹاف
اسٹیج
اسٹیو
اسٹیٹ
اسپاٹ
اسکور
اسکول
اسکوپ
اسکین
اشارہ
اشارے
اشکال
اشیاء
اصرار
اصطبل
اصلاح
اصلیت
اضافہ
اضافی
اضافے
اطءلہ
اطاعت
اطراف
اطلاع
اطلاق
اظہار
اعداد
اعزاز
اعصاب
اعضاء
اعلان
اعمال
اغواء
افراد
افسوس
افواج
افواہ
اقدام
اقرار
اقسام
اقلیت
اقوام
الادا
الارم
البتہ
التجا
الجھن
الجھی
الحال
الزام
الشان
العین
الفاط
الفاظ
الموت
الویل
الینا
امداد
امراء
املاک
اموات
امکان
اناڑی
انتھک
انتہا
انتیس
انجام
انداز
اندوز
اندھا
اندھے
انسان
انصاف
انعام
انٹری
انٹیل
انڈیا
انڈین
انکار
انگلی
انگیز
انھوں
انھیں
انہوں
انہین
انہیں
اوائل
اودان
اورات
اورجب
اورہر
اوقات
اولاد
اولگا
اولین
اونچی
اونچے
اٹاری
اٹھاؤ
اٹھاو
اٹھنا
اپددر
اپریل
اپنوں
اپہاس
اچانک
اچھال
اڑانے
اکٹھا
اکٹھے
اکڑکر
اکھاڑ
اکیلا
اکیلی
اکیلے
اگرچہ
اگستس
اگلوا
اہداف
اہمیت
ایجاد
ایجنٹ
ایران
ایریا
ایمان
ایملی
اینجل
اینڈی
اینکر
ایونز
ایونٹ
ایڑھی
ایکشن
ایکٹر
ایکٹو
باؤنڈ
بائبل
بائیں
باتوں
باتیں
باخبر
بارنس
بارود
بارڈر
بازار
بالوں
بالٹک
بالٹی
بالکل
باندھ
بانڈز
باہری
باہمی
باہوں
بتاءو
بتاؤں
بتائی
بتائے
بتاتا
بتاتی
بتاتے
بتانا
بتانے
بتاوں
بتایا
بجائے
بجانے
بحالی
بحران
بحریہ
بخشوں
بدلتا
بدلتے
بدلنے
بدماش
بدنام
برآمد
براؤن
برائن
برائی
برائے
برابر
برادر
برانڈ
براوو
برباد
برتاؤ
برتری
برتھا
برخاف
برسات
برسوں
برطرف
برعکس
بریکر
بریکٹ
بزدلی
بشانہ
بظاہر
بغاوت
بغداد
بفیلو
بقایا
بلائے
بلاتا
بلاتے
بلاسٹ
بلانا
بلاوی
بلاکس
بلایا
بلبلا
بلندی
بلوچی
بلڈاگ
بلڈنگ
بلیوں
بمشکل
بناؤں
بنائی
بنائے
بناتا
بناتی
بناتے
بنانا
بنانے
بناوٹ
بنایا
بنجمن
بندوا
بندوق
بندوں
بندھن
بندھے
بنگلہ
بنیاد
بنیان
بوائے
بورنگ
بوسٹن
بولتا
بولتے
بولنا
بولنے
بولوں
بولٹن
بولیں
بوڑھا
بوڑھے
بچائی
بچاتا
بچالو
بچانا
بچانے
بچایا
بڑپپن
بڑھتا
بڑھتی
بڑھتے
بڑھنے
بڑھیں
بکارا
بکسوا
بکواس
بگرام
بگولے
بھائی
بھاری
بھاگا
بھاگو
بھاگے
بھرتی
بھرنے
بھریں
بھوری
بھولا
بھولو
بھولی
بھوکا
بھوکے
بھٹکا
بھیجا
بھیجو
بھیجی
بھیجے
بہادر
بہانا
بہانہ
بہانے
بہایا
بہبود
بہتری
بہنوں
بیاسی
بیبسی
بیجنگ
بیجوں
بیرنگ
بیروت
بیرون
بیضوی
بیلچے
بیمار
بیونس
بیٹری
بیٹوں
بیٹھا
بیٹھو
بیٹھی
بیٹھے
بیچلر
بیچنے
بیچوں
بیکار
بیہوش
بےحوش
بےکار
تائید
تابوت
تاخیر
تاریخ
تاریک
تالاب
تاوان
تاکنا
تباہی
تبدیل
تبصرہ
تبولی
تجارت
تجاست
تجاوز
تجربہ
تجربے
تجزیہ
تجوری
تجویز
تحائف
تحریر
تحریک
تحقیق
تحلیل
تحویل
تخلیق
تدفین
تدویر
تذکرے
تربیت
ترتیب
ترجمہ
ترجیح
ترسیل
ترمیم
ترکون
ترکوں
تزئین
تسبیح
تسلسل
تسلیم
تشخیص
تشریح
تشریف
تشویش
تشکیل
تصادم
تصدیق
تصویر
تعارف
تعاقب
تعالی
تعاون
تعداد
تعریف
تعلیم
تعمیر
تعمیل
تعویذ
تفتشی
تفتیش
تفریح
تفصیل
تفویض
تفہیم
تقاضہ
تقدیر
تقریب
تقریر
تقسیم
تقطیع
تلاشی
تلافی
تلوار
تمارا
تماشا
تمہیں
تناظر
تنظیم
تنقید
توازن
توسیع
تولیہ
توپاک
توڑنا
توڑنے
توکیا
توہین
تکلیف
تکمیل
تھامس
تھرمل
تھرٹی
تھنڈر
تھوڑا
تھوڑی
تھوڑے
تھیٹر
تہائی
تہارا
تہارے
تہذیب
تیاری
تیسرا
تیسری
تیسرے
تیمور
تینوں
ثقافت
جائزہ
جائیں
جارہا
جارہے
جاسوس
جامنی
جانتا
جانتی
جانتے
جانسن
جاننا
جاننے
جانور
جانوں
جانیں
جاوگی
جاپان
جاگتے
جاگنا
جاہتی
جاہیں
جایئے
جبڑوں
جتاؤں
جذبات
جرائم
جرمنی
جزیرہ
جزیرے
جسموں
جلانے
جللاد
جماتی
جماعت
جمپنگ
جنازے
جنوبی
جنوری
جنگجو
جنگلی
جنگوں
جنگیں
جنھیں
جنہوں
جنہیں
جنیوا
جوابی
جواگر
جوتوں
جولیا
جوہان
جوہری
جگائے
جگہوں
جگہیں
جھاڑو
جھجھک
جھنڈا
جھنڈے
جھونک
جھوٹا
جھوٹی
جھوٹے
جھٹلا
جھٹکا
جھپٹا
جھگڑا
جھگڑے
جہالت
جیتنے
جینرو
جیکسن
حادثہ
حادثے
حالات
حالیہ
حاملہ
حرارت
حراست
حسنسن
حضرات
حفاظت
حقائق
حقدار
حقیقت
حقیقی
حلقوں
حماقت
حمایت
حملوں
حوالے
حوروں
حوریں
حوصلہ
حکومت
حیثیت
حیران
حیوان
خاتمہ
خاتمے
خاتون
خارجہ
خارجی
خاصیت
خاموش
خانوں
خبروں
خبریں
خداؤں
خدائی
خدارا
خداوں
خدایا
خدشات
خدمات
خرابی
خراپن
خروںچ
خرگوش
خریدا
خزانہ
خزانے
خصوصی
خطرات
خلاصہ
خلیات
خواجہ
خواہش
خوراک
خہجءز
خیانت
خیموں
دائرہ
دائرے
دائیں
داخلہ
داخلی
داخلے
دالان
داڑھی
داہنے
دبانا
دبانے
درآمد
دراصل
درپیش
درکار
دستخط
دسمبر
دفاتر
دفاعی
دفتری
دلائی
دلاتا
دلاتی
دلاتے
دلانے
دلواؤ
دلچسب
دلچسپ
دلیری
دماغی
دمیتر
دوائی
دوران
دوروں
دوستو
دوستی
دوسرا
دوسری
دوسرے
دونوں
دونگا
دوپہر
دوچار
دوڑنے
دوڑوں
دوگلا
دوگنی
دوہرا
دکھاؤ
دکھاو
دکھتا
دکھتے
دھبوں
دھمکی
دھندہ
دھواں
دھونے
دھوکا
دھوکہ
دھوکے
دھچکا
دھڑوں
دھڑکن
دھیان
دھیرے
دھیما
دہائی
دہراؤ
دہندہ
دیالی
دیانا
دیجئے
دیرپا
دیوار
دیکھا
دیکھو
دیکھی
دیکھے
ذائقہ
ذخائر
ذخیرہ
ذرائع
ذریعہ
ذریعے
ذلالت
ذہجءز
ذہنوں
ذہنیت
راؤنڈ
رائفل
رابرٹ
رابطہ
رابطے
راتوں
راجرز
راستہ
راستے
راکٹس
راہیں
ربیکا
رجحان
رجمنٹ
ردعمل
رسائی
رسالت
رسانی
رسیلی
رسیوں
رعایا
رعایت
رفتار
روابط
روانہ
روایت
روبوٹ
روحوں
روشنی
رولنڈ
رولنگ
رومال
رونلڈ
روٹری
روپوش
روکتا
روکنا
روکنے
رپورٹ
رکاوٹ
رکنیت
رکھتا
رکھتی
رکھتے
رکھنا
رکھنی
رکھنے
رکھوں
رکھیں
رگڑتا
رہائش
رہائی
رہنما
رہوگے
ریاست
ریجنل
ریزرو
ریسرچ
ریشمی
ریلوے
ریمزے
ریمسی
ریورس
ریوین
ریڈار
ریڈیو
ریکٹر
زانٹی
زاویہ
زخموں
زلزلہ
زلزلے
زمانے
زندگی
زگانے
زیادہ
سائبر
سائرل
سائرن
سائنس
سابقہ
ساتھی
ساحلی
ساختہ
سادگی
ساسیں
سالار
سالسا
سالوں
سالچک
سامان
سامبو
سامری
سامنا
سامنے
سانتا
سانحہ
سانحے
سبارو
ستارہ
ستارے
ستمبر
سجایا
سخاوت
سراسر
سراہا
سرجری
سرحدی
سردار
سرسبز
سرسوں
سرغنہ
سرمئی
سرورز
سروسز
سرکشی
سرکٹس
سرینا
سعودی
سفارت
سفارش
سلائڈ
سلامت
سلسلہ
سلسلے
سلطان
سلطنت
سلویو
سلیکس
سماجی
سماعت
سمتار
سمتبر
سمجھا
سمجھی
سمجھے
سمسٹر
سمندر
سمنوی
سنائی
سناتا
سنایا
سنبھل
سنتان
سنتری
سنسنی
سنوڈن
سنوگی
سنچری
سنگین
سنہری
سنہرے
سوئنگ
سوائے
سوادج
سواری
سوراخ
سوزاک
سوچتا
سوچتی
سوچتے
سوچلو
سوچنا
سوچنی
سوچنے
سوڈان
سویرے
سویٹی
سٹائل
سٹارک
سٹریٹ
سٹیشن
سٹیفن
سٹیمپ
سٹیون
سٹیوی
سپاہی
سپریم
سپیشل
سچائی
سڑکوں
سکاؤٹ
سکتیں
سکرپٹ
سکرین
سکریپ
سکریچ
سکھاؤ
سگریٹ
سگنلز
سہارے
سہولت
سیارہ
سیارے
سیاست
سیاسی
سیدھا
سیدھی
سیدھے
سیریز
سیلاب
سیلاس
سیلمن
سینئر
سینٹر
سینکا
سیٹیں
سیڈان
سیکرٹ
سیکشن
سیکنڈ
سیکھا
سییلی
شاؤلن
شاباش
شالوم
شاپنگ
شاگرد
شخصیت
شرابا
شرابی
شراکت
شرطیہ
شرماو
شرٹوں
شریان
شعلوں
شمالی
شناخت
شوٹنگ
شکاری
شکایت
شکریہ
شکلیں
شکنیں
شگاگو
شہادت
شہروں
شہسہا
شیروں
شیطان
شیلٹر
شیپرڈ
شیڈول
صحافی
صحراء
صدیوں
صفائی
صفایا
صفحات
صندوق
صوبوں
ضآؤاط
ضرورت
ضروری
ضمانت
ضوابط
طالاب
طریقہ
طریقے
طلائی
طلسمی
طوفان
طیارہ
طیارے
ظریفی
عاجزی
عارضی
عالمی
عالیہ
عبادت
عدالت
عراقی
عربوں
عزائم
عسکری
عقائد
عقیدہ
عقیدے
علاقہ
علاقے
علامت
علاوہ
علموں
علیکم
عمارت
عملوں
عنوان
عوامی
عہدوں
غبارے
غداری
غرائب
غمزدہ
غمگین
غنڈوں
غٹاغٹ
غیرتی
فائدہ
فائدے
فائٹر
فائیو
فارسی
فارما
فاصلہ
فاصلے
فرائض
فرانس
فراہم
فرشتہ
فرعون
فروخت
فروری
فرینڈ
فرینک
فضائی
فضیلت
فلائٹ
فلسفہ
فلسفے
فلموں
فلمیں
فلٹرز
فنڈنگ
فوائد
فوارہ
فوارے
فوبیا
فوجوں
فوجیں
فورسز
فہرست
فیصلہ
فیصلے
فینکس
فیڈرل
قاعدہ
قافلے
قالین
قانون
قبیلہ
قبیلے
قدرتی
قدموں
قذافی
قربان
قریبی
قسمتی
قسمیں
قصائی
قفقاز
قواعد
قوموں
قومیت
قیادت
قیامت
قیمتی
لاؤنج
لائٹر
لائیو
لائیں
لائیے
لاتوں
لارنس
لازما
لازمی
لاشیں
لافلن
لالچی
لاٹھی
لاپتہ
لاہور
لبرٹی
لبنان
لرزاں
لطیفے
لعنتی
لفظوں
لمحات
لمحوں
لنڈسے
لنگوٹ
لنگڑے
لورین
لوسرن
لومڑی
لونگا
لوٹنا
لوٹنے
لوڈنگ
لوگوں
لڑائی
لڑاکا
لڑرہے
لڑکوں
لکھنا
لکھنے
لکھیں
لگائی
لگائے
لگاتا
لگاتے
لگانا
لگانے
لگایا
لگرہا
لہروں
لیبیا
لیجئے
لیجنڈ
ماؤنٹ
مائنس
مائیک
مابین
ماتحت
ماحول
مارتا
مارتے
مارجن
مارشل
مارنا
مارنے
ماروں
مارٹم
مارٹن
مارکس
مارکو
مارگی
ماریں
ماسٹر
ماسکو
مافیا
مالکن
مالیت
مانتا
مانتی
مانتے
ماندہ
ماننا
مانند
ماننی
ماننے
مانگو
مانگے
مانیں
مایوس
مبارک
مبتلا
مبینہ
متاثر
متجسس
متحدہ
متحمل
مترجم
متروک
متصور
متضاد
متعلق
متعین
متغیر
متوجہ
متوقع
مثالی
مجازی
مجبور
مجروح
محافظ
محبوب
محتاط
محتاظ
محترم
محدود
محروم
محسوس
محفوظ
محلوں
محکمہ
مخالف
مخبری
مختار
مختتم
مختصر
مختلف
مخروط
مخصوص
مخلوط
مخلوق
مخواہ
مداوا
مدراس
مدنظر
مذموم
مذہبی
مربوط
مرتبہ
مرتھا
مرجھا
مرحلہ
مرحلے
مرحوم
مردار
مردوں
مرموز
مروان
مرچکا
مرکزی
مرکوز
مرگئے
مرہون
مریگا
مزدور
مسئلہ
مسئلے
مسائل
مسافر
مستحق
مسترد
مستقل
مستند
مستول
مسدود
مسلسل
مسمار
مسودہ
مسوری
مسٹرد
مسکرا
مسیحی
مشاغل
مشتبہ
مشترک
مشتمل
مشرقی
مشروب
مشروط
مشغول
مشورہ
مشکوک
مشہور
مصائب
مصروف
مصلحت
مصیبت
مضبوط
مضحکہ
مضمون
مطابق
مطلوب
مطمئن
مطمعن
مظلوم
معافی
معبود
معجزہ
معدنی
معذرت
معذور
معرفت
معروف
معزرت
معصوم
معلوم
معمول
معموں
معنوں
معیار
مغربی
مغفرت
مفرور
مفلوج
مقاصد
مقالہ
مقامی
مقبول
مقدار
مقدمہ
مقدمے
ملاتے
ملازم
ملانے
ملاکر
ملایا
ملحقہ
ملعون
ملٹری
ملکیت
ممالک
ممنوع
ممکنہ
مناسب
مناظر
منافق
منانے
منتخب
منتظر
منتظم
منتقل
منتیں
منجمد
منحصر
منحوس
منزلہ
منسلک
منسوب
منسوخ
منطقی
منظور
منعقد
منفرد
منقطع
منٹوں
منہدم
منیجر
مواقع
موجود
مورٹز
مورگن
موزوں
موساد
موصول
موضوع
مولوی
موونگ
مویشی
مٹانے
مٹھاس
مچانا
مچھلی
مکانی
مکاوت
مہاجر
مہارت
مہاشی
مہریں
مہمان
مہنگا
مہنگے
مہودی
مہینہ
مہینے
میدان
میراث
میرین
میریٹ
میزیں
میلنگ
میمبر
مینار
مینڈی
میوزک
میٹرو
میٹنگ
میٹھی
میڈرڈ
میڈیا
نااہل
نابود
نادان
نادیہ
ناراض
نارمل
ناستے
ناشتا
ناقوس
نامزد
ناموں
ناپاک
ناچتی
ناکام
نایاب
نبٹنا
نتائج
نتیجہ
نتیجے
نراشا
نرسنگ
نزدیک
نشانہ
نشانی
نشانے
نصیحت
نظریں
نظریہ
نقصان
نمائش
نمبرز
نمونہ
نمونے
نمٹنے
نوازی
نوشتہ
نوعیت
نومبر
نوکری
نکالا
نکالو
نکالی
نکالے
نکلتا
نکلتے
نکلنا
نکلنے
نکلیں
نگاری
نگلنا
نہایت
نیشنل
نیوٹن
نیٹلی
نیکدل
نےٹلی
وائرس
وائٹل
وائیٹ
وارنٹ
واریر
واقعہ
واقعی
واقعے
والدہ
والوں
والکر
والیس
واپسی
وبالا
وراست
ورانہ
ورکنگ
وزٹرز
وسائل
وصولی
وضاحت
وعدوں
وغیرہ
وفاقی
وففوہ
وقتوں
وقوعہ
ولینٹ
ونڈوز
وکلاء
ویران
ویشیا
ویچلن
ویڈیو
ویکسی
ویگاس
ٹائمر
ٹائمز
ٹائٹس
ٹائٹن
ٹاورز
ٹاکنگ
ٹرائل
ٹرالی
ٹروجن
ٹرکوں
ٹریفک
ٹریلر
ٹرینر
ٹریور
ٹریول
ٹریکر
ٹریکی
ٹوائی
ٹوبیس
ٹونگا
ٹوٹتا
ٹوکری
ٹوکیو
ٹویٹر
ٹپکاو
ٹھنڈا
ٹھنڈی
ٹھنڈے
ٹھوڑی
ٹھوکر
ٹھٹھہ
ٹھہرو
ٹھہرے
ٹہلنے
ٹیموں
ٹینڈر
ٹیڑھی
ٹیکسی
پاؤلو
پاؤنڈ
پاؤڈر
پائلٹ
پابند
پاتال
پادری
پارٹی
پاستا
پالتا
پالنے
پتائی
پتلون
پتیوں
پجاما
پذیری
پرائر
پرامن
پرامڈ
پرانا
پرانی
پرانے
پرجوش
پرستی
پرندہ
پرندے
پرواز
پرواہ
پریمی
پستول
پسندی
پسینہ
پسینے
پشاور
پلانٹ
پلندے
پناہی
پنجرا
پنجری
پنجرے
پندرہ
پنکھے
پوجھو
پورٹل
پورٹو
پوسٹر
پولیس
پوچھا
پوچھو
پوچھے
پٹاخہ
پٹانگ
پٹھوں
پٹیشن
پچارا
پچاسی
پچھلا
پچھلی
پچھلے
پڑتال
پڑھتا
پڑھتی
پڑھتے
پڑھنا
پڑھنے
پکارا
پکارے
پکانا
پکانے
پکاکر
پکایا
پکڑنا
پکڑنے
پکڑوں
پگھلا
پھاٹک
پھرنے
پھریں
پھنسا
پھنسے
پھوڑا
پھیری
پھیلا
پھیلی
پھینک
پہاڑی
پہنتے
پہننے
پہنچا
پہنچے
پہنیں
پہچان
پہیلی
پہیوں
پیئرس
پیارا
پیاری
پیارے
پیاسا
پیانو
پیداش
پیروں
پیروی
پیسنا
پیسوں
پیشاب
پیشکش
پیشگی
پیغام
پینسل
پینشن
پیوست
پیٹرن
پیٹرک
پیٹیو
پیپلز
پیچھا
پیچھے
پیڑوں
چارجر
چالاک
چالوں
چالیس
چاندی
چاوڈر
چاہئے
چاہتا
چاہتی
چاہتے
چاہنے
چاہوں
چاہیں
چاہیے
چجرسی
چرایا
چروکی
چرھتا
چلاؤں
چلائی
چلائے
چلاتا
چلاتی
چلاتے
چلانا
چلانے
چلاوں
چلایا
چمکیں
چوبیس
چوتھا
چوتھی
چوتھے
چوروں
چولہا
چومنے
چونکا
چونکہ
چوٹوں
چوڑیل
چوہوں
چڑھنا
چڑھنے
چڑھیں
چکانی
چکاگو
چکایا
چھاتی
چھاپا
چھاپہ
چھاپے
چھتری
چھتوں
چھدرت
چھوئے
چھوری
چھونا
چھونے
چھوٹا
چھوٹی
چھوٹے
چھوڑا
چھوڑو
چھوڑے
چھپنے
چھینک
چہروں
چیئرز
چیخنا
چیخنے
چیزوں
چیزیں
چیلنج
چیمبر
چینلز
چیٹنگ
ڈارون
ڈالتا
ڈالرز
ڈالنا
ڈالنے
ڈالوں
ڈالیں
ڈامنو
ڈاکٹر
ڈبلیو
ڈرامہ
ڈرامے
ڈرانا
ڈرانے
ڈرپوک
ڈریگن
ڈسپلے
ڈمپنگ
ڈنڈوں
ڈوئچے
ڈویژن
ڈکارڈ
ڈھادو
ڈھونڈ
ڈھکنا
ڈھکنے
ڈھیلے
ڈیاگو
ڈیلٹا
ڈیمین
ڈینیل
ڈیوٹی
ڈیٹنگ
کاربن
کارسن
کاروں
کارٹر
کارکن
کارگو
کاریں
کاغذی
کالنگ
کاموں
کانوں
کانٹا
کانٹے
کاٹنے
کاٹیج
کاپتہ
کاپٹر
کراؤں
کرائی
کراتی
کرافٹ
کرانے
کراچی
کرایا
کرایہ
کردار
کردوں
کردیا
کردیں
کررہا
کررہی
کررہے
کرسمس
کرسٹن
کرسکو
کرفیو
کرلوں
کرلیا
کرمنل
کرنسی
کرنکل
کرنیں
کرواؤ
کروگی
کروگے
کرکرا
کریڈٹ
کریگا
کشائی
کشمیر
کفارہ
کلارک
کلاسک
کلوزڈ
کلپنا
کلیدی
کماتا
کماتے
کمانا
کمانڈ
کمانے
کمایا
کمزور
کمشنر
کمپنی
کمیشن
کمینہ
کمینی
کمینے
کمیٹی
کنارہ
کنارے
کندھے
کنوؤں
کنورٹ
کنویں
کنکشن
کوئنز
کوائف
کوبھی
کودنے
کوشاں
کونسا
کونسل
کونسی
کونسے
کونور
کونوں
کووئی
کوڑھی
کوژیہ
کویتی
کٹھور
کٹہرے
کپتان
کپڑوں
کھائی
کھابہ
کھاتا
کھاتی
کھاتے
کھانا
کھانے
کھایا
کھروں
کھسکی
کھلتا
کھلنے
کھمبے
کھودو
کھولا
کھولو
کھولے
کھونا
کھونے
کھچڑی
کھڑکی
کھیتی
کھیلو
کھینچ
کہانی
کہاوت
کہاہے
کیبنٹ
کیجئے
کیجیے
کیطرف
کیلئے
کیلبر
کیلون
کیمبل
کیمرا
کیمرہ
کیمرے
کیمپس
کیمڈن
کینچی
کینڈی
کیٹیا
کیپلر
کیپٹل
کیپٹن
کےلئے
گائیڈ
گابھا
گارڈز
گانٹھ
گاہوں
گراتے
گرافر
گرانے
گردوں
گرنٹس
گروہی
گرہیں
گرینس
گرینڈ
گزارا
گزارو
گزارے
گزرتا
گزرتے
گزرنا
گزشتہ
گفتگو
گلابی
گلبرٹ
گلرمو
گلمور
گلیوں
گمراہ
گمشدہ
گمنام
گندگی
گنڈوں
گنگنا
گواہی
گودام
گورنر
گوروں
گورڈن
گولسن
گولڈن
گونگے
گھائل
گھبرا
گھروں
گھسنا
گھسنے
گھسیٹ
گھلنے
گھنٹہ
گھنٹی
گھنٹے
گھوسٹ
گھونٹ
گھونپ
گھوڑا
گھوڑی
گھوڑے
گھٹتی
گھٹنے
گھٹیا
گیارہ
گیراج
ھاںسی
ھمممم
ھیںچو
ہاربر
ہارنے
ہاورڈ
ہتکڑی
ہجآتہ
ہدایت
ہفتوں
ہلاتا
ہلاکت
ہمارا
ہماری
ہمارے
ہمدرد
ہمممم
ہموار
ہمیشہ
ہنستے
ہنسلی
ہنسنا
ہواؤں
ہوائی
ہوتیں
ہوجاؤ
ہوجاو
ہورہا
ہورہی
ہوسکا
ہوسکے
ہونگی
ہونگے
ہوچکا
ہوچکے
ہوگئی
ہوگئے
ہوگیا
ہوںگے
ہٹائی
ہٹیئے
ہڈیوں
ہڑتال
ہںسنا
ہینری
ہینڈل
ہینگر
ہیومن
ہیوگو
ہیکرز
ہیکنگ
ہیکٹر
یاترہ
یاتنا
یادوں
یافتہ
یقینا
یقینی
یلئڈی
یلرجی
یوراج
یورپی
یونین
یووتی
یہسان
یہودی
ییومن
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Daily answer pool contains likely-corrupted tokens.

There are several entries that look non-lexical or OCR-corrupted (e.g., Line 25 أہغاد, Line 89 اطءلہ, Line 170 اپددر, Line 625 خہجءز, Line 968 ضآؤاط, Line 1451 وففوہ, Line 1935 ھمممم, Line 1992 یلئڈی). If these are selected as daily answers, puzzle quality drops sharply.

Please prune/regenerate these before shipping.

Example cleanup diff (non-exhaustive)
-أہغاد
-اطءلہ
-اپددر
-خہجءز
-ضآؤاط
-وففوہ
-ھمممم
-یلئڈی

If useful, I can draft a repeatable cleanup script/issue template for lexicon QA (noise filtering + manual review bucket).

🧰 Tools
🪛 LanguageTool

[whitespace] ~1-~1: آیا منظور شما «"آئنده"» است؟
Context: آؤنگا آئندہ آئینی آبادی آبشار آتشیں آجاتا آرائش آرس...

(ReplaceLettersInSameLangs)


[whitespace] ~15-~15: آیا منظور شما «"آماده"» است؟
Context: ...سیی آرڈمر آریئر آزادی آسانی آسمان آفیسر آمادہ آمدنی آمدید آنتوں آوروں آکٹپس آگئیں آہس...

(ReplaceLettersInSameLangs)


[whitespace] ~22-~22: آیا منظور شما «"آهسته"» است؟
Context: ...ادہ آمدنی آمدید آنتوں آوروں آکٹپس آگئیں آہستہ آہنگی أہغاد ابتدا ابرار ابلاغ اتارو اتح...

(ReplaceLettersInSameLangs)


[whitespace] ~23-~23: آیا منظور شما «"آهنگی"» است؟
Context: ...دنی آمدید آنتوں آوروں آکٹپس آگئیں آہستہ آہنگی أہغاد ابتدا ابرار ابلاغ اتارو اتحاد اتر...

(ReplaceLettersInSameLangs)


[whitespace] ~24-~24: آیا منظور شما «"أهغاد"» است؟
Context: ...دید آنتوں آوروں آکٹپس آگئیں آہستہ آہنگی أہغاد ابتدا ابرار ابلاغ اتارو اتحاد اترتے اتر...

(ReplaceLettersInSameLangs)


[whitespace] ~35-~35: آیا منظور شما «"اثاثه"» است؟
Context: ...ارو اتحاد اترتے اترنا اترنے اتفاق اتوار اثاثہ اثرات اثناء اجارہ اجازت اجزاء اجلاس اجم...

(ReplaceLettersInSameLangs)


[whitespace] ~38-~38: آیا منظور شما «"اجاره"» است؟
Context: ...رنا اترنے اتفاق اتوار اثاثہ اثرات اثناء اجارہ اجازت اجزاء اجلاس اجمود اجنبی احاطہ احس...

(ReplaceLettersInSameLangs)


[whitespace] ~44-~44: آیا منظور شما «"احاطه"» است؟
Context: ...ناء اجارہ اجازت اجزاء اجلاس اجمود اجنبی احاطہ احساس احکام اخبار اخروٹ ادارے ادخال ادر...

(ReplaceLettersInSameLangs)


[whitespace] ~52-~52: آیا منظور شما «"ادهار"» است؟
Context: ...ساس احکام اخبار اخروٹ ادارے ادخال ادراک ادھار ارادہ اربوں اردنی ارسال ارکان ازارہ اسا...

(ReplaceLettersInSameLangs)


[whitespace] ~53-~53: آیا منظور شما «"اراده"» است؟
Context: ...کام اخبار اخروٹ ادارے ادخال ادراک ادھار ارادہ اربوں اردنی ارسال ارکان ازارہ اسامہ است...

(ReplaceLettersInSameLangs)


[whitespace] ~58-~58: آیا منظور شما «"ازاره"» است؟
Context: ...راک ادھار ارادہ اربوں اردنی ارسال ارکان ازارہ اسامہ استاد اسرار اسلئے اسلام اسلحہ اسل...

(ReplaceLettersInSameLangs)


[whitespace] ~59-~59: آیا منظور شما «"اسامه"» است؟
Context: ...ھار ارادہ اربوں اردنی ارسال ارکان ازارہ اسامہ استاد اسرار اسلئے اسلام اسلحہ اسلیے اسن...

(ReplaceLettersInSameLangs)


[whitespace] ~64-~64: آیا منظور شما «"اسلحه"» است؟
Context: ...کان ازارہ اسامہ استاد اسرار اسلئے اسلام اسلحہ اسلیے اسناد اسٹار اسٹاف اسٹیج اسٹیو اسٹ...

(ReplaceLettersInSameLangs)


[whitespace] ~77-~77: آیا منظور شما «"اشاره"» است؟
Context: ...ٹیو اسٹیٹ اسپاٹ اسکور اسکول اسکوپ اسکین اشارہ اشارے اشکال اشیاء اصرار اصطبل اصلاح اصل...

(ReplaceLettersInSameLangs)


[whitespace] ~85-~85: آیا منظور شما «"اضافه"» است؟
Context: ...ارے اشکال اشیاء اصرار اصطبل اصلاح اصلیت اضافہ اضافی اضافے اطءلہ اطاعت اطراف اطلاع اطل...

(ReplaceLettersInSameLangs)


[whitespace] ~88-~88: آیا منظور شما «"اطءله"» است؟
Context: ...رار اصطبل اصلاح اصلیت اضافہ اضافی اضافے اطءلہ اطاعت اطراف اطلاع اطلاق اظہار اعداد اعز...

(ReplaceLettersInSameLangs)


[whitespace] ~93-~93: آیا منظور شما «"اظهار"» است؟
Context: ...افی اضافے اطءلہ اطاعت اطراف اطلاع اطلاق اظہار اعداد اعزاز اعصاب اعضاء اعلان اعمال اغو...

(ReplaceLettersInSameLangs)


[whitespace] ~104-~104: آیا منظور شما «"افواه"» است؟
Context: ...ضاء اعلان اعمال اغواء افراد افسوس افواج افواہ اقدام اقرار اقسام اقلیت اقوام الادا الا...

(ReplaceLettersInSameLangs)


[whitespace] ~112-~112: آیا منظور شما «"البته"» است؟
Context: ...دام اقرار اقسام اقلیت اقوام الادا الارم البتہ التجا الجھن الجھی الحال الزام الشان الع...

(ReplaceLettersInSameLangs)


[whitespace] ~114-~114: آیا منظور شما «"الجهن"» است؟
Context: ...سام اقلیت اقوام الادا الارم البتہ التجا الجھن الجھی الحال الزام الشان العین الفاط الف...

(ReplaceLettersInSameLangs)


[whitespace] ~115-~115: آیا منظور شما «"الجهی"» است؟
Context: ...لیت اقوام الادا الارم البتہ التجا الجھن الجھی الحال الزام الشان العین الفاط الفاظ الم...

(ReplaceLettersInSameLangs)


[whitespace] ~131-~131: آیا منظور شما «"انتهک"» است؟
Context: ...ینا امداد امراء املاک اموات امکان اناڑی انتھک انتہا انتیس انجام انداز اندوز اندھا اند...

(ReplaceLettersInSameLangs)


[whitespace] ~132-~132: آیا منظور شما «"انتها"» است؟
Context: ...داد امراء املاک اموات امکان اناڑی انتھک انتہا انتیس انجام انداز اندوز اندھا اندھے انس...

(ReplaceLettersInSameLangs)


[whitespace] ~137-~137: آیا منظور شما «"اندها"» است؟
Context: ...اڑی انتھک انتہا انتیس انجام انداز اندوز اندھا اندھے انسان انصاف انعام انٹری انٹیل انڈ...

(ReplaceLettersInSameLangs)


[whitespace] ~138-~138: آیا منظور شما «"اندهے"» است؟
Context: ...تھک انتہا انتیس انجام انداز اندوز اندھا اندھے انسان انصاف انعام انٹری انٹیل انڈیا انڈ...

(ReplaceLettersInSameLangs)


[whitespace] ~149-~149: آیا منظور شما «"انهوں"» است؟
Context: ...ٹری انٹیل انڈیا انڈین انکار انگلی انگیز انھوں انھیں انہوں انہین انہیں اوائل اودان اور...

(ReplaceLettersInSameLangs)


[whitespace] ~150-~150: آیا منظور شما «"انهیں"» است؟
Context: ...ٹیل انڈیا انڈین انکار انگلی انگیز انھوں انھیں انہوں انہین انہیں اوائل اودان اورات اور...

(ReplaceLettersInSameLangs)


[whitespace] ~151-~151: آیا منظور شما «"انهوں"» است؟
Context: ...ڈیا انڈین انکار انگلی انگیز انھوں انھیں انہوں انہین انہیں اوائل اودان اورات اورجب اور...

(ReplaceLettersInSameLangs)


[whitespace] ~152-~152: آیا منظور شما «"انهین"» است؟
Context: ...ڈین انکار انگلی انگیز انھوں انھیں انہوں انہین انہیں اوائل اودان اورات اورجب اورہر اوق...

(ReplaceLettersInSameLangs)


[whitespace] ~153-~153: آیا منظور شما «"انهیں"» است؟
Context: ...کار انگلی انگیز انھوں انھیں انہوں انہین انہیں اوائل اودان اورات اورجب اورہر اوقات اول...

(ReplaceLettersInSameLangs)


[whitespace] ~158-~158: آیا منظور شما «"اورهر"» است؟
Context: ...ہوں انہین انہیں اوائل اودان اورات اورجب اورہر اوقات اولاد اولگا اولین اونچی اونچے اٹا...

(ReplaceLettersInSameLangs)


[whitespace] ~166-~166: آیا منظور شما «"اٹهاؤ"» است؟
Context: ...قات اولاد اولگا اولین اونچی اونچے اٹاری اٹھاؤ اٹھاو اٹھنا اپددر اپریل اپنوں اپہاس اچا...

(ReplaceLettersInSameLangs)


[whitespace] ~167-~167: آیا منظور شما «"اٹهاو"» است؟
Context: ...لاد اولگا اولین اونچی اونچے اٹاری اٹھاؤ اٹھاو اٹھنا اپددر اپریل اپنوں اپہاس اچانک اچھ...

(ReplaceLettersInSameLangs)


[whitespace] ~168-~168: آیا منظور شما «"اٹهنا"» است؟
Context: ...لگا اولین اونچی اونچے اٹاری اٹھاؤ اٹھاو اٹھنا اپددر اپریل اپنوں اپہاس اچانک اچھال اڑا...

(ReplaceLettersInSameLangs)


[whitespace] ~172-~172: آیا منظور شما «"اپهاس"» است؟
Context: ...اری اٹھاؤ اٹھاو اٹھنا اپددر اپریل اپنوں اپہاس اچانک اچھال اڑانے اکٹھا اکٹھے اکڑکر اکھ...

(ReplaceLettersInSameLangs)


[whitespace] ~174-~174: آیا منظور شما «"اچهال"» است؟
Context: ...ھاو اٹھنا اپددر اپریل اپنوں اپہاس اچانک اچھال اڑانے اکٹھا اکٹھے اکڑکر اکھاڑ اکیلا اکی...

(ReplaceLettersInSameLangs)


[whitespace] ~176-~176: آیا منظور شما «"اکٹها"» است؟
Context: ...ددر اپریل اپنوں اپہاس اچانک اچھال اڑانے اکٹھا اکٹھے اکڑکر اکھاڑ اکیلا اکیلی اکیلے اگر...

(ReplaceLettersInSameLangs)


[whitespace] ~177-~177: آیا منظور شما «"اکٹهے"» است؟
Context: ...ریل اپنوں اپہاس اچانک اچھال اڑانے اکٹھا اکٹھے اکڑکر اکھاڑ اکیلا اکیلی اکیلے اگرچہ اگس...

(ReplaceLettersInSameLangs)


[whitespace] ~179-~179: آیا منظور شما «"اکهاڑ"» است؟
Context: ...ہاس اچانک اچھال اڑانے اکٹھا اکٹھے اکڑکر اکھاڑ اکیلا اکیلی اکیلے اگرچہ اگستس اگلوا اہد...

(ReplaceLettersInSameLangs)


[whitespace] ~183-~183: آیا منظور شما «"اگرچه"» است؟
Context: ...ٹھا اکٹھے اکڑکر اکھاڑ اکیلا اکیلی اکیلے اگرچہ اگستس اگلوا اہداف اہمیت ایجاد ایجنٹ ایر...

(ReplaceLettersInSameLangs)


[whitespace] ~186-~186: آیا منظور شما «"اهداف"» است؟
Context: ...ھاڑ اکیلا اکیلی اکیلے اگرچہ اگستس اگلوا اہداف اہمیت ایجاد ایجنٹ ایران ایریا ایمان ایم...

(ReplaceLettersInSameLangs)


[whitespace] ~187-~187: آیا منظور شما «"اهمیت"» است؟
Context: ...یلا اکیلی اکیلے اگرچہ اگستس اگلوا اہداف اہمیت ایجاد ایجنٹ ایران ایریا ایمان ایملی این...

(ReplaceLettersInSameLangs)


[whitespace] ~199-~199: آیا منظور شما «"ایڑهی"» است؟
Context: ...مان ایملی اینجل اینڈی اینکر ایونز ایونٹ ایڑھی ایکشن ایکٹر ایکٹو باؤنڈ بائبل بائیں بات...

(ReplaceLettersInSameLangs)


[whitespace] ~217-~217: آیا منظور شما «"بانده"» است؟
Context: ...رود بارڈر بازار بالوں بالٹک بالٹی بالکل باندھ بانڈز باہری باہمی باہوں بتاءو بتاؤں بتا...

(ReplaceLettersInSameLangs)


[whitespace] ~219-~219: آیا منظور شما «"باهری"» است؟
Context: ...زار بالوں بالٹک بالٹی بالکل باندھ بانڈز باہری باہمی باہوں بتاءو بتاؤں بتائی بتائے بتا...

(ReplaceLettersInSameLangs)


[whitespace] ~220-~220: آیا منظور شما «"باهمی"» است؟
Context: ...لوں بالٹک بالٹی بالکل باندھ بانڈز باہری باہمی باہوں بتاءو بتاؤں بتائی بتائے بتاتا بتا...

(ReplaceLettersInSameLangs)


[whitespace] ~221-~221: آیا منظور شما «"باهوں"» است؟
Context: ...لٹک بالٹی بالکل باندھ بانڈز باہری باہمی باہوں بتاءو بتاؤں بتائی بتائے بتاتا بتاتی بتا...

(ReplaceLettersInSameLangs)


[whitespace] ~237-~237: آیا منظور شما «"بحریه"» است؟
Context: ...انے بتاوں بتایا بجائے بجانے بحالی بحران بحریہ بخشوں بدلتا بدلتے بدلنے بدماش بدنام برآ...

(ReplaceLettersInSameLangs)


[whitespace] ~256-~256: آیا منظور شما «"برتها"» است؟
Context: ...ابر برادر برانڈ براوو برباد برتاؤ برتری برتھا برخاف برسات برسوں برطرف برعکس بریکر بری...

(ReplaceLettersInSameLangs)


[whitespace] ~265-~265: آیا منظور شما «"بشانه"» است؟
Context: ...سات برسوں برطرف برعکس بریکر بریکٹ بزدلی بشانہ بظاہر بغاوت بغداد بفیلو بقایا بلائے بلا...

(ReplaceLettersInSameLangs)


[whitespace] ~266-~266: آیا منظور شما «"بظاهر"» است؟
Context: ...سوں برطرف برعکس بریکر بریکٹ بزدلی بشانہ بظاہر بغاوت بغداد بفیلو بقایا بلائے بلاتا بلا...

(ReplaceLettersInSameLangs)


[whitespace] ~300-~300: آیا منظور شما «"بندهن"» است؟
Context: ...انے بناوٹ بنایا بنجمن بندوا بندوق بندوں بندھن بندھے بنگلہ بنیاد بنیان بوائے بورنگ بوس...

(ReplaceLettersInSameLangs)


[whitespace] ~301-~301: آیا منظور شما «"بندهے"» است؟
Context: ...اوٹ بنایا بنجمن بندوا بندوق بندوں بندھن بندھے بنگلہ بنیاد بنیان بوائے بورنگ بوسٹن بول...

(ReplaceLettersInSameLangs)


[whitespace] ~302-~302: آیا منظور شما «"بنگله"» است؟
Context: ...ایا بنجمن بندوا بندوق بندوں بندھن بندھے بنگلہ بنیاد بنیان بوائے بورنگ بوسٹن بولتا بول...

(ReplaceLettersInSameLangs)


[whitespace] ~315-~315: آیا منظور شما «"بوڑها"» است؟
Context: ...لتا بولتے بولنا بولنے بولوں بولٹن بولیں بوڑھا بوڑھے بچائی بچاتا بچالو بچانا بچانے بچا...

(ReplaceLettersInSameLangs)


[whitespace] ~316-~316: آیا منظور شما «"بوڑهے"» است؟
Context: ...لتے بولنا بولنے بولوں بولٹن بولیں بوڑھا بوڑھے بچائی بچاتا بچالو بچانا بچانے بچایا بڑپ...

(ReplaceLettersInSameLangs)


[whitespace] ~324-~324: آیا منظور شما «"بڑهتا"» است؟
Context: ...ائی بچاتا بچالو بچانا بچانے بچایا بڑپپن بڑھتا بڑھتی بڑھتے بڑھنے بڑھیں بکارا بکسوا بکو...

(ReplaceLettersInSameLangs)


[whitespace] ~325-~325: آیا منظور شما «"بڑهتی"» است؟
Context: ...اتا بچالو بچانا بچانے بچایا بڑپپن بڑھتا بڑھتی بڑھتے بڑھنے بڑھیں بکارا بکسوا بکواس بگر...

(ReplaceLettersInSameLangs)


[whitespace] ~326-~326: آیا منظور شما «"بڑهتے"» است؟
Context: ...الو بچانا بچانے بچایا بڑپپن بڑھتا بڑھتی بڑھتے بڑھنے بڑھیں بکارا بکسوا بکواس بگرام بگو...

(ReplaceLettersInSameLangs)


[whitespace] ~327-~327: آیا منظور شما «"بڑهنے"» است؟
Context: ...انا بچانے بچایا بڑپپن بڑھتا بڑھتی بڑھتے بڑھنے بڑھیں بکارا بکسوا بکواس بگرام بگولے بھا...

(ReplaceLettersInSameLangs)


[whitespace] ~328-~328: آیا منظور شما «"بڑهیں"» است؟
Context: ...انے بچایا بڑپپن بڑھتا بڑھتی بڑھتے بڑھنے بڑھیں بکارا بکسوا بکواس بگرام بگولے بھائی بھا...

(ReplaceLettersInSameLangs)


[whitespace] ~334-~334: آیا منظور شما «"بهائی"» است؟
Context: ...ھنے بڑھیں بکارا بکسوا بکواس بگرام بگولے بھائی بھاری بھاگا بھاگو بھاگے بھرتی بھرنے بھر...

(ReplaceLettersInSameLangs)


[whitespace] ~335-~335: آیا منظور شما «"بهاری"» است؟
Context: ...ھیں بکارا بکسوا بکواس بگرام بگولے بھائی بھاری بھاگا بھاگو بھاگے بھرتی بھرنے بھریں بھو...

(ReplaceLettersInSameLangs)


[whitespace] ~336-~336: آیا منظور شما «"بهاگا"» است؟
Context: ...ارا بکسوا بکواس بگرام بگولے بھائی بھاری بھاگا بھاگو بھاگے بھرتی بھرنے بھریں بھوری بھو...

(ReplaceLettersInSameLangs)


[whitespace] ~337-~337: آیا منظور شما «"بهاگو"» است؟
Context: ...سوا بکواس بگرام بگولے بھائی بھاری بھاگا بھاگو بھاگے بھرتی بھرنے بھریں بھوری بھولا بھو...

(ReplaceLettersInSameLangs)


[whitespace] ~338-~338: آیا منظور شما «"بهاگے"» است؟
Context: ...واس بگرام بگولے بھائی بھاری بھاگا بھاگو بھاگے بھرتی بھرنے بھریں بھوری بھولا بھولو بھو...

(ReplaceLettersInSameLangs)


[whitespace] ~339-~339: آیا منظور شما «"بهرتی"» است؟
Context: ...رام بگولے بھائی بھاری بھاگا بھاگو بھاگے بھرتی بھرنے بھریں بھوری بھولا بھولو بھولی بھو...

(ReplaceLettersInSameLangs)


[whitespace] ~340-~340: آیا منظور شما «"بهرنے"» است؟
Context: ...ولے بھائی بھاری بھاگا بھاگو بھاگے بھرتی بھرنے بھریں بھوری بھولا بھولو بھولی بھوکا بھو...

(ReplaceLettersInSameLangs)


[whitespace] ~341-~341: آیا منظور شما «"بهریں"» است؟
Context: ...ائی بھاری بھاگا بھاگو بھاگے بھرتی بھرنے بھریں بھوری بھولا بھولو بھولی بھوکا بھوکے بھٹ...

(ReplaceLettersInSameLangs)


[whitespace] ~342-~342: آیا منظور شما «"بهوری"» است؟
Context: ...اری بھاگا بھاگو بھاگے بھرتی بھرنے بھریں بھوری بھولا بھولو بھولی بھوکا بھوکے بھٹکا بھی...

(ReplaceLettersInSameLangs)


[whitespace] ~343-~343: آیا منظور شما «"بهولا"» است؟
Context: ...اگا بھاگو بھاگے بھرتی بھرنے بھریں بھوری بھولا بھولو بھولی بھوکا بھوکے بھٹکا بھیجا بھی...

(ReplaceLettersInSameLangs)


[whitespace] ~344-~344: آیا منظور شما «"بهولو"» است؟
Context: ...اگو بھاگے بھرتی بھرنے بھریں بھوری بھولا بھولو بھولی بھوکا بھوکے بھٹکا بھیجا بھیجو بھی...

(ReplaceLettersInSameLangs)


[whitespace] ~345-~345: آیا منظور شما «"بهولی"» است؟
Context: ...اگے بھرتی بھرنے بھریں بھوری بھولا بھولو بھولی بھوکا بھوکے بھٹکا بھیجا بھیجو بھیجی بھی...

(ReplaceLettersInSameLangs)


[whitespace] ~346-~346: آیا منظور شما «"بهوکا"» است؟
Context: ...رتی بھرنے بھریں بھوری بھولا بھولو بھولی بھوکا بھوکے بھٹکا بھیجا بھیجو بھیجی بھیجے بہا...

(ReplaceLettersInSameLangs)


[whitespace] ~347-~347: آیا منظور شما «"بهوکے"» است؟
Context: ...رنے بھریں بھوری بھولا بھولو بھولی بھوکا بھوکے بھٹکا بھیجا بھیجو بھیجی بھیجے بہادر بہا...

(ReplaceLettersInSameLangs)


[whitespace] ~348-~348: آیا منظور شما «"بهٹکا"» است؟
Context: ...ریں بھوری بھولا بھولو بھولی بھوکا بھوکے بھٹکا بھیجا بھیجو بھیجی بھیجے بہادر بہانا بہا...

(ReplaceLettersInSameLangs)


[whitespace] ~349-~349: آیا منظور شما «"بهیجا"» است؟
Context: ...وری بھولا بھولو بھولی بھوکا بھوکے بھٹکا بھیجا بھیجو بھیجی بھیجے بہادر بہانا بہانہ بہا...

(ReplaceLettersInSameLangs)


[whitespace] ~350-~350: آیا منظور شما «"بهیجو"» است؟
Context: ...ولا بھولو بھولی بھوکا بھوکے بھٹکا بھیجا بھیجو بھیجی بھیجے بہادر بہانا بہانہ بہانے بہا...

(ReplaceLettersInSameLangs)


[whitespace] ~351-~351: آیا منظور شما «"بهیجی"» است؟
Context: ...ولو بھولی بھوکا بھوکے بھٹکا بھیجا بھیجو بھیجی بھیجے بہادر بہانا بہانہ بہانے بہایا بہب...

(ReplaceLettersInSameLangs)


[whitespace] ~352-~352: آیا منظور شما «"بهیجے"» است؟
Context: ...ولی بھوکا بھوکے بھٹکا بھیجا بھیجو بھیجی بھیجے بہادر بہانا بہانہ بہانے بہایا بہبود بہت...

(ReplaceLettersInSameLangs)


[whitespace] ~353-~353: آیا منظور شما «"بهادر"» است؟
Context: ...وکا بھوکے بھٹکا بھیجا بھیجو بھیجی بھیجے بہادر بہانا بہانہ بہانے بہایا بہبود بہتری بہن...

(ReplaceLettersInSameLangs)


[whitespace] ~354-~354: آیا منظور شما «"بهانا"» است؟
Context: ...وکے بھٹکا بھیجا بھیجو بھیجی بھیجے بہادر بہانا بہانہ بہانے بہایا بہبود بہتری بہنوں بیا...

(ReplaceLettersInSameLangs)


[whitespace] ~355-~355: آیا منظور شما «"بهانه"» است؟
Context: ...ٹکا بھیجا بھیجو بھیجی بھیجے بہادر بہانا بہانہ بہانے بہایا بہبود بہتری بہنوں بیاسی بیب...

(ReplaceLettersInSameLangs)


[whitespace] ~356-~356: آیا منظور شما «"بهانے"» است؟
Context: ...یجا بھیجو بھیجی بھیجے بہادر بہانا بہانہ بہانے بہایا بہبود بہتری بہنوں بیاسی بیبسی بیج...

(ReplaceLettersInSameLangs)


[whitespace] ~357-~357: آیا منظور شما «"بهایا"» است؟
Context: ...یجو بھیجی بھیجے بہادر بہانا بہانہ بہانے بہایا بہبود بہتری بہنوں بیاسی بیبسی بیجنگ بیج...

(ReplaceLettersInSameLangs)


[whitespace] ~358-~358: آیا منظور شما «"بهبود"» است؟
Context: ...یجی بھیجے بہادر بہانا بہانہ بہانے بہایا بہبود بہتری بہنوں بیاسی بیبسی بیجنگ بیجوں بیر...

(ReplaceLettersInSameLangs)


[whitespace] ~359-~359: آیا منظور شما «"بهتری"» است؟
Context: ...یجے بہادر بہانا بہانہ بہانے بہایا بہبود بہتری بہنوں بیاسی بیبسی بیجنگ بیجوں بیرنگ بیر...

(ReplaceLettersInSameLangs)


[whitespace] ~360-~360: آیا منظور شما «"بهنوں"» است؟
Context: ...ادر بہانا بہانہ بہانے بہایا بہبود بہتری بہنوں بیاسی بیبسی بیجنگ بیجوں بیرنگ بیروت بیر...

(ReplaceLettersInSameLangs)


[whitespace] ~374-~374: آیا منظور شما «"بیٹها"» است؟
Context: ...رون بیضوی بیلچے بیمار بیونس بیٹری بیٹوں بیٹھا بیٹھو بیٹھی بیٹھے بیچلر بیچنے بیچوں بیک...

(ReplaceLettersInSameLangs)


[whitespace] ~375-~375: آیا منظور شما «"بیٹهو"» است؟
Context: ...ضوی بیلچے بیمار بیونس بیٹری بیٹوں بیٹھا بیٹھو بیٹھی بیٹھے بیچلر بیچنے بیچوں بیکار بیہ...

(ReplaceLettersInSameLangs)


[whitespace] ~376-~376: آیا منظور شما «"بیٹهی"» است؟
Context: ...لچے بیمار بیونس بیٹری بیٹوں بیٹھا بیٹھو بیٹھی بیٹھے بیچلر بیچنے بیچوں بیکار بیہوش بےح...

(ReplaceLettersInSameLangs)


[whitespace] ~377-~377: آیا منظور شما «"بیٹهے"» است؟
Context: ...مار بیونس بیٹری بیٹوں بیٹھا بیٹھو بیٹھی بیٹھے بیچلر بیچنے بیچوں بیکار بیہوش بےحوش بےک...

(ReplaceLettersInSameLangs)


[whitespace] ~382-~382: آیا منظور شما «"بیهوش"» است؟
Context: ...ٹھو بیٹھی بیٹھے بیچلر بیچنے بیچوں بیکار بیہوش بےحوش بےکار تائید تابوت تاخیر تاریخ تار...

(ReplaceLettersInSameLangs)


[whitespace] ~393-~393: آیا منظور شما «"تباهی"» است؟
Context: ...بوت تاخیر تاریخ تاریک تالاب تاوان تاکنا تباہی تبدیل تبصرہ تبولی تجارت تجاست تجاوز تجر...

(ReplaceLettersInSameLangs)


[whitespace] ~395-~395: آیا منظور شما «"تبصره"» است؟
Context: ...ریخ تاریک تالاب تاوان تاکنا تباہی تبدیل تبصرہ تبولی تجارت تجاست تجاوز تجربہ تجربے تجز...

(ReplaceLettersInSameLangs)


[whitespace] ~400-~400: آیا منظور شما «"تجربه"» است؟
Context: ...اہی تبدیل تبصرہ تبولی تجارت تجاست تجاوز تجربہ تجربے تجزیہ تجوری تجویز تحائف تحریر تحر...

(ReplaceLettersInSameLangs)


[whitespace] ~402-~402: آیا منظور شما «"تجزیه"» است؟
Context: ...صرہ تبولی تجارت تجاست تجاوز تجربہ تجربے تجزیہ تجوری تجویز تحائف تحریر تحریک تحقیق تحل...

(ReplaceLettersInSameLangs)


[whitespace] ~417-~417: آیا منظور شما «"ترجمه"» است؟
Context: ...ویل تخلیق تدفین تدویر تذکرے تربیت ترتیب ترجمہ ترجیح ترسیل ترمیم ترکون ترکوں تزئین تسب...

(ReplaceLettersInSameLangs)


[whitespace] ~450-~450: آیا منظور شما «"تفهیم"» است؟
Context: ...میل تعویذ تفتشی تفتیش تفریح تفصیل تفویض تفہیم تقاضہ تقدیر تقریب تقریر تقسیم تقطیع تلا...

(ReplaceLettersInSameLangs)


[whitespace] ~451-~451: آیا منظور شما «"تقاضه"» است؟
Context: ...ویذ تفتشی تفتیش تفریح تفصیل تفویض تفہیم تقاضہ تقدیر تقریب تقریر تقسیم تقطیع تلاشی تلا...

(ReplaceLettersInSameLangs)


[whitespace] ~462-~462: آیا منظور شما «"تمهیں"» است؟
Context: ...سیم تقطیع تلاشی تلافی تلوار تمارا تماشا تمہیں تناظر تنظیم تنقید توازن توسیع تولیہ توپ...

(ReplaceLettersInSameLangs)


[whitespace] ~468-~468: آیا منظور شما «"تولیه"» است؟
Context: ...اشا تمہیں تناظر تنظیم تنقید توازن توسیع تولیہ توپاک توڑنا توڑنے توکیا توہین تکلیف تکم...

(ReplaceLettersInSameLangs)


[whitespace] ~473-~473: آیا منظور شما «"توهین"» است؟
Context: ...ازن توسیع تولیہ توپاک توڑنا توڑنے توکیا توہین تکلیف تکمیل تھامس تھرمل تھرٹی تھنڈر تھو...

(ReplaceLettersInSameLangs)


[whitespace] ~476-~476: آیا منظور شما «"تهامس"» است؟
Context: ...پاک توڑنا توڑنے توکیا توہین تکلیف تکمیل تھامس تھرمل تھرٹی تھنڈر تھوڑا تھوڑی تھوڑے تھی...

(ReplaceLettersInSameLangs)


[whitespace] ~477-~477: آیا منظور شما «"تهرمل"» است؟
Context: ...ڑنا توڑنے توکیا توہین تکلیف تکمیل تھامس تھرمل تھرٹی تھنڈر تھوڑا تھوڑی تھوڑے تھیٹر تہا...

(ReplaceLettersInSameLangs)


[whitespace] ~478-~478: آیا منظور شما «"تهرٹی"» است؟
Context: ...ڑنے توکیا توہین تکلیف تکمیل تھامس تھرمل تھرٹی تھنڈر تھوڑا تھوڑی تھوڑے تھیٹر تہائی تہا...

(ReplaceLettersInSameLangs)


[whitespace] ~479-~479: آیا منظور شما «"تهنڈر"» است؟
Context: ...کیا توہین تکلیف تکمیل تھامس تھرمل تھرٹی تھنڈر تھوڑا تھوڑی تھوڑے تھیٹر تہائی تہارا تہا...

(ReplaceLettersInSameLangs)


[whitespace] ~480-~480: آیا منظور شما «"تهوڑا"» است؟
Context: ...ہین تکلیف تکمیل تھامس تھرمل تھرٹی تھنڈر تھوڑا تھوڑی تھوڑے تھیٹر تہائی تہارا تہارے تہذ...

(ReplaceLettersInSameLangs)


[whitespace] ~481-~481: آیا منظور شما «"تهوڑی"» است؟
Context: ...لیف تکمیل تھامس تھرمل تھرٹی تھنڈر تھوڑا تھوڑی تھوڑے تھیٹر تہائی تہارا تہارے تہذیب تیا...

(ReplaceLettersInSameLangs)


[whitespace] ~482-~482: آیا منظور شما «"تهوڑے"» است؟
Context: ...میل تھامس تھرمل تھرٹی تھنڈر تھوڑا تھوڑی تھوڑے تھیٹر تہائی تہارا تہارے تہذیب تیاری تیس...

(ReplaceLettersInSameLangs)


[whitespace] ~483-~483: آیا منظور شما «"تهیٹر"» است؟
Context: ...امس تھرمل تھرٹی تھنڈر تھوڑا تھوڑی تھوڑے تھیٹر تہائی تہارا تہارے تہذیب تیاری تیسرا تیس...

(ReplaceLettersInSameLangs)


[whitespace] ~484-~484: آیا منظور شما «"تهائی"» است؟
Context: ...رمل تھرٹی تھنڈر تھوڑا تھوڑی تھوڑے تھیٹر تہائی تہارا تہارے تہذیب تیاری تیسرا تیسری تیس...

(ReplaceLettersInSameLangs)


[whitespace] ~485-~485: آیا منظور شما «"تهارا"» است؟
Context: ...رٹی تھنڈر تھوڑا تھوڑی تھوڑے تھیٹر تہائی تہارا تہارے تہذیب تیاری تیسرا تیسری تیسرے تیم...

(ReplaceLettersInSameLangs)


[whitespace] ~486-~486: آیا منظور شما «"تهارے"» است؟
Context: ...نڈر تھوڑا تھوڑی تھوڑے تھیٹر تہائی تہارا تہارے تہذیب تیاری تیسرا تیسری تیسرے تیمور تین...

(ReplaceLettersInSameLangs)


[whitespace] ~487-~487: آیا منظور شما «"تهذیب"» است؟
Context: ...وڑا تھوڑی تھوڑے تھیٹر تہائی تہارا تہارے تہذیب تیاری تیسرا تیسری تیسرے تیمور تینوں ثقا...

(ReplaceLettersInSameLangs)


[whitespace] ~495-~495: آیا منظور شما «"جائزه"» است؟
Context: ...اری تیسرا تیسری تیسرے تیمور تینوں ثقافت جائزہ جائیں جارہا جارہے جاسوس جامنی جانتا جان...

(ReplaceLettersInSameLangs)


[whitespace] ~497-~497: آیا منظور شما «"جارها"» است؟
Context: ...سری تیسرے تیمور تینوں ثقافت جائزہ جائیں جارہا جارہے جاسوس جامنی جانتا جانتی جانتے جان...

(ReplaceLettersInSameLangs)


[whitespace] ~498-~498: آیا منظور شما «"جارهے"» است؟
Context: ...سرے تیمور تینوں ثقافت جائزہ جائیں جارہا جارہے جاسوس جامنی جانتا جانتی جانتے جانسن جان...

(ReplaceLettersInSameLangs)


[whitespace] ~514-~514: آیا منظور شما «"جاهتی"» است؟
Context: ...نور جانوں جانیں جاوگی جاپان جاگتے جاگنا جاہتی جاہیں جایئے جبڑوں جتاؤں جذبات جرائم جرم...

(ReplaceLettersInSameLangs)


[whitespace] ~515-~515: آیا منظور شما «"جاهیں"» است؟
Context: ...نوں جانیں جاوگی جاپان جاگتے جاگنا جاہتی جاہیں جایئے جبڑوں جتاؤں جذبات جرائم جرمنی جزی...

(ReplaceLettersInSameLangs)


[whitespace] ~522-~522: آیا منظور شما «"جزیره"» است؟
Context: ...ہیں جایئے جبڑوں جتاؤں جذبات جرائم جرمنی جزیرہ جزیرے جسموں جلانے جللاد جماتی جماعت جمپ...

(ReplaceLettersInSameLangs)


[whitespace] ~537-~537: آیا منظور شما «"جنهیں"» است؟
Context: ...ازے جنوبی جنوری جنگجو جنگلی جنگوں جنگیں جنھیں جنہوں جنہیں جنیوا جوابی جواگر جوتوں جول...

(ReplaceLettersInSameLangs)


[whitespace] ~538-~538: آیا منظور شما «"جنهوں"» است؟
Context: ...وبی جنوری جنگجو جنگلی جنگوں جنگیں جنھیں جنہوں جنہیں جنیوا جوابی جواگر جوتوں جولیا جوہ...

(ReplaceLettersInSameLangs)


[whitespace] ~539-~539: آیا منظور شما «"جنهیں"» است؟
Context: ...وری جنگجو جنگلی جنگوں جنگیں جنھیں جنہوں جنہیں جنیوا جوابی جواگر جوتوں جولیا جوہان جوہ...

(ReplaceLettersInSameLangs)


[whitespace] ~545-~545: آیا منظور شما «"جوهان"» است؟
Context: ...ہوں جنہیں جنیوا جوابی جواگر جوتوں جولیا جوہان جوہری جگائے جگہوں جگہیں جھاڑو جھجھک جھن...

(ReplaceLettersInSameLangs)


[whitespace] ~546-~546: آیا منظور شما «"جوهری"» است؟
Context: ...ہیں جنیوا جوابی جواگر جوتوں جولیا جوہان جوہری جگائے جگہوں جگہیں جھاڑو جھجھک جھنڈا جھن...

(ReplaceLettersInSameLangs)


[whitespace] ~548-~548: آیا منظور شما «"جگهوں"» است؟
Context: ...ابی جواگر جوتوں جولیا جوہان جوہری جگائے جگہوں جگہیں جھاڑو جھجھک جھنڈا جھنڈے جھونک جھو...

(ReplaceLettersInSameLangs)


[whitespace] ~549-~549: آیا منظور شما «"جگهیں"» است؟
Context: ...اگر جوتوں جولیا جوہان جوہری جگائے جگہوں جگہیں جھاڑو جھجھک جھنڈا جھنڈے جھونک جھوٹا جھو...

(ReplaceLettersInSameLangs)


[whitespace] ~550-~550: آیا منظور شما «"جهاڑو"» است؟
Context: ...توں جولیا جوہان جوہری جگائے جگہوں جگہیں جھاڑو جھجھک جھنڈا جھنڈے جھونک جھوٹا جھوٹی جھو...

(ReplaceLettersInSameLangs)


[whitespace] ~551-~551: آیا منظور شما «"جهجهک"» است؟
Context: ...لیا جوہان جوہری جگائے جگہوں جگہیں جھاڑو جھجھک جھنڈا جھنڈے جھونک جھوٹا جھوٹی جھوٹے جھٹ...

(ReplaceLettersInSameLangs)


[whitespace] ~552-~552: آیا منظور شما «"جهنڈا"» است؟
Context: ...ہان جوہری جگائے جگہوں جگہیں جھاڑو جھجھک جھنڈا جھنڈے جھونک جھوٹا جھوٹی جھوٹے جھٹلا جھٹ...

(ReplaceLettersInSameLangs)


[whitespace] ~553-~553: آیا منظور شما «"جهنڈے"» است؟
Context: ...ہری جگائے جگہوں جگہیں جھاڑو جھجھک جھنڈا جھنڈے جھونک جھوٹا جھوٹی جھوٹے جھٹلا جھٹکا جھپ...

(ReplaceLettersInSameLangs)


[whitespace] ~554-~554: آیا منظور شما «"جهونک"» است؟
Context: ...ائے جگہوں جگہیں جھاڑو جھجھک جھنڈا جھنڈے جھونک جھوٹا جھوٹی جھوٹے جھٹلا جھٹکا جھپٹا جھگ...

(ReplaceLettersInSameLangs)


[whitespace] ~555-~555: آیا منظور شما «"جهوٹا"» است؟
Context: ...ہوں جگہیں جھاڑو جھجھک جھنڈا جھنڈے جھونک جھوٹا جھوٹی جھوٹے جھٹلا جھٹکا جھپٹا جھگڑا جھگ...

(ReplaceLettersInSameLangs)


[whitespace] ~556-~556: آیا منظور شما «"جهوٹی"» است؟
Context: ...ہیں جھاڑو جھجھک جھنڈا جھنڈے جھونک جھوٹا جھوٹی جھوٹے جھٹلا جھٹکا جھپٹا جھگڑا جھگڑے جہا...

(ReplaceLettersInSameLangs)


[whitespace] ~557-~557: آیا منظور شما «"جهوٹے"» است؟
Context: ...اڑو جھجھک جھنڈا جھنڈے جھونک جھوٹا جھوٹی جھوٹے جھٹلا جھٹکا جھپٹا جھگڑا جھگڑے جہالت جیت...

(ReplaceLettersInSameLangs)


[whitespace] ~558-~558: آیا منظور شما «"جهٹلا"» است؟
Context: ...جھک جھنڈا جھنڈے جھونک جھوٹا جھوٹی جھوٹے جھٹلا جھٹکا جھپٹا جھگڑا جھگڑے جہالت جیتنے جین...

(ReplaceLettersInSameLangs)


[whitespace] ~559-~559: آیا منظور شما «"جهٹکا"» است؟
Context: ...نڈا جھنڈے جھونک جھوٹا جھوٹی جھوٹے جھٹلا جھٹکا جھپٹا جھگڑا جھگڑے جہالت جیتنے جینرو جیک...

(ReplaceLettersInSameLangs)


[whitespace] ~560-~560: آیا منظور شما «"جهپٹا"» است؟
Context: ...نڈے جھونک جھوٹا جھوٹی جھوٹے جھٹلا جھٹکا جھپٹا جھگڑا جھگڑے جہالت جیتنے جینرو جیکسن حاد...

(ReplaceLettersInSameLangs)


[whitespace] ~561-~561: آیا منظور شما «"جهگڑا"» است؟
Context: ...ونک جھوٹا جھوٹی جھوٹے جھٹلا جھٹکا جھپٹا جھگڑا جھگڑے جہالت جیتنے جینرو جیکسن حادثہ حاد...

(ReplaceLettersInSameLangs)


[whitespace] ~562-~562: آیا منظور شما «"جهگڑے"» است؟
Context: ...وٹا جھوٹی جھوٹے جھٹلا جھٹکا جھپٹا جھگڑا جھگڑے جہالت جیتنے جینرو جیکسن حادثہ حادثے حال...

(ReplaceLettersInSameLangs)


[whitespace] ~563-~563: آیا منظور شما «"جهالت"» است؟
Context: ...وٹی جھوٹے جھٹلا جھٹکا جھپٹا جھگڑا جھگڑے جہالت جیتنے جینرو جیکسن حادثہ حادثے حالات حال...

(ReplaceLettersInSameLangs)


[whitespace] ~567-~567: آیا منظور شما «"حادثه"» است؟
Context: ...پٹا جھگڑا جھگڑے جہالت جیتنے جینرو جیکسن حادثہ حادثے حالات حالیہ حاملہ حرارت حراست حسن...

(ReplaceLettersInSameLangs)


[whitespace] ~570-~570: آیا منظور شما «"حالیه"» است؟
Context: ...الت جیتنے جینرو جیکسن حادثہ حادثے حالات حالیہ حاملہ حرارت حراست حسنسن حضرات حفاظت حقا...

(ReplaceLettersInSameLangs)


[whitespace] ~571-~571: آیا منظور شما «"حامله"» است؟
Context: ...تنے جینرو جیکسن حادثہ حادثے حالات حالیہ حاملہ حرارت حراست حسنسن حضرات حفاظت حقائق حقد...

(ReplaceLettersInSameLangs)


[whitespace] ~588-~588: آیا منظور شما «"حوصله"» است؟
Context: ...قوں حماقت حمایت حملوں حوالے حوروں حوریں حوصلہ حکومت حیثیت حیران حیوان خاتمہ خاتمے خات...

(ReplaceLettersInSameLangs)


[whitespace] ~593-~593: آیا منظور شما «"خاتمه"» است؟
Context: ...روں حوریں حوصلہ حکومت حیثیت حیران حیوان خاتمہ خاتمے خاتون خارجہ خارجی خاصیت خاموش خان...

(ReplaceLettersInSameLangs)


[whitespace] ~596-~596: آیا منظور شما «"خارجه"» است؟
Context: ...ومت حیثیت حیران حیوان خاتمہ خاتمے خاتون خارجہ خارجی خاصیت خاموش خانوں خبروں خبریں خدا...

(ReplaceLettersInSameLangs)


[whitespace] ~615-~615: آیا منظور شما «"خزانه"» است؟
Context: ...شات خدمات خرابی خراپن خروںچ خرگوش خریدا خزانہ خزانے خصوصی خطرات خلاصہ خلیات خواجہ خوا...

(ReplaceLettersInSameLangs)


[whitespace] ~619-~619: آیا منظور شما «"خلاصه"» است؟
Context: ...وںچ خرگوش خریدا خزانہ خزانے خصوصی خطرات خلاصہ خلیات خواجہ خواہش خوراک خہجءز خیانت خیم...

(ReplaceLettersInSameLangs)


[whitespace] ~621-~621: آیا منظور شما «"خواجه"» است؟
Context: ...یدا خزانہ خزانے خصوصی خطرات خلاصہ خلیات خواجہ خواہش خوراک خہجءز خیانت خیموں دائرہ دائ...

(ReplaceLettersInSameLangs)


[whitespace] ~622-~622: آیا منظور شما «"خواهش"» است؟
Context: ...انہ خزانے خصوصی خطرات خلاصہ خلیات خواجہ خواہش خوراک خہجءز خیانت خیموں دائرہ دائرے دائ...

(ReplaceLettersInSameLangs)


[whitespace] ~624-~624: آیا منظور شما «"خهجءز"» است؟
Context: ...وصی خطرات خلاصہ خلیات خواجہ خواہش خوراک خہجءز خیانت خیموں دائرہ دائرے دائیں داخلہ داخ...

(ReplaceLettersInSameLangs)


[whitespace] ~627-~627: آیا منظور شما «"دائره"» است؟
Context: ...یات خواجہ خواہش خوراک خہجءز خیانت خیموں دائرہ دائرے دائیں داخلہ داخلی داخلے دالان داڑ...

(ReplaceLettersInSameLangs)


[whitespace] ~630-~630: آیا منظور شما «"داخله"» است؟
Context: ...راک خہجءز خیانت خیموں دائرہ دائرے دائیں داخلہ داخلی داخلے دالان داڑھی داہنے دبانا دبا...

(ReplaceLettersInSameLangs)


[whitespace] ~634-~634: آیا منظور شما «"داڑهی"» است؟
Context: ...ئرہ دائرے دائیں داخلہ داخلی داخلے دالان داڑھی داہنے دبانا دبانے درآمد دراصل درپیش درک...

(ReplaceLettersInSameLangs)


[whitespace] ~635-~635: آیا منظور شما «"داهنے"» است؟
Context: ...ئرے دائیں داخلہ داخلی داخلے دالان داڑھی داہنے دبانا دبانے درآمد دراصل درپیش درکار دست...

(ReplaceLettersInSameLangs)


[whitespace] ~668-~668: آیا منظور شما «"دوپهر"» است؟
Context: ...ستو دوستی دوسرا دوسری دوسرے دونوں دونگا دوپہر دوچار دوڑنے دوڑوں دوگلا دوگنی دوہرا دکھ...

(ReplaceLettersInSameLangs)


[whitespace] ~674-~674: آیا منظور شما «"دوهرا"» است؟
Context: ...نگا دوپہر دوچار دوڑنے دوڑوں دوگلا دوگنی دوہرا دکھاؤ دکھاو دکھتا دکھتے دھبوں دھمکی دھن...

(ReplaceLettersInSameLangs)


[whitespace] ~675-~675: آیا منظور شما «"دکهاؤ"» است؟
Context: ...پہر دوچار دوڑنے دوڑوں دوگلا دوگنی دوہرا دکھاؤ دکھاو دکھتا دکھتے دھبوں دھمکی دھندہ دھو...

(ReplaceLettersInSameLangs)


[whitespace] ~676-~676: آیا منظور شما «"دکهاو"» است؟
Context: ...چار دوڑنے دوڑوں دوگلا دوگنی دوہرا دکھاؤ دکھاو دکھتا دکھتے دھبوں دھمکی دھندہ دھواں دھو...

(ReplaceLettersInSameLangs)


[whitespace] ~677-~677: آیا منظور شما «"دکهتا"» است؟
Context: ...ڑنے دوڑوں دوگلا دوگنی دوہرا دکھاؤ دکھاو دکھتا دکھتے دھبوں دھمکی دھندہ دھواں دھونے دھو...

(ReplaceLettersInSameLangs)


[whitespace] ~678-~678: آیا منظور شما «"دکهتے"» است؟
Context: ...ڑوں دوگلا دوگنی دوہرا دکھاؤ دکھاو دکھتا دکھتے دھبوں دھمکی دھندہ دھواں دھونے دھوکا دھو...

(ReplaceLettersInSameLangs)


[whitespace] ~679-~679: آیا منظور شما «"دهبوں"» است؟
Context: ...گلا دوگنی دوہرا دکھاؤ دکھاو دکھتا دکھتے دھبوں دھمکی دھندہ دھواں دھونے دھوکا دھوکہ دھو...

(ReplaceLettersInSameLangs)


[whitespace] ~680-~680: آیا منظور شما «"دهمکی"» است؟
Context: ...گنی دوہرا دکھاؤ دکھاو دکھتا دکھتے دھبوں دھمکی دھندہ دھواں دھونے دھوکا دھوکہ دھوکے دھچ...

(ReplaceLettersInSameLangs)


[whitespace] ~681-~681: آیا منظور شما «"دهنده"» است؟
Context: ...ہرا دکھاؤ دکھاو دکھتا دکھتے دھبوں دھمکی دھندہ دھواں دھونے دھوکا دھوکہ دھوکے دھچکا دھڑ...

(ReplaceLettersInSameLangs)


[whitespace] ~682-~682: آیا منظور شما «"دهواں"» است؟
Context: ...ھاؤ دکھاو دکھتا دکھتے دھبوں دھمکی دھندہ دھواں دھونے دھوکا دھوکہ دھوکے دھچکا دھڑوں دھڑ...

(ReplaceLettersInSameLangs)


[whitespace] ~683-~683: آیا منظور شما «"دهونے"» است؟
Context: ...ھاو دکھتا دکھتے دھبوں دھمکی دھندہ دھواں دھونے دھوکا دھوکہ دھوکے دھچکا دھڑوں دھڑکن دھی...

(ReplaceLettersInSameLangs)


[whitespace] ~684-~684: آیا منظور شما «"دهوکا"» است؟
Context: ...ھتا دکھتے دھبوں دھمکی دھندہ دھواں دھونے دھوکا دھوکہ دھوکے دھچکا دھڑوں دھڑکن دھیان دھی...

(ReplaceLettersInSameLangs)


[whitespace] ~685-~685: آیا منظور شما «"دهوکه"» است؟
Context: ...ھتے دھبوں دھمکی دھندہ دھواں دھونے دھوکا دھوکہ دھوکے دھچکا دھڑوں دھڑکن دھیان دھیرے دھی...

(ReplaceLettersInSameLangs)


[whitespace] ~686-~686: آیا منظور شما «"دهوکے"» است؟
Context: ...بوں دھمکی دھندہ دھواں دھونے دھوکا دھوکہ دھوکے دھچکا دھڑوں دھڑکن دھیان دھیرے دھیما دہا...

(ReplaceLettersInSameLangs)


[whitespace] ~687-~687: آیا منظور شما «"دهچکا"» است؟
Context: ...مکی دھندہ دھواں دھونے دھوکا دھوکہ دھوکے دھچکا دھڑوں دھڑکن دھیان دھیرے دھیما دہائی دہر...

(ReplaceLettersInSameLangs)


[whitespace] ~688-~688: آیا منظور شما «"دهڑوں"» است؟
Context: ...ندہ دھواں دھونے دھوکا دھوکہ دھوکے دھچکا دھڑوں دھڑکن دھیان دھیرے دھیما دہائی دہراؤ دہن...

(ReplaceLettersInSameLangs)


[whitespace] ~689-~689: آیا منظور شما «"دهڑکن"» است؟
Context: ...واں دھونے دھوکا دھوکہ دھوکے دھچکا دھڑوں دھڑکن دھیان دھیرے دھیما دہائی دہراؤ دہندہ دیا...

(ReplaceLettersInSameLangs)


[whitespace] ~690-~690: آیا منظور شما «"دهیان"» است؟
Context: ...ونے دھوکا دھوکہ دھوکے دھچکا دھڑوں دھڑکن دھیان دھیرے دھیما دہائی دہراؤ دہندہ دیالی دیا...

(ReplaceLettersInSameLangs)


[whitespace] ~691-~691: آیا منظور شما «"دهیرے"» است؟
Context: ...وکا دھوکہ دھوکے دھچکا دھڑوں دھڑکن دھیان دھیرے دھیما دہائی دہراؤ دہندہ دیالی دیانا دیج...

(ReplaceLettersInSameLangs)


[whitespace] ~692-~692: آیا منظور شما «"دهیما"» است؟
Context: ...وکہ دھوکے دھچکا دھڑوں دھڑکن دھیان دھیرے دھیما دہائی دہراؤ دہندہ دیالی دیانا دیجئے دیر...

(ReplaceLettersInSameLangs)


[whitespace] ~693-~693: آیا منظور شما «"دهائی"» است؟
Context: ...وکے دھچکا دھڑوں دھڑکن دھیان دھیرے دھیما دہائی دہراؤ دہندہ دیالی دیانا دیجئے دیرپا دیو...

(ReplaceLettersInSameLangs)


[whitespace] ~694-~694: آیا منظور شما «"دهراؤ"» است؟
Context: ...چکا دھڑوں دھڑکن دھیان دھیرے دھیما دہائی دہراؤ دہندہ دیالی دیانا دیجئے دیرپا دیوار دیک...

(ReplaceLettersInSameLangs)


[whitespace] ~695-~695: آیا منظور شما «"دهنده"» است؟
Context: ...ڑوں دھڑکن دھیان دھیرے دھیما دہائی دہراؤ دہندہ دیالی دیانا دیجئے دیرپا دیوار دیکھا دیک...

(ReplaceLettersInSameLangs)


[whitespace] ~701-~701: آیا منظور شما «"دیکها"» است؟
Context: ...راؤ دہندہ دیالی دیانا دیجئے دیرپا دیوار دیکھا دیکھو دیکھی دیکھے ذائقہ ذخائر ذخیرہ ذرا...

(ReplaceLettersInSameLangs)


[whitespace] ~702-~702: آیا منظور شما «"دیکهو"» است؟
Context: ...ندہ دیالی دیانا دیجئے دیرپا دیوار دیکھا دیکھو دیکھی دیکھے ذائقہ ذخائر ذخیرہ ذرائع ذری...

(ReplaceLettersInSameLangs)


[whitespace] ~703-~703: آیا منظور شما «"دیکهی"» است؟
Context: ...الی دیانا دیجئے دیرپا دیوار دیکھا دیکھو دیکھی دیکھے ذائقہ ذخائر ذخیرہ ذرائع ذریعہ ذری...

(ReplaceLettersInSameLangs)


[whitespace] ~704-~704: آیا منظور شما «"دیکهے"» است؟
Context: ...انا دیجئے دیرپا دیوار دیکھا دیکھو دیکھی دیکھے ذائقہ ذخائر ذخیرہ ذرائع ذریعہ ذریعے ذلا...

(ReplaceLettersInSameLangs)


[whitespace] ~705-~705: آیا منظور شما «"ذائقه"» است؟
Context: ...جئے دیرپا دیوار دیکھا دیکھو دیکھی دیکھے ذائقہ ذخائر ذخیرہ ذرائع ذریعہ ذریعے ذلالت ذہج...

(ReplaceLettersInSameLangs)


[whitespace] ~707-~707: آیا منظور شما «"ذخیره"» است؟
Context: ...وار دیکھا دیکھو دیکھی دیکھے ذائقہ ذخائر ذخیرہ ذرائع ذریعہ ذریعے ذلالت ذہجءز ذہنوں ذہن...

(ReplaceLettersInSameLangs)


[whitespace] ~709-~709: آیا منظور شما «"ذریعه"» است؟
Context: ...کھو دیکھی دیکھے ذائقہ ذخائر ذخیرہ ذرائع ذریعہ ذریعے ذلالت ذہجءز ذہنوں ذہنیت راؤنڈ رائ...

(ReplaceLettersInSameLangs)


[whitespace] ~712-~712: آیا منظور شما «"ذهجءز"» است؟
Context: ...ئقہ ذخائر ذخیرہ ذرائع ذریعہ ذریعے ذلالت ذہجءز ذہنوں ذہنیت راؤنڈ رائفل رابرٹ رابطہ راب...

(ReplaceLettersInSameLangs)


[whitespace] ~713-~713: آیا منظور شما «"ذهنوں"» است؟
Context: ...ائر ذخیرہ ذرائع ذریعہ ذریعے ذلالت ذہجءز ذہنوں ذہنیت راؤنڈ رائفل رابرٹ رابطہ رابطے رات...

(ReplaceLettersInSameLangs)


[whitespace] ~714-~714: آیا منظور شما «"ذهنیت"» است؟
Context: ...یرہ ذرائع ذریعہ ذریعے ذلالت ذہجءز ذہنوں ذہنیت راؤنڈ رائفل رابرٹ رابطہ رابطے راتوں راج...

(ReplaceLettersInSameLangs)


[whitespace] ~718-~718: آیا منظور شما «"رابطه"» است؟
Context: ...الت ذہجءز ذہنوں ذہنیت راؤنڈ رائفل رابرٹ رابطہ رابطے راتوں راجرز راستہ راستے راکٹس راہ...

(ReplaceLettersInSameLangs)


[whitespace] ~722-~722: آیا منظور شما «"راسته"» است؟
Context: ...ؤنڈ رائفل رابرٹ رابطہ رابطے راتوں راجرز راستہ راستے راکٹس راہیں ربیکا رجحان رجمنٹ ردع...

(ReplaceLettersInSameLangs)


[whitespace] ~725-~725: آیا منظور شما «"راهیں"» است؟
Context: ...بطہ رابطے راتوں راجرز راستہ راستے راکٹس راہیں ربیکا رجحان رجمنٹ ردعمل رسائی رسالت رسا...

(ReplaceLettersInSameLangs)


[whitespace] ~739-~739: آیا منظور شما «"روانه"» است؟
Context: ...انی رسیلی رسیوں رعایا رعایت رفتار روابط روانہ روایت روبوٹ روحوں روشنی رولنڈ رولنگ روم...

(ReplaceLettersInSameLangs)


[whitespace] ~756-~756: آیا منظور شما «"رکهتا"» است؟
Context: ...پوش روکتا روکنا روکنے رپورٹ رکاوٹ رکنیت رکھتا رکھتی رکھتے رکھنا رکھنی رکھنے رکھوں رکھ...

(ReplaceLettersInSameLangs)


[whitespace] ~757-~757: آیا منظور شما «"رکهتی"» است؟
Context: ...کتا روکنا روکنے رپورٹ رکاوٹ رکنیت رکھتا رکھتی رکھتے رکھنا رکھنی رکھنے رکھوں رکھیں رگڑ...

(ReplaceLettersInSameLangs)


[whitespace] ~758-~758: آیا منظور شما «"رکهتے"» است؟
Context: ...کنا روکنے رپورٹ رکاوٹ رکنیت رکھتا رکھتی رکھتے رکھنا رکھنی رکھنے رکھوں رکھیں رگڑتا رہا...

(ReplaceLettersInSameLangs)


[whitespace] ~759-~759: آیا منظور شما «"رکهنا"» است؟
Context: ...کنے رپورٹ رکاوٹ رکنیت رکھتا رکھتی رکھتے رکھنا رکھنی رکھنے رکھوں رکھیں رگڑتا رہائش رہا...

(ReplaceLettersInSameLangs)


[whitespace] ~760-~760: آیا منظور شما «"رکهنی"» است؟
Context: ...ورٹ رکاوٹ رکنیت رکھتا رکھتی رکھتے رکھنا رکھنی رکھنے رکھوں رکھیں رگڑتا رہائش رہائی رہن...

(ReplaceLettersInSameLangs)


[whitespace] ~761-~761: آیا منظور شما «"رکهنے"» است؟
Context: ...اوٹ رکنیت رکھتا رکھتی رکھتے رکھنا رکھنی رکھنے رکھوں رکھیں رگڑتا رہائش رہائی رہنما رہو...

(ReplaceLettersInSameLangs)


[whitespace] ~762-~762: آیا منظور شما «"رکهوں"» است؟
Context: ...نیت رکھتا رکھتی رکھتے رکھنا رکھنی رکھنے رکھوں رکھیں رگڑتا رہائش رہائی رہنما رہوگے ریا...

(ReplaceLettersInSameLangs)


[whitespace] ~763-~763: آیا منظور شما «"رکهیں"» است؟
Context: ...ھتا رکھتی رکھتے رکھنا رکھنی رکھنے رکھوں رکھیں رگڑتا رہائش رہائی رہنما رہوگے ریاست ریج...

(ReplaceLettersInSameLangs)


[whitespace] ~765-~765: آیا منظور شما «"رهائش"» است؟
Context: ...ھتے رکھنا رکھنی رکھنے رکھوں رکھیں رگڑتا رہائش رہائی رہنما رہوگے ریاست ریجنل ریزرو ریس...

(ReplaceLettersInSameLangs)


[whitespace] ~766-~766: آیا منظور شما «"رهائی"» است؟
Context: ...ھنا رکھنی رکھنے رکھوں رکھیں رگڑتا رہائش رہائی رہنما رہوگے ریاست ریجنل ریزرو ریسرچ ریش...

(ReplaceLettersInSameLangs)


[whitespace] ~767-~767: آیا منظور شما «"رهنما"» است؟
Context: ...ھنی رکھنے رکھوں رکھیں رگڑتا رہائش رہائی رہنما رہوگے ریاست ریجنل ریزرو ریسرچ ریشمی ریل...

(ReplaceLettersInSameLangs)


[whitespace] ~768-~768: آیا منظور شما «"رهوگے"» است؟
Context: ...ھنے رکھوں رکھیں رگڑتا رہائش رہائی رہنما رہوگے ریاست ریجنل ریزرو ریسرچ ریشمی ریلوے ریم...

(ReplaceLettersInSameLangs)


[whitespace] ~783-~783: آیا منظور شما «"زاویه"» است؟
Context: ...مسی ریورس ریوین ریڈار ریڈیو ریکٹر زانٹی زاویہ زخموں زلزلہ زلزلے زمانے زندگی زگانے زیا...

(ReplaceLettersInSameLangs)


[whitespace] ~785-~785: آیا منظور شما «"زلزله"» است؟
Context: ...وین ریڈار ریڈیو ریکٹر زانٹی زاویہ زخموں زلزلہ زلزلے زمانے زندگی زگانے زیادہ سائبر سائ...

(ReplaceLettersInSameLangs)


[whitespace] ~790-~790: آیا منظور شما «"زیاده"» است؟
Context: ...ویہ زخموں زلزلہ زلزلے زمانے زندگی زگانے زیادہ سائبر سائرل سائرن سائنس سابقہ ساتھی ساح...

(ReplaceLettersInSameLangs)


[whitespace] ~795-~795: آیا منظور شما «"سابقه"» است؟
Context: ...دگی زگانے زیادہ سائبر سائرل سائرن سائنس سابقہ ساتھی ساحلی ساختہ سادگی ساسیں سالار سال...

(ReplaceLettersInSameLangs)


[whitespace] ~796-~796: آیا منظور شما «"ساتهی"» است؟
Context: ...انے زیادہ سائبر سائرل سائرن سائنس سابقہ ساتھی ساحلی ساختہ سادگی ساسیں سالار سالسا سال...

(ReplaceLettersInSameLangs)


[whitespace] ~798-~798: آیا منظور شما «"ساخته"» است؟
Context: ...ئبر سائرل سائرن سائنس سابقہ ساتھی ساحلی ساختہ سادگی ساسیں سالار سالسا سالوں سالچک سام...

(ReplaceLettersInSameLangs)


[whitespace] ~811-~811: آیا منظور شما «"سانحه"» است؟
Context: ...لچک سامان سامبو سامری سامنا سامنے سانتا سانحہ سانحے سبارو ستارہ ستارے ستمبر سجایا سخا...

(ReplaceLettersInSameLangs)


[whitespace] ~814-~814: آیا منظور شما «"ستاره"» است؟
Context: ...مری سامنا سامنے سانتا سانحہ سانحے سبارو ستارہ ستارے ستمبر سجایا سخاوت سراسر سراہا سرج...

(ReplaceLettersInSameLangs)


[whitespace] ~820-~820: آیا منظور شما «"سراها"» است؟
Context: ...ارو ستارہ ستارے ستمبر سجایا سخاوت سراسر سراہا سرجری سرحدی سردار سرسبز سرسوں سرغنہ سرم...

(ReplaceLettersInSameLangs)


[whitespace] ~826-~826: آیا منظور شما «"سرغنه"» است؟
Context: ...اسر سراہا سرجری سرحدی سردار سرسبز سرسوں سرغنہ سرمئی سرورز سروسز سرکشی سرکٹس سرینا سعو...

(ReplaceLettersInSameLangs)


[whitespace] ~838-~838: آیا منظور شما «"سلسله"» است؟
Context: ...کٹس سرینا سعودی سفارت سفارش سلائڈ سلامت سلسلہ سلسلے سلطان سلطنت سلویو سلیکس سماجی سما...

(ReplaceLettersInSameLangs)


[whitespace] ~848-~848: آیا منظور شما «"سمجها"» است؟
Context: ...طنت سلویو سلیکس سماجی سماعت سمتار سمتبر سمجھا سمجھی سمجھے سمسٹر سمندر سمنوی سنائی سنا...

(ReplaceLettersInSameLangs)


[whitespace] ~849-~849: آیا منظور شما «"سمجهی"» است؟
Context: ...ویو سلیکس سماجی سماعت سمتار سمتبر سمجھا سمجھی سمجھے سمسٹر سمندر سمنوی سنائی سناتا سنا...

(ReplaceLettersInSameLangs)


[whitespace] ~850-~850: آیا منظور شما «"سمجهے"» است؟
Context: ...یکس سماجی سماعت سمتار سمتبر سمجھا سمجھی سمجھے سمسٹر سمندر سمنوی سنائی سناتا سنایا سنب...

(ReplaceLettersInSameLangs)


[whitespace] ~857-~857: آیا منظور شما «"سنبهل"» است؟
Context: ...جھے سمسٹر سمندر سمنوی سنائی سناتا سنایا سنبھل سنتان سنتری سنسنی سنوڈن سنوگی سنچری سنگ...

(ReplaceLettersInSameLangs)


[whitespace] ~865-~865: آیا منظور شما «"سنهری"» است؟
Context: ...تان سنتری سنسنی سنوڈن سنوگی سنچری سنگین سنہری سنہرے سوئنگ سوائے سوادج سواری سوراخ سوز...

(ReplaceLettersInSameLangs)


[whitespace] ~866-~866: آیا منظور شما «"سنهرے"» است؟
Context: ...تری سنسنی سنوڈن سنوگی سنچری سنگین سنہری سنہرے سوئنگ سوائے سوادج سواری سوراخ سوزاک سوچ...

(ReplaceLettersInSameLangs)


[whitespace] ~891-~891: آیا منظور شما «"سپاهی"» است؟
Context: ...ارک سٹریٹ سٹیشن سٹیفن سٹیمپ سٹیون سٹیوی سپاہی سپریم سپیشل سچائی سڑکوں سکاؤٹ سکتیں سکر...

(ReplaceLettersInSameLangs)


[whitespace] ~902-~902: آیا منظور شما «"سکهاؤ"» است؟
Context: ...کوں سکاؤٹ سکتیں سکرپٹ سکرین سکریپ سکریچ سکھاؤ سگریٹ سگنلز سہارے سہولت سیارہ سیارے سیا...

(ReplaceLettersInSameLangs)


[whitespace] ~905-~905: آیا منظور شما «"سهارے"» است؟
Context: ...رپٹ سکرین سکریپ سکریچ سکھاؤ سگریٹ سگنلز سہارے سہولت سیارہ سیارے سیاست سیاسی سیدھا سید...

(ReplaceLettersInSameLangs)


[whitespace] ~906-~906: آیا منظور شما «"سهولت"» است؟
Context: ...رین سکریپ سکریچ سکھاؤ سگریٹ سگنلز سہارے سہولت سیارہ سیارے سیاست سیاسی سیدھا سیدھی سید...

(ReplaceLettersInSameLangs)


[whitespace] ~907-~907: آیا منظور شما «"سیاره"» است؟
Context: ...ریپ سکریچ سکھاؤ سگریٹ سگنلز سہارے سہولت سیارہ سیارے سیاست سیاسی سیدھا سیدھی سیدھے سیر...

(ReplaceLettersInSameLangs)


[whitespace] ~911-~911: آیا منظور شما «"سیدها"» است؟
Context: ...نلز سہارے سہولت سیارہ سیارے سیاست سیاسی سیدھا سیدھی سیدھے سیریز سیلاب سیلاس سیلمن سین...

(ReplaceLettersInSameLangs)


[whitespace] ~912-~912: آیا منظور شما «"سیدهی"» است؟
Context: ...ارے سہولت سیارہ سیارے سیاست سیاسی سیدھا سیدھی سیدھے سیریز سیلاب سیلاس سیلمن سینئر سین...

(ReplaceLettersInSameLangs)


[whitespace] ~913-~913: آیا منظور شما «"سیدهے"» است؟
Context: ...ولت سیارہ سیارے سیاست سیاسی سیدھا سیدھی سیدھے سیریز سیلاب سیلاس سیلمن سینئر سینٹر سین...

(ReplaceLettersInSameLangs)


[whitespace] ~926-~926: آیا منظور شما «"سیکها"» است؟
Context: ...نٹر سینکا سیٹیں سیڈان سیکرٹ سیکشن سیکنڈ سیکھا سییلی شاؤلن شاباش شالوم شاپنگ شاگرد شخص...

(ReplaceLettersInSameLangs)


[whitespace] ~937-~937: آیا منظور شما «"شرطیه"» است؟
Context: ...لوم شاپنگ شاگرد شخصیت شرابا شرابی شراکت شرطیہ شرماو شرٹوں شریان شعلوں شمالی شناخت شوٹ...

(ReplaceLettersInSameLangs)


[whitespace] ~947-~947: آیا منظور شما «"شکریه"» است؟
Context: ...یان شعلوں شمالی شناخت شوٹنگ شکاری شکایت شکریہ شکلیں شکنیں شگاگو شہادت شہروں شہسہا شیر...

(ReplaceLettersInSameLangs)


[whitespace] ~951-~951: آیا منظور شما «"شهادت"» است؟
Context: ...ٹنگ شکاری شکایت شکریہ شکلیں شکنیں شگاگو شہادت شہروں شہسہا شیروں شیطان شیلٹر شیپرڈ شیڈ...

(ReplaceLettersInSameLangs)


[whitespace] ~952-~952: آیا منظور شما «"شهروں"» است؟
Context: ...اری شکایت شکریہ شکلیں شکنیں شگاگو شہادت شہروں شہسہا شیروں شیطان شیلٹر شیپرڈ شیڈول صحا...

(ReplaceLettersInSameLangs)


[whitespace] ~953-~953: آیا منظور شما «"شهسها"» است؟
Context: ...ایت شکریہ شکلیں شکنیں شگاگو شہادت شہروں شہسہا شیروں شیطان شیلٹر شیپرڈ شیڈول صحافی صحر...

(ReplaceLettersInSameLangs)


[whitespace] ~973-~973: آیا منظور شما «"طریقه"» است؟
Context: ...بوں ضآؤاط ضرورت ضروری ضمانت ضوابط طالاب طریقہ طریقے طلائی طلسمی طوفان طیارہ طیارے ظری...

(ReplaceLettersInSameLangs)


[whitespace] ~978-~978: آیا منظور شما «"طیاره"» است؟
Context: ...ابط طالاب طریقہ طریقے طلائی طلسمی طوفان طیارہ طیارے ظریفی عاجزی عارضی عالمی عالیہ عبا...

(ReplaceLettersInSameLangs)


[whitespace] ~984-~984: آیا منظور شما «"عالیه"» است؟
Context: ...فان طیارہ طیارے ظریفی عاجزی عارضی عالمی عالیہ عبادت عدالت عراقی عربوں عزائم عسکری عقا...

(ReplaceLettersInSameLangs)


[whitespace] ~992-~992: آیا منظور شما «"عقیده"» است؟
Context: ...ادت عدالت عراقی عربوں عزائم عسکری عقائد عقیدہ عقیدے علاقہ علاقے علامت علاوہ علموں علی...

(ReplaceLettersInSameLangs)


[whitespace] ~994-~994: آیا منظور شما «"علاقه"» است؟
Context: ...اقی عربوں عزائم عسکری عقائد عقیدہ عقیدے علاقہ علاقے علامت علاوہ علموں علیکم عمارت عمل...

(ReplaceLettersInSameLangs)


[whitespace] ~997-~997: آیا منظور شما «"علاوه"» است؟
Context: ...کری عقائد عقیدہ عقیدے علاقہ علاقے علامت علاوہ علموں علیکم عمارت عملوں عنوان عوامی عہد...

(ReplaceLettersInSameLangs)


[whitespace] ~1004-~1004: آیا منظور شما «"عهدوں"» است؟
Context: ...اوہ علموں علیکم عمارت عملوں عنوان عوامی عہدوں غبارے غداری غرائب غمزدہ غمگین غنڈوں غٹا...

(ReplaceLettersInSameLangs)


[whitespace] ~1008-~1008: آیا منظور شما «"غمزده"» است؟
Context: ...لوں عنوان عوامی عہدوں غبارے غداری غرائب غمزدہ غمگین غنڈوں غٹاغٹ غیرتی فائدہ فائدے فائ...

(ReplaceLettersInSameLangs)


[whitespace] ~1013-~1013: آیا منظور شما «"فائده"» است؟
Context: ...اری غرائب غمزدہ غمگین غنڈوں غٹاغٹ غیرتی فائدہ فائدے فائٹر فائیو فارسی فارما فاصلہ فاص...

(ReplaceLettersInSameLangs)


[whitespace] ~1019-~1019: آیا منظور شما «"فاصله"» است؟
Context: ...رتی فائدہ فائدے فائٹر فائیو فارسی فارما فاصلہ فاصلے فرائض فرانس فراہم فرشتہ فرعون فرو...

(ReplaceLettersInSameLangs)


[whitespace] ~1023-~1023: آیا منظور شما «"فراهم"» است؟
Context: ...ئیو فارسی فارما فاصلہ فاصلے فرائض فرانس فراہم فرشتہ فرعون فروخت فروری فرینڈ فرینک فضا...

(ReplaceLettersInSameLangs)


[whitespace] ~1024-~1024: آیا منظور شما «"فرشته"» است؟
Context: ...رسی فارما فاصلہ فاصلے فرائض فرانس فراہم فرشتہ فرعون فروخت فروری فرینڈ فرینک فضائی فضی...

(ReplaceLettersInSameLangs)


[whitespace] ~1033-~1033: آیا منظور شما «"فلسفه"» است؟
Context: ...وخت فروری فرینڈ فرینک فضائی فضیلت فلائٹ فلسفہ فلسفے فلموں فلمیں فلٹرز فنڈنگ فوائد فوا...

(ReplaceLettersInSameLangs)


[whitespace] ~1040-~1040: آیا منظور شما «"فواره"» است؟
Context: ...سفہ فلسفے فلموں فلمیں فلٹرز فنڈنگ فوائد فوارہ فوارے فوبیا فوجوں فوجیں فورسز فہرست فیص...

(ReplaceLettersInSameLangs)


[whitespace] ~1046-~1046: آیا منظور شما «"فهرست"» است؟
Context: ...ائد فوارہ فوارے فوبیا فوجوں فوجیں فورسز فہرست فیصلہ فیصلے فینکس فیڈرل قاعدہ قافلے قال...

(ReplaceLettersInSameLangs)


[whitespace] ~1047-~1047: آیا منظور شما «"فیصله"» است؟
Context: ...ارہ فوارے فوبیا فوجوں فوجیں فورسز فہرست فیصلہ فیصلے فینکس فیڈرل قاعدہ قافلے قالین قان...

(ReplaceLettersInSameLangs)


[whitespace] ~1051-~1051: آیا منظور شما «"قاعده"» است؟
Context: ...جیں فورسز فہرست فیصلہ فیصلے فینکس فیڈرل قاعدہ قافلے قالین قانون قبیلہ قبیلے قدرتی قدم...

(ReplaceLettersInSameLangs)


[whitespace] ~1055-~1055: آیا منظور شما «"قبیله"» است؟
Context: ...صلے فینکس فیڈرل قاعدہ قافلے قالین قانون قبیلہ قبیلے قدرتی قدموں قذافی قربان قریبی قسم...

(ReplaceLettersInSameLangs)


[whitespace] ~1084-~1084: آیا منظور شما «"لاٹهی"» است؟
Context: ...توں لارنس لازما لازمی لاشیں لافلن لالچی لاٹھی لاپتہ لاہور لبرٹی لبنان لرزاں لطیفے لعن...

(ReplaceLettersInSameLangs)


[whitespace] ~1085-~1085: آیا منظور شما «"لاپته"» است؟
Context: ...رنس لازما لازمی لاشیں لافلن لالچی لاٹھی لاپتہ لاہور لبرٹی لبنان لرزاں لطیفے لعنتی لفظ...

(ReplaceLettersInSameLangs)


[whitespace] ~1086-~1086: آیا منظور شما «"لاهور"» است؟
Context: ...زما لازمی لاشیں لافلن لالچی لاٹھی لاپتہ لاہور لبرٹی لبنان لرزاں لطیفے لعنتی لفظوں لمح...

(ReplaceLettersInSameLangs)


[whitespace] ~1108-~1108: آیا منظور شما «"لڑرهے"» است؟
Context: ...نگا لوٹنا لوٹنے لوڈنگ لوگوں لڑائی لڑاکا لڑرہے لڑکوں لکھنا لکھنے لکھیں لگائی لگائے لگا...

(ReplaceLettersInSameLangs)


[whitespace] ~1110-~1110: آیا منظور شما «"لکهنا"» است؟
Context: ...ٹنے لوڈنگ لوگوں لڑائی لڑاکا لڑرہے لڑکوں لکھنا لکھنے لکھیں لگائی لگائے لگاتا لگاتے لگا...

(ReplaceLettersInSameLangs)


[whitespace] ~1111-~1111: آیا منظور شما «"لکهنے"» است؟
Context: ...ڈنگ لوگوں لڑائی لڑاکا لڑرہے لڑکوں لکھنا لکھنے لکھیں لگائی لگائے لگاتا لگاتے لگانا لگا...

(ReplaceLettersInSameLangs)


[whitespace] ~1112-~1112: آیا منظور شما «"لکهیں"» است؟
Context: ...گوں لڑائی لڑاکا لڑرہے لڑکوں لکھنا لکھنے لکھیں لگائی لگائے لگاتا لگاتے لگانا لگانے لگا...

(ReplaceLettersInSameLangs)


[whitespace] ~1120-~1120: آیا منظور شما «"لگرها"» است؟
Context: ...ائی لگائے لگاتا لگاتے لگانا لگانے لگایا لگرہا لہروں لیبیا لیجئے لیجنڈ ماؤنٹ مائنس مائ...

(ReplaceLettersInSameLangs)


[whitespace] ~1121-~1121: آیا منظور شما «"لهروں"» است؟
Context: ...ائے لگاتا لگاتے لگانا لگانے لگایا لگرہا لہروں لیبیا لیجئے لیجنڈ ماؤنٹ مائنس مائیک ماب...

(ReplaceLettersInSameLangs)


[whitespace] ~1152-~1152: آیا منظور شما «"مانده"» است؟
Context: ...سکو مافیا مالکن مالیت مانتا مانتی مانتے ماندہ ماننا مانند ماننی ماننے مانگو مانگے مان...

(ReplaceLettersInSameLangs)


[whitespace] ~1163-~1163: آیا منظور شما «"مبینه"» است؟
Context: ...ننے مانگو مانگے مانیں مایوس مبارک مبتلا مبینہ متاثر متجسس متحدہ متحمل مترجم متروک متص...

(ReplaceLettersInSameLangs)


[whitespace] ~1166-~1166: آیا منظور شما «"متحده"» است؟
Context: ...نیں مایوس مبارک مبتلا مبینہ متاثر متجسس متحدہ متحمل مترجم متروک متصور متضاد متعلق متع...

(ReplaceLettersInSameLangs)


[whitespace] ~1175-~1175: آیا منظور شما «"متوجه"» است؟
Context: ...رجم متروک متصور متضاد متعلق متعین متغیر متوجہ متوقع مثالی مجازی مجبور مجروح محافظ محب...

(ReplaceLettersInSameLangs)


[whitespace] ~1191-~1191: آیا منظور شما «"محکمه"» است؟
Context: ...تاظ محترم محدود محروم محسوس محفوظ محلوں محکمہ مخالف مخبری مختار مختتم مختصر مختلف مخر...

(ReplaceLettersInSameLangs)


[whitespace] ~1202-~1202: آیا منظور شما «"مخواه"» است؟
Context: ...تتم مختصر مختلف مخروط مخصوص مخلوط مخلوق مخواہ مداوا مدراس مدنظر مذموم مذہبی مربوط مرت...

(ReplaceLettersInSameLangs)


[whitespace] ~1207-~1207: آیا منظور شما «"مذهبی"» است؟
Context: ...لوط مخلوق مخواہ مداوا مدراس مدنظر مذموم مذہبی مربوط مرتبہ مرتھا مرجھا مرحلہ مرحلے مرح...

(ReplaceLettersInSameLangs)


[whitespace] ~1209-~1209: آیا منظور شما «"مرتبه"» است؟
Context: ...واہ مداوا مدراس مدنظر مذموم مذہبی مربوط مرتبہ مرتھا مرجھا مرحلہ مرحلے مرحوم مردار مرد...

(ReplaceLettersInSameLangs)


[whitespace] ~1210-~1210: آیا منظور شما «"مرتها"» است؟
Context: ...اوا مدراس مدنظر مذموم مذہبی مربوط مرتبہ مرتھا مرجھا مرحلہ مرحلے مرحوم مردار مردوں مرم...

(ReplaceLettersInSameLangs)


[whitespace] ~1211-~1211: آیا منظور شما «"مرجها"» است؟
Context: ...راس مدنظر مذموم مذہبی مربوط مرتبہ مرتھا مرجھا مرحلہ مرحلے مرحوم مردار مردوں مرموز مرو...

(ReplaceLettersInSameLangs)


[whitespace] ~1212-~1212: آیا منظور شما «"مرحله"» است؟
Context: ...نظر مذموم مذہبی مربوط مرتبہ مرتھا مرجھا مرحلہ مرحلے مرحوم مردار مردوں مرموز مروان مرچ...

(ReplaceLettersInSameLangs)


[whitespace] ~1223-~1223: آیا منظور شما «"مرهون"» است؟
Context: ...دوں مرموز مروان مرچکا مرکزی مرکوز مرگئے مرہون مریگا مزدور مسئلہ مسئلے مسائل مسافر مست...

(ReplaceLettersInSameLangs)


[whitespace] ~1226-~1226: آیا منظور شما «"مسئله"» است؟
Context: ...چکا مرکزی مرکوز مرگئے مرہون مریگا مزدور مسئلہ مسئلے مسائل مسافر مستحق مسترد مستقل مست...

(ReplaceLettersInSameLangs)


[whitespace] ~1238-~1238: آیا منظور شما «"مسوده"» است؟
Context: ...ترد مستقل مستند مستول مسدود مسلسل مسمار مسودہ مسوری مسٹرد مسکرا مسیحی مشاغل مشتبہ مشت...

(ReplaceLettersInSameLangs)


[whitespace] ~1244-~1244: آیا منظور شما «"مشتبه"» است؟
Context: ...مار مسودہ مسوری مسٹرد مسکرا مسیحی مشاغل مشتبہ مشترک مشتمل مشرقی مشروب مشروط مشغول مشو...

(ReplaceLettersInSameLangs)


[whitespace] ~1251-~1251: آیا منظور شما «"مشوره"» است؟
Context: ...تبہ مشترک مشتمل مشرقی مشروب مشروط مشغول مشورہ مشکوک مشہور مصائب مصروف مصلحت مصیبت مضب...

(ReplaceLettersInSameLangs)


[whitespace] ~1253-~1253: آیا منظور شما «"مشهور"» است؟
Context: ...تمل مشرقی مشروب مشروط مشغول مشورہ مشکوک مشہور مصائب مصروف مصلحت مصیبت مضبوط مضحکہ مضم...

(ReplaceLettersInSameLangs)


[whitespace] ~1259-~1259: آیا منظور شما «"مضحکه"» است؟
Context: ...کوک مشہور مصائب مصروف مصلحت مصیبت مضبوط مضحکہ مضمون مطابق مطلوب مطمئن مطمعن مظلوم معا...

(ReplaceLettersInSameLangs)


[misspelling] ~1264-~1264: اشتباه محتمل املائی پیداشده: مطمئن.
Context: ...یبت مضبوط مضحکہ مضمون مطابق مطلوب مطمئن مطمعن مظلوم معافی معبود معجزہ معدنی معذرت معذ...

(FA_SIMPLE_REPLACE)


[whitespace] ~1268-~1268: آیا منظور شما «"معجزه"» است؟
Context: ...ابق مطلوب مطمئن مطمعن مظلوم معافی معبود معجزہ معدنی معذرت معذور معرفت معروف معزرت معص...

(ReplaceLettersInSameLangs)


[whitespace] ~1286-~1286: آیا منظور شما «"مقاله"» است؟
Context: ...نوں معیار مغربی مغفرت مفرور مفلوج مقاصد مقالہ مقامی مقبول مقدار مقدمہ مقدمے ملاتے ملا...

(ReplaceLettersInSameLangs)


[whitespace] ~1290-~1290: آیا منظور شما «"مقدمه"» است؟
Context: ...رور مفلوج مقاصد مقالہ مقامی مقبول مقدار مقدمہ مقدمے ملاتے ملازم ملانے ملاکر ملایا ملح...

(ReplaceLettersInSameLangs)


[whitespace] ~1297-~1297: آیا منظور شما «"ملحقه"» است؟
Context: ...دمہ مقدمے ملاتے ملازم ملانے ملاکر ملایا ملحقہ ملعون ملٹری ملکیت ممالک ممنوع ممکنہ منا...

(ReplaceLettersInSameLangs)


[whitespace] ~1303-~1303: آیا منظور شما «"ممکنه"» است؟
Context: ...ایا ملحقہ ملعون ملٹری ملکیت ممالک ممنوع ممکنہ مناسب مناظر منافق منانے منتخب منتظر منت...

(ReplaceLettersInSameLangs)


[whitespace] ~1316-~1316: آیا منظور شما «"منزله"» است؟
Context: ...تظر منتظم منتقل منتیں منجمد منحصر منحوس منزلہ منسلک منسوب منسوخ منطقی منظور منعقد منف...

(ReplaceLettersInSameLangs)


[whitespace] ~1326-~1326: آیا منظور شما «"منهدم"» است؟
Context: ...سوخ منطقی منظور منعقد منفرد منقطع منٹوں منہدم منیجر مواقع موجود مورٹز مورگن موزوں موس...

(ReplaceLettersInSameLangs)


[whitespace] ~1340-~1340: آیا منظور شما «"مٹهاس"» است؟
Context: ...ساد موصول موضوع مولوی موونگ مویشی مٹانے مٹھاس مچانا مچھلی مکانی مکاوت مہاجر مہارت مہا...

(ReplaceLettersInSameLangs)


[whitespace] ~1342-~1342: آیا منظور شما «"مچهلی"» است؟
Context: ...ضوع مولوی موونگ مویشی مٹانے مٹھاس مچانا مچھلی مکانی مکاوت مہاجر مہارت مہاشی مہریں مہم...

(ReplaceLettersInSameLangs)


[whitespace] ~1345-~1345: آیا منظور شما «"مهاجر"» است؟
Context: ...یشی مٹانے مٹھاس مچانا مچھلی مکانی مکاوت مہاجر مہارت مہاشی مہریں مہمان مہنگا مہنگے مہو...

(ReplaceLettersInSameLangs)


[whitespace] ~1346-~1346: آیا منظور شما «"مهارت"» است؟
Context: ...انے مٹھاس مچانا مچھلی مکانی مکاوت مہاجر مہارت مہاشی مہریں مہمان مہنگا مہنگے مہودی مہی...

(ReplaceLettersInSameLangs)


[whitespace] ~1347-~1347: آیا منظور شما «"مهاشی"» است؟
Context: ...ھاس مچانا مچھلی مکانی مکاوت مہاجر مہارت مہاشی مہریں مہمان مہنگا مہنگے مہودی مہینہ مہی...

(ReplaceLettersInSameLangs)


[whitespace] ~1348-~1348: آیا منظور شما «"مهریں"» است؟
Context: ...انا مچھلی مکانی مکاوت مہاجر مہارت مہاشی مہریں مہمان مہنگا مہنگے مہودی مہینہ مہینے مید...

(ReplaceLettersInSameLangs)


[whitespace] ~1349-~1349: آیا منظور شما «"مهمان"» است؟
Context: ...ھلی مکانی مکاوت مہاجر مہارت مہاشی مہریں مہمان مہنگا مہنگے مہودی مہینہ مہینے میدان میر...

(ReplaceLettersInSameLangs)


[whitespace] ~1350-~1350: آیا منظور شما «"مهنگا"» است؟
Context: ...انی مکاوت مہاجر مہارت مہاشی مہریں مہمان مہنگا مہنگے مہودی مہینہ مہینے میدان میراث میر...

(ReplaceLettersInSameLangs)


[whitespace] ~1351-~1351: آیا منظور شما «"مهنگے"» است؟
Context: ...اوت مہاجر مہارت مہاشی مہریں مہمان مہنگا مہنگے مہودی مہینہ مہینے میدان میراث میرین میر...

(ReplaceLettersInSameLangs)


[whitespace] ~1352-~1352: آیا منظور شما «"مهودی"» است؟
Context: ...اجر مہارت مہاشی مہریں مہمان مہنگا مہنگے مہودی مہینہ مہینے میدان میراث میرین میریٹ میز...

(ReplaceLettersInSameLangs)


[whitespace] ~1353-~1353: آیا منظور شما «"مهینه"» است؟
Context: ...ارت مہاشی مہریں مہمان مہنگا مہنگے مہودی مہینہ مہینے میدان میراث میرین میریٹ میزیں میل...

(ReplaceLettersInSameLangs)


[whitespace] ~1354-~1354: آیا منظور شما «"مهینے"» است؟
Context: ...اشی مہریں مہمان مہنگا مہنگے مہودی مہینہ مہینے میدان میراث میرین میریٹ میزیں میلنگ میم...

(ReplaceLettersInSameLangs)


[whitespace] ~1367-~1367: آیا منظور شما «"میٹهی"» است؟
Context: ...لنگ میمبر مینار مینڈی میوزک میٹرو میٹنگ میٹھی میڈرڈ میڈیا نااہل نابود نادان نادیہ نار...

(ReplaceLettersInSameLangs)


[whitespace] ~1370-~1370: آیا منظور شما «"نااهل"» است؟
Context: ...نڈی میوزک میٹرو میٹنگ میٹھی میڈرڈ میڈیا نااہل نابود نادان نادیہ ناراض نارمل ناستے ناش...

(ReplaceLettersInSameLangs)


[whitespace] ~1373-~1373: آیا منظور شما «"نادیه"» است؟
Context: ...ٹنگ میٹھی میڈرڈ میڈیا نااہل نابود نادان نادیہ ناراض نارمل ناستے ناشتا ناقوس نامزد نام...

(ReplaceLettersInSameLangs)


[whitespace] ~1387-~1387: آیا منظور شما «"نتیجه"» است؟
Context: ...موں ناپاک ناچتی ناکام نایاب نبٹنا نتائج نتیجہ نتیجے نراشا نرسنگ نزدیک نشانہ نشانی نشا...

(ReplaceLettersInSameLangs)


[whitespace] ~1392-~1392: آیا منظور شما «"نشانه"» است؟
Context: ...ٹنا نتائج نتیجہ نتیجے نراشا نرسنگ نزدیک نشانہ نشانی نشانے نصیحت نظریں نظریہ نقصان نما...

(ReplaceLettersInSameLangs)


[whitespace] ~1397-~1397: آیا منظور شما «"نظریه"» است؟
Context: ...سنگ نزدیک نشانہ نشانی نشانے نصیحت نظریں نظریہ نقصان نمائش نمبرز نمونہ نمونے نمٹنے نوا...

(ReplaceLettersInSameLangs)


[whitespace] ~1401-~1401: آیا منظور شما «"نمونه"» است؟
Context: ...انے نصیحت نظریں نظریہ نقصان نمائش نمبرز نمونہ نمونے نمٹنے نوازی نوشتہ نوعیت نومبر نوک...

(ReplaceLettersInSameLangs)


[whitespace] ~1405-~1405: آیا منظور شما «"نوشته"» است؟
Context: ...صان نمائش نمبرز نمونہ نمونے نمٹنے نوازی نوشتہ نوعیت نومبر نوکری نکالا نکالو نکالی نکا...

(ReplaceLettersInSameLangs)


[whitespace] ~1420-~1420: آیا منظور شما «"نهایت"» است؟
Context: ...لتا نکلتے نکلنا نکلنے نکلیں نگاری نگلنا نہایت نیشنل نیوٹن نیٹلی نیکدل نےٹلی وائرس وائ...

(ReplaceLettersInSameLangs)


[whitespace] ~1431-~1431: آیا منظور شما «"واقعه"» است؟
Context: ...کدل نےٹلی وائرس وائٹل وائیٹ وارنٹ واریر واقعہ واقعی واقعے والدہ والوں والکر والیس واپ...

(ReplaceLettersInSameLangs)


[whitespace] ~1434-~1434: آیا منظور شما «"والده"» است؟
Context: ...ئٹل وائیٹ وارنٹ واریر واقعہ واقعی واقعے والدہ والوں والکر والیس واپسی وبالا وراست ورا...

(ReplaceLettersInSameLangs)


[whitespace] ~1441-~1441: آیا منظور شما «"ورانه"» است؟
Context: ...لدہ والوں والکر والیس واپسی وبالا وراست ورانہ ورکنگ وزٹرز وسائل وصولی وضاحت وعدوں وغی...

(ReplaceLettersInSameLangs)


[whitespace] ~1448-~1448: آیا منظور شما «"وغیره"» است؟
Context: ...انہ ورکنگ وزٹرز وسائل وصولی وضاحت وعدوں وغیرہ وفاقی وففوہ وقتوں وقوعہ ولینٹ ونڈوز وکل...

(ReplaceLettersInSameLangs)


[whitespace] ~1450-~1450: آیا منظور شما «"وففوه"» است؟
Context: ...ٹرز وسائل وصولی وضاحت وعدوں وغیرہ وفاقی وففوہ وقتوں وقوعہ ولینٹ ونڈوز وکلاء ویران ویش...

(ReplaceLettersInSameLangs)


[whitespace] ~1452-~1452: آیا منظور شما «"وقوعه"» است؟
Context: ...ولی وضاحت وعدوں وغیرہ وفاقی وففوہ وقتوں وقوعہ ولینٹ ونڈوز وکلاء ویران ویشیا ویچلن ویڈ...

(ReplaceLettersInSameLangs)


[whitespace] ~1487-~1487: آیا منظور شما «"ٹهنڈا"» است؟
Context: ...بیس ٹونگا ٹوٹتا ٹوکری ٹوکیو ٹویٹر ٹپکاو ٹھنڈا ٹھنڈی ٹھنڈے ٹھوڑی ٹھوکر ٹھٹھہ ٹھہرو ٹھہ...

(ReplaceLettersInSameLangs)


[whitespace] ~1488-~1488: آیا منظور شما «"ٹهنڈی"» است؟
Context: ...نگا ٹوٹتا ٹوکری ٹوکیو ٹویٹر ٹپکاو ٹھنڈا ٹھنڈی ٹھنڈے ٹھوڑی ٹھوکر ٹھٹھہ ٹھہرو ٹھہرے ٹہل...

(ReplaceLettersInSameLangs)


[whitespace] ~1489-~1489: آیا منظور شما «"ٹهنڈے"» است؟
Context: ...ٹتا ٹوکری ٹوکیو ٹویٹر ٹپکاو ٹھنڈا ٹھنڈی ٹھنڈے ٹھوڑی ٹھوکر ٹھٹھہ ٹھہرو ٹھہرے ٹہلنے ٹیم...

(ReplaceLettersInSameLangs)


[whitespace] ~1490-~1490: آیا منظور شما «"ٹهوڑی"» است؟
Context: ...کری ٹوکیو ٹویٹر ٹپکاو ٹھنڈا ٹھنڈی ٹھنڈے ٹھوڑی ٹھوکر ٹھٹھہ ٹھہرو ٹھہرے ٹہلنے ٹیموں ٹین...

(ReplaceLettersInSameLangs)


[whitespace] ~1491-~1491: آیا منظور شما «"ٹهوکر"» است؟
Context: ...کیو ٹویٹر ٹپکاو ٹھنڈا ٹھنڈی ٹھنڈے ٹھوڑی ٹھوکر ٹھٹھہ ٹھہرو ٹھہرے ٹہلنے ٹیموں ٹینڈر ٹیڑ...

(ReplaceLettersInSameLangs)


[whitespace] ~1492-~1492: آیا منظور شما «"ٹهٹهه"» است؟
Context: ...یٹر ٹپکاو ٹھنڈا ٹھنڈی ٹھنڈے ٹھوڑی ٹھوکر ٹھٹھہ ٹھہرو ٹھہرے ٹہلنے ٹیموں ٹینڈر ٹیڑھی ٹیک...

(ReplaceLettersInSameLangs)


[whitespace] ~1493-~1493: آیا منظور شما «"ٹههرو"» است؟
Context: ...کاو ٹھنڈا ٹھنڈی ٹھنڈے ٹھوڑی ٹھوکر ٹھٹھہ ٹھہرو ٹھہرے ٹہلنے ٹیموں ٹینڈر ٹیڑھی ٹیکسی پاؤ...

(ReplaceLettersInSameLangs)


[whitespace] ~1494-~1494: آیا منظور شما «"ٹههرے"» است؟
Context: ...نڈا ٹھنڈی ٹھنڈے ٹھوڑی ٹھوکر ٹھٹھہ ٹھہرو ٹھہرے ٹہلنے ٹیموں ٹینڈر ٹیڑھی ٹیکسی پاؤلو پاؤ...

(ReplaceLettersInSameLangs)


[whitespace] ~1495-~1495: آیا منظور شما «"ٹهلنے"» است؟
Context: ...نڈی ٹھنڈے ٹھوڑی ٹھوکر ٹھٹھہ ٹھہرو ٹھہرے ٹہلنے ٹیموں ٹینڈر ٹیڑھی ٹیکسی پاؤلو پاؤنڈ پاؤ...

(ReplaceLettersInSameLangs)


[whitespace] ~1498-~1498: آیا منظور شما «"ٹیڑهی"» است؟
Context: ...وکر ٹھٹھہ ٹھہرو ٹھہرے ٹہلنے ٹیموں ٹینڈر ٹیڑھی ٹیکسی پاؤلو پاؤنڈ پاؤڈر پائلٹ پابند پات...

(ReplaceLettersInSameLangs)


[whitespace] ~1524-~1524: آیا منظور شما «"پرنده"» است؟
Context: ...امن پرامڈ پرانا پرانی پرانے پرجوش پرستی پرندہ پرندے پرواز پرواہ پریمی پستول پسندی پسی...

(ReplaceLettersInSameLangs)


[whitespace] ~1527-~1527: آیا منظور شما «"پرواه"» است؟
Context: ...انی پرانے پرجوش پرستی پرندہ پرندے پرواز پرواہ پریمی پستول پسندی پسینہ پسینے پشاور پلا...

(ReplaceLettersInSameLangs)


[whitespace] ~1531-~1531: آیا منظور شما «"پسینه"» است؟
Context: ...ندہ پرندے پرواز پرواہ پریمی پستول پسندی پسینہ پسینے پشاور پلانٹ پلندے پناہی پنجرا پنج...

(ReplaceLettersInSameLangs)


[whitespace] ~1536-~1536: آیا منظور شما «"پناهی"» است؟
Context: ...تول پسندی پسینہ پسینے پشاور پلانٹ پلندے پناہی پنجرا پنجری پنجرے پندرہ پنکھے پوجھو پور...

(ReplaceLettersInSameLangs)


[whitespace] ~1540-~1540: آیا منظور شما «"پندره"» است؟
Context: ...اور پلانٹ پلندے پناہی پنجرا پنجری پنجرے پندرہ پنکھے پوجھو پورٹل پورٹو پوسٹر پولیس پوچ...

(ReplaceLettersInSameLangs)


[whitespace] ~1541-~1541: آیا منظور شما «"پنکهے"» است؟
Context: ...انٹ پلندے پناہی پنجرا پنجری پنجرے پندرہ پنکھے پوجھو پورٹل پورٹو پوسٹر پولیس پوچھا پوچ...

(ReplaceLettersInSameLangs)


[whitespace] ~1542-~1542: آیا منظور شما «"پوجهو"» است؟
Context: ...ندے پناہی پنجرا پنجری پنجرے پندرہ پنکھے پوجھو پورٹل پورٹو پوسٹر پولیس پوچھا پوچھو پوچ...

(ReplaceLettersInSameLangs)


[whitespace] ~1547-~1547: آیا منظور شما «"پوچها"» است؟
Context: ...درہ پنکھے پوجھو پورٹل پورٹو پوسٹر پولیس پوچھا پوچھو پوچھے پٹاخہ پٹانگ پٹھوں پٹیشن پچا...

(ReplaceLettersInSameLangs)


[whitespace] ~1548-~1548: آیا منظور شما «"پوچهو"» است؟
Context: ...کھے پوجھو پورٹل پورٹو پوسٹر پولیس پوچھا پوچھو پوچھے پٹاخہ پٹانگ پٹھوں پٹیشن پچارا پچا...

(ReplaceLettersInSameLangs)


[whitespace] ~1549-~1549: آیا منظور شما «"پوچهے"» است؟
Context: ...جھو پورٹل پورٹو پوسٹر پولیس پوچھا پوچھو پوچھے پٹاخہ پٹانگ پٹھوں پٹیشن پچارا پچاسی پچھ...

(ReplaceLettersInSameLangs)


[whitespace] ~1550-~1550: آیا منظور شما «"پٹاخه"» است؟
Context: ...رٹل پورٹو پوسٹر پولیس پوچھا پوچھو پوچھے پٹاخہ پٹانگ پٹھوں پٹیشن پچارا پچاسی پچھلا پچھ...

(ReplaceLettersInSameLangs)


[whitespace] ~1552-~1552: آیا منظور شما «"پٹهوں"» است؟
Context: ...سٹر پولیس پوچھا پوچھو پوچھے پٹاخہ پٹانگ پٹھوں پٹیشن پچارا پچاسی پچھلا پچھلی پچھلے پڑت...

(ReplaceLettersInSameLangs)


[whitespace] ~1556-~1556: آیا منظور شما «"پچهلا"» است؟
Context: ...چھے پٹاخہ پٹانگ پٹھوں پٹیشن پچارا پچاسی پچھلا پچھلی پچھلے پڑتال پڑھتا پڑھتی پڑھتے پڑھ...

(ReplaceLettersInSameLangs)


[whitespace] ~1557-~1557: آیا منظور شما «"پچهلی"» است؟
Context: ...اخہ پٹانگ پٹھوں پٹیشن پچارا پچاسی پچھلا پچھلی پچھلے پڑتال پڑھتا پڑھتی پڑھتے پڑھنا پڑھ...

(ReplaceLettersInSameLangs)


[whitespace] ~1558-~1558: آیا منظور شما «"پچهلے"» است؟
Context: ...انگ پٹھوں پٹیشن پچارا پچاسی پچھلا پچھلی پچھلے پڑتال پڑھتا پڑھتی پڑھتے پڑھنا پڑھنے پکا...

(ReplaceLettersInSameLangs)


[whitespace] ~1560-~1560: آیا منظور شما «"پڑهتا"» است؟
Context: ...یشن پچارا پچاسی پچھلا پچھلی پچھلے پڑتال پڑھتا پڑھتی پڑھتے پڑھنا پڑھنے پکارا پکارے پکا...

(ReplaceLettersInSameLangs)


[whitespace] ~1561-~1561: آیا منظور شما «"پڑهتی"» است؟
Context: ...ارا پچاسی پچھلا پچھلی پچھلے پڑتال پڑھتا پڑھتی پڑھتے پڑھنا پڑھنے پکارا پکارے پکانا پکا...

(ReplaceLettersInSameLangs)


[whitespace] ~1562-~1562: آیا منظور شما «"پڑهتے"» است؟
Context: ...اسی پچھلا پچھلی پچھلے پڑتال پڑھتا پڑھتی پڑھتے پڑھنا پڑھنے پکارا پکارے پکانا پکانے پکا...

(ReplaceLettersInSameLangs)


[whitespace] ~1563-~1563: آیا منظور شما «"پڑهنا"» است؟
Context: ...ھلا پچھلی پچھلے پڑتال پڑھتا پڑھتی پڑھتے پڑھنا پڑھنے پکارا پکارے پکانا پکانے پکاکر پکا...

(ReplaceLettersInSameLangs)


[whitespace] ~1564-~1564: آیا منظور شما «"پڑهنے"» است؟
Context: ...ھلی پچھلے پڑتال پڑھتا پڑھتی پڑھتے پڑھنا پڑھنے پکارا پکارے پکانا پکانے پکاکر پکایا پکڑ...

(ReplaceLettersInSameLangs)


[whitespace] ~1574-~1574: آیا منظور شما «"پگهلا"» است؟
Context: ...انا پکانے پکاکر پکایا پکڑنا پکڑنے پکڑوں پگھلا پھاٹک پھرنے پھریں پھنسا پھنسے پھوڑا پھی...

(ReplaceLettersInSameLangs)


[whitespace] ~1575-~1575: آیا منظور شما «"پهاٹک"» است؟
Context: ...انے پکاکر پکایا پکڑنا پکڑنے پکڑوں پگھلا پھاٹک پھرنے پھریں پھنسا پھنسے پھوڑا پھیری پھی...

(ReplaceLettersInSameLangs)


[whitespace] ~1576-~1576: آیا منظور شما «"پهرنے"» است؟
Context: ...اکر پکایا پکڑنا پکڑنے پکڑوں پگھلا پھاٹک پھرنے پھریں پھنسا پھنسے پھوڑا پھیری پھیلا پھی...

(ReplaceLettersInSameLangs)


[whitespace] ~1577-~1577: آیا منظور شما «"پهریں"» است؟
Context: ...ایا پکڑنا پکڑنے پکڑوں پگھلا پھاٹک پھرنے پھریں پھنسا پھنسے پھوڑا پھیری پھیلا پھیلی پھی...

(ReplaceLettersInSameLangs)


[whitespace] ~1578-~1578: آیا منظور شما «"پهنسا"» است؟
Context: ...ڑنا پکڑنے پکڑوں پگھلا پھاٹک پھرنے پھریں پھنسا پھنسے پھوڑا پھیری پھیلا پھیلی پھینک پہا...

(ReplaceLettersInSameLangs)


[whitespace] ~1579-~1579: آیا منظور شما «"پهنسے"» است؟
Context: ...ڑنے پکڑوں پگھلا پھاٹک پھرنے پھریں پھنسا پھنسے پھوڑا پھیری پھیلا پھیلی پھینک پہاڑی پہن...

(ReplaceLettersInSameLangs)


[whitespace] ~1580-~1580: آیا منظور شما «"پهوڑا"» است؟
Context: ...ڑوں پگھلا پھاٹک پھرنے پھریں پھنسا پھنسے پھوڑا پھیری پھیلا پھیلی پھینک پہاڑی پہنتے پہن...

(ReplaceLettersInSameLangs)


[whitespace] ~1581-~1581: آیا منظور شما «"پهیری"» است؟
Context: ...ھلا پھاٹک پھرنے پھریں پھنسا پھنسے پھوڑا پھیری پھیلا پھیلی پھینک پہاڑی پہنتے پہننے پہن...

(ReplaceLettersInSameLangs)


[whitespace] ~1582-~1582: آیا منظور شما «"پهیلا"» است؟
Context: ...اٹک پھرنے پھریں پھنسا پھنسے پھوڑا پھیری پھیلا پھیلی پھینک پہاڑی پہنتے پہننے پہنچا پہن...

(ReplaceLettersInSameLangs)


[whitespace] ~1583-~1583: آیا منظور شما «"پهیلی"» است؟
Context: ...رنے پھریں پھنسا پھنسے پھوڑا پھیری پھیلا پھیلی پھینک پہاڑی پہنتے پہننے پہنچا پہنچے پہن...

(ReplaceLettersInSameLangs)


[whitespace] ~1584-~1584: آیا منظور شما «"پهینک"» است؟
Context: ...ریں پھنسا پھنسے پھوڑا پھیری پھیلا پھیلی پھینک پہاڑی پہنتے پہننے پہنچا پہنچے پہنیں پہچ...

(ReplaceLettersInSameLangs)


[whitespace] ~1585-~1585: آیا منظور شما «"پهاڑی"» است؟
Context: ...نسا پھنسے پھوڑا پھیری پھیلا پھیلی پھینک پہاڑی پہنتے پہننے پہنچا پہنچے پہنیں پہچان پہی...

(ReplaceLettersInSameLangs)


[whitespace] ~1586-~1586: آیا منظور شما «"پهنتے"» است؟
Context: ...نسے پھوڑا پھیری پھیلا پھیلی پھینک پہاڑی پہنتے پہننے پہنچا پہنچے پہنیں پہچان پہیلی پہی...

(ReplaceLettersInSameLangs)


[whitespace] ~1587-~1587: آیا منظور شما «"پهننے"» است؟
Context: ...وڑا پھیری پھیلا پھیلی پھینک پہاڑی پہنتے پہننے پہنچا پہنچے پہنیں پہچان پہیلی پہیوں پیئ...

(ReplaceLettersInSameLangs)


[whitespace] ~1588-~1588: آیا منظور شما «"پهنچا"» است؟
Context: ...یری پھیلا پھیلی پھینک پہاڑی پہنتے پہننے پہنچا پہنچے پہنیں پہچان پہیلی پہیوں پیئرس پیا...

(ReplaceLettersInSameLangs)


[whitespace] ~1589-~1589: آیا منظور شما «"پهنچے"» است؟
Context: ...یلا پھیلی پھینک پہاڑی پہنتے پہننے پہنچا پہنچے پہنیں پہچان پہیلی پہیوں پیئرس پیارا پیا...

(ReplaceLettersInSameLangs)


[whitespace] ~1590-~1590: آیا منظور شما «"پهنیں"» است؟
Context: ...یلی پھینک پہاڑی پہنتے پہننے پہنچا پہنچے پہنیں پہچان پہیلی پہیوں پیئرس پیارا پیاری پیا...

(ReplaceLettersInSameLangs)


[whitespace] ~1591-~1591: آیا منظور شما «"پهچان"» است؟
Context: ...ینک پہاڑی پہنتے پہننے پہنچا پہنچے پہنیں پہچان پہیلی پہیوں پیئرس پیارا پیاری پیارے پیا...

(ReplaceLettersInSameLangs)


[whitespace] ~1592-~1592: آیا منظور شما «"پهیلی"» است؟
Context: ...اڑی پہنتے پہننے پہنچا پہنچے پہنیں پہچان پہیلی پہیوں پیئرس پیارا پیاری پیارے پیاسا پیا...

(ReplaceLettersInSameLangs)


[whitespace] ~1593-~1593: آیا منظور شما «"پهیوں"» است؟
Context: ...نتے پہننے پہنچا پہنچے پہنیں پہچان پہیلی پہیوں پیئرس پیارا پیاری پیارے پیاسا پیانو پید...

(ReplaceLettersInSameLangs)


[whitespace] ~1616-~1616: آیا منظور شما «"پیچها"» است؟
Context: ...نسل پینشن پیوست پیٹرن پیٹرک پیٹیو پیپلز پیچھا پیچھے پیڑوں چارجر چالاک چالوں چالیس چان...

(ReplaceLettersInSameLangs)


[whitespace] ~1617-~1617: آیا منظور شما «"پیچهے"» است؟
Context: ...نشن پیوست پیٹرن پیٹرک پیٹیو پیپلز پیچھا پیچھے پیڑوں چارجر چالاک چالوں چالیس چاندی چاو...

(ReplaceLettersInSameLangs)


[whitespace] ~1625-~1625: آیا منظور شما «"چاهئے"» است؟
Context: ...ڑوں چارجر چالاک چالوں چالیس چاندی چاوڈر چاہئے چاہتا چاہتی چاہتے چاہنے چاہوں چاہیں چاہ...

(ReplaceLettersInSameLangs)


[whitespace] ~1626-~1626: آیا منظور شما «"چاهتا"» است؟
Context: ...رجر چالاک چالوں چالیس چاندی چاوڈر چاہئے چاہتا چاہتی چاہتے چاہنے چاہوں چاہیں چاہیے چجر...

(ReplaceLettersInSameLangs)


[whitespace] ~1627-~1627: آیا منظور شما «"چاهتی"» است؟
Context: ...لاک چالوں چالیس چاندی چاوڈر چاہئے چاہتا چاہتی چاہتے چاہنے چاہوں چاہیں چاہیے چجرسی چرا...

(ReplaceLettersInSameLangs)


[whitespace] ~1628-~1628: آیا منظور شما «"چاهتے"» است؟
Context: ...لوں چالیس چاندی چاوڈر چاہئے چاہتا چاہتی چاہتے چاہنے چاہوں چاہیں چاہیے چجرسی چرایا چرو...

(ReplaceLettersInSameLangs)


[whitespace] ~1629-~1629: آیا منظور شما «"چاهنے"» است؟
Context: ...لیس چاندی چاوڈر چاہئے چاہتا چاہتی چاہتے چاہنے چاہوں چاہیں چاہیے چجرسی چرایا چروکی چرھ...

(ReplaceLettersInSameLangs)


[whitespace] ~1630-~1630: آیا منظور شما «"چاهوں"» است؟
Context: ...ندی چاوڈر چاہئے چاہتا چاہتی چاہتے چاہنے چاہوں چاہیں چاہیے چجرسی چرایا چروکی چرھتا چلا...

(ReplaceLettersInSameLangs)


[whitespace] ~1631-~1631: آیا منظور شما «"چاهیں"» است؟
Context: ...وڈر چاہئے چاہتا چاہتی چاہتے چاہنے چاہوں چاہیں چاہیے چجرسی چرایا چروکی چرھتا چلاؤں چلا...

(ReplaceLettersInSameLangs)


[whitespace] ~1632-~1632: آیا منظور شما «"چاهیے"» است؟
Context: ...ہئے چاہتا چاہتی چاہتے چاہنے چاہوں چاہیں چاہیے چجرسی چرایا چروکی چرھتا چلاؤں چلائی چلا...

(ReplaceLettersInSameLangs)


[whitespace] ~1636-~1636: آیا منظور شما «"چرهتا"» است؟
Context: ...ہنے چاہوں چاہیں چاہیے چجرسی چرایا چروکی چرھتا چلاؤں چلائی چلائے چلاتا چلاتی چلاتے چلا...

(ReplaceLettersInSameLangs)


[whitespace] ~1649-~1649: آیا منظور شما «"چوتها"» است؟
Context: ...اتے چلانا چلانے چلاوں چلایا چمکیں چوبیس چوتھا چوتھی چوتھے چوروں چولہا چومنے چونکا چون...

(ReplaceLettersInSameLangs)


[whitespace] ~1650-~1650: آیا منظور شما «"چوتهی"» است؟
Context: ...انا چلانے چلاوں چلایا چمکیں چوبیس چوتھا چوتھی چوتھے چوروں چولہا چومنے چونکا چونکہ چوٹ...

(ReplaceLettersInSameLangs)


[whitespace] ~1651-~1651: آیا منظور شما «"چوتهے"» است؟
Context: ...انے چلاوں چلایا چمکیں چوبیس چوتھا چوتھی چوتھے چوروں چولہا چومنے چونکا چونکہ چوٹوں چوڑ...

(ReplaceLettersInSameLangs)


[whitespace] ~1653-~1653: آیا منظور شما «"چولها"» است؟
Context: ...ایا چمکیں چوبیس چوتھا چوتھی چوتھے چوروں چولہا چومنے چونکا چونکہ چوٹوں چوڑیل چوہوں چڑھ...

(ReplaceLettersInSameLangs)


[whitespace] ~1656-~1656: آیا منظور شما «"چونکه"» است؟
Context: ...تھا چوتھی چوتھے چوروں چولہا چومنے چونکا چونکہ چوٹوں چوڑیل چوہوں چڑھنا چڑھنے چڑھیں چکا...

(ReplaceLettersInSameLangs)


[whitespace] ~1659-~1659: آیا منظور شما «"چوهوں"» است؟
Context: ...روں چولہا چومنے چونکا چونکہ چوٹوں چوڑیل چوہوں چڑھنا چڑھنے چڑھیں چکانی چکاگو چکایا چھا...

(ReplaceLettersInSameLangs)


[whitespace] ~1660-~1660: آیا منظور شما «"چڑهنا"» است؟
Context: ...لہا چومنے چونکا چونکہ چوٹوں چوڑیل چوہوں چڑھنا چڑھنے چڑھیں چکانی چکاگو چکایا چھاتی چھا...

(ReplaceLettersInSameLangs)


[whitespace] ~1661-~1661: آیا منظور شما «"چڑهنے"» است؟
Context: ...منے چونکا چونکہ چوٹوں چوڑیل چوہوں چڑھنا چڑھنے چڑھیں چکانی چکاگو چکایا چھاتی چھاپا چھا...

(ReplaceLettersInSameLangs)


[whitespace] ~1662-~1662: آیا منظور شما «"چڑهیں"» است؟
Context: ...نکا چونکہ چوٹوں چوڑیل چوہوں چڑھنا چڑھنے چڑھیں چکانی چکاگو چکایا چھاتی چھاپا چھاپہ چھا...

(ReplaceLettersInSameLangs)


[whitespace] ~1666-~1666: آیا منظور شما «"چهاتی"» است؟
Context: ...ہوں چڑھنا چڑھنے چڑھیں چکانی چکاگو چکایا چھاتی چھاپا چھاپہ چھاپے چھتری چھتوں چھدرت چھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1667-~1667: آیا منظور شما «"چهاپا"» است؟
Context: ...ھنا چڑھنے چڑھیں چکانی چکاگو چکایا چھاتی چھاپا چھاپہ چھاپے چھتری چھتوں چھدرت چھوئے چھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1668-~1668: آیا منظور شما «"چهاپه"» است؟
Context: ...ھنے چڑھیں چکانی چکاگو چکایا چھاتی چھاپا چھاپہ چھاپے چھتری چھتوں چھدرت چھوئے چھوری چھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1669-~1669: آیا منظور شما «"چهاپے"» است؟
Context: ...ھیں چکانی چکاگو چکایا چھاتی چھاپا چھاپہ چھاپے چھتری چھتوں چھدرت چھوئے چھوری چھونا چھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1670-~1670: آیا منظور شما «"چهتری"» است؟
Context: ...انی چکاگو چکایا چھاتی چھاپا چھاپہ چھاپے چھتری چھتوں چھدرت چھوئے چھوری چھونا چھونے چھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1671-~1671: آیا منظور شما «"چهتوں"» است؟
Context: ...اگو چکایا چھاتی چھاپا چھاپہ چھاپے چھتری چھتوں چھدرت چھوئے چھوری چھونا چھونے چھوٹا چھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1672-~1672: آیا منظور شما «"چهدرت"» است؟
Context: ...ایا چھاتی چھاپا چھاپہ چھاپے چھتری چھتوں چھدرت چھوئے چھوری چھونا چھونے چھوٹا چھوٹی چھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1673-~1673: آیا منظور شما «"چهوئے"» است؟
Context: ...اتی چھاپا چھاپہ چھاپے چھتری چھتوں چھدرت چھوئے چھوری چھونا چھونے چھوٹا چھوٹی چھوٹے چھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1674-~1674: آیا منظور شما «"چهوری"» است؟
Context: ...اپا چھاپہ چھاپے چھتری چھتوں چھدرت چھوئے چھوری چھونا چھونے چھوٹا چھوٹی چھوٹے چھوڑا چھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1675-~1675: آیا منظور شما «"چهونا"» است؟
Context: ...اپہ چھاپے چھتری چھتوں چھدرت چھوئے چھوری چھونا چھونے چھوٹا چھوٹی چھوٹے چھوڑا چھوڑو چھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1676-~1676: آیا منظور شما «"چهونے"» است؟
Context: ...اپے چھتری چھتوں چھدرت چھوئے چھوری چھونا چھونے چھوٹا چھوٹی چھوٹے چھوڑا چھوڑو چھوڑے چھپ...

(ReplaceLettersInSameLangs)


[whitespace] ~1677-~1677: آیا منظور شما «"چهوٹا"» است؟
Context: ...تری چھتوں چھدرت چھوئے چھوری چھونا چھونے چھوٹا چھوٹی چھوٹے چھوڑا چھوڑو چھوڑے چھپنے چھی...

(ReplaceLettersInSameLangs)


[whitespace] ~1678-~1678: آیا منظور شما «"چهوٹی"» است؟
Context: ...توں چھدرت چھوئے چھوری چھونا چھونے چھوٹا چھوٹی چھوٹے چھوڑا چھوڑو چھوڑے چھپنے چھینک چہر...

(ReplaceLettersInSameLangs)


[whitespace] ~1679-~1679: آیا منظور شما «"چهوٹے"» است؟
Context: ...درت چھوئے چھوری چھونا چھونے چھوٹا چھوٹی چھوٹے چھوڑا چھوڑو چھوڑے چھپنے چھینک چہروں چیئ...

(ReplaceLettersInSameLangs)


[whitespace] ~1680-~1680: آیا منظور شما «"چهوڑا"» است؟
Context: ...وئے چھوری چھونا چھونے چھوٹا چھوٹی چھوٹے چھوڑا چھوڑو چھوڑے چھپنے چھینک چہروں چیئرز چیخ...

(ReplaceLettersInSameLangs)


[whitespace] ~1681-~1681: آیا منظور شما «"چهوڑو"» است؟
Context: ...وری چھونا چھونے چھوٹا چھوٹی چھوٹے چھوڑا چھوڑو چھوڑے چھپنے چھینک چہروں چیئرز چیخنا چیخ...

(ReplaceLettersInSameLangs)


[whitespace] ~1682-~1682: آیا منظور شما «"چهوڑے"» است؟
Context: ...ونا چھونے چھوٹا چھوٹی چھوٹے چھوڑا چھوڑو چھوڑے چھپنے چھینک چہروں چیئرز چیخنا چیخنے چیز...

(ReplaceLettersInSameLangs)


[whitespace] ~1683-~1683: آیا منظور شما «"چهپنے"» است؟
Context: ...ونے چھوٹا چھوٹی چھوٹے چھوڑا چھوڑو چھوڑے چھپنے چھینک چہروں چیئرز چیخنا چیخنے چیزوں چیز...

(ReplaceLettersInSameLangs)


[whitespace] ~1684-~1684: آیا منظور شما «"چهینک"» است؟
Context: ...وٹا چھوٹی چھوٹے چھوڑا چھوڑو چھوڑے چھپنے چھینک چہروں چیئرز چیخنا چیخنے چیزوں چیزیں چیل...

(ReplaceLettersInSameLangs)


[whitespace] ~1685-~1685: آیا منظور شما «"چهروں"» است؟
Context: ...وٹی چھوٹے چھوڑا چھوڑو چھوڑے چھپنے چھینک چہروں چیئرز چیخنا چیخنے چیزوں چیزیں چیلنج چیم...

(ReplaceLettersInSameLangs)


[whitespace] ~1705-~1705: آیا منظور شما «"ڈرامه"» است؟
Context: ...لنا ڈالنے ڈالوں ڈالیں ڈامنو ڈاکٹر ڈبلیو ڈرامہ ڈرامے ڈرانا ڈرانے ڈرپوک ڈریگن ڈسپلے ڈمپ...

(ReplaceLettersInSameLangs)


[whitespace] ~1717-~1717: آیا منظور شما «"ڈهادو"» است؟
Context: ...یگن ڈسپلے ڈمپنگ ڈنڈوں ڈوئچے ڈویژن ڈکارڈ ڈھادو ڈھونڈ ڈھکنا ڈھکنے ڈھیلے ڈیاگو ڈیلٹا ڈیم...

(ReplaceLettersInSameLangs)


[whitespace] ~1718-~1718: آیا منظور شما «"ڈهونڈ"» است؟
Context: ...پلے ڈمپنگ ڈنڈوں ڈوئچے ڈویژن ڈکارڈ ڈھادو ڈھونڈ ڈھکنا ڈھکنے ڈھیلے ڈیاگو ڈیلٹا ڈیمین ڈین...

(ReplaceLettersInSameLangs)


[whitespace] ~1719-~1719: آیا منظور شما «"ڈهکنا"» است؟
Context: ...پنگ ڈنڈوں ڈوئچے ڈویژن ڈکارڈ ڈھادو ڈھونڈ ڈھکنا ڈھکنے ڈھیلے ڈیاگو ڈیلٹا ڈیمین ڈینیل ڈیو...

(ReplaceLettersInSameLangs)


[whitespace] ~1720-~1720: آیا منظور شما «"ڈهکنے"» است؟
Context: ...ڈوں ڈوئچے ڈویژن ڈکارڈ ڈھادو ڈھونڈ ڈھکنا ڈھکنے ڈھیلے ڈیاگو ڈیلٹا ڈیمین ڈینیل ڈیوٹی ڈیٹ...

(ReplaceLettersInSameLangs)


[whitespace] ~1721-~1721: آیا منظور شما «"ڈهیلے"» است؟
Context: ...ئچے ڈویژن ڈکارڈ ڈھادو ڈھونڈ ڈھکنا ڈھکنے ڈھیلے ڈیاگو ڈیلٹا ڈیمین ڈینیل ڈیوٹی ڈیٹنگ کار...

(ReplaceLettersInSameLangs)


[whitespace] ~1743-~1743: آیا منظور شما «"کاپته"» است؟
Context: ...لنگ کاموں کانوں کانٹا کانٹے کاٹنے کاٹیج کاپتہ کاپٹر کراؤں کرائی کراتی کرافٹ کرانے کرا...

(ReplaceLettersInSameLangs)


[whitespace] ~1752-~1752: آیا منظور شما «"کرایه"» است؟
Context: ...اؤں کرائی کراتی کرافٹ کرانے کراچی کرایا کرایہ کردار کردوں کردیا کردیں کررہا کررہی کرر...

(ReplaceLettersInSameLangs)


[whitespace] ~1757-~1757: آیا منظور شما «"کررها"» است؟
Context: ...اچی کرایا کرایہ کردار کردوں کردیا کردیں کررہا کررہی کررہے کرسمس کرسٹن کرسکو کرفیو کرل...

(ReplaceLettersInSameLangs)


[whitespace] ~1758-~1758: آیا منظور شما «"کررهی"» است؟
Context: ...ایا کرایہ کردار کردوں کردیا کردیں کررہا کررہی کررہے کرسمس کرسٹن کرسکو کرفیو کرلوں کرل...

(ReplaceLettersInSameLangs)


[whitespace] ~1759-~1759: آیا منظور شما «"کررهے"» است؟
Context: ...ایہ کردار کردوں کردیا کردیں کررہا کررہی کررہے کرسمس کرسٹن کرسکو کرفیو کرلوں کرلیا کرم...

(ReplaceLettersInSameLangs)


[whitespace] ~1778-~1778: آیا منظور شما «"کفاره"» است؟
Context: ...وگی کروگے کرکرا کریڈٹ کریگا کشائی کشمیر کفارہ کلارک کلاسک کلوزڈ کلپنا کلیدی کماتا کما...

(ReplaceLettersInSameLangs)


[whitespace] ~1794-~1794: آیا منظور شما «"کمینه"» است؟
Context: ...انڈ کمانے کمایا کمزور کمشنر کمپنی کمیشن کمینہ کمینی کمینے کمیٹی کنارہ کنارے کندھے کنو...

(ReplaceLettersInSameLangs)


[whitespace] ~1798-~1798: آیا منظور شما «"کناره"» است؟
Context: ...شنر کمپنی کمیشن کمینہ کمینی کمینے کمیٹی کنارہ کنارے کندھے کنوؤں کنورٹ کنویں کنکشن کوئ...

(ReplaceLettersInSameLangs)


[whitespace] ~1800-~1800: آیا منظور شما «"کندهے"» است؟
Context: ...یشن کمینہ کمینی کمینے کمیٹی کنارہ کنارے کندھے کنوؤں کنورٹ کنویں کنکشن کوئنز کوائف کوب...

(ReplaceLettersInSameLangs)


[whitespace] ~1807-~1807: آیا منظور شما «"کوبهی"» است؟
Context: ...دھے کنوؤں کنورٹ کنویں کنکشن کوئنز کوائف کوبھی کودنے کوشاں کونسا کونسل کونسی کونسے کون...

(ReplaceLettersInSameLangs)


[whitespace] ~1817-~1817: آیا منظور شما «"کوڑهی"» است؟
Context: ...نسا کونسل کونسی کونسے کونور کونوں کووئی کوڑھی کوژیہ کویتی کٹھور کٹہرے کپتان کپڑوں کھا...

(ReplaceLettersInSameLangs)


[whitespace] ~1818-~1818: آیا منظور شما «"کوژیه"» است؟
Context: ...نسل کونسی کونسے کونور کونوں کووئی کوڑھی کوژیہ کویتی کٹھور کٹہرے کپتان کپڑوں کھائی کھا...

(ReplaceLettersInSameLangs)


[whitespace] ~1820-~1820: آیا منظور شما «"کٹهور"» است؟
Context: ...نسے کونور کونوں کووئی کوڑھی کوژیہ کویتی کٹھور کٹہرے کپتان کپڑوں کھائی کھابہ کھاتا کھا...

(ReplaceLettersInSameLangs)


[whitespace] ~1821-~1821: آیا منظور شما «"کٹهرے"» است؟
Context: ...نور کونوں کووئی کوڑھی کوژیہ کویتی کٹھور کٹہرے کپتان کپڑوں کھائی کھابہ کھاتا کھاتی کھا...

(ReplaceLettersInSameLangs)


[whitespace] ~1824-~1824: آیا منظور شما «"کهائی"» است؟
Context: ...ڑھی کوژیہ کویتی کٹھور کٹہرے کپتان کپڑوں کھائی کھابہ کھاتا کھاتی کھاتے کھانا کھانے کھا...

(ReplaceLettersInSameLangs)


[whitespace] ~1825-~1825: آیا منظور شما «"کهابه"» است؟
Context: ...ژیہ کویتی کٹھور کٹہرے کپتان کپڑوں کھائی کھابہ کھاتا کھاتی کھاتے کھانا کھانے کھایا کھر...

(ReplaceLettersInSameLangs)


[whitespace] ~1826-~1826: آیا منظور شما «"کهاتا"» است؟
Context: ...یتی کٹھور کٹہرے کپتان کپڑوں کھائی کھابہ کھاتا کھاتی کھاتے کھانا کھانے کھایا کھروں کھس...

(ReplaceLettersInSameLangs)


[whitespace] ~1827-~1827: آیا منظور شما «"کهاتی"» است؟
Context: ...ھور کٹہرے کپتان کپڑوں کھائی کھابہ کھاتا کھاتی کھاتے کھانا کھانے کھایا کھروں کھسکی کھل...

(ReplaceLettersInSameLangs)


[whitespace] ~1828-~1828: آیا منظور شما «"کهاتے"» است؟
Context: ...ہرے کپتان کپڑوں کھائی کھابہ کھاتا کھاتی کھاتے کھانا کھانے کھایا کھروں کھسکی کھلتا کھل...

(ReplaceLettersInSameLangs)


[whitespace] ~1829-~1829: آیا منظور شما «"کهانا"» است؟
Context: ...تان کپڑوں کھائی کھابہ کھاتا کھاتی کھاتے کھانا کھانے کھایا کھروں کھسکی کھلتا کھلنے کھم...

(ReplaceLettersInSameLangs)


[whitespace] ~1830-~1830: آیا منظور شما «"کهانے"» است؟
Context: ...ڑوں کھائی کھابہ کھاتا کھاتی کھاتے کھانا کھانے کھایا کھروں کھسکی کھلتا کھلنے کھمبے کھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1831-~1831: آیا منظور شما «"کهایا"» است؟
Context: ...ائی کھابہ کھاتا کھاتی کھاتے کھانا کھانے کھایا کھروں کھسکی کھلتا کھلنے کھمبے کھودو کھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1832-~1832: آیا منظور شما «"کهروں"» است؟
Context: ...ابہ کھاتا کھاتی کھاتے کھانا کھانے کھایا کھروں کھسکی کھلتا کھلنے کھمبے کھودو کھولا کھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1833-~1833: آیا منظور شما «"کهسکی"» است؟
Context: ...اتا کھاتی کھاتے کھانا کھانے کھایا کھروں کھسکی کھلتا کھلنے کھمبے کھودو کھولا کھولو کھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1834-~1834: آیا منظور شما «"کهلتا"» است؟
Context: ...اتی کھاتے کھانا کھانے کھایا کھروں کھسکی کھلتا کھلنے کھمبے کھودو کھولا کھولو کھولے کھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1835-~1835: آیا منظور شما «"کهلنے"» است؟
Context: ...اتے کھانا کھانے کھایا کھروں کھسکی کھلتا کھلنے کھمبے کھودو کھولا کھولو کھولے کھونا کھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1836-~1836: آیا منظور شما «"کهمبے"» است؟
Context: ...انا کھانے کھایا کھروں کھسکی کھلتا کھلنے کھمبے کھودو کھولا کھولو کھولے کھونا کھونے کھچ...

(ReplaceLettersInSameLangs)


[whitespace] ~1837-~1837: آیا منظور شما «"کهودو"» است؟
Context: ...انے کھایا کھروں کھسکی کھلتا کھلنے کھمبے کھودو کھولا کھولو کھولے کھونا کھونے کھچڑی کھڑ...

(ReplaceLettersInSameLangs)


[whitespace] ~1838-~1838: آیا منظور شما «"کهولا"» است؟
Context: ...ایا کھروں کھسکی کھلتا کھلنے کھمبے کھودو کھولا کھولو کھولے کھونا کھونے کھچڑی کھڑکی کھی...

(ReplaceLettersInSameLangs)


[whitespace] ~1839-~1839: آیا منظور شما «"کهولو"» است؟
Context: ...روں کھسکی کھلتا کھلنے کھمبے کھودو کھولا کھولو کھولے کھونا کھونے کھچڑی کھڑکی کھیتی کھی...

(ReplaceLettersInSameLangs)


[whitespace] ~1840-~1840: آیا منظور شما «"کهولے"» است؟
Context: ...سکی کھلتا کھلنے کھمبے کھودو کھولا کھولو کھولے کھونا کھونے کھچڑی کھڑکی کھیتی کھیلو کھی...

(ReplaceLettersInSameLangs)


[whitespace] ~1841-~1841: آیا منظور شما «"کهونا"» است؟
Context: ...لتا کھلنے کھمبے کھودو کھولا کھولو کھولے کھونا کھونے کھچڑی کھڑکی کھیتی کھیلو کھینچ کہا...

(ReplaceLettersInSameLangs)


[whitespace] ~1842-~1842: آیا منظور شما «"کهونے"» است؟
Context: ...لنے کھمبے کھودو کھولا کھولو کھولے کھونا کھونے کھچڑی کھڑکی کھیتی کھیلو کھینچ کہانی کہا...

(ReplaceLettersInSameLangs)


[whitespace] ~1843-~1843: آیا منظور شما «"کهچڑی"» است؟
Context: ...مبے کھودو کھولا کھولو کھولے کھونا کھونے کھچڑی کھڑکی کھیتی کھیلو کھینچ کہانی کہاوت کہا...

(ReplaceLettersInSameLangs)


[whitespace] ~1844-~1844: آیا منظور شما «"کهڑکی"» است؟
Context: ...ودو کھولا کھولو کھولے کھونا کھونے کھچڑی کھڑکی کھیتی کھیلو کھینچ کہانی کہاوت کہاہے کیب...

(ReplaceLettersInSameLangs)


[whitespace] ~1845-~1845: آیا منظور شما «"کهیتی"» است؟
Context: ...ولا کھولو کھولے کھونا کھونے کھچڑی کھڑکی کھیتی کھیلو کھینچ کہانی کہاوت کہاہے کیبنٹ کیج...

(ReplaceLettersInSameLangs)


[whitespace] ~1846-~1846: آیا منظور شما «"کهیلو"» است؟
Context: ...ولو کھولے کھونا کھونے کھچڑی کھڑکی کھیتی کھیلو کھینچ کہانی کہاوت کہاہے کیبنٹ کیجئے کیج...

(ReplaceLettersInSameLangs)


[whitespace] ~1847-~1847: آیا منظور شما «"کهینچ"» است؟
Context: ...ولے کھونا کھونے کھچڑی کھڑکی کھیتی کھیلو کھینچ کہانی کہاوت کہاہے کیبنٹ کیجئے کیجیے کیط...

(ReplaceLettersInSameLangs)


[whitespace] ~1848-~1848: آیا منظور شما «"کهانی"» است؟
Context: ...ونا کھونے کھچڑی کھڑکی کھیتی کھیلو کھینچ کہانی کہاوت کہاہے کیبنٹ کیجئے کیجیے کیطرف کیل...

(ReplaceLettersInSameLangs)


[whitespace] ~1849-~1849: آیا منظور شما «"کهاوت"» است؟
Context: ...ونے کھچڑی کھڑکی کھیتی کھیلو کھینچ کہانی کہاوت کہاہے کیبنٹ کیجئے کیجیے کیطرف کیلئے کیل...

(ReplaceLettersInSameLangs)


[whitespace] ~1850-~1850: آیا منظور شما «"کهاهے"» است؟
Context: ...چڑی کھڑکی کھیتی کھیلو کھینچ کہانی کہاوت کہاہے کیبنٹ کیجئے کیجیے کیطرف کیلئے کیلبر کیل...

(ReplaceLettersInSameLangs)


[whitespace] ~1860-~1860: آیا منظور شما «"کیمره"» است؟
Context: ...جیے کیطرف کیلئے کیلبر کیلون کیمبل کیمرا کیمرہ کیمرے کیمپس کیمڈن کینچی کینڈی کیٹیا کیپ...

(ReplaceLettersInSameLangs)


[whitespace] ~1872-~1872: آیا منظور شما «"گابها"» است؟
Context: ...نڈی کیٹیا کیپلر کیپٹل کیپٹن کےلئے گائیڈ گابھا گارڈز گانٹھ گاہوں گراتے گرافر گرانے گرد...

(ReplaceLettersInSameLangs)


[whitespace] ~1874-~1874: آیا منظور شما «"گانٹه"» است؟
Context: ...پلر کیپٹل کیپٹن کےلئے گائیڈ گابھا گارڈز گانٹھ گاہوں گراتے گرافر گرانے گردوں گرنٹس گرو...

(ReplaceLettersInSameLangs)


[whitespace] ~1875-~1875: آیا منظور شما «"گاهوں"» است؟
Context: ...پٹل کیپٹن کےلئے گائیڈ گابھا گارڈز گانٹھ گاہوں گراتے گرافر گرانے گردوں گرنٹس گروہی گرہ...

(ReplaceLettersInSameLangs)


[whitespace] ~1881-~1881: آیا منظور شما «"گروهی"» است؟
Context: ...نٹھ گاہوں گراتے گرافر گرانے گردوں گرنٹس گروہی گرہیں گرینس گرینڈ گزارا گزارو گزارے گزر...

(ReplaceLettersInSameLangs)


[whitespace] ~1882-~1882: آیا منظور شما «"گرهیں"» است؟
Context: ...ہوں گراتے گرافر گرانے گردوں گرنٹس گروہی گرہیں گرینس گرینڈ گزارا گزارو گزارے گزرتا گزر...

(ReplaceLettersInSameLangs)


[whitespace] ~1891-~1891: آیا منظور شما «"گزشته"» است؟
Context: ...ینڈ گزارا گزارو گزارے گزرتا گزرتے گزرنا گزشتہ گفتگو گلابی گلبرٹ گلرمو گلمور گلیوں گمر...

(ReplaceLettersInSameLangs)


[whitespace] ~1898-~1898: آیا منظور شما «"گمراه"» است؟
Context: ...شتہ گفتگو گلابی گلبرٹ گلرمو گلمور گلیوں گمراہ گمشدہ گمنام گندگی گنڈوں گنگنا گواہی گود...

(ReplaceLettersInSameLangs)


[whitespace] ~1899-~1899: آیا منظور شما «"گمشده"» است؟
Context: ...تگو گلابی گلبرٹ گلرمو گلمور گلیوں گمراہ گمشدہ گمنام گندگی گنڈوں گنگنا گواہی گودام گور...

(ReplaceLettersInSameLangs)


[whitespace] ~1904-~1904: آیا منظور شما «"گواهی"» است؟
Context: ...یوں گمراہ گمشدہ گمنام گندگی گنڈوں گنگنا گواہی گودام گورنر گوروں گورڈن گولسن گولڈن گون...

(ReplaceLettersInSameLangs)


[whitespace] ~1912-~1912: آیا منظور شما «"گهائل"» است؟
Context: ...دام گورنر گوروں گورڈن گولسن گولڈن گونگے گھائل گھبرا گھروں گھسنا گھسنے گھسیٹ گھلنے گھن...

(ReplaceLettersInSameLangs)


[whitespace] ~1913-~1913: آیا منظور شما «"گهبرا"» است؟
Context: ...رنر گوروں گورڈن گولسن گولڈن گونگے گھائل گھبرا گھروں گھسنا گھسنے گھسیٹ گھلنے گھنٹہ گھن...

(ReplaceLettersInSameLangs)


[whitespace] ~1914-~1914: آیا منظور شما «"گهروں"» است؟
Context: ...روں گورڈن گولسن گولڈن گونگے گھائل گھبرا گھروں گھسنا گھسنے گھسیٹ گھلنے گھنٹہ گھنٹی گھن...

(ReplaceLettersInSameLangs)


[whitespace] ~1915-~1915: آیا منظور شما «"گهسنا"» است؟
Context: ...رڈن گولسن گولڈن گونگے گھائل گھبرا گھروں گھسنا گھسنے گھسیٹ گھلنے گھنٹہ گھنٹی گھنٹے گھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1916-~1916: آیا منظور شما «"گهسنے"» است؟
Context: ...لسن گولڈن گونگے گھائل گھبرا گھروں گھسنا گھسنے گھسیٹ گھلنے گھنٹہ گھنٹی گھنٹے گھوسٹ گھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1917-~1917: آیا منظور شما «"گهسیٹ"» است؟
Context: ...لڈن گونگے گھائل گھبرا گھروں گھسنا گھسنے گھسیٹ گھلنے گھنٹہ گھنٹی گھنٹے گھوسٹ گھونٹ گھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1918-~1918: آیا منظور شما «"گهلنے"» است؟
Context: ...نگے گھائل گھبرا گھروں گھسنا گھسنے گھسیٹ گھلنے گھنٹہ گھنٹی گھنٹے گھوسٹ گھونٹ گھونپ گھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1919-~1919: آیا منظور شما «"گهنٹه"» است؟
Context: ...ائل گھبرا گھروں گھسنا گھسنے گھسیٹ گھلنے گھنٹہ گھنٹی گھنٹے گھوسٹ گھونٹ گھونپ گھوڑا گھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1920-~1920: آیا منظور شما «"گهنٹی"» است؟
Context: ...برا گھروں گھسنا گھسنے گھسیٹ گھلنے گھنٹہ گھنٹی گھنٹے گھوسٹ گھونٹ گھونپ گھوڑا گھوڑی گھو...

(ReplaceLettersInSameLangs)


[whitespace] ~1921-~1921: آیا منظور شما «"گهنٹے"» است؟
Context: ...روں گھسنا گھسنے گھسیٹ گھلنے گھنٹہ گھنٹی گھنٹے گھوسٹ گھونٹ گھونپ گھوڑا گھوڑی گھوڑے گھٹ...

(ReplaceLettersInSameLangs)


[whitespace] ~1922-~1922: آیا منظور شما «"گهوسٹ"» است؟
Context: ...سنا گھسنے گھسیٹ گھلنے گھنٹہ گھنٹی گھنٹے گھوسٹ گھونٹ گھونپ گھوڑا گھوڑی گھوڑے گھٹتی گھٹ...

(ReplaceLettersInSameLangs)


[whitespace] ~1923-~1923: آیا منظور شما «"گهونٹ"» است؟
Context: ...سنے گھسیٹ گھلنے گھنٹہ گھنٹی گھنٹے گھوسٹ گھونٹ گھونپ گھوڑا گھوڑی گھوڑے گھٹتی گھٹنے گھٹ...

(ReplaceLettersInSameLangs)


[whitespace] ~1924-~1924: آیا منظور شما «"گهونپ"» است؟
Context: ...سیٹ گھلنے گھنٹہ گھنٹی گھنٹے گھوسٹ گھونٹ گھونپ گھوڑا گھوڑی گھوڑے گھٹتی گھٹنے گھٹیا گیا...

(ReplaceLettersInSameLangs)


[whitespace] ~1925-~1925: آیا منظور شما «"گهوڑا"» است؟
Context: ...لنے گھنٹہ گھنٹی گھنٹے گھوسٹ گھونٹ گھونپ گھوڑا گھوڑی گھوڑے گھٹتی گھٹنے گھٹیا گیارہ گیر...

(ReplaceLettersInSameLangs)


[whitespace] ~1926-~1926: آیا منظور شما «"گهوڑی"» است؟
Context: ...نٹہ گھنٹی گھنٹے گھوسٹ گھونٹ گھونپ گھوڑا گھوڑی گھوڑے گھٹتی گھٹنے گھٹیا گیارہ گیراج ھاں...

(ReplaceLettersInSameLangs)


[whitespace] ~1927-~1927: آیا منظور شما «"گهوڑے"» است؟
Context: ...نٹی گھنٹے گھوسٹ گھونٹ گھونپ گھوڑا گھوڑی گھوڑے گھٹتی گھٹنے گھٹیا گیارہ گیراج ھاںسی ھمم...

(ReplaceLettersInSameLangs)


[whitespace] ~1928-~1928: آیا منظور شما «"گهٹتی"» است؟
Context: ...نٹے گھوسٹ گھونٹ گھونپ گھوڑا گھوڑی گھوڑے گھٹتی گھٹنے گھٹیا گیارہ گیراج ھاںسی ھمممم ھیں...

(ReplaceLettersInSameLangs)


[whitespace] ~1929-~1929: آیا منظور شما «"گهٹنے"» است؟
Context: ...وسٹ گھونٹ گھونپ گھوڑا گھوڑی گھوڑے گھٹتی گھٹنے گھٹیا گیارہ گیراج ھاںسی ھمممم ھیںچو ہار...

(ReplaceLettersInSameLangs)


[whitespace] ~1930-~1930: آیا منظور شما «"گهٹیا"» است؟
Context: ...ونٹ گھونپ گھوڑا گھوڑی گھوڑے گھٹتی گھٹنے گھٹیا گیارہ گیراج ھاںسی ھمممم ھیںچو ہاربر ہار...

(ReplaceLettersInSameLangs)


[whitespace] ~1931-~1931: آیا منظور شما «"گیاره"» است؟
Context: ...ونپ گھوڑا گھوڑی گھوڑے گھٹتی گھٹنے گھٹیا گیارہ گیراج ھاںسی ھمممم ھیںچو ہاربر ہارنے ہاو...

(ReplaceLettersInSameLangs)


[whitespace] ~1933-~1933: آیا منظور شما «"هاںسی"» است؟
Context: ...وڑی گھوڑے گھٹتی گھٹنے گھٹیا گیارہ گیراج ھاںسی ھمممم ھیںچو ہاربر ہارنے ہاورڈ ہتکڑی ہجآ...

(ReplaceLettersInSameLangs)


[whitespace] ~1934-~1934: آیا منظور شما «"همممم"» است؟
Context: ...وڑے گھٹتی گھٹنے گھٹیا گیارہ گیراج ھاںسی ھمممم ھیںچو ہاربر ہارنے ہاورڈ ہتکڑی ہجآتہ ہدا...

(ReplaceLettersInSameLangs)


[whitespace] ~1935-~1935: آیا منظور شما «"هیںچو"» است؟
Context: ...ٹتی گھٹنے گھٹیا گیارہ گیراج ھاںسی ھمممم ھیںچو ہاربر ہارنے ہاورڈ ہتکڑی ہجآتہ ہدایت ہفت...

(ReplaceLettersInSameLangs)


[whitespace] ~1936-~1936: آیا منظور شما «"هاربر"» است؟
Context: ...ٹنے گھٹیا گیارہ گیراج ھاںسی ھمممم ھیںچو ہاربر ہارنے ہاورڈ ہتکڑی ہجآتہ ہدایت ہفتوں ہلا...

(ReplaceLettersInSameLangs)


[whitespace] ~1937-~1937: آیا منظور شما «"هارنے"» است؟
Context: ...ٹیا گیارہ گیراج ھاںسی ھمممم ھیںچو ہاربر ہارنے ہاورڈ ہتکڑی ہجآتہ ہدایت ہفتوں ہلاتا ہلا...

(ReplaceLettersInSameLangs)


[whitespace] ~1938-~1938: آیا منظور شما «"هاورڈ"» است؟
Context: ...ارہ گیراج ھاںسی ھمممم ھیںچو ہاربر ہارنے ہاورڈ ہتکڑی ہجآتہ ہدایت ہفتوں ہلاتا ہلاکت ہما...

(ReplaceLettersInSameLangs)


[whitespace] ~1939-~1939: آیا منظور شما «"هتکڑی"» است؟
Context: ...راج ھاںسی ھمممم ھیںچو ہاربر ہارنے ہاورڈ ہتکڑی ہجآتہ ہدایت ہفتوں ہلاتا ہلاکت ہمارا ہما...

(ReplaceLettersInSameLangs)


[whitespace] ~1940-~1940: آیا منظور شما «"هجآته"» است؟
Context: ...ںسی ھمممم ھیںچو ہاربر ہارنے ہاورڈ ہتکڑی ہجآتہ ہدایت ہفتوں ہلاتا ہلاکت ہمارا ہماری ہما...

(ReplaceLettersInSameLangs)


[whitespace] ~1941-~1941: آیا منظور شما «"هدایت"» است؟
Context: ...ممم ھیںچو ہاربر ہارنے ہاورڈ ہتکڑی ہجآتہ ہدایت ہفتوں ہلاتا ہلاکت ہمارا ہماری ہمارے ہمد...

(ReplaceLettersInSameLangs)


[whitespace] ~1942-~1942: آیا منظور شما «"هفتوں"» است؟
Context: ...ںچو ہاربر ہارنے ہاورڈ ہتکڑی ہجآتہ ہدایت ہفتوں ہلاتا ہلاکت ہمارا ہماری ہمارے ہمدرد ہمم...

(ReplaceLettersInSameLangs)


[whitespace] ~1943-~1943: آیا منظور شما «"هلاتا"» است؟
Context: ...ربر ہارنے ہاورڈ ہتکڑی ہجآتہ ہدایت ہفتوں ہلاتا ہلاکت ہمارا ہماری ہمارے ہمدرد ہمممم ہمو...

(ReplaceLettersInSameLangs)


[whitespace] ~1944-~1944: آیا منظور شما «"هلاکت"» است؟
Context: ...رنے ہاورڈ ہتکڑی ہجآتہ ہدایت ہفتوں ہلاتا ہلاکت ہمارا ہماری ہمارے ہمدرد ہمممم ہموار ہمی...

(ReplaceLettersInSameLangs)


[whitespace] ~1945-~1945: آیا منظور شما «"همارا"» است؟
Context: ...ورڈ ہتکڑی ہجآتہ ہدایت ہفتوں ہلاتا ہلاکت ہمارا ہماری ہمارے ہمدرد ہمممم ہموار ہمیشہ ہنس...

(ReplaceLettersInSameLangs)


[whitespace] ~1946-~1946: آیا منظور شما «"هماری"» است؟
Context: ...کڑی ہجآتہ ہدایت ہفتوں ہلاتا ہلاکت ہمارا ہماری ہمارے ہمدرد ہمممم ہموار ہمیشہ ہنستے ہنس...

(ReplaceLettersInSameLangs)


[whitespace] ~1947-~1947: آیا منظور شما «"همارے"» است؟
Context: ...آتہ ہدایت ہفتوں ہلاتا ہلاکت ہمارا ہماری ہمارے ہمدرد ہمممم ہموار ہمیشہ ہنستے ہنسلی ہنس...

(ReplaceLettersInSameLangs)


[whitespace] ~1948-~1948: آیا منظور شما «"همدرد"» است؟
Context: ...ایت ہفتوں ہلاتا ہلاکت ہمارا ہماری ہمارے ہمدرد ہمممم ہموار ہمیشہ ہنستے ہنسلی ہنسنا ہوا...

(ReplaceLettersInSameLangs)


[whitespace] ~1949-~1949: آیا منظور شما «"همممم"» است؟
Context: ...توں ہلاتا ہلاکت ہمارا ہماری ہمارے ہمدرد ہمممم ہموار ہمیشہ ہنستے ہنسلی ہنسنا ہواؤں ہوا...

(ReplaceLettersInSameLangs)


[whitespace] ~1950-~1950: آیا منظور شما «"هموار"» است؟
Context: ...اتا ہلاکت ہمارا ہماری ہمارے ہمدرد ہمممم ہموار ہمیشہ ہنستے ہنسلی ہنسنا ہواؤں ہوائی ہوت...

(ReplaceLettersInSameLangs)


[whitespace] ~1951-~1951: آیا منظور شما «"همیشه"» است؟
Context: ...اکت ہمارا ہماری ہمارے ہمدرد ہمممم ہموار ہمیشہ ہنستے ہنسلی ہنسنا ہواؤں ہوائی ہوتیں ہوج...

(ReplaceLettersInSameLangs)


[whitespace] ~1952-~1952: آیا منظور شما «"هنستے"» است؟
Context: ...ارا ہماری ہمارے ہمدرد ہمممم ہموار ہمیشہ ہنستے ہنسلی ہنسنا ہواؤں ہوائی ہوتیں ہوجاؤ ہوج...

(ReplaceLettersInSameLangs)


[whitespace] ~1953-~1953: آیا منظور شما «"هنسلی"» است؟
Context: ...اری ہمارے ہمدرد ہمممم ہموار ہمیشہ ہنستے ہنسلی ہنسنا ہواؤں ہوائی ہوتیں ہوجاؤ ہوجاو ہور...

(ReplaceLettersInSameLangs)


[whitespace] ~1954-~1954: آیا منظور شما «"هنسنا"» است؟
Context: ...ارے ہمدرد ہمممم ہموار ہمیشہ ہنستے ہنسلی ہنسنا ہواؤں ہوائی ہوتیں ہوجاؤ ہوجاو ہورہا ہور...

(ReplaceLettersInSameLangs)


[whitespace] ~1955-~1955: آیا منظور شما «"هواؤں"» است؟
Context: ...درد ہمممم ہموار ہمیشہ ہنستے ہنسلی ہنسنا ہواؤں ہوائی ہوتیں ہوجاؤ ہوجاو ہورہا ہورہی ہوس...

(ReplaceLettersInSameLangs)


[whitespace] ~1956-~1956: آیا منظور شما «"هوائی"» است؟
Context: ...ممم ہموار ہمیشہ ہنستے ہنسلی ہنسنا ہواؤں ہوائی ہوتیں ہوجاؤ ہوجاو ہورہا ہورہی ہوسکا ہوس...

(ReplaceLettersInSameLangs)


[whitespace] ~1957-~1957: آیا منظور شما «"هوتیں"» است؟
Context: ...وار ہمیشہ ہنستے ہنسلی ہنسنا ہواؤں ہوائی ہوتیں ہوجاؤ ہوجاو ہورہا ہورہی ہوسکا ہوسکے ہون...

(ReplaceLettersInSameLangs)


[whitespace] ~1958-~1958: آیا منظور شما «"هوجاؤ"» است؟
Context: ...یشہ ہنستے ہنسلی ہنسنا ہواؤں ہوائی ہوتیں ہوجاؤ ہوجاو ہورہا ہورہی ہوسکا ہوسکے ہونگی ہون...

(ReplaceLettersInSameLangs)


[whitespace] ~1959-~1959: آیا منظور شما «"هوجاو"» است؟
Context: ...ستے ہنسلی ہنسنا ہواؤں ہوائی ہوتیں ہوجاؤ ہوجاو ہورہا ہورہی ہوسکا ہوسکے ہونگی ہونگے ہوچ...

(ReplaceLettersInSameLangs)


[whitespace] ~1960-~1960: آیا منظور شما «"هورها"» است؟
Context: ...سلی ہنسنا ہواؤں ہوائی ہوتیں ہوجاؤ ہوجاو ہورہا ہورہی ہوسکا ہوسکے ہونگی ہونگے ہوچکا ہوچ...

(ReplaceLettersInSameLangs)


[whitespace] ~1961-~1961: آیا منظور شما «"هورهی"» است؟
Context: ...سنا ہواؤں ہوائی ہوتیں ہوجاؤ ہوجاو ہورہا ہورہی ہوسکا ہوسکے ہونگی ہونگے ہوچکا ہوچکے ہوگ...

(ReplaceLettersInSameLangs)


[whitespace] ~1962-~1962: آیا منظور شما «"هوسکا"» است؟
Context: ...اؤں ہوائی ہوتیں ہوجاؤ ہوجاو ہورہا ہورہی ہوسکا ہوسکے ہونگی ہونگے ہوچکا ہوچکے ہوگئی ہوگ...

(ReplaceLettersInSameLangs)


[whitespace] ~1963-~1963: آیا منظور شما «"هوسکے"» است؟
Context: ...ائی ہوتیں ہوجاؤ ہوجاو ہورہا ہورہی ہوسکا ہوسکے ہونگی ہونگے ہوچکا ہوچکے ہوگئی ہوگئے ہوگ...

(ReplaceLettersInSameLangs)


[whitespace] ~1964-~1964: آیا منظور شما «"هونگی"» است؟
Context: ...تیں ہوجاؤ ہوجاو ہورہا ہورہی ہوسکا ہوسکے ہونگی ہونگے ہوچکا ہوچکے ہوگئی ہوگئے ہوگیا ہوں...

(ReplaceLettersInSameLangs)


[whitespace] ~1965-~1965: آیا منظور شما «"هونگے"» است؟
Context: ...جاؤ ہوجاو ہورہا ہورہی ہوسکا ہوسکے ہونگی ہونگے ہوچکا ہوچکے ہوگئی ہوگئے ہوگیا ہوںگے ہٹا...

(ReplaceLettersInSameLangs)


[whitespace] ~1966-~1966: آیا منظور شما «"هوچکا"» است؟
Context: ...جاو ہورہا ہورہی ہوسکا ہوسکے ہونگی ہونگے ہوچکا ہوچکے ہوگئی ہوگئے ہوگیا ہوںگے ہٹائی ہٹی...

(ReplaceLettersInSameLangs)


[whitespace] ~1967-~1967: آیا منظور شما «"هوچکے"» است؟
Context: ...رہا ہورہی ہوسکا ہوسکے ہونگی ہونگے ہوچکا ہوچکے ہوگئی ہوگئے ہوگیا ہوںگے ہٹائی ہٹیئے ہڈی...

(ReplaceLettersInSameLangs)


[whitespace] ~1968-~1968: آیا منظور شما «"هوگئی"» است؟
Context: ...رہی ہوسکا ہوسکے ہونگی ہونگے ہوچکا ہوچکے ہوگئی ہوگئے ہوگیا ہوںگے ہٹائی ہٹیئے ہڈیوں ہڑت...

(ReplaceLettersInSameLangs)


[whitespace] ~1969-~1969: آیا منظور شما «"هوگئے"» است؟
Context: ...سکا ہوسکے ہونگی ہونگے ہوچکا ہوچکے ہوگئی ہوگئے ہوگیا ہوںگے ہٹائی ہٹیئے ہڈیوں ہڑتال ہںس...

(ReplaceLettersInSameLangs)


[whitespace] ~1970-~1970: آیا منظور شما «"هوگیا"» است؟
Context: ...سکے ہونگی ہونگے ہوچکا ہوچکے ہوگئی ہوگئے ہوگیا ہوںگے ہٹائی ہٹیئے ہڈیوں ہڑتال ہںسنا ہین...

(ReplaceLettersInSameLangs)


[whitespace] ~1971-~1971: آیا منظور شما «"هوںگے"» است؟
Context: ...نگی ہونگے ہوچکا ہوچکے ہوگئی ہوگئے ہوگیا ہوںگے ہٹائی ہٹیئے ہڈیوں ہڑتال ہںسنا ہینری ہین...

(ReplaceLettersInSameLangs)


[whitespace] ~1972-~1972: آیا منظور شما «"هٹائی"» است؟
Context: ...نگے ہوچکا ہوچکے ہوگئی ہوگئے ہوگیا ہوںگے ہٹائی ہٹیئے ہڈیوں ہڑتال ہںسنا ہینری ہینڈل ہین...

(ReplaceLettersInSameLangs)


[whitespace] ~1973-~1973: آیا منظور شما «"هٹیئے"» است؟
Context: ...چکا ہوچکے ہوگئی ہوگئے ہوگیا ہوںگے ہٹائی ہٹیئے ہڈیوں ہڑتال ہںسنا ہینری ہینڈل ہینگر ہیو...

(ReplaceLettersInSameLangs)


[whitespace] ~1974-~1974: آیا منظور شما «"هڈیوں"» است؟
Context: ...چکے ہوگئی ہوگئے ہوگیا ہوںگے ہٹائی ہٹیئے ہڈیوں ہڑتال ہںسنا ہینری ہینڈل ہینگر ہیومن ہیو...

(ReplaceLettersInSameLangs)


[whitespace] ~1975-~1975: آیا منظور شما «"هڑتال"» است؟
Context: ...گئی ہوگئے ہوگیا ہوںگے ہٹائی ہٹیئے ہڈیوں ہڑتال ہںسنا ہینری ہینڈل ہینگر ہیومن ہیوگو ہیک...

(ReplaceLettersInSameLangs)


[whitespace] ~1976-~1976: آیا منظور شما «"هںسنا"» است؟
Context: ...گئے ہوگیا ہوںگے ہٹائی ہٹیئے ہڈیوں ہڑتال ہںسنا ہینری ہینڈل ہینگر ہیومن ہیوگو ہیکرز ہیک...

(ReplaceLettersInSameLangs)


[whitespace] ~1977-~1977: آیا منظور شما «"هینری"» است؟
Context: ...گیا ہوںگے ہٹائی ہٹیئے ہڈیوں ہڑتال ہںسنا ہینری ہینڈل ہینگر ہیومن ہیوگو ہیکرز ہیکنگ ہیک...

(ReplaceLettersInSameLangs)


[whitespace] ~1978-~1978: آیا منظور شما «"هینڈل"» است؟
Context: ...ںگے ہٹائی ہٹیئے ہڈیوں ہڑتال ہںسنا ہینری ہینڈل ہینگر ہیومن ہیوگو ہیکرز ہیکنگ ہیکٹر یات...

(ReplaceLettersInSameLangs)


[whitespace] ~1979-~1979: آیا منظور شما «"هینگر"» است؟
Context: ...ائی ہٹیئے ہڈیوں ہڑتال ہںسنا ہینری ہینڈل ہینگر ہیومن ہیوگو ہیکرز ہیکنگ ہیکٹر یاترہ یات...

(ReplaceLettersInSameLangs)


[whitespace] ~1980-~1980: آیا منظور شما «"هیومن"» است؟
Context: ...یئے ہڈیوں ہڑتال ہںسنا ہینری ہینڈل ہینگر ہیومن ہیوگو ہیکرز ہیکنگ ہیکٹر یاترہ یاتنا یاد...

(ReplaceLettersInSameLangs)


[whitespace] ~1981-~1981: آیا منظور شما «"هیوگو"» است؟
Context: ...یوں ہڑتال ہںسنا ہینری ہینڈل ہینگر ہیومن ہیوگو ہیکرز ہیکنگ ہیکٹر یاترہ یاتنا یادوں یاف...

(ReplaceLettersInSameLangs)


[whitespace] ~1982-~1982: آیا منظور شما «"هیکرز"» است؟
Context: ...تال ہںسنا ہینری ہینڈل ہینگر ہیومن ہیوگو ہیکرز ہیکنگ ہیکٹر یاترہ یاتنا یادوں یافتہ یقی...

(ReplaceLettersInSameLangs)


[whitespace] ~1983-~1983: آیا منظور شما «"هیکنگ"» است؟
Context: ...سنا ہینری ہینڈل ہینگر ہیومن ہیوگو ہیکرز ہیکنگ ہیکٹر یاترہ یاتنا یادوں یافتہ یقینا یقی...

(ReplaceLettersInSameLangs)


[whitespace] ~1984-~1984: آیا منظور شما «"هیکٹر"» است؟
Context: ...نری ہینڈل ہینگر ہیومن ہیوگو ہیکرز ہیکنگ ہیکٹر یاترہ یاتنا یادوں یافتہ یقینا یقینی یلئ...

(ReplaceLettersInSameLangs)


[whitespace] ~1985-~1985: آیا منظور شما «"یاتره"» است؟
Context: ...نڈل ہینگر ہیومن ہیوگو ہیکرز ہیکنگ ہیکٹر یاترہ یاتنا یادوں یافتہ یقینا یقینی یلئڈی یلر...

(ReplaceLettersInSameLangs)


[whitespace] ~1988-~1988: آیا منظور شما «"یافته"» است؟
Context: ...وگو ہیکرز ہیکنگ ہیکٹر یاترہ یاتنا یادوں یافتہ یقینا یقینی یلئڈی یلرجی یوراج یورپی یون...

(ReplaceLettersInSameLangs)


[whitespace] ~1997-~1997: آیا منظور شما «"یهسان"» است؟
Context: ...ینی یلئڈی یلرجی یوراج یورپی یونین یووتی یہسان یہودی ییومن

(ReplaceLettersInSameLangs)


[whitespace] ~1998-~1998: آیا منظور شما «"یهودی"» است؟
Context: ...ئڈی یلرجی یوراج یورپی یونین یووتی یہسان یہودی ییومن

(ReplaceLettersInSameLangs)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/ur/ur_daily_words.txt` around lines 1 - 2000, Daily
answer pool contains OCR/noise-corrupted tokens that must be removed or flagged;
scan webapp/data/languages/ur/ur_daily_words.txt and prune entries matching the
example corrupt tokens (e.g., "أہغاد", "اطءلہ", "اپددر", "خہجءز", "ضآؤاط",
"وففوہ", "ھمممم", "یلئڈی") by either deleting them or moving them to a QA
bucket, add an automated validation step (Unicode script/regex) to warn on
non-standard Urdu/Arabic letter sequences and punctuation, and regenerate the
list so only valid lexical tokens remain (keep records of pruned tokens for
manual review).

Comment on lines +1 to +2
# Uzbek Language Data — Sources

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add Uzbek dataset source URLs and licenses (file is currently incomplete).

This file is header-only right now, so data provenance and licensing cannot be audited.

📄 Suggested patch
 # Uzbek Language Data — Sources
 
+## FrequencyWords (OpenSubtitles)
+- URL: https://github.com/hermitdave/FrequencyWords
+- License: MIT (code), CC-BY-SA 4.0 (content)
+
+## wordfreq
+- URL: https://github.com/rspeer/wordfreq
+- License: MIT
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Uzbek Language Data — Sources
# Uzbek Language Data — Sources
## FrequencyWords (OpenSubtitles)
- URL: https://github.com/hermitdave/FrequencyWords
- License: MIT (code), CC-BY-SA 4.0 (content)
## wordfreq
- URL: https://github.com/rspeer/wordfreq
- License: MIT
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/uz/SOURCES.md` around lines 1 - 2, The SOURCES.md
currently only contains a header and lacks dataset provenance; update
webapp/data/languages/uz/SOURCES.md to list each Uzbek dataset used with its
name, canonical source URL, license identifier (e.g., CC-BY-4.0, CC0), and
attribution/contributor info so licensing can be audited; ensure each entry
follows a consistent bullet or table format and include any dataset-specific
notes (e.g., subset, preprocessing) to make provenance unambiguous.

Comment on lines +1 to +567
huzur
arvoh
radiy
qizil
vatan
qabih
voris
bitta
izhor
johil
sigir
isloh
aslan
hadis
otadi
zohid
ildiz
baliq
pyotr
bugun
fason
yoqub
kuyik
sobor
nuqta
urush
yemoq
zakon
siyoh
amina
pirat
qaror
isrof
ihota
hasan
negiz
qozoq
raqam
toʻrt
ahvol
savat
mufti
kiyik
nigoh
zohir
ixlos
nufuz
sevgi
zamin
pyesa
parik
muguz
hissa
ongli
tamom
boqiy
shukr
xodim
sirka
hokim
mayiz
korol
oydek
xitob
savob
qorin
jasad
zamon
oʻyin
nomus
chili
shams
qalay
sabot
sonet
doʻst
huquq
ablah
molik
avlod
luzum
nasha
litiy
eshon
terim
zakar
momiq
zarar
demoq
oʻlar
nosir
oʻtov
kofir
iqbol
salom
pitsa
choch
muqim
davom
qatra
ssuda
oshiq
isyon
savol
hissi
bodom
rioya
salib
ovchi
hojat
ishoq
erkak
tovar
otash
birga
qarir
alayh
kanva
ichak
nahor
tamal
xitoy
sahro
aprel
takya
askar
guruh
hozir
sarob
qiyos
xatib
malta
aorta
hasad
shakl
razil
burga
urugʻ
tinch
radar
laziz
xutba
jigar
bilan
shoir
ombor
hatto
shkaf
sohil
murod
karam
iroda
karta
tulki
fitna
qomat
kelin
dabba
tavba
rajab
qaysi
teatr
xabar
mudir
halqa
seara
rusni
lager
hamza
vanna
boʻsh
niyat
olmoq
javob
tunis
sumka
iffat
sovuq
dariy
soqol
aqida
surat
ochiq
lekin
vafot
ikrom
omina
ilyos
taqvo
inson
nihon
radif
ovqat
rupor
fahsh
tilla
qasam
vazir
bobiy
bolta
issiq
shaxs
gʻozi
quruq
hamla
badan
mohir
lozim
qayiq
okean
kimyo
xayol
shina
havza
makon
buyuk
mavzu
begim
safar
sihat
baxil
buzoq
vasiy
pemza
maqol
limon
holat
qonun
muhim
bizga
sharq
tuyuq
zilol
nafas
qonli
zaboy
foniy
terak
pesha
faraz
manba
hayot
oltin
kalit
tabib
zavod
sovun
anhor
fasih
kecha
lotin
tomat
qalin
reniy
tutun
jinni
zuhra
daxma
yetti
maqom
aynan
murch
yangi
lampa
hovuz
olmos
ermoq
atama
bayon
hafta
ajdod
kabob
afyun
najib
insof
xamsa
sonli
namoz
qadim
xarip
misol
iqror
qiliq
voqea
sifat
soyuz
garov
hadya
geliy
yozuv
islom
sobiq
uchun
adyol
olcha
foyda
toifa
tatar
gʻarb
qovun
shart
tuzum
tojik
jihat
rumin
sizga
butun
ruhan
somsa
tovus
sohir
osiyo
uslub
ahmoq
paqir
vosit
pirog
ziyon
katta
qissa
daryo
raqib
urmoq
xolos
devor
uradi
fosiq
qavat
kuzni
paxta
xiyli
palov
tizim
qabul
manot
burun
akula
lahza
qolip
jasur
diniy
faqat
avval
taroq
qadar
gilam
loyiq
yunon
shayx
atrof
savdo
tuxum
qisqa
kiyim
bordi
mayak
halab
qismi
sokin
nukus
xiyla
ildam
menga
zavja
kitob
iqlim
yomon
oqmoq
aholi
irqiy
alloh
qibla
shuur
somiy
hassa
imkon
pilik
quloq
boʻri
milod
inkor
jonli
bahor
xalat
qanot
erkin
shnur
dubay
abzal
fotih
katet
oddiy
jihod
barot
tufli
sodiq
malay
hakim
beliz
nazar
xusus
sudya
dalil
osmon
yurak
muboh
baron
salat
faqir
subut
ellik
manti
janub
fozil
guvoh
zafar
insho
ispan
uymoq
jahon
keldi
axloq
kishi
shifo
ariza
nikoh
josus
elchi
qimiz
quyon
zarif
ehson
ilhom
aloqa
hovli
parij
oʻrta
unsur
kerak
mebel
talab
haqir
kohin
botil
zakot
nusxa
usmon
tojir
doira
ruhiy
eston
muhit
totli
balki
pakki
yelka
sariq
urgʻu
tarix
tovuq
jadal
qadam
sklad
qurol
marta
tuhfa
jamoa
ogʻir
arman
oybek
muzey
qomus
notiq
modda
bulut
albom
vodiy
shafe
rohat
vakil
eshik
taraf
nodir
dunyo
anjir
banan
gʻayr
hamma
kabel
sovet
sohib
jussa
zarba
barak
xamir
biroq
tuman
moyli
sabab
saxiy
idrok
mahal
arzon
suzuk
qorli
yoqut
asriy
havas
kaliy
xonim
qalam
siloh
narsa
jalab
eshak
gʻayn
kotib
adash
gunoh
osmoq
nomli
izzat
otmoq
alban
aksar
falaj
loyli
sabiy
tizza
mufid
kasal
hisob
temir
fagot
bilim
gʻayb
vujud
litva
viski
basra
qahva
ogayo
suyak
dofin
isbot
qirol
tamiz
kamol
qoida
sadaf
tariq
kapot
fojir
radio
sahar
hilol
madad
xotin
xoʻja
doimo
ilmiy
ogʻiz
okrug
nafar
etnik
irsiy
diloq
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check Uzbek language config for grapheme_mode setting
cat webapp/data/languages/uz/language_config.json | jq '.grapheme_mode'

# Count codepoint lengths of words containing the modifier apostrophe
echo "--- Words with ʻ (U+02BB) and their codepoint counts ---"
grep 'ʻ' webapp/data/languages/uz/uz_5words.txt | head -10 | while read word; do
  len=$(echo -n "$word" | wc -m)
  echo "$word: $len codepoints"
done

Repository: Hugo0/wordle

Length of output: 317


🏁 Script executed:

#!/bin/bash
# Count total words with apostrophe
total_with_apostrophe=$(grep -c 'ʻ' webapp/data/languages/uz/uz_5words.txt)
echo "Total words with modifier apostrophe (ʻ): $total_with_apostrophe"

# Count all words and verify total count
total_words=$(wc -l < webapp/data/languages/uz/uz_5words.txt)
echo "Total words in file: $total_words"

# Check if ALL apostrophe words are 6 codepoints
echo ""
echo "Checking if all apostrophe words are 6 codepoints:"
grep 'ʻ' webapp/data/languages/uz/uz_5words.txt | while read word; do
  len=$(echo -n "$word" | wc -m)
  if [ "$len" -ne 6 ]; then
    echo "UNEXPECTED: $word has $len codepoints (not 6)"
  fi
done | head -5
# Count how many are 6
count_6=$(grep 'ʻ' webapp/data/languages/uz/uz_5words.txt | awk '{print length($0)}' | grep -c "^6$")
echo "Words with ʻ that are 6 codepoints: $count_6 / $total_with_apostrophe"

# Verify no words without apostrophe exceed 5 codepoints
echo ""
echo "Checking words without apostrophe for length violations:"
grep -v 'ʻ' webapp/data/languages/uz/uz_5words.txt | awk '{if (length($0) != 5) print $0 " (" length($0) " codepoints)"}' | head -5

Repository: Hugo0/wordle

Length of output: 279


Fix 18 Uzbek words that violate the 5-letter constraint.

The file contains 18 words with the modifier letter apostrophe (ʻ, U+02BB) that measure 6 codepoints instead of 5: toʻrt, oʻyin, doʻst, oʻlar, oʻtov, urugʻ, boʻsh, gʻozi, gʻarb, boʻri, and others. Since grapheme_mode is disabled for Uzbek, the system counts individual codepoints, and these words violate the 5-letter constraint defined by the filename uz_5words.txt.

Either replace these 18 words with alternative 5-codepoint words or enable grapheme-aware length validation for Uzbek to properly handle the and digraphs as single grapheme units.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/uz/uz_5words.txt` around lines 1 - 567, The
uz_5words.txt file contains 18 entries that use the modifier letter apostrophe
(U+02BB) and therefore are 6 codepoints (e.g. toʻrt, oʻyin, doʻst, oʻlar, oʻtov,
urugʻ, boʻsh, gʻozi, gʻarb, boʻri, etc.), violating the 5-codepoint constraint;
fix by either replacing each listed 6-codepoint word with a true 5-codepoint
Uzbek word (ensure replacements are 5 Unicode codepoints exactly) or enable
grapheme-aware length handling for Uzbek so sequences like oʻ and gʻ are treated
as single graphemes (adjust the validator/config to set grapheme_mode for
Uzbek); update the entries for the specific words mentioned (toʻrt, oʻyin,
doʻst, oʻlar, oʻtov, urugʻ, boʻsh, gʻozi, gʻarb, boʻri and the remaining
problematic tokens) accordingly.

Comment on lines +1 to +2
# Yoruba Language Data — Sources

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Source provenance is missing (header-only file).

This file needs actual source links/licensing/processing notes; otherwise the dataset is not auditable or reproducible.

I can draft a SOURCES.md template (source URL, license, extraction date, normalization steps) and map it to the current Yoruba assets if you want.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/yo/SOURCES.md` around lines 1 - 2, The SOURCES.md for
Yoruba currently only contains a header and lacks provenance; update
webapp/data/languages/yo/SOURCES.md to include per-asset source entries (source
URL, license, extraction date), processing/normalization steps applied
(tokenization, filtering, deduplication, scripts used), and a mapping from each
Yoruba asset filename to its source entry so the dataset is auditable and
reproducible; use the existing "# Yoruba Language Data — Sources" header as the
anchor and follow the proposed template fields (source URL, license, extraction
date, normalization steps) for each listed asset.

Comment on lines +30 to +42
[
"⇨",
"z",
"x",
"c",
"v",
"b",
"n",
"m",
"ẹ",
"ọ",
"ṣ",
"⌫"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if Yoruba word list contains tonal diacritics
echo "--- Checking for tonal marks in Yoruba words ---"
# Look for combining acute (U+0301), grave (U+0300), or macron (U+0304)
# Or precomposed characters with these marks
rg -o '[àáâãäåèéêëìíîïòóôõöùúûüÀÁÈÉÌÍÒÓÙÚ]' webapp/data/languages/yo/ --no-filename | sort | uniq -c | head -20

# Also check the character file
echo "--- Yoruba characters file ---"
cat webapp/data/languages/yo/yo_characters.txt 2>/dev/null || echo "File not found"

Repository: Hugo0/wordle

Length of output: 315


Add tonal diacritics to keyboard and character set.

The Yoruba word list includes 163 instances of tonal diacritics (à, á, è, é, ì, í, ò, ó, ù, ú and their capitals), but the keyboard layout and character set file (yo_characters.txt) do not include these characters. This creates a functional gap—users cannot input valid Yoruba words containing tonal marks even though these words exist in the game.

To resolve:

  1. Add tonal-marked vowels (à, á, è, é, ì, í, ò, ó, ù, ú) to the keyboard layout
  2. Update yo_characters.txt to include these characters
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/yo/yo_keyboard.json` around lines 30 - 42, The keyboard
JSON row currently containing "⇨","z","x","c","v","b","n","m","ẹ","ọ","ṣ","⌫"
needs to include Yoruba tonal vowels (à, á, è, é, ì, í, ò, ó, ù, ú) and their
uppercase forms so users can type marked words; update
webapp/data/languages/yo/yo_keyboard.json to add those characters into the
appropriate rows (near the vowel keys where "ẹ","ọ","ṣ" appear) and also update
the character set file yo_characters.txt to include all tonal vowels and their
capital variants (À, Á, È, É, Ì, Í, Ò, Ó, Ù, Ú) alongside existing characters so
the game recognizes them.

Hugo0 added a commit that referenced this pull request Mar 14, 2026
Adds scripts/profanity_blocklist.txt with common English profanity/slurs
that leak into subtitle-sourced word lists (FrequencyWords). These words
are filtered from daily word candidates but remain valid guesses.

Fixes: bitch, nigga, pussy, whore found in Indonesian/Tagalog daily words
(reported by CodeRabbit review on PR #149).
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 16

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
webapp/app.py (1)

180-183: ⚠️ Potential issue | 🟡 Minor

Potential ZeroDivisionError if all words are filtered out.

If _5words is empty after filtering (e.g., corrupted character set file), line 181 will raise ZeroDivisionError.

🛡️ Proposed defensive fix
-    if n_in_order / len(_5words) > 0.8:
+    if _5words and n_in_order / len(_5words) > 0.8:
         random.shuffle(_5words)
         print(f"{lang} words are sorted, shuffling")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/app.py` around lines 180 - 183, The division n_in_order / len(_5words)
can raise ZeroDivisionError when _5words is empty; before computing the ratio or
shuffling, add a guard that checks if len(_5words) == 0 (or not _5words) and
handle it (e.g., skip the check/shuffle, log an error/warning with context
including lang, or return/continue from the enclosing function) so the block
around the n_in_order calculation and random.shuffle(_5words) never divides by
zero.
♻️ Duplicate comments (4)
webapp/data/languages/yo/SOURCES.md (1)

1-6: ⚠️ Potential issue | 🟠 Major

Provenance metadata is still incomplete for reproducibility.

This now has a source URL and license, but it still misses key audit fields (e.g., extraction date, processing/normalization steps, and mapping of each Yoruba asset file to the source entry). Please expand this into full provenance docs so the dataset can be reproduced.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/yo/SOURCES.md` around lines 1 - 6, The SOURCES.md for
"Yoruba Language Data — Sources" is missing full provenance; update this file to
include extraction_date, extractor identity/version, exact URL(s) used with
fetch timestamps, data processing/normalization steps (tokenization, filtering,
encoding changes), mapping table that links each asset file name to the original
Wiktionary entry identifiers or URLs, dataset version or commit hash and
checksum(s) for generated files, and contact/license attribution details so the
dataset can be reproduced; reference the top-level header "Yoruba Language Data
— Sources" and the existing "kaikki.org (Wiktionary extract)" entry when adding
these fields.
webapp/data/languages/ms/ms_daily_words.txt (1)

387-387: ⚠️ Potential issue | 🟠 Major

Malay daily list still contains English fragment/contraction tokens.

didnt (Line 387), doesn (Line 397), thats (Line 1822), and youre (Line 1984) should not be in the daily pool. Please regenerate with contamination filtering enabled end-to-end.

Also applies to: 397-397, 1822-1822, 1984-1984

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/ms/ms_daily_words.txt` at line 387, The Malay
daily-word list contains English contraction tokens ("didnt", "doesn", "thats",
"youre"); remove these tokens from the list and re-run the generation pipeline
with contamination filtering enabled end-to-end (enable the
language-contamination filter / language-detection step in the generator) so
English fragments are excluded automatically; verify the regenerated output no
longer contains the listed tokens and add a regression check to the pipeline to
catch English tokens in Malay lists.
webapp/data/languages/tl/tl_daily_words.txt (1)

543-543: ⚠️ Potential issue | 🟠 Major

Daily pool still contains obvious contamination tokens.

gmail (Line 543), https (Line 652), and north (Line 1295) are still in the Tagalog daily list. Please remove these via the generation pipeline (not manual edits) so filtering is systematic and repeatable.

Also applies to: 652-652, 1295-1295

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/tl/tl_daily_words.txt` at line 543, The Tagalog
daily-word generation pipeline is not filtering out contamination tokens like
"gmail", "https", and "north"; update the pipeline (e.g., in the
generateDailyWords()/buildDailyPool() flow or the token
normalization/filterTokens() step) to systematically exclude these by adding a
contamination stoplist and URL/email pattern checks: add exact-match exclusions
for known bad tokens ("gmail","north") and a regex filter for URL/email tokens
(e.g., patterns matching ^https?:// and email/domain tokens), apply the filters
before finalizing the daily pool (e.g., in filterContaminants()/finalizePool()),
and run the generator to regenerate the Tagalog daily list so removals are
reproducible by the pipeline.
scripts/improve_word_lists.py (1)

317-328: ⚠️ Potential issue | 🟠 Major

load_hunspell_words uses codepoint-based filtering, breaks for Hindi.

EXTRA_SOURCES on line 291 includes "hi": {"leipzig", "hunspell", "kaikki"}, but load_hunspell_words uses len(w) == 5 and w.isalpha() which will filter out valid Hindi words with combining marks.

This affects the native dictionary used for contamination detection, potentially causing incorrect contamination flags for Hindi.

🐛 Proposed fix to support grapheme-mode
-def load_hunspell_words(lang: str) -> set[str]:
+def load_hunspell_words(lang: str, grapheme_mode: bool = False) -> set[str]:
     """Load 5-letter words from Hunspell dictionary."""
     path = HUNSPELL_DIR / f"{lang}.dic"
     if not path.exists():
         return set()
+    if grapheme_mode:
+        import grapheme
     words = set()
     for line in path.read_text(encoding="utf-8", errors="ignore").splitlines():
         # Strip affix flags after '/'
         w = line.split("/")[0].strip().lower()
-        if len(w) == 5 and w.isalpha():
-            words.add(w)
+        if grapheme_mode:
+            if w and grapheme.length(w) == 5:
+                words.add(w)
+        else:
+            if len(w) == 5 and w.isalpha():
+                words.add(w)
     return words
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/improve_word_lists.py` around lines 317 - 328, load_hunspell_words
currently filters by codepoint length and w.isalpha(), which drops valid Hindi
words with combining marks; update load_hunspell_words to count grapheme
clusters instead of codepoints (so accented/combining characters count as one)
by using a grapheme-aware splitter (e.g., the third-party regex module with
regex.findall(r'\X', w)) and require that the grapheme sequence length == 5;
additionally replace w.isalpha() with a check that the graphemes contain letters
(e.g., test that at least one base character matches Unicode letter properties
like \p{L} or use char.isalpha() on base graphemes) so Hindi words with
combining marks are accepted while preserving alphabetic-only filtering.
🧹 Nitpick comments (6)
webapp/data/languages/nds/nds_curated_schedule.txt (1)

1-4: Consider adding an automated integrity check for curated schedule files.

To prevent accidental drift, add a CI/script check that validates days equals the number of entries and that the file remains immutable unless regenerated.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/nds/nds_curated_schedule.txt` around lines 1 - 4, Add a
CI/script integrity check that parses curated schedule files like
nds_curated_schedule.txt and validates that the header metadata matches the
content: verify the numeric "days:" value equals the actual number of entries
below the header and that the "word_list_hash" matches a computed hash of the
file body; if mismatched, fail the job and require regeneration. Implement this
check as a reusable script (e.g., scripts/verify_curated_schedule) invoked by CI
for the directory, and ensure it returns non-zero on mismatch or any file
modification outside of regeneration so the file is treated as immutable unless
the regeneration tool updates it.
webapp/data/languages/uz/uz_curated_schedule.txt (1)

5-48: Curated schedule contains repeated daily words.

There are duplicates in this 48-day window (e.g., kabob, diniy, uchun). Deduplicate during schedule generation to avoid repeated daily answers in short rotations.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/uz/uz_curated_schedule.txt` around lines 5 - 48, The
curated Uzbek schedule file contains duplicate entries (e.g., "kabob", "diniy",
"uchun") causing repeated daily answers; fix by deduplicating the source list
before generating the 48-day rotation: update the schedule generation path
(e.g., generateCuratedSchedule or buildScheduleFromCuratedList) to filter the
input word list for uniqueness while preserving first-occurrence order (or
dedupe the parsed contents of uz_curated_schedule.txt) so the produced schedule
contains only unique daily words.
webapp/data/languages/ie/ie_curated_schedule.txt (1)

1-4: Optional: Add daily_words_hash for consistency.

The header is missing the daily_words_hash field present in other curated schedules (e.g., pt, ru, uk). While not critical, adding it would improve metadata consistency across language data files.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/ie/ie_curated_schedule.txt` around lines 1 - 4, Add a
daily_words_hash header entry to this file to match other curated schedules:
create a `daily_words_hash: <hash>` line in the header above or alongside
`word_list_hash` so the file includes `daily_words_hash`, `word_list_hash` and
`days` metadata (see other language files like pt/ru/uk for the exact
placement), ensuring the hash value is computed from the same frozen daily words
source used for the `word_list_hash` (so MIGRATION_DAY_IDX and list generation
remain consistent).
scripts/freeze_past_words.py (2)

250-253: Platform-specific path splitting.

Using f.split("/")[-1] is Unix-specific. Consider using Path(f).name for cross-platform compatibility.

♻️ Suggested fix
     else:
         langs = sorted(
-            f.split("/")[-1] for f in glob.glob(str(LANGUAGES_DIR / "*")) if os.path.isdir(f)
+            Path(f).name for f in glob.glob(str(LANGUAGES_DIR / "*")) if os.path.isdir(f)
         )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/freeze_past_words.py` around lines 250 - 253, The code that builds
langs uses f.split("/")[-1], which is Unix-specific; update the comprehension
that sets langs to use Path(f).name for cross-platform path handling (replace
f.split("/")[-1] with Path(f).name) and add/import Path from pathlib if not
already imported so LANGUAGES_DIR, the glob.glob results, and the langs variable
work correctly on Windows and POSIX.

105-112: Grapheme-mode words not lowercased while non-grapheme words are.

In load_language_data, non-grapheme words are lowercased (line 111) but grapheme-mode words are not (line 109). This inconsistency could cause hash mismatches with webapp/app.py which also lowercases only non-grapheme words. Verify this is intentional.

Additionally, line 112 filters by character set using c in chars for c in w, but for grapheme-mode languages, the character set may contain combining marks that need grapheme-aware iteration to validate correctly.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/freeze_past_words.py` around lines 105 - 112, The load_language_data
block is inconsistent: when use_graphemes is true the words are not lowercased
and the character-set filter uses per-codepoint iteration, which can cause
mismatches with non-grapheme processing and incorrect validation for combining
marks; update the grapheme branch (the use_graphemes conditional that imports
grapheme and uses grapheme.length) to also normalize/lowercase each word
consistently with the non-grapheme branch (same casing behavior as
webapp/app.py) and change the post-filtering step to perform grapheme-aware
iteration when use_graphemes is true (use grapheme.graphemes(word) to check each
grapheme against chars) so both length-checking and character validation are
grapheme-aware and casing is consistent across branches.
scripts/add_language.py (1)

621-630: Frequency sort immediately undone by shuffle.

Words are sorted by frequency descending (line 622) then immediately shuffled (lines 624-626). The frequency sort has no effect on the final output — all frequency information is discarded.

If this is intentional (shuffle for deterministic daily word selection), consider removing the sort or adding a comment explaining why frequency ordering isn't preserved.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/add_language.py` around lines 621 - 630, The code sorts words by
frequency into sorted_words using all_words then immediately calls
rng.shuffle(sorted_words), which nullifies the frequency ordering; either remove
the frequency sort (delete the sorted(... key=...) line) if deterministic
shuffle is the intended behavior, or preserve frequency by removing the shuffle
and keeping the sorted_words order; alternatively, if you want to keep both,
replace the unconditional shuffle with a clear comment explaining why frequency
order is intentionally discarded (and reference the variables/function:
sorted_words, all_words, rng.shuffle) so future readers understand the decision.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@scripts/freeze_past_words.py`:
- Around line 42-67: The current functions _word_hash and _day_hash return hex
string digests causing lexicographic comparisons that diverge from
webapp/app.py; change both to return the same integer form used in the app:
compute hashlib.sha256(...).digest() and convert the first 8 bytes to an integer
via int.from_bytes(..., "big"); update get_daily_word_consistent_hash to build
candidates with these integer keys (same tuple shape (key, word)), sort by the
integer key and compare numeric values against the integer day hash so selection
matches production; keep function names _word_hash, _day_hash and
get_daily_word_consistent_hash unchanged.

In `@webapp/data/languages/ar/ar_curated_schedule.txt`:
- Line 28: The frozen Arabic schedule file
webapp/data/languages/ar/ar_curated_schedule.txt contains a duplicated daily
word "بقشيش" (appears at lines referenced as 28 and 30); update the
freeze/generation step to deduplicate entries before writing the schedule by
filtering out repeated tokens (e.g., using a Set or unique-by-value filter) so
the generator emits each word only once and then regenerate
ar_curated_schedule.txt to remove the duplicate "بقشيش".

In `@webapp/data/languages/ca/ca_curated_schedule.txt`:
- Line 20: The curated schedule contains duplicate entries ("pecar" and
"ànsia"); update the schedule-generation code to enforce uniqueness (e.g.,
filter/collect items into a Set before writing) so duplicate tokens are removed
before saving the curated list, and re-generate the Catalan curated schedule to
eliminate the repeated "pecar" and "ànsia" entries; ensure the dedup step runs
in the function that produces the curated output (the generator that writes the
curated schedule file).

In `@webapp/data/languages/gl/gl_curated_schedule.txt`:
- Line 9: The schedule file gl_curated_schedule.txt contains a duplicate entry
"trema" used twice (appearing for day 3 and day 35); replace one of the
occurrences of the token "trema" with an alternative curated word that does not
appear elsewhere in the file (or remove it) so every scheduled day has a unique
word, then run a quick grep/search for "trema" to confirm only one occurrence
remains.

In `@webapp/data/languages/hr/hr_curated_schedule.txt`:
- Line 53: Remove the profane entry "kurva" from hr_curated_schedule.txt and add
it to the Croatian profanity blocklist (or the global profanity_blocklist) so it
is filtered programmatically; specifically delete the "kurva" line in
hr_curated_schedule.txt and append "kurva" to the Croatian blocklist file (e.g.,
hr_profanity or profanity_blocklist) used by the scheduler/filtering logic to
ensure it is blocked at runtime.

In `@webapp/data/languages/hu/hu_curated_schedule.txt`:
- Line 11: The curated schedule contains duplicate entries ("össze" and "tömeg")
that must be removed during schedule generation; update the schedule generation
pipeline (e.g., the generateCuratedSchedule / scheduleGenerator function that
reads hu_curated_schedule.txt) to deduplicate entries per migration window by
normalizing whitespace/case and preserving the original order (first occurrence
wins), implement a helper like dedupeScheduleEntries to filter duplicates within
each window, and add/update tests to assert no repeated answers appear in the
same migration window.

In `@webapp/data/languages/ia/ia_curated_schedule.txt`:
- Around line 5-52: The curated schedule file contains duplicate entries "grano"
and "pacto" which will repeat in the 48-day cycle; open ia_curated_schedule.txt,
remove or replace the second occurrences of "grano" and "pacto" (the duplicates
shown in the diff) with unique words so the list contains no repeats, and ensure
the total list length and ordering still satisfy the 48-day schedule (or run the
existing dedupe/validation routine after editing to confirm uniqueness).

In `@webapp/data/languages/id/id_curated_schedule.txt`:
- Around line 27-32: The curated schedule file id_curated_schedule.txt contains
a duplicated entry ("hadap") (appears in the provided diff), so remove the
duplicate occurrences and ensure each daily answer is unique in this file;
additionally, add a deduplication/validation step to the generation or CI
pipeline that scans curated schedule files (e.g., id_curated_schedule.txt) and
fails or auto-fixes when duplicate tokens are detected (implement using a Set or
check-before-append in the generator and a unit/CI check that reads each
schedule and asserts uniqueness).

In `@webapp/data/languages/nb/nb_curated_schedule.txt`:
- Line 48: The curated schedule contains an English-only token "right" that
slipped into the Norwegian frozen schedule; remove the token from the frozen
artifact, then tighten the curation pipeline's contamination filter (update the
language-detection/validation step used by the schedule generator to reject
tokens classified as English-only or with low Norwegian confidence, and add a
unit/regression test) and regenerate the frozen schedules from the canonical
source data rather than editing the frozen file manually.

In `@webapp/data/languages/ne/ne_curated_schedule.txt`:
- Around line 5-52: The Nepali curated schedule file contains excessive
duplicate entries (e.g., "अनवसर", "एसओएस", "चलअचल", "सहगमन", "एकसदन", "दलबदल",
"अनवरत") which must be de-duplicated and the schedule regenerated from a larger
word pool; remove repeated tokens so each word appears only once in
ne_curated_schedule.txt, and implement or run deduplication logic in the
schedule-generation pipeline (ensure functions that build the schedule enforce
uniqueness and a minimum vocabulary target) and/or expand the source lexicon
before re-generating the file so the final schedule contains a diverse set of
unique Nepali words of the intended length.

In `@webapp/data/languages/pl/pl_curated_schedule.txt`:
- Around line 12-15: Remove the duplicate token "deseń" from the curated weekly
schedule by keeping only one occurrence and replacing the other with the
intended unique word for that day (or a different valid entry), ensuring each
day in the week is distinct; update the line containing the second "deseń" in
the schedule file so the duplicate is eliminated and commit the corrected list.

In `@webapp/data/languages/pt/pt_curated_schedule.txt`:
- Line 23: The Portuguese term "merda" (and other non-English profanities) is
present in the Portuguese curated schedule but not included in the global
profanity blocklist; update the blocklist used by the profanity filter
(scripts/profanity_blocklist.txt) to include "merda" and other language-specific
profanities referenced in webapp/data/languages/pt/pt_curated_schedule.txt so
they are excluded during daily word selection, and ensure the
profanity-loader/validator that reads the blocklist still accepts the expanded
entries (check the code that loads the blocklist to confirm no charset/trim
issues).

In `@webapp/data/languages/tr/tr_curated_schedule.txt`:
- Line 14: The frozen schedule contains a duplicated entry "burun" (appears at
lines 14 and 20 in tr_curated_schedule), so remove the duplicate occurrence and
update the schedule to contain only one "burun"; additionally, update the
schedule-generation/deduplication logic that produces tr_curated_schedule to
filter out repeated words (e.g., use a uniqueness check or set when assembling
daily answers) so future generations cannot emit the same token twice.

In `@webapp/data/languages/uk/uk_curated_schedule.txt`:
- Around line 5-53: The curated schedule contains excessive duplication of the
word "йдучи" (appears three times); replace the two extra occurrences of "йдучи"
with two unique Ukrainian words of similar length/frequency to restore variety,
ensure the full 48-entry list contains no duplicate entries, and run a simple
uniqueness check (e.g., set membership) on the list to prevent reintroducing
duplicates; target the lines where "йдучи" appears in the schedule for
replacement.

In `@webapp/data/languages/uz/SOURCES.md`:
- Around line 3-6: Update the "## kaikki.org (Wiktionary extract)" SOURCES.md
entry to include reproducibility and attribution metadata: add a snapshot date
or revision identifier (e.g., "Snapshot date: YYYY-MM-DD" or "Wiktionary
revision ID(s)"), the exact version or export method used (e.g., dump/API export
and parameters), and explicit attribution handling details for CC-BY-SA content
(e.g., required attribution text, link-back obligations, whether modifications
were made, and how share-alike will be satisfied). Keep these fields alongside
the existing URL/License/Description under the same heading so auditors can
trace the exact source and how attribution is applied.

In `@webapp/data/languages/yo/yo_curated_schedule.txt`:
- Around line 5-52: The curated Yoruba schedule contains duplicate entries
("alase" and "bẹẹrẹ") which will repeat in the 48-day cycle; open the
yo_curated_schedule.txt list, remove or replace the second occurrences of
"alase" and "bẹẹrẹ" with unique Yoruba words so that the file contains 48
distinct words (no duplicates), and verify there are no other repeated tokens in
the list before committing.

---

Outside diff comments:
In `@webapp/app.py`:
- Around line 180-183: The division n_in_order / len(_5words) can raise
ZeroDivisionError when _5words is empty; before computing the ratio or
shuffling, add a guard that checks if len(_5words) == 0 (or not _5words) and
handle it (e.g., skip the check/shuffle, log an error/warning with context
including lang, or return/continue from the enclosing function) so the block
around the n_in_order calculation and random.shuffle(_5words) never divides by
zero.

---

Duplicate comments:
In `@scripts/improve_word_lists.py`:
- Around line 317-328: load_hunspell_words currently filters by codepoint length
and w.isalpha(), which drops valid Hindi words with combining marks; update
load_hunspell_words to count grapheme clusters instead of codepoints (so
accented/combining characters count as one) by using a grapheme-aware splitter
(e.g., the third-party regex module with regex.findall(r'\X', w)) and require
that the grapheme sequence length == 5; additionally replace w.isalpha() with a
check that the graphemes contain letters (e.g., test that at least one base
character matches Unicode letter properties like \p{L} or use char.isalpha() on
base graphemes) so Hindi words with combining marks are accepted while
preserving alphabetic-only filtering.

In `@webapp/data/languages/ms/ms_daily_words.txt`:
- Line 387: The Malay daily-word list contains English contraction tokens
("didnt", "doesn", "thats", "youre"); remove these tokens from the list and
re-run the generation pipeline with contamination filtering enabled end-to-end
(enable the language-contamination filter / language-detection step in the
generator) so English fragments are excluded automatically; verify the
regenerated output no longer contains the listed tokens and add a regression
check to the pipeline to catch English tokens in Malay lists.

In `@webapp/data/languages/tl/tl_daily_words.txt`:
- Line 543: The Tagalog daily-word generation pipeline is not filtering out
contamination tokens like "gmail", "https", and "north"; update the pipeline
(e.g., in the generateDailyWords()/buildDailyPool() flow or the token
normalization/filterTokens() step) to systematically exclude these by adding a
contamination stoplist and URL/email pattern checks: add exact-match exclusions
for known bad tokens ("gmail","north") and a regex filter for URL/email tokens
(e.g., patterns matching ^https?:// and email/domain tokens), apply the filters
before finalizing the daily pool (e.g., in filterContaminants()/finalizePool()),
and run the generator to regenerate the Tagalog daily list so removals are
reproducible by the pipeline.

In `@webapp/data/languages/yo/SOURCES.md`:
- Around line 1-6: The SOURCES.md for "Yoruba Language Data — Sources" is
missing full provenance; update this file to include extraction_date, extractor
identity/version, exact URL(s) used with fetch timestamps, data
processing/normalization steps (tokenization, filtering, encoding changes),
mapping table that links each asset file name to the original Wiktionary entry
identifiers or URLs, dataset version or commit hash and checksum(s) for
generated files, and contact/license attribution details so the dataset can be
reproduced; reference the top-level header "Yoruba Language Data — Sources" and
the existing "kaikki.org (Wiktionary extract)" entry when adding these fields.

---

Nitpick comments:
In `@scripts/add_language.py`:
- Around line 621-630: The code sorts words by frequency into sorted_words using
all_words then immediately calls rng.shuffle(sorted_words), which nullifies the
frequency ordering; either remove the frequency sort (delete the sorted(...
key=...) line) if deterministic shuffle is the intended behavior, or preserve
frequency by removing the shuffle and keeping the sorted_words order;
alternatively, if you want to keep both, replace the unconditional shuffle with
a clear comment explaining why frequency order is intentionally discarded (and
reference the variables/function: sorted_words, all_words, rng.shuffle) so
future readers understand the decision.

In `@scripts/freeze_past_words.py`:
- Around line 250-253: The code that builds langs uses f.split("/")[-1], which
is Unix-specific; update the comprehension that sets langs to use Path(f).name
for cross-platform path handling (replace f.split("/")[-1] with Path(f).name)
and add/import Path from pathlib if not already imported so LANGUAGES_DIR, the
glob.glob results, and the langs variable work correctly on Windows and POSIX.
- Around line 105-112: The load_language_data block is inconsistent: when
use_graphemes is true the words are not lowercased and the character-set filter
uses per-codepoint iteration, which can cause mismatches with non-grapheme
processing and incorrect validation for combining marks; update the grapheme
branch (the use_graphemes conditional that imports grapheme and uses
grapheme.length) to also normalize/lowercase each word consistently with the
non-grapheme branch (same casing behavior as webapp/app.py) and change the
post-filtering step to perform grapheme-aware iteration when use_graphemes is
true (use grapheme.graphemes(word) to check each grapheme against chars) so both
length-checking and character validation are grapheme-aware and casing is
consistent across branches.

In `@webapp/data/languages/ie/ie_curated_schedule.txt`:
- Around line 1-4: Add a daily_words_hash header entry to this file to match
other curated schedules: create a `daily_words_hash: <hash>` line in the header
above or alongside `word_list_hash` so the file includes `daily_words_hash`,
`word_list_hash` and `days` metadata (see other language files like pt/ru/uk for
the exact placement), ensuring the hash value is computed from the same frozen
daily words source used for the `word_list_hash` (so MIGRATION_DAY_IDX and list
generation remain consistent).

In `@webapp/data/languages/nds/nds_curated_schedule.txt`:
- Around line 1-4: Add a CI/script integrity check that parses curated schedule
files like nds_curated_schedule.txt and validates that the header metadata
matches the content: verify the numeric "days:" value equals the actual number
of entries below the header and that the "word_list_hash" matches a computed
hash of the file body; if mismatched, fail the job and require regeneration.
Implement this check as a reusable script (e.g.,
scripts/verify_curated_schedule) invoked by CI for the directory, and ensure it
returns non-zero on mismatch or any file modification outside of regeneration so
the file is treated as immutable unless the regeneration tool updates it.

In `@webapp/data/languages/uz/uz_curated_schedule.txt`:
- Around line 5-48: The curated Uzbek schedule file contains duplicate entries
(e.g., "kabob", "diniy", "uchun") causing repeated daily answers; fix by
deduplicating the source list before generating the 48-day rotation: update the
schedule generation path (e.g., generateCuratedSchedule or
buildScheduleFromCuratedList) to filter the input word list for uniqueness while
preserving first-occurrence order (or dedupe the parsed contents of
uz_curated_schedule.txt) so the produced schedule contains only unique daily
words.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 538e3b41-57e7-40d5-8ebb-e2ae14581bd8

📥 Commits

Reviewing files that changed from the base of the PR and between a68ac2a and 887542a.

📒 Files selected for processing (87)
  • scripts/add_language.py
  • scripts/freeze_past_words.py
  • scripts/improve_word_lists.py
  • scripts/profanity_blocklist.txt
  • tests/test_word_lists.py
  • webapp/app.py
  • webapp/data/languages/ar/ar_curated_schedule.txt
  • webapp/data/languages/az/az_curated_schedule.txt
  • webapp/data/languages/bg/bg_curated_schedule.txt
  • webapp/data/languages/bn/bn_curated_schedule.txt
  • webapp/data/languages/br/br_curated_schedule.txt
  • webapp/data/languages/ca/ca_curated_schedule.txt
  • webapp/data/languages/ckb/ckb_curated_schedule.txt
  • webapp/data/languages/cs/cs_curated_schedule.txt
  • webapp/data/languages/da/da_curated_schedule.txt
  • webapp/data/languages/de/de_curated_schedule.txt
  • webapp/data/languages/el/el_curated_schedule.txt
  • webapp/data/languages/en/en_curated_schedule.txt
  • webapp/data/languages/eo/eo_curated_schedule.txt
  • webapp/data/languages/es/es_curated_schedule.txt
  • webapp/data/languages/et/et_curated_schedule.txt
  • webapp/data/languages/eu/eu_curated_schedule.txt
  • webapp/data/languages/fa/fa_curated_schedule.txt
  • webapp/data/languages/fi/fi_curated_schedule.txt
  • webapp/data/languages/fo/fo_curated_schedule.txt
  • webapp/data/languages/fr/fr_curated_schedule.txt
  • webapp/data/languages/fur/fur_curated_schedule.txt
  • webapp/data/languages/fy/fy_curated_schedule.txt
  • webapp/data/languages/ga/ga_curated_schedule.txt
  • webapp/data/languages/gd/gd_curated_schedule.txt
  • webapp/data/languages/gl/gl_curated_schedule.txt
  • webapp/data/languages/he/he_curated_schedule.txt
  • webapp/data/languages/hi/hi_curated_schedule.txt
  • webapp/data/languages/hr/hr_curated_schedule.txt
  • webapp/data/languages/hu/hu_curated_schedule.txt
  • webapp/data/languages/hy/hy_curated_schedule.txt
  • webapp/data/languages/hyw/hyw_curated_schedule.txt
  • webapp/data/languages/ia/ia_curated_schedule.txt
  • webapp/data/languages/id/id_curated_schedule.txt
  • webapp/data/languages/id/id_daily_words.txt
  • webapp/data/languages/ie/ie_curated_schedule.txt
  • webapp/data/languages/is/is_curated_schedule.txt
  • webapp/data/languages/it/it_curated_schedule.txt
  • webapp/data/languages/ka/ka_curated_schedule.txt
  • webapp/data/languages/ko/ko_curated_schedule.txt
  • webapp/data/languages/la/la_curated_schedule.txt
  • webapp/data/languages/lb/lb_curated_schedule.txt
  • webapp/data/languages/lt/lt_curated_schedule.txt
  • webapp/data/languages/ltg/ltg_curated_schedule.txt
  • webapp/data/languages/lv/lv_curated_schedule.txt
  • webapp/data/languages/mi/mi_curated_schedule.txt
  • webapp/data/languages/mk/mk_curated_schedule.txt
  • webapp/data/languages/mn/mn_curated_schedule.txt
  • webapp/data/languages/mr/mr_curated_schedule.txt
  • webapp/data/languages/ms/ms_curated_schedule.txt
  • webapp/data/languages/ms/ms_daily_words.txt
  • webapp/data/languages/nb/nb_curated_schedule.txt
  • webapp/data/languages/nds/nds_curated_schedule.txt
  • webapp/data/languages/ne/ne_curated_schedule.txt
  • webapp/data/languages/nl/nl_curated_schedule.txt
  • webapp/data/languages/nn/nn_curated_schedule.txt
  • webapp/data/languages/oc/oc_curated_schedule.txt
  • webapp/data/languages/pau/pau_curated_schedule.txt
  • webapp/data/languages/pl/pl_curated_schedule.txt
  • webapp/data/languages/pt/pt_curated_schedule.txt
  • webapp/data/languages/qya/qya_curated_schedule.txt
  • webapp/data/languages/ro/ro_curated_schedule.txt
  • webapp/data/languages/ru/ru_curated_schedule.txt
  • webapp/data/languages/rw/rw_curated_schedule.txt
  • webapp/data/languages/sk/sk_curated_schedule.txt
  • webapp/data/languages/sl/sl_curated_schedule.txt
  • webapp/data/languages/sq/sq_curated_schedule.txt
  • webapp/data/languages/sq/sq_daily_words.txt
  • webapp/data/languages/sr/sr_curated_schedule.txt
  • webapp/data/languages/sv/sv_curated_schedule.txt
  • webapp/data/languages/tk/tk_curated_schedule.txt
  • webapp/data/languages/tl/tl_curated_schedule.txt
  • webapp/data/languages/tl/tl_daily_words.txt
  • webapp/data/languages/tlh/tlh_curated_schedule.txt
  • webapp/data/languages/tr/tr_curated_schedule.txt
  • webapp/data/languages/uk/uk_curated_schedule.txt
  • webapp/data/languages/ur/ur_curated_schedule.txt
  • webapp/data/languages/uz/SOURCES.md
  • webapp/data/languages/uz/uz_curated_schedule.txt
  • webapp/data/languages/vi/vi_curated_schedule.txt
  • webapp/data/languages/yo/SOURCES.md
  • webapp/data/languages/yo/yo_curated_schedule.txt
✅ Files skipped from review due to trivial changes (40)
  • webapp/data/languages/fa/fa_curated_schedule.txt
  • webapp/data/languages/hyw/hyw_curated_schedule.txt
  • webapp/data/languages/cs/cs_curated_schedule.txt
  • webapp/data/languages/da/da_curated_schedule.txt
  • webapp/data/languages/en/en_curated_schedule.txt
  • webapp/data/languages/ltg/ltg_curated_schedule.txt
  • webapp/data/languages/sv/sv_curated_schedule.txt
  • webapp/data/languages/nn/nn_curated_schedule.txt
  • webapp/data/languages/bn/bn_curated_schedule.txt
  • webapp/data/languages/ko/ko_curated_schedule.txt
  • webapp/data/languages/he/he_curated_schedule.txt
  • webapp/data/languages/br/br_curated_schedule.txt
  • webapp/data/languages/lb/lb_curated_schedule.txt
  • webapp/data/languages/mr/mr_curated_schedule.txt
  • webapp/data/languages/it/it_curated_schedule.txt
  • webapp/data/languages/eu/eu_curated_schedule.txt
  • webapp/data/languages/tk/tk_curated_schedule.txt
  • webapp/data/languages/fr/fr_curated_schedule.txt
  • webapp/data/languages/sq/sq_curated_schedule.txt
  • webapp/data/languages/fy/fy_curated_schedule.txt
  • webapp/data/languages/sk/sk_curated_schedule.txt
  • webapp/data/languages/vi/vi_curated_schedule.txt
  • webapp/data/languages/ur/ur_curated_schedule.txt
  • webapp/data/languages/mn/mn_curated_schedule.txt
  • webapp/data/languages/gd/gd_curated_schedule.txt
  • webapp/data/languages/fo/fo_curated_schedule.txt
  • webapp/data/languages/lv/lv_curated_schedule.txt
  • webapp/data/languages/mk/mk_curated_schedule.txt
  • webapp/data/languages/et/et_curated_schedule.txt
  • webapp/data/languages/rw/rw_curated_schedule.txt
  • webapp/data/languages/la/la_curated_schedule.txt
  • webapp/data/languages/oc/oc_curated_schedule.txt
  • webapp/data/languages/pau/pau_curated_schedule.txt
  • webapp/data/languages/es/es_curated_schedule.txt
  • webapp/data/languages/ga/ga_curated_schedule.txt
  • webapp/data/languages/az/az_curated_schedule.txt
  • webapp/data/languages/tlh/tlh_curated_schedule.txt
  • webapp/data/languages/sr/sr_curated_schedule.txt
  • webapp/data/languages/nl/nl_curated_schedule.txt
  • webapp/data/languages/ka/ka_curated_schedule.txt
🚧 Files skipped from review as they are similar to previous changes (2)
  • webapp/data/languages/sq/sq_daily_words.txt
  • webapp/data/languages/id/id_daily_words.txt

Comment on lines +42 to +67
def _word_hash(word, lang_code):
"""Hash a word for consistent hashing (must match webapp/app.py)."""
key = f"{lang_code}:{word}"
return hashlib.sha256(key.encode()).hexdigest()


def _day_hash(day_idx, lang_code):
"""Hash a day index for consistent hashing (must match webapp/app.py)."""
key = f"{lang_code}:day:{day_idx}"
return hashlib.sha256(key.encode()).hexdigest()


def get_daily_word_consistent_hash(words, blocklist, day_idx, lang_code):
"""Consistent hashing word selection (must match webapp/app.py)."""
day_h = _day_hash(day_idx, lang_code)
candidates = []
for word in words:
if word not in blocklist:
candidates.append((_word_hash(word, lang_code), word))
if not candidates:
return words[0] if words else ""
candidates.sort(key=lambda x: x[0])
for word_h, word in candidates:
if word_h >= day_h:
return word
return candidates[0][1]
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Hash comparison type mismatch with webapp/app.py — will produce different word selections.

This script uses hashlib.sha256(...).hexdigest() (string) for hash comparisons, but webapp/app.py uses int.from_bytes(h[:8], "big") (integer). String comparison of hex digests produces lexicographic ordering while integer comparison produces numeric ordering — these yield different results.

This will cause freeze_language() to compute different words than the production app serves, breaking the historical word preservation guarantee.

🐛 Proposed fix to align with webapp/app.py
 def _word_hash(word, lang_code):
     """Hash a word for consistent hashing (must match webapp/app.py)."""
     key = f"{lang_code}:{word}"
-    return hashlib.sha256(key.encode()).hexdigest()
+    h = hashlib.sha256(key.encode()).digest()
+    return int.from_bytes(h[:8], "big")


 def _day_hash(day_idx, lang_code):
     """Hash a day index for consistent hashing (must match webapp/app.py)."""
     key = f"{lang_code}:day:{day_idx}"
-    return hashlib.sha256(key.encode()).hexdigest()
+    h = hashlib.sha256(key.encode()).digest()
+    return int.from_bytes(h[:8], "big")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def _word_hash(word, lang_code):
"""Hash a word for consistent hashing (must match webapp/app.py)."""
key = f"{lang_code}:{word}"
return hashlib.sha256(key.encode()).hexdigest()
def _day_hash(day_idx, lang_code):
"""Hash a day index for consistent hashing (must match webapp/app.py)."""
key = f"{lang_code}:day:{day_idx}"
return hashlib.sha256(key.encode()).hexdigest()
def get_daily_word_consistent_hash(words, blocklist, day_idx, lang_code):
"""Consistent hashing word selection (must match webapp/app.py)."""
day_h = _day_hash(day_idx, lang_code)
candidates = []
for word in words:
if word not in blocklist:
candidates.append((_word_hash(word, lang_code), word))
if not candidates:
return words[0] if words else ""
candidates.sort(key=lambda x: x[0])
for word_h, word in candidates:
if word_h >= day_h:
return word
return candidates[0][1]
def _word_hash(word, lang_code):
"""Hash a word for consistent hashing (must match webapp/app.py)."""
key = f"{lang_code}:{word}"
h = hashlib.sha256(key.encode()).digest()
return int.from_bytes(h[:8], "big")
def _day_hash(day_idx, lang_code):
"""Hash a day index for consistent hashing (must match webapp/app.py)."""
key = f"{lang_code}:day:{day_idx}"
h = hashlib.sha256(key.encode()).digest()
return int.from_bytes(h[:8], "big")
def get_daily_word_consistent_hash(words, blocklist, day_idx, lang_code):
"""Consistent hashing word selection (must match webapp/app.py)."""
day_h = _day_hash(day_idx, lang_code)
candidates = []
for word in words:
if word not in blocklist:
candidates.append((_word_hash(word, lang_code), word))
if not candidates:
return words[0] if words else ""
candidates.sort(key=lambda x: x[0])
for word_h, word in candidates:
if word_h >= day_h:
return word
return candidates[0][1]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/freeze_past_words.py` around lines 42 - 67, The current functions
_word_hash and _day_hash return hex string digests causing lexicographic
comparisons that diverge from webapp/app.py; change both to return the same
integer form used in the app: compute hashlib.sha256(...).digest() and convert
the first 8 bytes to an integer via int.from_bytes(..., "big"); update
get_daily_word_consistent_hash to build candidates with these integer keys (same
tuple shape (key, word)), sort by the integer key and compare numeric values
against the integer day hash so selection matches production; keep function
names _word_hash, _day_hash and get_daily_word_consistent_hash unchanged.

تقاطع
واجبه
حواجز
بقشيش
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Frozen Arabic schedule has a duplicate daily word.

بقشيش appears twice (Line 28 and Line 30). Please deduplicate in the freeze/generation step.

Also applies to: 30-30

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/ar/ar_curated_schedule.txt` at line 28, The frozen
Arabic schedule file webapp/data/languages/ar/ar_curated_schedule.txt contains a
duplicated daily word "بقشيش" (appears at lines referenced as 28 and 30); update
the freeze/generation step to deduplicate entries before writing the schedule by
filtering out repeated tokens (e.g., using a Set or unique-by-value filter) so
the generator emits each word only once and then regenerate
ar_curated_schedule.txt to remove the duplicate "بقشيش".

fotin
pixar
senta
pecar
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Catalan curated schedule contains duplicate entries.

pecar repeats (Line 20, Line 26) and ànsia repeats (Line 22, Line 48). Please enforce uniqueness when generating curated schedules.

Also applies to: 22-22, 26-26, 48-48

🧰 Tools
🪛 LanguageTool

[grammar] ~20-~20: Error de concordança.
Context: ...imm vejam obria fotin pixar senta pecar sever ànsia ganga revés vinil pecar tenda mango neb...

(CONCORDANCES_ADJ_NOM)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/ca/ca_curated_schedule.txt` at line 20, The curated
schedule contains duplicate entries ("pecar" and "ànsia"); update the
schedule-generation code to enforce uniqueness (e.g., filter/collect items into
a Set before writing) so duplicate tokens are removed before saving the curated
list, and re-generate the Catalan curated schedule to eliminate the repeated
"pecar" and "ànsia" entries; ensure the dedup step runs in the function that
produces the curated output (the generator that writes the curated schedule
file).

cobre
torta
trema
credo
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify duplicates in gl_curated_schedule.txt
echo "=== Checking for duplicates in Galician schedule ==="
grep -v '^#' webapp/data/languages/gl/gl_curated_schedule.txt | sort | uniq -d

Repository: Hugo0/wordle

Length of output: 114


🏁 Script executed:

cat -n webapp/data/languages/gl/gl_curated_schedule.txt

Repository: Hugo0/wordle

Length of output: 893


Duplicate word "trema" appears on lines 8 and 40.

"trema" appears twice in the schedule—on line 8 (day 3) and line 40 (day 35). Players will see the same word on two different days, which degrades the game experience.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/gl/gl_curated_schedule.txt` at line 9, The schedule
file gl_curated_schedule.txt contains a duplicate entry "trema" used twice
(appearing for day 3 and day 35); replace one of the occurrences of the token
"trema" with an alternative curated word that does not appear elsewhere in the
file (or remove it) so every scheduled day has a unique word, then run a quick
grep/search for "trema" to confirm only one occurrence remains.

nizak
triom
aneks
kurva
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Profane word "kurva" in curated daily schedule.

"kurva" is a profane word (Croatian for a vulgar term). This should be filtered from the daily word schedule to avoid offending players.

Consider adding it to the Croatian blocklist or the global profanity blocklist.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/hr/hr_curated_schedule.txt` at line 53, Remove the
profane entry "kurva" from hr_curated_schedule.txt and add it to the Croatian
profanity blocklist (or the global profanity_blocklist) so it is filtered
programmatically; specifically delete the "kurva" line in
hr_curated_schedule.txt and append "kurva" to the Croatian blocklist file (e.g.,
hr_profanity or profanity_blocklist) used by the scheduler/filtering logic to
ensure it is blocked at runtime.

Comment thread webapp/data/languages/pt/pt_word_history.txt
papel
marka
pines
burun
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Duplicate word appears in frozen schedule.

burun is present on both Line 14 and Line 20. Please dedupe the generated schedule to avoid repeated daily answers.

Also applies to: 20-20

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/tr/tr_curated_schedule.txt` at line 14, The frozen
schedule contains a duplicated entry "burun" (appears at lines 14 and 20 in
tr_curated_schedule), so remove the duplicate occurrence and update the schedule
to contain only one "burun"; additionally, update the
schedule-generation/deduplication logic that produces tr_curated_schedule to
filter out repeated words (e.g., use a uniqueness check or set when assembling
daily answers) so future generations cannot emit the same token twice.

Comment on lines +5 to +53
# days: 48 (MIGRATION_DAY_IDX+1 through today)
удова
взяти
обмір
мілль
викид
рибно
благо
декан
спуск
обряд
герой
траса
розум
ремзі
сідні
тьотя
захід
кожен
тромб
сокол
чехун
царюк
сцена
корея
дечим
бакал
лазор
дотла
йдучи
ерзац
рубці
йдучи
криса
натан
сукня
йдучи
пекти
бейбі
молод
індія
томмі
пасок
житло
міцно
суміш
темне
гусій
екран
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Flag excessive word duplication in the curated schedule.

The word "йдучи" appears 3 times in the 48-day schedule (lines 34, 37, 41), with occurrences very close together. This level of repetition significantly reduces word variety and may frustrate players.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~33-~33: Не узгоджено дієслово з іменником: "йдучи" (вимагає: орудний, інфінітив, давальний) і "ерзац" (ч.р.: називний, знахідний)
Context: ...рюк сцена корея дечим бакал лазор дотла йдучи ерзац рубці йдучи криса натан сукня йдучи пек...

(UK_VERB_NOUN_INFLECTION_AGREEMENT)


[uncategorized] ~37-~37: «криса» - помилкове слово, виправлення: пацюк.
Context: ...кал лазор дотла йдучи ерзац рубці йдучи криса натан сукня йдучи пекти бейбі молод інд...

(UK_SIMPLE_REPLACE)


[uncategorized] ~50-~50: Потенційна помилка: прикметник не узгоджений з іменником: "темне": [с.р.: називний, знахідний] і "гусій": [ч.р.: називний]
Context: ...лод індія томмі пасок житло міцно суміш темне гусій екран

(UK_ADJ_NOUN_INFLECTION_AGREEMENT)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/uk/uk_curated_schedule.txt` around lines 5 - 53, The
curated schedule contains excessive duplication of the word "йдучи" (appears
three times); replace the two extra occurrences of "йдучи" with two unique
Ukrainian words of similar length/frequency to restore variety, ensure the full
48-entry list contains no duplicate entries, and run a simple uniqueness check
(e.g., set membership) on the list to prevent reintroducing duplicates; target
the lines where "йдучи" appears in the schedule for replacement.

Comment on lines +3 to +6
## kaikki.org (Wiktionary extract)
- URL: https://kaikki.org/dictionary/Uzbek/
- License: CC-BY-SA 3.0 (Wiktionary content)
- Description: Word list extracted from English Wiktionary's Uzbek entries
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Source provenance is still not audit-complete for attribution compliance.

This entry lacks reproducibility metadata (snapshot date/version/revision) and explicit attribution handling details required for CC-BY-SA style content. Add those fields so licensing audits are defensible.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/uz/SOURCES.md` around lines 3 - 6, Update the "##
kaikki.org (Wiktionary extract)" SOURCES.md entry to include reproducibility and
attribution metadata: add a snapshot date or revision identifier (e.g.,
"Snapshot date: YYYY-MM-DD" or "Wiktionary revision ID(s)"), the exact version
or export method used (e.g., dump/API export and parameters), and explicit
attribution handling details for CC-BY-SA content (e.g., required attribution
text, link-back obligations, whether modifications were made, and how
share-alike will be satisfied). Keep these fields alongside the existing
URL/License/Description under the same heading so auditors can trace the exact
source and how attribution is applied.

Comment on lines +5 to +52
atọtọ
alase
dinku
disai
otupa
bẹẹrẹ
anago
iloro
ihoho
ọlọwọ
alase
ajẹlẹ
orupo
upepe
ẹgbaa
sufee
oibaa
ọkuta
joṣua
maapu
ọmọwu
oṣelu
ọjẹlu
ajola
ijaye
wọnwe
olori
eekan
agira
ẹẹrin
atupa
yinnu
ajayi
ekura
yangi
ikebe
ewuro
agẹmọ
ipade
nikan
ọyẹyẹ
ọghọn
ikede
aighọ
ariwa
bẹẹrẹ
ọmama
riran
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Flag duplicate words in the curated schedule.

The word list contains duplicates that will repeat within the 48-day cycle:

  • "alase" appears at lines 6 and 15
  • "bẹẹrẹ" appears at lines 10 and 50

Similar to the Interlingua schedule, these duplicates reduce word variety for players.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/yo/yo_curated_schedule.txt` around lines 5 - 52, The
curated Yoruba schedule contains duplicate entries ("alase" and "bẹẹrẹ") which
will repeat in the 48-day cycle; open the yo_curated_schedule.txt list, remove
or replace the second occurrences of "alase" and "bẹẹrẹ" with unique Yoruba
words so that the file contains 48 distinct words (no duplicates), and verify
there are no other repeated tokens in the list before committing.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 19

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
webapp/data/languages/eu/eu_daily_words.txt (1)

1-2000: ⚠️ Potential issue | 🔴 Critical

Fix character encoding for 10 words containing ñ — all are currently 6 characters instead of 5.

The following words use a combining character (n + accent mark) instead of the precomposed ñ character (U+00F1), breaking the 5-letter constraint:

  • Line 97: aloña
  • Line 110: amañi
  • Line 114: amiñi
  • Line 213: azaña
  • Line 910: iñigo
  • Line 1053: koñak
  • Line 1319: muñoz
  • Line 1510: piñoi
  • Line 1625: señor
  • Line 2000: ñikad

Replace each with the precomposed ñ character to ensure all words are exactly 5 letters and pass game validation.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/eu/eu_daily_words.txt` around lines 1 - 2000, Replace
the five words that currently use a decomposed "n" + combining tilde with the
precomposed ñ (U+00F1) so each word is exactly 5 characters: change "aloña",
"amañi", "amiñi", "azaña", "iñigo", "koñak", "muñoz", "piñoi", "señor", and
"ñikad" to use the single-character ñ (U+00F1) instead of an "n" followed by a
combining accent; search for those exact token strings in the eu_daily_words.txt
content and update their encoding to the precomposed character so they validate
as 5-letter words.
scripts/improve_word_lists.py (1)

765-801: ⚠️ Potential issue | 🟠 Major

Supplement generation bypasses profanity filtering.

The profanity filter added for daily candidates is not applied when building supplement_sorted. This allows offensive words to remain accepted guesses (already visible in changed supplement data).

Suggested fix
     all_supplement = set(existing_supplement) | new_supplement
     # Remove any that are in the main list (safety)
     all_supplement -= existing_word_set
+    # Apply safety filters to supplement as well
+    all_supplement = {
+        w for w in all_supplement if w not in blocklist and w not in profanity
+    }
@@
         for w in wf_words:
             if w in existing_word_set:
                 continue
             if w in all_supplement:
                 continue
+            if w in blocklist or w in profanity:
+                continue
             if w in common_names:
                 continue
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/improve_word_lists.py` around lines 765 - 801, The
supplement-generation path is not applying the profanity filter, so offensive
words slip into all_supplement/supplement_sorted; update the code to call the
same profanity check used for daily candidates whenever building supplements:
(1) when creating new_supplement (the set comprehension using is_valid_word),
exclude profane words; (2) inside the wf_words loop before adding to wf_new skip
words flagged by the profanity predicate; and (3) as a final safety step, run
the profanity filter over all_supplement (the union of existing_supplement and
new additions) and remove any profane entries before producing
supplement_sorted. Use the existing profanity function/s (the same predicate
used for daily candidates) to ensure consistent behavior.
♻️ Duplicate comments (2)
scripts/improve_word_lists.py (1)

338-352: ⚠️ Potential issue | 🟠 Major

Grapheme-mode dictionary loaders still drop valid words due isalpha()/codepoint checks.

Line 350, Line 369, and Line 385 rely on isalpha() (and Line 369/Line 385 also rely on len(w) == 5). This still rejects many valid combining-mark words and under-builds native_dict, which can cause false English-contamination removals later.

Suggested fix
+import unicodedata
+import grapheme
+
+def _is_letters_or_marks(word: str) -> bool:
+    return bool(word) and all(unicodedata.category(ch)[0] in {"L", "M"} for ch in word)
+
 def _load_word_file(path: Path) -> set[str]:
@@
-        if w and w.isalpha():
+        if _is_letters_or_marks(w):
             words.add(w)
@@
 def load_hunspell_words(lang: str) -> set[str]:
@@
-        if len(w) == 5 and w.isalpha():
+        if grapheme.length(w) == 5 and _is_letters_or_marks(w):
             words.add(w)
@@
 def load_leipzig_words(lang: str) -> set[str]:
@@
-                if len(w) == 5 and w.isalpha():
+                if grapheme.length(w) == 5 and _is_letters_or_marks(w):
                     words.add(w)

Run this verification to confirm current filters are dropping combining-mark words from grapheme-mode languages:

#!/bin/bash
python - <<'PY'
from pathlib import Path
import unicodedata

def has_mark(s: str) -> bool:
    return any(unicodedata.category(ch).startswith("M") for ch in s)

def load_words(path: Path):
    if not path.exists():
        return []
    out = []
    for line in path.read_text(encoding="utf-8", errors="ignore").splitlines():
        w = line.strip().split("\t")[-1].split("/")[0].strip().lower()
        if w:
            out.append(w)
    return out

targets = [
    Path("scripts/.freq_data/kaikki/hi_words.txt"),
    Path("scripts/.freq_data/kaikki/bn_words.txt"),
    Path("scripts/.freq_data/kaikki/mr_words.txt"),
    Path("scripts/.freq_data/hunspell/hi.dic"),
    Path("scripts/.freq_data/leipzig/hi"),
]

for p in targets:
    if p.is_dir():
        words = []
        for f in p.glob("*-words.txt"):
            words.extend(load_words(f))
        label = str(p)
    else:
        words = load_words(p)
        label = str(p)

    if not words:
        print(f"{label}: no data")
        continue

    with_marks = [w for w in words if has_mark(w)]
    dropped_by_isalpha = [w for w in with_marks if not w.isalpha()]
    dropped_by_len5 = [w for w in words if len(w) != 5]

    print(f"\n{label}")
    print(f"  total={len(words)} with_marks={len(with_marks)}")
    print(f"  mark_words_failing_isalpha={len(dropped_by_isalpha)} sample={dropped_by_isalpha[:8]}")
    print(f"  words_failing_len_eq_5={len(dropped_by_len5)} sample={dropped_by_len5[:8]}")
PY

Also applies to: 360-371, 374-387

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/improve_word_lists.py` around lines 338 - 352, The current character
checks (in _load_word_file and the other word-loading functions that use
w.isalpha() and len(w) == 5) reject valid words containing Unicode combining
marks; replace those filters with Unicode-category checks that accept letters
and combining marks (e.g., require every character's unicodedata.category to
start with "L" or "M" instead of w.isalpha()), and replace byte/codepoint length
checks (len(w) == 5) with a grapheme-cluster-aware length test (use the
third-party regex module's \X or the grapheme package to count grapheme
clusters) so grapheme-mode languages (Hindi/Bengali/Marathi) are preserved.
Ensure to import unicodedata and add a short helper like is_letter_or_mark(w:
str) and a grapheme_count(w: str) used by the loaders (_load_word_file and the
other functions that currently rely on isalpha()/len==5).
scripts/download_sources.py (1)

367-368: ⚠️ Potential issue | 🟠 Major

Kaikki extraction is still code-point based, so grapheme-mode words get dropped.

The runtime side of this PR adds grapheme-aware handling, but these filters still use code-point len() plus isalpha()/lower(). Valid combining-mark entries are filtered out before they ever reach .freq_data/kaikki.

#!/bin/bash
set -euo pipefail

python - <<'PY'
import unicodedata

samples = ["अपलाभिया", "तक्षशिला", "স্পাইগিরি"]
for word in samples:
    print(
        word,
        "len=", len(word),
        "isalpha=", word.isalpha(),
        "categories=", [unicodedata.category(ch) for ch in word],
    )
PY

rg -n 'len\(w\) == 5|len\(word\) == 5|w\.isalpha\(\)|word\.isalpha\(\)|w == w\.lower\(\)|word == word\.lower\(\)' scripts/download_sources.py

Also applies to: 386-386, 417-418, 441-443

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/download_sources.py` around lines 367 - 368, The extraction filters
use code-point checks (len/isalpha/lower) so grapheme clusters are dropped;
replace those with grapheme-aware checks using the regex module: for each
candidate (the expression building words), require the string matches a
grapheme-count pattern like r'^(?:\X){5}$' to enforce exactly five graphemes,
require it matches r'^[\p{L}\p{M}]+$' to allow base letters plus combining marks
(not raw code-point isalpha), and keep the case check using casefold (w ==
w.casefold()) instead of w == w.lower(); update the occurrences where words is
built (the sorted(...) comprehension) and the other similar spots mentioned
(around the other three occurrences) to use these regex-based predicates and
import the regex module.
🧹 Nitpick comments (5)
webapp/data/languages/et/et_daily_words.txt (1)

4-1974: Add an automated lexicon QA check in CI for this file.

Given the size of this update, it would help to enforce: uniqueness, exact length policy (letter/grapheme per language mode), Unicode normalization (NFC), and blocked-word screening in a pre-commit/CI validator to prevent silent data regressions.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/et/et_daily_words.txt` around lines 4 - 1974, Add a
CI/pre-commit lexicon validator (e.g. validate_lexicon / validateLexicon job)
that runs on changes to et_daily_words.txt and enforces: 1) uniqueness (fail if
duplicate entries), 2) exact-length policy using grapheme/cluser counts per
language mode (reject entries that are not the expected grapheme length), 3)
Unicode NFC normalization (normalize input and fail if not NFC), and 4)
blocked-word screening against a curated denylist; the job should print clear
diagnostics and exit non-zero on any violation so PRs cannot silently regress
the lexicon.
webapp/data/languages/ha/language_config.json (1)

2-7: Set grapheme_mode explicitly for Hausa.

This works with today’s optional handling, but adding "grapheme_mode": "false" makes intent explicit and avoids accidental behavior drift if defaults/merge logic change.

Proposed diff
 {
     "language_code": "ha",
     "name": "Hausa",
     "name_native": "Hausa",
     "timezone": "Africa/Lagos",
     "right_to_left": "false",
+    "grapheme_mode": "false",
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/ha/language_config.json` around lines 2 - 7, Add an
explicit "grapheme_mode": "false" entry to the Hausa language config object in
language_config.json (near the existing "right_to_left" and "timezone" keys) so
the file explicitly sets grapheme handling for the "ha" language; ensure the key
is a sibling of "right_to_left" (not nested under "meta") and uses the string
"false" to match existing config value types.
webapp/data/languages/ha/SOURCES.md (1)

3-9: Add source snapshot metadata for reproducibility.

Please include per-source snapshot details (e.g., dump filename/version and access date). This makes provenance and licensing audits much easier later.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/ha/SOURCES.md` around lines 3 - 9, For each listed
source heading ("Leipzig Corpora Collection" and "kaikki.org (Wiktionary
extract)") add snapshot metadata: include the exact dump filename or version
(e.g., corpus file name or Wiktionary dump identifier) and the date you accessed
or downloaded it; place these as new fields under each source (e.g., "Snapshot:
<filename/version>", "Accessed: <YYYY-MM-DD>") so provenance and licensing
audits can reproduce the exact data used.
webapp/data/languages/gl/gl_daily_words.txt (1)

1-2000: Add an automated lexical QA gate for bulk list edits

Given the size of this data churn, add a pre-commit/CI check for: duplicate entries, canonical (accent-folded) duplicates, length=5 grapheme/char constraints (per language mode), and dictionary provenance coverage for new tokens. This will prevent bad daily words from landing again.

I can draft the validator script and a minimal CI step if you want.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/gl/gl_daily_words.txt` around lines 1 - 2000, The bulk
edit to webapp/data/languages/gl/gl_daily_words.txt needs an automated QA gate:
add a validator script (e.g., validate_daily_words) that loads the daily words
list and fails on (1) exact duplicate entries, (2) accent-folded/canonical
duplicates (normalize accents/diacritics and compare), (3) words whose grapheme
cluster length != 5 per language mode (use a grapheme-aware counter, not
codepoint length), and (4) new tokens lacking dictionary provenance by checking
against our lexicon sources (wordlists/lexicons) and reporting missing sources;
wire this script into pre-commit/CI (pre-commit hook and the CI job that
modifies or validates the daily words file) so any violation on
webapp/data/languages/gl/gl_daily_words.txt fails the commit/CI run.
webapp/data/languages/hr/hr_daily_words.txt (1)

970-974: Consider lexical diversity in consecutive pronoun forms.

Lines 970-974 add five consecutive inflected forms of the Croatian pronoun "on" (he/it): njega, njemu, njima, njime, njome. While these are valid 5-letter Croatian words, having multiple grammatical forms of the same pronoun clustered together may reduce lexical diversity in the daily word selection.

Consider whether including all inflected forms adds value to the player experience, or if it would be better to favor a broader range of distinct root words.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/hr/hr_daily_words.txt` around lines 970 - 974, The
block adds five consecutive inflected Croatian pronoun forms (njega, njemu,
njima, njime, njome) which reduces lexical diversity in daily selection; update
hr_daily_words.txt to avoid clustering multiple inflections of the same lemma by
keeping at most one representative form (e.g., keep "njega") and replace the
other four entries with distinct root words (different lemmas) of similar length
or thematic value so the daily pool favors varied vocabulary rather than
repeated inflections.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@scripts/download_sources.py`:
- Around line 460-515: The CLI currently ignores failures from download
functions in main, so "all" and single-command runs always exit 0; change each
call site in main to detect errors and fail early or aggregate failures: have
download_leipzig, download_hunspell, download_kbbi, download_katla,
download_shabdle, extract_kaikki, download_kaikki either return a boolean (or
raise on error), then in main capture those returns (or catch exceptions) for
the "all" flow and each branch, accumulate any failures and call sys.exit(1)
when any downloader failed; also ensure single-command branches propagate
nonzero exit on failure instead of silently printing Done.
- Around line 301-307: The current download_katla() early return only checks for
answers.txt, which leaves a half-installed state if valid.txt is missing; update
download_katla() to treat Katla as complete only when both answers.txt and
valid.txt exist by checking both target_dir / "answers.txt" and target_dir /
"valid.txt" before printing the "already downloaded" message and returning,
otherwise proceed with the download/creation steps so both files are ensured;
reference the download_katla() function and the "answers.txt" and "valid.txt"
paths when making this change.
- Around line 410-424: The current logic always continues when a definitions
file exists, which prevents falling back to remote Kaikki if local extraction
yields no valid words; update the block around DEFINITIONS_DIR /
f"{lang}_en.json" so that the try/except only performs the continue when a
non-empty words list is produced (i.e., move the continue inside the "if words:"
branch after writing out_file), and otherwise allow execution to proceed to the
remote-download path (also ensure exceptions fall through to the remote fallback
rather than swallowing them).
- Around line 203-214: Guard the unprotected subprocess.run calls that invoke
external binaries (dpkg, apt, sudo, git) in download_sources.py: before calling
subprocess.run(["dpkg", ...]) / subprocess.run(["sudo","apt",...]) and git
invocations, check availability with shutil.which("dpkg") / shutil.which("apt")
/ shutil.which("sudo") / shutil.which("git") and skip or log a clear warning if
missing, or alternatively wrap each subprocess.run in a try/except
FileNotFoundError block to handle missing binaries gracefully; update the code
paths around the package install logic (the block using subprocess.run with
variables package and result) and the git call sites to use these guards so the
script continues instead of raising FileNotFoundError.
- Around line 333-348: The shabdle download is unused: either integrate it into
the Hindi pipeline or remove it. To integrate, add "shabdle" to the
EXTRA_SOURCES set in improve_word_lists.py, implement a loader function
load_shabdle_words() that reads FREQ_DATA/"shabdle"/"hi_words.txt" (matching
download_shabdle() output) and returns the word list, and update add_language.py
to call that loader when processing Hindi; also ensure
webapp/data/languages/hi/SOURCES.md documents "shabdle". Alternatively, remove
the download_shabdle() function and delete the shabdle entry from
webapp/data/languages/hi/SOURCES.md so there is no stale download.

In `@scripts/improve_word_lists.py`:
- Around line 693-701: The en_removed metric only subtracts removals from
scored; capture lengths for both lists before filtering (e.g., scored_pre2 =
len(scored); unscored_pre = len(unscored)), then apply the english filter using
is_english_contamination on scored and unscored, and set en_removed =
(scored_pre2 - len(scored)) + (unscored_pre - len(unscored)) so the printed
metric reflects removals from both lists (adjust any subsequent uses/prints of
en_removed accordingly).
- Around line 1070-1087: The report currently forces contamination = set() when
native_dict is empty, causing the printed contamination percentages to show 0.0%
incorrectly; update the logic around native_dict, contamination and the print
formatting so percentages are only computed when native_dict (and words/daily)
are present and non-empty—e.g. compute contamination_pct and daily_contam_pct
conditionally (using None or "N/A" when native_dict is missing) and adjust the
two print statements that output English overlaps and "Contamination (EN & not
native)" and the daily contamination line to display "N/A" or skip the
percentage when you cannot evaluate contamination; refer to variables
native_dict, contamination, en_overlap, daily_contam and the print blocks in the
shown diff to locate where to change the formatting.

In `@webapp/data/languages/da/da_5words_supplement.txt`:
- Line 490: Remove the newly added offensive words from the Danish supplement by
deleting the entries "cunth", "negro", "nigga", and "pussy" from the
da_5words_supplement.txt file (they currently appear as individual lines in the
list); ensure no duplicate variants remain elsewhere in the file, update any
related tests or snapshots that reference these exact tokens, and re-run the
wordlist validation to confirm only acceptable Danish words remain.
- Around line 1056-1057: The supplemental Danish word list contains many
OCR/noise artefacts (e.g., tokens like "hjaip", "hjæip", "iader", "iiiie",
"ldiot", "lsaac", "lzzie") that must not be treated as valid guesses; open
webapp/data/languages/da/da_5words_supplement.txt and remove or replace all
non-Danish/garbage tokens in the affected ranges (around lines 1056–1057,
1134–1184, 1398–1494), and validate the final list against a trusted Danish
dictionary or wordlist to ensure only legitimate Danish words remain (don’t
reintroduce OCR artefacts). Ensure the cleaned file preserves format and
encoding so the game won’t load corrupted entries.

In `@webapp/data/languages/da/da_daily_words.txt`:
- Line 953: The Danish daily-words list contains the English word "lemon" which
must be removed or replaced with the correct Danish term; locate the entry
"lemon" in the da_daily_words.txt daily words list and replace it with "citron"
(or remove the line if the list should not include that lemma), then run the
list validation/lint step that checks for English contamination to confirm the
change.

In `@webapp/data/languages/de/de_daily_words.txt`:
- Line 7: Remove the token "abhat" from the German daily words list in
de_daily_words.txt: locate the exact entry "abhat" and delete that line
(preserving file encoding and newline conventions) so it is no longer selected
as a daily word; do not modify other entries (e.g., keep "bälde") or surrounding
formatting.

In `@webapp/data/languages/es/es_daily_words.txt`:
- Line 82: Remove the abbreviation-style entries "aprox", "excmo", and "izqdo"
from the Spanish daily-answer list (they are not valid Wordle-style words) by
deleting those lines in the es_daily_words.txt data set or replacing them with
appropriate five-letter Spanish words; update the daily-answer pool so only full
words (not shorthand/abbreviations) remain and run any data validation script to
ensure no other abbreviation-style tokens exist.
- Line 810: Replace the nonstandard entry "harpa" with the standard Spanish form
"arpa" in the es_daily_words.txt daily pool; locate the token "harpa" (currently
at the mentioned entry) and update it to "arpa" so the daily answers use the
common orthography for fairness and guessability.
- Line 566: Replace the malformed token "dupdo" in es_daily_words.txt with the
correct Spanish word or remove it if it was inserted accidentally; locate the
entry "dupdo" (the unexpected token in the daily words list) and either fix its
spelling to the intended word consistent with the other entries or delete the
line to prevent a broken daily solution.

In `@webapp/data/languages/fr/fr_daily_words.txt`:
- Line 1511: The daily-answer list contains duplicate-equivalent entries "roder"
and "rôder" (the language's diacritic_map normalizes ô→o), so remove the ASCII
variant "roder" and keep the accented canonical "rôder" in the French daily pool
to avoid duplicate-normalized answers; update the list to contain only one of
these tokens ("rôder") so validation/win logic treats it uniquely.
- Line 543: Remove the proper nouns "ivana" and "samoa" from the FR daily pool
in webapp/data/languages/fr/fr_daily_words.txt and add them to the French
blocklist in webapp/data/languages/fr/fr_blocklist.txt (or, alternatively,
simply delete them from fr_daily_words.txt); ensure the entries "ivana" and
"samoa" are added in the same format as existing blocklist items (matching
patterns used for other names like "diana" and places like "yukon") so they are
consistently excluded from future daily pools.

In `@webapp/data/languages/gl/gl_daily_words.txt`:
- Around line 752-760: The daily-answer pool contains stress-marked
infinitive-looking entries (e.g., "fálar", "págar", "pásar", "rémar", "rífar",
"xútar" and the block showing "fálar / féd er / fémur / fíxer / fóder / fósil /
fúmar / fúrar / fútil") that are not valid standalone Galician lemmas; remove
these accented infinitive forms from the list or validate each one against the
same native-dictionary validation used by the contamination filter (use the
contamination filter's validation routine) and only keep entries that pass that
native-dictionary check so they no longer surface as daily answers.
- Around line 833-837: The daily Galician word list contains accent-folding
collisions (e.g., guíar vs guiar, gálar vs galar, gánar/gáñar vs ganar) that
produce duplicate canonical forms after diacritic stripping; update the word
list to remove or de-duplicate accented variants (remove accented duplicates
like guíar, gálar, gáñar, etc.), or mark these specific entries as excluded from
daily rotation, or change the normalization logic to preserve distinguishing
accents (adjust the normalization function used at answer-checking to avoid
stripping diacritics for these words); specifically locate the entries (guíar,
gábar, gálar, gánar, gáñar) in the daily words file and either delete the
accented duplicates or flag them for exclusion, or modify the normalization
routine so these collisions do not produce duplicate outcomes.

In `@webapp/data/languages/it/it_daily_words.txt`:
- Line 686: Remove or replace the English word "fifty" introduced in
it_daily_words.txt (the daily answer candidate at the diff) because the file is
used directly for Italian daily selections; edit the entry so the file contains
only Italian words (either delete the "fifty" line or substitute it with a
correct Italian word/translation) and save the file to prevent non-Italian
answers from surfacing.

---

Outside diff comments:
In `@scripts/improve_word_lists.py`:
- Around line 765-801: The supplement-generation path is not applying the
profanity filter, so offensive words slip into all_supplement/supplement_sorted;
update the code to call the same profanity check used for daily candidates
whenever building supplements: (1) when creating new_supplement (the set
comprehension using is_valid_word), exclude profane words; (2) inside the
wf_words loop before adding to wf_new skip words flagged by the profanity
predicate; and (3) as a final safety step, run the profanity filter over
all_supplement (the union of existing_supplement and new additions) and remove
any profane entries before producing supplement_sorted. Use the existing
profanity function/s (the same predicate used for daily candidates) to ensure
consistent behavior.

In `@webapp/data/languages/eu/eu_daily_words.txt`:
- Around line 1-2000: Replace the five words that currently use a decomposed "n"
+ combining tilde with the precomposed ñ (U+00F1) so each word is exactly 5
characters: change "aloña", "amañi", "amiñi", "azaña", "iñigo", "koñak",
"muñoz", "piñoi", "señor", and "ñikad" to use the single-character ñ (U+00F1)
instead of an "n" followed by a combining accent; search for those exact token
strings in the eu_daily_words.txt content and update their encoding to the
precomposed character so they validate as 5-letter words.

---

Duplicate comments:
In `@scripts/download_sources.py`:
- Around line 367-368: The extraction filters use code-point checks
(len/isalpha/lower) so grapheme clusters are dropped; replace those with
grapheme-aware checks using the regex module: for each candidate (the expression
building words), require the string matches a grapheme-count pattern like
r'^(?:\X){5}$' to enforce exactly five graphemes, require it matches
r'^[\p{L}\p{M}]+$' to allow base letters plus combining marks (not raw
code-point isalpha), and keep the case check using casefold (w == w.casefold())
instead of w == w.lower(); update the occurrences where words is built (the
sorted(...) comprehension) and the other similar spots mentioned (around the
other three occurrences) to use these regex-based predicates and import the
regex module.

In `@scripts/improve_word_lists.py`:
- Around line 338-352: The current character checks (in _load_word_file and the
other word-loading functions that use w.isalpha() and len(w) == 5) reject valid
words containing Unicode combining marks; replace those filters with
Unicode-category checks that accept letters and combining marks (e.g., require
every character's unicodedata.category to start with "L" or "M" instead of
w.isalpha()), and replace byte/codepoint length checks (len(w) == 5) with a
grapheme-cluster-aware length test (use the third-party regex module's \X or the
grapheme package to count grapheme clusters) so grapheme-mode languages
(Hindi/Bengali/Marathi) are preserved. Ensure to import unicodedata and add a
short helper like is_letter_or_mark(w: str) and a grapheme_count(w: str) used by
the loaders (_load_word_file and the other functions that currently rely on
isalpha()/len==5).

---

Nitpick comments:
In `@webapp/data/languages/et/et_daily_words.txt`:
- Around line 4-1974: Add a CI/pre-commit lexicon validator (e.g.
validate_lexicon / validateLexicon job) that runs on changes to
et_daily_words.txt and enforces: 1) uniqueness (fail if duplicate entries), 2)
exact-length policy using grapheme/cluser counts per language mode (reject
entries that are not the expected grapheme length), 3) Unicode NFC normalization
(normalize input and fail if not NFC), and 4) blocked-word screening against a
curated denylist; the job should print clear diagnostics and exit non-zero on
any violation so PRs cannot silently regress the lexicon.

In `@webapp/data/languages/gl/gl_daily_words.txt`:
- Around line 1-2000: The bulk edit to
webapp/data/languages/gl/gl_daily_words.txt needs an automated QA gate: add a
validator script (e.g., validate_daily_words) that loads the daily words list
and fails on (1) exact duplicate entries, (2) accent-folded/canonical duplicates
(normalize accents/diacritics and compare), (3) words whose grapheme cluster
length != 5 per language mode (use a grapheme-aware counter, not codepoint
length), and (4) new tokens lacking dictionary provenance by checking against
our lexicon sources (wordlists/lexicons) and reporting missing sources; wire
this script into pre-commit/CI (pre-commit hook and the CI job that modifies or
validates the daily words file) so any violation on
webapp/data/languages/gl/gl_daily_words.txt fails the commit/CI run.

In `@webapp/data/languages/ha/language_config.json`:
- Around line 2-7: Add an explicit "grapheme_mode": "false" entry to the Hausa
language config object in language_config.json (near the existing
"right_to_left" and "timezone" keys) so the file explicitly sets grapheme
handling for the "ha" language; ensure the key is a sibling of "right_to_left"
(not nested under "meta") and uses the string "false" to match existing config
value types.

In `@webapp/data/languages/ha/SOURCES.md`:
- Around line 3-9: For each listed source heading ("Leipzig Corpora Collection"
and "kaikki.org (Wiktionary extract)") add snapshot metadata: include the exact
dump filename or version (e.g., corpus file name or Wiktionary dump identifier)
and the date you accessed or downloaded it; place these as new fields under each
source (e.g., "Snapshot: <filename/version>", "Accessed: <YYYY-MM-DD>") so
provenance and licensing audits can reproduce the exact data used.

In `@webapp/data/languages/hr/hr_daily_words.txt`:
- Around line 970-974: The block adds five consecutive inflected Croatian
pronoun forms (njega, njemu, njima, njime, njome) which reduces lexical
diversity in daily selection; update hr_daily_words.txt to avoid clustering
multiple inflections of the same lemma by keeping at most one representative
form (e.g., keep "njega") and replace the other four entries with distinct root
words (different lemmas) of similar length or thematic value so the daily pool
favors varied vocabulary rather than repeated inflections.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 411e3a34-640d-4120-b753-c900f79c282e

📥 Commits

Reviewing files that changed from the base of the PR and between 887542a and fb0552e.

📒 Files selected for processing (43)
  • scripts/download_sources.py
  • scripts/improve_word_lists.py
  • webapp/data/languages/ca/ca_daily_words.txt
  • webapp/data/languages/cs/cs_daily_words.txt
  • webapp/data/languages/da/da_5words_supplement.txt
  • webapp/data/languages/da/da_daily_words.txt
  • webapp/data/languages/de/de_daily_words.txt
  • webapp/data/languages/es/es_daily_words.txt
  • webapp/data/languages/et/et_daily_words.txt
  • webapp/data/languages/eu/eu_daily_words.txt
  • webapp/data/languages/fr/fr_daily_words.txt
  • webapp/data/languages/gl/gl_daily_words.txt
  • webapp/data/languages/ha/SOURCES.md
  • webapp/data/languages/ha/ha_5words.txt
  • webapp/data/languages/ha/ha_characters.txt
  • webapp/data/languages/ha/ha_curated_schedule.txt
  • webapp/data/languages/ha/ha_keyboard.json
  • webapp/data/languages/ha/language_config.json
  • webapp/data/languages/hr/hr_daily_words.txt
  • webapp/data/languages/hu/hu_daily_words.txt
  • webapp/data/languages/is/is_daily_words.txt
  • webapp/data/languages/it/it_daily_words.txt
  • webapp/data/languages/lt/lt_daily_words.txt
  • webapp/data/languages/lv/lv_daily_words.txt
  • webapp/data/languages/nb/nb_daily_words.txt
  • webapp/data/languages/nl/nl_daily_words.txt
  • webapp/data/languages/nn/nn_daily_words.txt
  • webapp/data/languages/pa/SOURCES.md
  • webapp/data/languages/pa/language_config.json
  • webapp/data/languages/pa/pa_5words.txt
  • webapp/data/languages/pa/pa_characters.txt
  • webapp/data/languages/pa/pa_curated_schedule.txt
  • webapp/data/languages/pa/pa_keyboard.json
  • webapp/data/languages/pt/pt_5words_supplement.txt
  • webapp/data/languages/pt/pt_daily_words.txt
  • webapp/data/languages/ro/ro_daily_words.txt
  • webapp/data/languages/sk/sk_daily_words.txt
  • webapp/data/languages/sl/sl_daily_words.txt
  • webapp/data/languages/sv/sv_daily_words.txt
  • webapp/data/languages/tr/tr_daily_words.txt
  • webapp/data/languages/yo/yo_5words.txt
  • webapp/data/languages/yo/yo_characters.txt
  • webapp/data/languages/yo/yo_keyboard.json
💤 Files with no reviewable changes (1)
  • webapp/data/languages/lt/lt_daily_words.txt
✅ Files skipped from review due to trivial changes (3)
  • webapp/data/languages/ha/ha_curated_schedule.txt
  • webapp/data/languages/ha/ha_characters.txt
  • webapp/data/languages/ha/ha_keyboard.json

Comment on lines +203 to +214
# Check if package is installed
result = subprocess.run(["dpkg", "-s", package], capture_output=True, text=True)
if result.returncode != 0:
print(f" Installing {package}...")
result = subprocess.run(
["sudo", "apt", "install", "-y", package],
capture_output=True,
text=True,
)
if result.returncode != 0:
print(f" FAILED to install {package}: {result.stderr}")
continue
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

uname -s
for bin in dpkg sudo apt git; do
  if command -v "$bin" >/dev/null 2>&1; then
    echo "$bin: present"
  else
    echo "$bin: missing"
  fi
done

rg -n -C2 '"dpkg"|"sudo"|"apt"|"git"' scripts/download_sources.py

Repository: Hugo0/wordle

Length of output: 669


🏁 Script executed:

#!/bin/bash
# Check file size and read relevant sections
wc -l scripts/download_sources.py
echo "---"
# Read the first location (lines 195-225)
sed -n '195,225p' scripts/download_sources.py
echo "---"
# Read the second location (lines 245-280)
sed -n '245,280p' scripts/download_sources.py

Repository: Hugo0/wordle

Length of output: 2413


🏁 Script executed:

#!/bin/bash
# Check file structure from the beginning
head -50 scripts/download_sources.py
echo "---"
# Check for try-except blocks around the subprocess calls
sed -n '250,275p' scripts/download_sources.py
echo "---"
# Search for any try-except blocks in the file
rg -n 'try:|except' scripts/download_sources.py

Repository: Hugo0/wordle

Length of output: 2889


🏁 Script executed:

#!/bin/bash
# Check context around lines 195-235
sed -n '180,240p' scripts/download_sources.py
echo "=== SEPARATOR ==="
# Check context around lines 240-290
sed -n '235,295p' scripts/download_sources.py

Repository: Hugo0/wordle

Length of output: 4382


Guard against missing binaries before calling subprocess.run().

The subprocess calls at lines 203–214 (dpkg, apt, sudo) and 257–270 (git) are unguarded. If any of these binaries is missing, subprocess.run() raises FileNotFoundError before the returncode check is reached, causing the script to abort instead of skipping the source gracefully. Use shutil.which() to check binary availability first, or wrap these calls in try-except blocks.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/download_sources.py` around lines 203 - 214, Guard the unprotected
subprocess.run calls that invoke external binaries (dpkg, apt, sudo, git) in
download_sources.py: before calling subprocess.run(["dpkg", ...]) /
subprocess.run(["sudo","apt",...]) and git invocations, check availability with
shutil.which("dpkg") / shutil.which("apt") / shutil.which("sudo") /
shutil.which("git") and skip or log a clear warning if missing, or alternatively
wrap each subprocess.run in a try/except FileNotFoundError block to handle
missing binaries gracefully; update the code paths around the package install
logic (the block using subprocess.run with variables package and result) and the
git call sites to use these guards so the script continues instead of raising
FileNotFoundError.

Comment on lines +301 to +307
def download_katla():
"""Download Katla Indonesian Wordle word lists."""
target_dir = FREQ_DATA / "katla"
answers_file = target_dir / "answers.txt"
if answers_file.exists():
print(f" Katla: already downloaded ({answers_file})")
return
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Treat Katla as complete only when both outputs exist.

scripts/improve_word_lists.py, Lines 274-399, loads both answers.txt and valid.txt, but this guard only checks answers.txt. A run that writes answers.txt and then fails before the whitelist download becomes permanently half-installed on rerun.

💡 Proposed fix
 def download_katla():
     """Download Katla Indonesian Wordle word lists."""
     target_dir = FREQ_DATA / "katla"
     answers_file = target_dir / "answers.txt"
-    if answers_file.exists():
-        print(f"  Katla: already downloaded ({answers_file})")
+    valid_file = target_dir / "valid.txt"
+    if answers_file.exists() and valid_file.exists():
+        print(f"  Katla: already downloaded ({answers_file}, {valid_file})")
         return
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def download_katla():
"""Download Katla Indonesian Wordle word lists."""
target_dir = FREQ_DATA / "katla"
answers_file = target_dir / "answers.txt"
if answers_file.exists():
print(f" Katla: already downloaded ({answers_file})")
return
def download_katla():
"""Download Katla Indonesian Wordle word lists."""
target_dir = FREQ_DATA / "katla"
answers_file = target_dir / "answers.txt"
valid_file = target_dir / "valid.txt"
if answers_file.exists() and valid_file.exists():
print(f" Katla: already downloaded ({answers_file}, {valid_file})")
return
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/download_sources.py` around lines 301 - 307, The current
download_katla() early return only checks for answers.txt, which leaves a
half-installed state if valid.txt is missing; update download_katla() to treat
Katla as complete only when both answers.txt and valid.txt exist by checking
both target_dir / "answers.txt" and target_dir / "valid.txt" before printing the
"already downloaded" message and returning, otherwise proceed with the
download/creation steps so both files are ensured; reference the
download_katla() function and the "answers.txt" and "valid.txt" paths when
making this change.

Comment on lines +333 to +348
def download_shabdle():
"""Download Shabdle Hindi Wordle word list."""
target_dir = FREQ_DATA / "shabdle"
words_file = target_dir / "hi_words.txt"
if words_file.exists():
print(f" Shabdle: already downloaded ({words_file})")
return

target_dir.mkdir(parents=True, exist_ok=True)
url = "https://raw.githubusercontent.com/kach/shabdle/main/hi.wl"
raw_path = target_dir / "hi.wl"
if download_file(url, raw_path, "Shabdle Hindi word list"):
words = [w.strip() for w in raw_path.read_text(encoding="utf-8").splitlines() if w.strip()]
words_file.write_text("\n".join(words) + "\n", encoding="utf-8")
print(f" Shabdle: {len(words)} Hindi words → {words_file}")
raw_path.unlink(missing_ok=True)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

rg -n -C2 'shabdle|hi_words\.txt|\.freq_data/shabdle' scripts webapp tests

Repository: Hugo0/wordle

Length of output: 3564


🏁 Script executed:

cat -n scripts/improve_word_lists.py | head -100

Repository: Hugo0/wordle

Length of output: 3094


🏁 Script executed:

sed -n '274,399p' scripts/improve_word_lists.py

Repository: Hugo0/wordle

Length of output: 4336


🏁 Script executed:

sed -n '573,611p' scripts/add_language.py

Repository: Hugo0/wordle

Length of output: 1594


🏁 Script executed:

# Search for how FREQ_DATA or .freq_data directories are discovered/loaded
rg -n 'FREQ_DATA|\.freq_data|glob.*freq|listdir.*freq' scripts

Repository: Hugo0/wordle

Length of output: 1305


🏁 Script executed:

# Check if SOURCES.md has generation scripts or comments
head -20 webapp/data/languages/hi/SOURCES.md

Repository: Hugo0/wordle

Length of output: 502


🏁 Script executed:

# Search for scripts that generate SOURCES.md files
rg -l 'SOURCES\.md|write.*sources' scripts

Repository: Hugo0/wordle

Length of output: 109


🏁 Script executed:

# Check if there's any documentation about how language sources are defined
rg -n 'shabdle' scripts/add_language.py

Repository: Hugo0/wordle

Length of output: 38


🏁 Script executed:

# Verify if shabdle should have been added to EXTRA_SOURCES for Hindi
git log -p --all -S "shabdle" -- scripts/add_language.py | head -100

Repository: Hugo0/wordle

Length of output: 38


🏁 Script executed:

# Check if download_shabdle is actually invoked in the main download pipeline
rg -n 'download_shabdle|"shabdle"' scripts/download_sources.py

Repository: Hugo0/wordle

Length of output: 317


🏁 Script executed:

# Look for any TODOs or comments about shabdle
rg -n -i 'TODO|FIXME|XXX' scripts/download_sources.py | grep -i shabdle

Repository: Hugo0/wordle

Length of output: 38


🏁 Script executed:

# Check the main download call to see if shabdle is included
sed -n '480,515p' scripts/download_sources.py

Repository: Hugo0/wordle

Length of output: 1245


Add shabdle to the Hindi word generation pipeline or remove the unused download.

The download_shabdle() function creates scripts/.freq_data/shabdle/hi_words.txt, but this data is never loaded. The improve_word_lists.py module defines extra sources for Hindi as {"leipzig", "hunspell", "kaikki"} (line 291), missing shabdle entirely. No load_shabdle_words() function exists, and add_language.py makes no provision for it. Either integrate shabdle by adding it to EXTRA_SOURCES and implementing a loader, or remove the download function and the stale reference in webapp/data/languages/hi/SOURCES.md.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/download_sources.py` around lines 333 - 348, The shabdle download is
unused: either integrate it into the Hindi pipeline or remove it. To integrate,
add "shabdle" to the EXTRA_SOURCES set in improve_word_lists.py, implement a
loader function load_shabdle_words() that reads
FREQ_DATA/"shabdle"/"hi_words.txt" (matching download_shabdle() output) and
returns the word list, and update add_language.py to call that loader when
processing Hindi; also ensure webapp/data/languages/hi/SOURCES.md documents
"shabdle". Alternatively, remove the download_shabdle() function and delete the
shabdle entry from webapp/data/languages/hi/SOURCES.md so there is no stale
download.

Comment thread scripts/download_sources.py
Comment on lines +460 to +515
def main():
parser = argparse.ArgumentParser(description="Download external word list sources")
subparsers = parser.add_subparsers(dest="command")

subparsers.add_parser("all", help="Download everything")

leipzig_cmd = subparsers.add_parser("leipzig", help="Download Leipzig Corpora")
leipzig_cmd.add_argument("langs", nargs="*", default=list(LEIPZIG_CORPORA.keys()))

subparsers.add_parser("hunspell", help="Download Hunspell dictionaries")
subparsers.add_parser("kbbi", help="Download KBBI Indonesian dictionary")
subparsers.add_parser("katla", help="Download Katla Indonesian Wordle lists")
subparsers.add_parser("shabdle", help="Download Shabdle Hindi Wordle word list")
subparsers.add_parser("extract-kaikki", help="Extract word lists from existing kaikki JSONs")

kaikki_cmd = subparsers.add_parser(
"kaikki-download", help="Download kaikki.org data for languages"
)
kaikki_cmd.add_argument("langs", nargs="*", default=list(KAIKKI_LANGS.keys()))

args = parser.parse_args()

if args.command == "all":
print("=== Downloading all sources ===\n")
print("--- Leipzig Corpora ---")
download_leipzig(list(LEIPZIG_CORPORA.keys()))
print("\n--- Hunspell ---")
download_hunspell()
print("\n--- KBBI ---")
download_kbbi()
print("\n--- Katla ---")
download_katla()
print("\n--- Shabdle ---")
download_shabdle()
print("\n--- Extract kaikki from existing definitions ---")
extract_kaikki()
print("\n--- Download kaikki for new languages ---")
download_kaikki(list(KAIKKI_LANGS.keys()))
print("\n=== Done ===")
elif args.command == "leipzig":
download_leipzig(args.langs)
elif args.command == "hunspell":
download_hunspell()
elif args.command == "kbbi":
download_kbbi()
elif args.command == "katla":
download_katla()
elif args.command == "shabdle":
download_shabdle()
elif args.command == "extract-kaikki":
extract_kaikki()
elif args.command == "kaikki-download":
download_kaikki(args.langs)
else:
parser.print_help()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

The CLI always exits green after partial failures.

These branches never inspect downloader success, so all can print === Done === and exit 0 after missing corpora or dictionaries. That makes broken source refreshes hard to catch in automation and easy to commit accidentally.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/download_sources.py` around lines 460 - 515, The CLI currently
ignores failures from download functions in main, so "all" and single-command
runs always exit 0; change each call site in main to detect errors and fail
early or aggregate failures: have download_leipzig, download_hunspell,
download_kbbi, download_katla, download_shabdle, extract_kaikki, download_kaikki
either return a boolean (or raise on error), then in main capture those returns
(or catch exceptions) for the "all" flow and each branch, accumulate any
failures and call sys.exit(1) when any downloader failed; also ensure
single-command branches propagate nonzero exit on failure instead of silently
printing Done.

engin
enjeu
ennui
enter
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify whether potentially risky additions are explicitly justified by source/filter logic.

set -euo pipefail

echo "== Suspicious entries in FR daily words =="
rg -n '^(enter|ivana|samoa|speck|spitz|spore)$' webapp/data/languages/fr/fr_daily_words.txt

echo
echo "== Find contamination/proper-noun handling in tooling =="
fd improve_word_lists.py -x sed -n '1,260p' {}

echo
echo "== Search for allowlists/blocklists and FR-specific exceptions =="
rg -n -C3 'allow|allowlist|blocklist|proper|name|contamin|dictionary|daily' scripts/improve_word_lists.py

Repository: Hugo0/wordle

Length of output: 25749


🏁 Script executed:

# Check if blocklists exist for French
find webapp/data/languages/fr -name "*blocklist*" -o -name "*names*"
echo "---"

# Check if common_names.txt exists and contains any of the suspicious entries
if [ -f scripts/common_names.txt ]; then
  echo "=== common_names.txt exists, checking for suspicious entries ==="
  rg -i '^(enter|ivana|samoa|speck|spitz|spore)$' scripts/common_names.txt
else
  echo "=== common_names.txt does NOT exist ==="
fi

Repository: Hugo0/wordle

Length of output: 166


🌐 Web query:

French language: are "enter", "ivana", "samoa", "speck", "spitz" valid dictionary words or proper nouns?

💡 Result:

Forme En français : mot du dictionnaire ? Plutôt nom propre ?
enter Oui : verbe français (« greffer », etc.). [1] Non (pas spécialement).
Ivana Pas un mot lexical courant : c’est surtout un prénom. [2] Oui (prénom).
Samoa Principalement toponyme (archipel/État) ; s’emploie comme nom géographique. [3] Oui (nom de lieu/pays).
speck Pas un mot « français standard » au sens strict ; surtout un emprunt culinaire (charcuterie), utilisé en français (ex. « pâtes au speck »). [4] Pas forcément (peut aussi être un nom propre/surnom dans d’autres langues, mais en français courant c’est l’aliment quand il est utilisé).
spitz Oui : nom commun français (type/race de chien). [5] Non (sauf majuscule en nom propre).

Sources : [1] Wiktionnaire, enter [2] Wikipédia (fr), Ivana (prénom) [3] Wiktionnaire, Samoa [4] Reverso, définition/usage de speck [5] Larousse, spitz


🏁 Script executed:

# Read the French blocklist
echo "=== Contents of fr_blocklist.txt ==="
cat webapp/data/languages/fr/fr_blocklist.txt

echo
echo "=== Check for 'spore' validity (not covered in web search) ==="
# spore should be a valid French word (biological term)
echo "spore is a standard biological term in French"

Repository: Hugo0/wordle

Length of output: 606


🏁 Script executed:

# Search for how native dictionary is built and if it filters proper nouns
echo "=== Check native dict building for French ==="
sed -n '425,472p' scripts/improve_word_lists.py

echo
echo "=== Check if kaikki loading filters proper nouns ==="
fd kaikki -x grep -l "proper\|noun" {}

Repository: Hugo0/wordle

Length of output: 1625


🏁 Script executed:

# Verify that ivana and samoa are actually IN the daily words file at the cited lines
echo "=== Verify exact content at flagged lines ==="
sed -n '543p;859p;1578p;1663p;1665p;1667p' webapp/data/languages/fr/fr_daily_words.txt

echo
echo "=== Check if there are language-specific blocklists or name filters ==="
find scripts -name "*name*" -o -name "*blocklist*"

echo
echo "=== Compare blocklist pattern: proper nouns already listed ==="
echo "Proper names in blocklist:"
grep -E "^(diana|heidi|nadia|ronan|pavel)$" webapp/data/languages/fr/fr_blocklist.txt
echo
echo "Geographic/proper locations in blocklist:"
grep -E "^(abuja|yukon|samoa)$" webapp/data/languages/fr/fr_blocklist.txt || echo "samoa NOT in blocklist"

Repository: Hugo0/wordle

Length of output: 443


🏁 Script executed:

# Try to run contamination audit for French if possible (or check logs)
echo "=== Check if improve_word_lists.py audit_contamination would flag these ==="
# The audit function (lines 1052-1092) builds native dict and checks for EN contamination
# Let's see if there are any audit logs or results

find . -name "*audit*" -o -name "*contam*" | head -20

echo
echo "=== Check final state: total lines in fr_daily_words.txt ==="
wc -l webapp/data/languages/fr/fr_daily_words.txt

Repository: Hugo0/wordle

Length of output: 242


Remove proper nouns ivana (line 859) and samoa (line 1578) from FR daily pool

ivana is a personal name, not a French dictionary word, and samoa is a geographic proper noun (country). Both match the explicit blocklist patterns already established in webapp/data/languages/fr/fr_blocklist.txt (which blocks similar entries like diana, heidi, ronan for names and yukon, abuja for places) but are mysteriously absent from the blocklist itself. These should either be added to the blocklist or removed from the daily words—they contradict the PR's contamination-cleanup objective.

The other entries (enter, spitz, spore) are valid French dictionary words and may remain; speck is borderline (loanword) but acceptable if intentionally included.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/fr/fr_daily_words.txt` at line 543, Remove the proper
nouns "ivana" and "samoa" from the FR daily pool in
webapp/data/languages/fr/fr_daily_words.txt and add them to the French blocklist
in webapp/data/languages/fr/fr_blocklist.txt (or, alternatively, simply delete
them from fr_daily_words.txt); ensure the entries "ivana" and "samoa" are added
in the same format as existing blocklist items (matching patterns used for other
names like "diana" and places like "yukon") so they are consistently excluded
from future daily pools.

river
robot
roche
roder
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Inspect accent/normalization behavior without executing repository code.

set -euo pipefail

echo "== Locate normalization/compare logic in frontend =="
rg -n -C4 'normalize|diacritic|accent|NFD|NFKD|toLowerCase|splitWord|grapheme' frontend/src

echo
echo "== Locate normalization/compare logic in backend/tests =="
rg -n -C4 'normalize|diacritic|accent|grapheme|daily|answer|guess' webapp tests

echo
echo "== Confirm both forms exist in FR daily pool =="
rg -n '^(roder|rôder)$' webapp/data/languages/fr/fr_daily_words.txt

Repository: Hugo0/wordle

Length of output: 50369


🏁 Script executed:

#!/bin/bash
# Find French language configuration
fd -e json -path "*fr*" . | head -20

Repository: Hugo0/wordle

Length of output: 224


🏁 Script executed:

#!/bin/bash
# Find French language configuration more carefully
find . -name "*language_config.json" -o -name "*config.json" | grep -i fr

Repository: Hugo0/wordle

Length of output: 103


🏁 Script executed:

#!/bin/bash
# Read the French language configuration
cat ./webapp/data/languages/fr/language_config.json

Repository: Hugo0/wordle

Length of output: 3685


Remove one of the diacritic variants from the French daily-answer pool.

Both roder (line 1511) and rôder (line 1556) are present in the daily pool, but the French language config includes a diacritic_map that normalizes ô to o. This causes both words to normalize to the same form during game logic (word validation, win detection), making them duplicate-equivalent answers. The first entry in the list becomes the canonical form, but keeping both introduces unnecessary duplication in the answer pool.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/fr/fr_daily_words.txt` at line 1511, The daily-answer
list contains duplicate-equivalent entries "roder" and "rôder" (the language's
diacritic_map normalizes ô→o), so remove the ASCII variant "roder" and keep the
accented canonical "rôder" in the French daily pool to avoid
duplicate-normalized answers; update the list to contain only one of these
tokens ("rôder") so validation/win logic treats it uniquely.

Comment thread webapp/data/languages/gl/gl_daily_words.txt Outdated
Comment thread webapp/data/languages/gl/gl_daily_words.txt Outdated
fibra
fieno
fiero
fifty
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Line 686 adds an English daily answer candidate (fifty).

it_daily_words.txt is loaded directly for daily selection, so this can surface as a non-Italian answer. This conflicts with the contamination-filter objective and should be removed/replaced.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@webapp/data/languages/it/it_daily_words.txt` at line 686, Remove or replace
the English word "fifty" introduced in it_daily_words.txt (the daily answer
candidate at the diff) because the file is used directly for Italian daily
selections; edit the entry so the file contains only Italian words (either
delete the "fifty" line or substitute it with a correct Italian
word/translation) and save the file to prevent non-Italian answers from
surfacing.

Hugo0 added a commit that referenced this pull request Mar 14, 2026
Adds scripts/profanity_blocklist.txt with common English profanity/slurs
that leak into subtitle-sourced word lists (FrequencyWords). These words
are filtered from daily word candidates but remain valid guesses.

Fixes: bitch, nigga, pussy, whore found in Indonesian/Tagalog daily words
(reported by CodeRabbit review on PR #149).
@Hugo0 Hugo0 force-pushed the worktree-add-languages branch from e811783 to 5c95c6c Compare March 14, 2026 21:41
Hugo0 added 13 commits March 14, 2026 21:48
…rd quality pipeline

Add Indonesian, Malay, Tagalog, Albanian, Urdu, Yoruba, Uzbek, Hindi,
Bengali, and Marathi — expanding from 65 to 75 languages.

Key features:
- Grapheme mode for Devanagari/Bengali scripts (Hindi, Bengali, Marathi)
  using Intl.Segmenter — counts aksharas instead of codepoints
- English contamination filter using multi-source native dictionaries
  (KBBI, Katla, kaikki.org, Hunspell) — 0% daily contamination
- New scripts: add_language.py (bootstrap languages), download_sources.py
  (fetch KBBI, Katla, Shabdle, kaikki.org word lists)
- Full native UI translations and SEO metadata for all languages
- All 2,319 tests pass (pytest + vitest)
Layer 1: freeze_past_words.py generates curated_schedule.txt for all 75
languages, locking in the exact daily word for every past day since
migration (Jan 26, 2026). These files are committed to git and take
priority over daily_words.txt, so historical words survive disk wipes.

Layer 2: app.py startup check warns if any language's curated schedule
doesn't cover all past days — catches cases where daily_words.txt was
modified without running the freeze script.

Integration: improve_word_lists.py automatically runs freeze before
overwriting daily_words.txt, making it impossible to modify word lists
without first preserving history.
Adds scripts/profanity_blocklist.txt with common English profanity/slurs
that leak into subtitle-sourced word lists (FrequencyWords). These words
are filtered from daily word candidates but remain valid guesses.

Fixes: bitch, nigga, pussy, whore found in Indonesian/Tagalog daily words
(reported by CodeRabbit review on PR #149).
- Remove length filter from _load_word_file so native dictionary
  cross-reference works for grapheme-mode languages (Hindi/Bengali/Marathi)
- Add grapheme-aware length checks to test_supplement_words_are_5_letters
  and test_daily_words_are_5_letters for consistency
- Pass grapheme_mode through generate_config() in add_language.py
- Add proper kaikki.org source attribution to Yoruba and Uzbek SOURCES.md
- Fix SOURCES.md generator to include kaikki/Leipzig when relevant

Urdu "corrupted tokens" and Yoruba "missing tonal diacritics" were
verified as false positives — all entries are valid.
Apply English contamination filter + profanity blocklist to daily word
selection for all existing languages that have Leipzig Corpora or
kaikki.org native dictionary data.

Languages with Leipzig (15K-27K native dict words): de, fr, es, it, pt,
nl, sv, da, hu, pl, cs, ro, hr, sk, sl — precise filtering, 1-54 words
removed per language (only true contamination, no false positives).

Languages with kaikki-only: ca, et, nb, nn, eu, gl, lv, lt, is, mk, uk,
el, tr, bg — smaller native dicts, slightly more aggressive but still
accurate.

Hebrew and Arabic excluded (have their own curated quality pipelines).

All past daily words are protected by curated_schedule.txt freeze.
Profanity blocklist prevents slurs from appearing as daily answers.
…ngs; fix Leipzig

New languages:
- Hausa (ha): 5,325 words from Leipzig Corpora (was 435 kaikki-only)
- Punjabi (pa): 12,467 words from Leipzig, grapheme_mode (Gurmukhi script)

Improved existing:
- Yoruba (yo): 4,326 words (was 899 kaikki → Leipzig boosted)
- 25+ existing languages decontaminated with Leipzig + kaikki native dicts
  (de, fr, es, it, pt, nl, sv, da, hu, pl, cs, ro, hr, sk, sl, etc.)

Infrastructure:
- Fixed Leipzig Corpora download URLs (was appending -words.tar.gz, should be .tar.gz)
- Added Leipzig mappings for 28 languages including Punjabi
- EXTRA_SOURCES expanded to cover all existing languages for contamination filtering
Reverted daily_words changes for 12 languages where the native dictionary
was too small (<5K words) causing false positive removals:
- Spanish: "aldea" (village), "arroz" (rice), "antes" (before) wrongly removed
- Turkish: "asker" (soldier), "damar" (vein) wrongly removed
- Basque, Galician, Icelandic, Lithuanian, Latvian, Norwegian (both),
  Catalan, Estonian, Croatian — all reverted

Kept decontamination for 12 languages with large native dicts (>15K words):
cs, da, de, fr, hu, it, nl, pt, ro, sk, sl, sv — 1-34 legitimate removals each.

Lesson: contamination filter only reliable with Leipzig Corpora data (15K+ native words).
kaikki-only dictionaries are too small for cross-reference filtering.
Generate daily_words.txt using Leipzig Corpora newspaper frequency data
for languages that previously had no frequency ranking (random daily words):
- Bulgarian (bg): 2,000 daily, 58% frequency-matched
- Finnish (fi): 2,000 daily, 61% frequency-matched
- Hausa (ha): 2,000 daily, 93% frequency-matched
- Hindi (hi): 2,000 daily, 28% frequency-matched
- Punjabi (pa): 2,000 daily, 100% frequency-matched
- Polish (pl): 1,694 daily, 93% frequency-matched
- Yoruba (yo): 2,000 daily, 82% frequency-matched

Daily words are now ranked by real-world frequency from newspaper text,
meaning common everyday words appear first. Previously these languages
served random words from a shuffled list.

Also fixes: Leipzig download URLs (was appending -words.tar.gz suffix),
added Leipzig corpus mappings for 28 languages.
Bengali (bn): 2,000 daily words from Leipzig Wikipedia corpus (50% freq-matched)
Korean (ko): 2,000 daily words from Leipzig Wikipedia corpus (59% freq-matched)

These were previously using random word selection (shuffled list).
Now daily words start with common everyday words.

Total: 52 of 77 languages now have frequency-ranked daily words (was 38 before this PR).
… limits

Rename curated_schedule.txt to word_history.txt across all 77 languages
for clarity — these files freeze daily word selections to git.

Important safety note: word_history only covers post-migration days
(Jan 26 2026+). Legacy days (2021-2026) cannot be reliably recomputed
because some word lists changed since launch (e.g., Finnish was
re-curated on Jan 25 2026, changing the shuffle order for all 1,682
legacy days). Legacy days rely on Render's disk cache.

Also: added Leipzig corpus mappings for Bengali and Korean.
… 7 languages

Supplement expansion using Leipzig Corpora newspaper frequency data:
- 51 languages now have supplement word lists (was 42)
- +436,767 total new supplement words across all languages
- Biggest gains: Arabic +18K, Indonesian +17K, Bulgarian +15K,
  Persian +15K, Croatian +13K, Finnish +13K, Hungarian +13K
- This should significantly reduce the 47% "invalid word" rate

Re-applied decontamination for 7 languages (previously reverted):
- es (1 removed), tr (4), hr (5), ca (8), et (31), ar (0), sr (0)
- Now using Leipzig (15K-24K native dict words) for precise filtering
- No false positives like the previous attempt

Added Leipzig corpus mappings for 27 additional languages in download_sources.py.
Hindi: +34,810 supplement words from Leipzig
Bengali: +22,203 supplement words from Leipzig
Punjabi: +2,554 supplement words from Leipzig

Also added 27 new Leipzig corpus mappings in download_sources.py
for languages like Persian, Hebrew, Russian, Armenian, etc.

Grand total supplement expansion this PR: ~496K new valid guess words
across 54 languages. Should dramatically reduce invalid word rate.
… words

These words contain compound final consonants not typeable on the default
keyboard, and were added to ko_blocklist.txt in PR #155.
@Hugo0 Hugo0 force-pushed the worktree-add-languages branch from 1e0c8a8 to 6c51c61 Compare March 14, 2026 21:51
Hugo0 added 3 commits March 14, 2026 21:59
…ments

Finnish: reverted daily_words.txt (removed). Finnish was working great
with random selection (71% completion rate, #2 language). Don't fix what
isn't broken. Supplement expansion (+13K words) is kept.

Garbage filter: removed 454 obvious junk entries from supplements across
43 languages. Ultra-conservative — only catches:
- All-same-character words (aaaaa, ههههه, ннннн)
- 4+ consecutive identical characters (brrrr, ahhhh, hmmmm)
No real words affected. Verified across all 75+ languages.
Sourced from JMdict-simplified, scored by wordfreq frequency:
- 2,000 daily words (ja_5words.txt)
- 2,996 supplement words (ja_5words_supplement.txt)
- 78 hiragana characters
- Gojūon (五十音) keyboard layout with dakuten, handakuten, small kana

Each tile = one hiragana character. Proper nouns and grammatical
expressions filtered out. 125M speakers.
…l, etc.)

Added gmail, https, yahoo, email, login, tweet, click, skype to the
blocklist. These leaked from newspaper data and aren't real words.

Fixed 4 languages where we introduced these: pl, tl, ha, id.
Pre-existing junk in other languages (cs, da, fr, etc.) will be cleaned
on their next improve_word_lists.py process run.
@Hugo0 Hugo0 changed the title feat: add 10 new languages (1.67B speakers) with grapheme mode feat: add 13 new languages (2B+ speakers), Japanese, word quality pipeline, supplements expansion Mar 14, 2026
Hugo0 added 4 commits March 14, 2026 22:14
Expanded blocklist to 83 entries covering:
- Brands: tesla, apple, honda, volvo, pepsi, cisco, rolex, etc.
- Politicians: obama, trump, putin, biden
- Tech: mysql, macos, email, skype, troll, tweet, pixel
- Profanity: semen, sperm (missed earlier)

Source: FrequencyWords (OpenSubtitles) ranks these highly because they
appear frequently in movie subtitles, but they make terrible daily words.
Daily words must now be verified by at least one dictionary source
(kaikki/Leipzig/Hunspell/KBBI) to be eligible as daily answers. This
prevents subtitle-frequency junk (brand names, proper nouns, tech terms)
from ever becoming daily words.

Pipeline flow:
1. Score words by FrequencyWords frequency
2. Filter: blocklist, profanity, common names, Roman numerals
3. Filter: English contamination (cross-reference)
4. NEW: Dictionary verification — only keep words confirmed by a
   dictionary source (kaikki.org, Leipzig newspaper corpus, Hunspell)
5. Take top 2000

This is a structural fix at the pipeline level, not whack-a-mole with
blocklists. Words without dictionary verification remain valid guesses
(in main word list + supplement), just not daily answers.

Reprocessed 16 existing languages with the new gate.
Ranked by wordfreq frequency scores. Needs manual curation pass —
some proper nouns (country names in hiragana) and grammatical
phrases slipped through JMdict filtering.
- Require kanji forms (eliminates transliterations and grammatical phrases)
- Exclude all 'exp' POS entries (expressions like なのである, でしかない)
- Exclude proper nouns, archaic, vulgar, abbreviated entries
- Only include words with wordfreq frequency > 0
- Remove empty supplement (all words are in main list)
- Add ゔ, ゎ, ゜ to keyboard

Result: 21,584 main words, 2,000 daily words (frequency-ranked)
Top daily words: じょうほう (情報), せかいてき (世界的), せんりゃく (戦略)
Hugo0 added 2 commits March 14, 2026 22:49
Key changes:
1. process_language() now accepts Leipzig as fallback frequency source
   when FrequencyWords is unavailable. Languages like bg, pl, ha, yo
   now go through the SAME pipeline with all filters.

2. Fixed circular reference: when Leipzig IS the frequency source,
   it's excluded from the native dictionary for contamination filtering.
   This prevents English code-switching in African newspapers from
   being treated as "dictionary-verified" native words.

3. batch command auto-discovers all processable languages instead of
   using a hardcoded priority list. Any language with FrequencyWords
   OR Leipzig data is included.

4. EXCLUDE set now allows Leipzig-sourced processing (bg, pl, ko
   were excluded from FrequencyWords but can use Leipzig).

Before: two separate code paths — improve_word_lists.py for FrequencyWords
languages, ad-hoc scripts for Leipzig languages. Different filtering.
After: one pipeline, consistent filtering for all.

Impact: Hausa/Yoruba daily words cleaned (video/music/beach/north removed).
Bulgarian/Polish daily words now go through dictionary verification gate.
Comprehensive design doc covering:
- Single words.yaml per language replacing 5 current files
- Per-word metadata (tier, frequency, difficulty, LLM scores, flags)
- Pipeline stages (source → normalize → score → curate → compile → freeze)
- Multi-mode support (4-10 letter, phrase, unlimited, multi-board)
- LLM curation integration
- Community contribution workflow
- Migration strategy aligned with Nuxt refactor
@Hugo0 Hugo0 changed the title feat: add 13 new languages (2B+ speakers), Japanese, word quality pipeline, supplements expansion feat: add 13 new languages (2B+ speakers), unified pipeline, word quality infrastructure Mar 14, 2026
@Hugo0 Hugo0 merged commit 23ecb5a into main Mar 14, 2026
4 checks passed
@Hugo0 Hugo0 deleted the worktree-add-languages branch April 15, 2026 17:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant