Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
227 changes: 227 additions & 0 deletions data/urdu_islamic_terms.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
{
"version": "1.0.0",
"language": "ur",
"description": "Curated core Islamic terminology for Urdu query processing.",
"terms": [
{
"id": "ur-ibadat-salah",
"urdu_term": "نماز",
"arabic_original": "صلاة",
"transliteration": "namaz / salah",
"english_equivalent": "ritual prayer",
"category": "ibadat",
"definition_ur": "روزانہ مقررہ اوقات میں ادا کی جانے والی فرض عبادت۔",
"variants": ["صلوٰۃ", "صلاۃ", "صلاح", "salah", "salat", "namaz"]
},
{
"id": "ur-ibadat-wudu",
"urdu_term": "وضو",
"arabic_original": "وضوء",
"transliteration": "wudu",
"english_equivalent": "ritual ablution",
"category": "ibadat",
"definition_ur": "نماز وغیرہ کے لیے مقررہ طریقے سے حاصل کی جانے والی طہارت۔",
"variants": ["وضوء", "وضو کرنا", "wudu", "wudhu"]
},
{
"id": "ur-ibadat-fasting",
"urdu_term": "روزہ",
"arabic_original": "صوم",
"transliteration": "roza / sawm",
"english_equivalent": "fasting",
"category": "ibadat",
"definition_ur": "نیت کے ساتھ فجر سے غروب آفتاب تک مفطرات سے رکنا۔",
"variants": ["صوم", "صیام", "roza", "sawm", "siyam"]
},
{
"id": "ur-ibadat-zakat",
"urdu_term": "زکوٰۃ",
"arabic_original": "زكاة",
"transliteration": "zakat",
"english_equivalent": "obligatory almsgiving",
"category": "ibadat",
"definition_ur": "شرائط پوری ہونے پر مال کا مقررہ حصہ مستحقین کو دینا۔",
"variants": ["زکات", "زکاۃ", "زكاة", "zakat", "zakah"]
},
{
"id": "ur-ibadat-hajj",
"urdu_term": "حج",
"arabic_original": "حج",
"transliteration": "hajj",
"english_equivalent": "pilgrimage to Makkah",
"category": "ibadat",
"definition_ur": "استطاعت رکھنے والے مسلمان کا مقررہ ایام میں بیت اللہ کا شرعی حج۔",
"variants": ["حج بیت اللہ", "hajj"]
},
{
"id": "ur-quran-quran",
"urdu_term": "قرآن مجید",
"arabic_original": "القرآن الكريم",
"transliteration": "Quran Majid",
"english_equivalent": "the Noble Quran",
"category": "quran",
"definition_ur": "اللہ تعالیٰ کی آخری نازل کردہ کتاب۔",
"variants": ["قرآن", "قران", "قرآن کریم", "القرآن", "Quran", "Qur'an"]
},
{
"id": "ur-quran-tafsir",
"urdu_term": "تفسیر",
"arabic_original": "تفسير",
"transliteration": "tafsir",
"english_equivalent": "Quranic exegesis",
"category": "quran",
"definition_ur": "قرآن مجید کے معانی اور مطالب کی علمی وضاحت۔",
"variants": ["تفسير", "tafsir"]
},
{
"id": "ur-hadith-hadith",
"urdu_term": "حدیث",
"arabic_original": "حديث",
"transliteration": "hadith",
"english_equivalent": "Prophetic narration",
"category": "hadith",
"definition_ur": "رسول اللہ ﷺ کے اقوال، افعال، تقریرات یا اوصاف کی روایت۔",
"variants": ["حديث", "احادیث", "hadith", "hadees"]
},
{
"id": "ur-hadith-sunnah",
"urdu_term": "سنت",
"arabic_original": "سنة",
"transliteration": "sunnah",
"english_equivalent": "Prophetic practice",
"category": "hadith",
"definition_ur": "رسول اللہ ﷺ کا منقول طریقہ اور تعلیم۔",
"variants": ["سنۃ", "سنة", "sunnah", "sunna"]
},
{
"id": "ur-fiqh-fiqh",
"urdu_term": "فقہ",
"arabic_original": "فقه",
"transliteration": "fiqh",
"english_equivalent": "Islamic jurisprudence",
"category": "fiqh",
"definition_ur": "تفصیلی دلائل سے عملی شرعی احکام جاننے کا علم۔",
"variants": ["فقه", "fiqh"]
},
{
"id": "ur-fiqh-fatwa",
"urdu_term": "فتویٰ",
"arabic_original": "فتوى",
"transliteration": "fatwa",
"english_equivalent": "formal legal opinion",
"category": "fiqh",
"definition_ur": "کسی شرعی سوال پر اہل علم کی مدلل رائے۔",
"variants": ["فتوی", "فتوى", "فتاویٰ", "fatwa"]
},
{
"id": "ur-fiqh-shariah",
"urdu_term": "شریعت",
"arabic_original": "شريعة",
"transliteration": "shariah",
"english_equivalent": "Islamic revealed law and way",
"category": "fiqh",
"definition_ur": "اسلام کا الٰہی ہدایت پر مبنی مجموعی طریقۂ زندگی۔",
"variants": ["شریعہ", "شريعة", "sharia", "shariah"]
},
{
"id": "ur-fiqh-hanafi",
"urdu_term": "فقہ حنفی",
"arabic_original": "المذهب الحنفي",
"transliteration": "Hanafi fiqh",
"english_equivalent": "Hanafi school of jurisprudence",
"category": "fiqh",
"definition_ur": "امام ابو حنیفہؒ سے منسوب اہل سنت کا فقہی مذہب۔",
"variants": ["حنفی", "مذہب حنفی", "Hanafi"]
},
{
"id": "ur-belief-tawhid",
"urdu_term": "توحید",
"arabic_original": "توحيد",
"transliteration": "tawhid",
"english_equivalent": "oneness of Allah",
"category": "aqidah",
"definition_ur": "اللہ تعالیٰ کو ذات، صفات اور عبادت میں یکتا ماننا۔",
"variants": ["توحيد", "tawhid", "tauheed"]
},
{
"id": "ur-belief-aqidah",
"urdu_term": "عقیدہ",
"arabic_original": "عقيدة",
"transliteration": "aqidah",
"english_equivalent": "creed or belief",
"category": "aqidah",
"definition_ur": "دین کے بنیادی ایمانی تصورات اور پختہ اعتقادات۔",
"variants": ["عقیدۂ", "عقائد", "عقيدة", "aqidah", "aqeedah"]
},
{
"id": "ur-ethics-taqwa",
"urdu_term": "تقویٰ",
"arabic_original": "تقوى",
"transliteration": "taqwa",
"english_equivalent": "God-consciousness",
"category": "akhlaq",
"definition_ur": "اللہ کی جواب دہی کا شعور رکھتے ہوئے گناہ سے بچنا۔",
"variants": ["تقوی", "تقوى", "taqwa"]
},
{
"id": "ur-ethics-sabr",
"urdu_term": "صبر",
"arabic_original": "صبر",
"transliteration": "sabr",
"english_equivalent": "patience and steadfastness",
"category": "akhlaq",
"definition_ur": "اطاعت، مصیبت اور گناہ سے اجتناب میں ثابت قدمی۔",
"variants": ["sabr"]
},
{
"id": "ur-ethics-dua",
"urdu_term": "دعا",
"arabic_original": "دعاء",
"transliteration": "dua",
"english_equivalent": "supplication",
"category": "ibadat",
"definition_ur": "اللہ تعالیٰ سے حاجت اور مدد طلب کرنا۔",
"variants": ["دعاء", "دُعا", "dua", "du'a"]
},
{
"id": "ur-family-nikah",
"urdu_term": "نکاح",
"arabic_original": "نكاح",
"transliteration": "nikah",
"english_equivalent": "Islamic marriage contract",
"category": "family",
"definition_ur": "مرد اور عورت کے درمیان شرعی عقد ازدواج۔",
"variants": ["نكاح", "nikah", "nikaah"]
},
{
"id": "ur-family-talaq",
"urdu_term": "طلاق",
"arabic_original": "طلاق",
"transliteration": "talaq",
"english_equivalent": "divorce",
"category": "family",
"definition_ur": "شرعی طریقے سے نکاح ختم کرنے کا عمل، جس کے احکام تفصیلی ہیں۔",
"variants": ["talaq", "divorce"]
},
{
"id": "ur-honorific-allah",
"urdu_term": "اللہ تعالیٰ",
"arabic_original": "الله تعالى",
"transliteration": "Allah Ta'ala",
"english_equivalent": "Allah, the Exalted",
"category": "honorific",
"definition_ur": "اللہ کے نام کے ساتھ ادب و تعظیم کا معروف اسلوب۔",
"variants": ["اللہ", "الله", "اللہ تعالٰی", "Allah"]
},
{
"id": "ur-honorific-prophet",
"urdu_term": "رسول اللہ ﷺ",
"arabic_original": "رسول الله صلى الله عليه وسلم",
"transliteration": "Rasul Allah, sallallahu alayhi wa sallam",
"english_equivalent": "Messenger of Allah, peace and blessings be upon him",
"category": "honorific",
"definition_ur": "نبی کریم محمد ﷺ کے ذکر کا باادب اسلوب۔",
"variants": ["رسول اللہ", "نبی کریم ﷺ", "حضرت محمد ﷺ", "صلی اللہ علیہ وسلم", "PBUH"]
}
]
}
75 changes: 75 additions & 0 deletions tests/test_urdu_processor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
"""Offline tests for Urdu normalization, terminology, and mixed-script processing."""

