| 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?'." |
| ) |
|
|