import re PIDGIN_MARKER_PATTERN = re.compile( r"\b(wetin|dey|una|abi|sabi|chop|waka|pikin|dem|wey|na)\b" r"|make we|no dey|no be|e go|i no|you no", re.IGNORECASE, ) STANDARD_ENGLISH_PATTERN = re.compile( r"\b(what|why|where|when|how|please|because|cannot|can't|don't|doesn't|should|would|could|will|are|is|am|have|has)\b", re.IGNORECASE, ) def _normalize_label(label): return str(label or "").strip().lower() def is_nigerian_pidgin_label(label): value = _normalize_label(label) return "naija" in value or ("nigerian" in value and "pidgin" in value) def is_nigerian_english_label(label): value = _normalize_label(label) return "nigerian english" in value and not is_nigerian_pidgin_label(value) def nigerian_variety_instruction(source_dialect="", target_dialect=""): source_is_relevant = is_nigerian_pidgin_label(source_dialect) or is_nigerian_english_label(source_dialect) target_is_relevant = is_nigerian_pidgin_label(target_dialect) or is_nigerian_english_label(target_dialect) if not source_is_relevant and not target_is_relevant: return "" return ( "NIGERIAN VARIETY BOUNDARY:\n" "- Nigerian English and Nigerian Pidgin English / Naija Pidgin are separate varieties, not interchangeable labels.\n" "- Nigerian English is a recognized World English variety. Use Nigerian English lexical, pragmatic, and cultural flavor while keeping English grammar; do not use core Naija Pidgin grammar markers such as 'wetin', 'dey', 'una', 'abi', 'na', 'abeg', or 'make we' unless the source is quoting them.\n" "- Nigerian Pidgin English / Naija Pidgin is an English-lexifier pidgin/creole continuum. Use Naija Pidgin grammar and discourse markers naturally; do not normalize it into Nigerian English or Standard English.\n" "- If the target is Nigerian English, avoid Naija Pidgin grammar. If the target is Nigerian Pidgin English, do not output polished Nigerian English." ) def nigerian_variety_retry_reason(translated, target_dialect): text = str(translated or "").strip() if not text: return "" if is_nigerian_english_label(target_dialect) and PIDGIN_MARKER_PATTERN.search(text): return "Target is Nigerian English, but the output contains Naija Pidgin markers." word_count = len(re.findall(r"[A-Za-z']+", text)) if ( is_nigerian_pidgin_label(target_dialect) and word_count >= 4 and not PIDGIN_MARKER_PATTERN.search(text) and STANDARD_ENGLISH_PATTERN.search(text) ): return "Target is Nigerian Pidgin English, but the output looks like Nigerian/Standard English without Naija Pidgin grammar." return "" def nigerian_variety_retry_prompt(text, source_dialect, target_dialect, translated, reason): return f""" The previous output crossed a Nigerian variety boundary. Reason: {reason} Source variety: {source_dialect} Target variety: {target_dialect} Source utterance: "{text}" Previous output: "{translated}" Rewrite the output ONLY in the requested target variety. {nigerian_variety_instruction(source_dialect, target_dialect)} """ def hausa_variety_instruction(source_dialect="", target_dialect=""): labels = f"{source_dialect} {target_dialect}".lower() if not any(token in labels for token in ("hausa", "kano", "katsina", "sokoto", "zaria")): return "" return ( "HAUSA LEXICAL AND HONORIFIC GUARDRAIL:\n" "- Preserve Hausa honorific gender and social role carefully.\n" "- 'malama' or 'mallama' means ma'am, madam, or female teacher; never translate it as sir, friend, bro, or guy.\n" "- 'malam' means sir, male teacher, or learned man; do not confuse it with 'malama'.\n" "- 'ina kwana?' is a morning greeting close to 'good morning' or 'how did you wake/sleep?'; keep the greeting natural for the target dialect.\n" "- When translating into English or Nigerian English, prefer respectful forms such as 'Good morning, ma'am' when the source says 'ina kwana, malama?'." )