from fastapi.testclient import TestClient
from fastapi import FastAPI

from urdu_processor import (
analyze_script,
extract_islamic_terms,
normalize_urdu,
process_urdu,
router,
tokenize_urdu,
transliterate_urdu,
)


def test_normalizes_arabic_keyboard_variants_and_nastaliq_spacing() -> None:
assert normalize_urdu(" زكاة\u200c كي حكم؟ ") == "زکاۃ کی حکم؟"


def test_diacritics_are_preserved_by_default_and_optionally_removed() -> None:
text = "قُرْآن"
assert "ُ" in normalize_urdu(text)
assert normalize_urdu(text, preserve_diacritics=False) == "قرآن"


def test_multiword_islamic_terms_are_single_tokens() -> None:
tokens = tokenize_urdu("فقہ حنفی میں زکوٰۃ کا حکم")
assert tokens[0].text == "فقہ حنفی"
assert tokens[0].kind == "islamic_term"
assert tokens[0].term_id == "ur-fiqh-hanafi"


def test_recognizes_urdu_arabic_and_latin_variants_without_duplicates() -> None:
terms = extract_islamic_terms("وضو اور wudu کے بعد نماز salah")
ids = [term.id for term in terms]
assert ids.count("ur-ibadat-wudu") == 1
assert ids.count("ur-ibadat-salah") == 1


