ask-handoff

Add Marathi Gujarati Malayalam Kannada (ISO + i18n)

slug ticket-108408-indic-languages project asksuite-control+asksuite-generic-bot source cursor updated 10/29/2026, 12:18:37 PM

Add mr/gu/ml/kn languages — Implementation Plan

Goal: Register Marathi, Gujarati, Malayalam, Kannada in Control + generic-bot phrases so Ocean Palms Goa can enable them. Task: TICKET-108408 Handoff: 108408 Spec: none — human confirmed ISO codes + i18n-cli translations Architecture: Same playbook as TICKET-62995 (Tamil) / TICKET-106998 (uz/kk): Control LanguageTypes + lead-field DTO + translates index evolution; generic-bot locale/<iso>.json + LanguageUtils. Company enable + languages table seed remain ops after deploy. Tech: Java Play Control; Node generic-bot i18n JSON; Google Translate via i18n-cli-translator Test layout: Control — LanguageTypesTest (JUnitParams, auto-covers new enum names). Generic-bot — existing unit tests if any touch LanguageUtils; smoke via locale file presence + configure list includes codes. Global Constraints:

  • Codes: mr, gu, ml, kn (world ISO, Indic short form like ta/hi)
  • Translations via i18n-cli-translator (no hand-written locale bodies)
  • Worktrees under /home/asksuite/Documentos/.agent-worktrees/{asksuite-control,asksuite-generic-bot}/ticket-108408
  • No commit/push; no DB seed in this PR unless evolution indexes only
  • TDD: LanguageTypes resolve red/green via existing parametrized test after enum+resolve

Architecture note

Rejected cheaper options: company-only toggle (codes missing from enum); sophia-bot-only (phrases live in generic-bot).

Task 1: Control LanguageTypes + resolve + evolution indexes

Files:

  • Modify: app/models/asksuiteTypes/LanguageTypes.java
  • Create: conf/evolutions/default/<N>.sql (N = next after origin master)
  • Test: test/models/tests/LanguageTypesTest.java (existing)

Acceptance:

  • Enum entries MARATHI(mr), GUJARATI(gu), MALAYALAM(ml), KANNADA(kn)
  • resolve startsWith mr/gu/ml/kn
  • Evolution creates btree indexes on translates for those keys
  • LanguageTypesTest passes for new names

TDD:

  • Red: add enum without resolve → test fails for new names
  • Green: add resolve branches
  • Verify: project JUnit for LanguageTypesTest (or compile-level assert resolve in shell if full suite heavy)

Risk: mech

Task 2: Control lead-field translations via i18n

Files:

  • Modify: app/helper/DefaultLeadFieldTranslationHelper.java
  • Scratch: temp JSON en→mr/gu/ml/kn then inline DTO blocks (scratch not committed)

Acceptance:

  • Four languages.add(... setIdentifier("mr"|"gu"|"ml"|"kn") ...) blocks with i18n-translated labels mirroring Tamil field set

TDD:

  • Red/Green: structural — identifiers present; spot-check non-ASCII script in values
  • Verify: rg 'setIdentifier\("(mr|gu|ml|kn)"\)' DefaultLeadFieldTranslationHelper.java

Risk: mech

Task 3: Generic-bot locale JSON via i18n + LanguageUtils

Files:

  • Create: src/locale/mr.json, gu.json, ml.json, kn.json
  • Modify: src/util/LanguageUtils.ts

Acceptance:

  • New locales filled from en (or pt-br) via i18n-cli-translator
  • Import + languagesFiles entries for mr/gu/ml/kn
  • Key parity ~same count as en.json

TDD:

  • Red: empty target files / missing LanguageUtils entries
  • Green: CLI fill + LanguageUtils wiring
  • Verify: node -e key counts; dry-run leftover 0 missing

Risk: integ (API key / translation quality)

Verify

# Control worktree
# run LanguageTypesTest if gradle/sbt available; else assert resolve via jshell/manual

# Generic-bot worktree
python3 ~/.cursor/skills/i18n-cli-translator/scripts/translate_i18n.py \
  --i18n-dir src/locale --source en --targets mr gu ml kn --dry-run

Smoke (human / ops)

Enable mr/gu/ml/kn on ocean-palms-goa after deploy + ensure languages rows exist in Control UI.