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 liketa/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) resolvestartsWith mr/gu/ml/kn- Evolution creates btree indexes on translates for those keys
LanguageTypesTestpasses 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(orpt-br) via i18n-cli-translator - Import +
languagesFilesentries 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 -ekey 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.