def test_mixed_script_profile() -> None:
profile = analyze_script("زکوٰۃ nisab 2.5%")
assert profile.mixed_script is True
assert profile.dominant_script == "mixed"
assert profile.urdu_arabic_characters > 0
assert profile.latin_characters > 0


def test_curated_transliteration_is_preferred_for_terms() -> None:
result = transliterate_urdu("زکوٰۃ اور نماز")
assert "zakat" in result
assert "namaz / salah" in result


def test_full_analysis_supplies_urdu_generation_and_citation_guidance() -> None:
result = process_urdu("Quran میں صبر کے متعلق کیا حکم ہے؟")
assert result.normalized_text
assert result.script_profile.mixed_script is True
assert any(term.id == "ur-quran-quran" for term in result.recognized_terms)
assert "قرآنی آیات" in result.generation_guidance
assert "حوالہ" in result.generation_guidance


def test_router_process_and_term_search() -> None:
app = FastAPI()
app.include_router(router)
client = TestClient(app)

processed = client.post("/urdu/process", json={"text": "نماز اور وضو"})
assert processed.status_code == 200
assert len(processed.json()["recognized_terms"]) == 2

searched = client.get("/urdu/terms", params={"query": "tawhid"})
assert searched.status_code == 200
assert searched.json()[0]["id"] == "ur-belief-tawhid"
Loading
Loading