FlutIQ / app /data /languages.py
kredd25's picture
feature: multi-language dossier (es, zh, vi, ht, ar, tl)
f9386fc
"""
Languages we expose for the dossier.
Selection rationale: the six non-English languages here cover roughly
80% of non-English-speaking households in US flood-prone metros
(USCB ACS 2022 home-language statistics).
The advisor and risk agents translate user-facing copy into the
chosen language. Product names ("NFIP flood insurance", "Sewer /
water-backup endorsement") and external resource names stay in
English on purpose — those are the strings the homeowner needs to
say or search to actually buy the product.
"""
# Each entry: code → (English label, native label, full English name
# for the prompt directive)
LANGUAGES: dict[str, tuple[str, str, str]] = {
"en": ("English", "English", "English"),
"es": ("Spanish", "Español", "Spanish (Latin American)"),
"zh": ("Mandarin", "中文", "Mandarin Chinese (Simplified)"),
"vi": ("Vietnamese", "Tiếng Việt", "Vietnamese"),
"ht": ("Haitian Creole", "Kreyòl ayisyen", "Haitian Creole"),
"ar": ("Arabic", "العربية", "Arabic"),
"tl": ("Tagalog", "Tagalog", "Tagalog"),
}
def normalize(code: str | None) -> str:
"""Coerce a possibly-stale or unknown code to a supported one."""
if not code:
return "en"
code = code.lower().split("-")[0] # 'es-MX' → 'es'
return code if code in LANGUAGES else "en"
def prompt_directive(code: str) -> str:
"""The string to inject into a system/user prompt to set output language."""
code = normalize(code)
if code == "en":
return ""
name = LANGUAGES[code][2]
return (
f"\n\nIMPORTANT: write ALL user-facing copy in {name}. This includes "
f"summary, rationale, descriptions, narrative paragraphs, and bullet "
f"text. Do NOT translate: official product names (e.g. \"NFIP flood "
f"insurance\", \"Sewer / water-backup endorsement\"), proper nouns, "
f"URLs, phone numbers, dollar amounts, or technical codes (e.g. "
f"\"FEMA Zone X\", \"AEP\"). Keep JSON keys in English."
)