Internationalization · AI-Accelerated

Six languages.
Six weeks.

The plumbing already half-exists — translation files, a locale field on every user, a language-aware speech stack. What's missing is the wiring. With AI tooling doing the mechanical work (string extraction, draft translation, keyword sets, test sweeps) and humans doing the judgement work (native review, cultural fit), the classical 12–17 week estimate compresses to an aggressive ~6 week programme — Korean included, since it rides the same CJK workstream as Japanese and already has self-hosted voice support.

ES · Week 2

Spanish

Latin script · es.json already 34% done · exercises the whole pipeline first

Voice: MeloTTS ES
FR · Week 3

French

Latin script · plural rules + punctuation spacing (« », espaces insécables)

Voice: MeloTTS FR
FIL · Week 3

Tagalog

Latin script · Taglish code-switching needs blended keyword sets

Voice: text-first launch
JA · Week 4–5

Japanese

CJK fonts + kinsoku line-breaking · family-name-first audit · kuromoji search

Voice: MeloTTS JA
KO · Week 4–5

Korean

Hangul — alphabetic with spaces · shares the CJK workstream with Japanese · nori search

Voice: MeloTTS KR
TH · Week 5–6

Thai

No word spaces — segmentation for wrapping & search · Buddhist-era dates optional

Voice: text-first launch
01The Programme

Six weeks, overlapping workstreams

Languages don't queue behind each other — once the foundation lands in week 2, translation, review, and language-specific engineering run in parallel lanes.

gantt
    title AI-Accelerated Multilingual Rollout
    dateFormat  YYYY-MM-DD
    axisFormat  W%W
    section Foundation
    ngx-translate wiring + language picker       :crit, f1, 2026-06-15, 4d
    AI string extraction (~250 strings)          :crit, f2, 2026-06-15, 5d
    Backend message catalogs (notif + email)     :crit, f3, 2026-06-18, 6d
    signalReason -> key+params migration         :crit, f4, 2026-06-18, 4d
    Locale plumbing (Whisper / Claude / TTS)     :f5, 2026-06-22, 4d
    section Spanish
    LLM draft + native review (es)               :active, s1, 2026-06-19, 6d
    QA sweep + launch ES                         :milestone, s2, 2026-06-26, 0d
    section French + Tagalog
    LLM drafts + native review (fr, fil)         :ft1, 2026-06-25, 6d
    Taglish keyword sets                         :ft2, 2026-06-29, 3d
    Launch FR + FIL (text-first fil)             :milestone, ft3, 2026-07-03, 0d
    section Japanese + Korean
    Name-order audit + CJK fonts + kinsoku       :j1, 2026-06-29, 5d
    kuromoji (ja) + nori (ko) search analyzers   :j2, 2026-07-02, 3d
    LLM draft + native review (ja, ko)           :j3, 2026-07-02, 6d
    Launch JA + KO                               :milestone, j4, 2026-07-10, 0d
    section Thai
    Segmentation + fonts + thai analyzer         :t1, 2026-07-06, 5d
    LLM draft + native review (th)               :t2, 2026-07-08, 5d
    Launch TH (text-first)                       :milestone, t3, 2026-07-17, 0d
    section Always-on
    Legal translations (privacy / ToS)           :l1, 2026-06-19, 18d
    Pseudo-locale + AI screenshot QA             :l2, 2026-06-22, 19d
        

Classical estimate

12–17 wks

Manual string extraction, agency translation rounds, sequential language launches.

AI-accelerated

~6 wks

AI does the mechanical 80%; native reviewers approve rather than produce. Languages overlap.

02Where AI Buys the Speed

The mechanical 80% is automatable

Each accelerator replaces a traditionally slow, human-serial task. Humans stay in the loop exactly where judgement matters: native review and cultural fit.

3 WKS → 4 DAYS

String extraction

Claude Code sweeps all ~75 pages and 31 components, extracting hardcoded strings into structured en.json keys and rewriting templates to the translate pipe — mechanically consistent, reviewed per PR.

4 WKS → 3 DAYS / LANG

Draft translation

LLM translates the full catalog (app strings, notifications, emails) with brand-glossary constraints. Native speakers review and correct — approving is 5–10x faster than translating.

2 WKS → 2 DAYS

Keyword & data sets

Interest-signal keywords, ad category labels, and exclusion dictionaries generated per language (including Taglish blends), validated against native review.

CONTINUOUS

Screenshot QA

Headless renders of every screen per locale; an AI pass flags truncation, overflow, untranslated strings, and font fallbacks before human QA ever looks.

03The Pipeline

From hardcoded string to shipped language

flowchart LR
    A["Hardcoded English
~250 strings, 150+ notifications,
10+ emails"] --> B["AI extraction
keys + params into en.json
+ backend catalogs"] B --> C["LLM draft
per language, brand
glossary enforced"] C --> D{"Native review
approve / correct"} D -->|approved| E["Merge locale files
es · fr · fil · ja · ko · th"] D -->|corrections| C E --> F["AI screenshot QA
overflow · truncation ·
untranslated keys"] F --> G(["Ship behind
language picker"]) style A fill:#14262a,stroke:#8aa6a0,color:#e8f4f0 style B fill:#14262a,stroke:#34d399,color:#e8f4f0 style C fill:#14262a,stroke:#34d399,color:#e8f4f0 style D fill:#0e3b2e,stroke:#4ade80,stroke-width:2px,color:#e8f4f0 style E fill:#14262a,stroke:#34d399,color:#e8f4f0 style F fill:#14262a,stroke:#34d399,color:#e8f4f0 style G fill:#0e3b2e,stroke:#4ade80,stroke-width:2px,color:#e8f4f0

One blocking data fix rides in the foundation: InterestPrompt.signalReason is stored in DynamoDB as an English string — it becomes a key + params so prompts render in the viewer's language.

04One Setting, Everywhere

How user.locale flows through the platform

The locale field already exists on every user — today nothing reads it. After the foundation phase, one setting drives every surface.

flowchart TD
    U["🌐 Language picker
Settings → user.locale
(synced to backend)"] U --> APP["App strings
ngx-translate locale JSON files"] U --> FMT["Dates · numbers · plurals
Angular locale data
es / fr / fil / ja / ko / th"] U --> N["Notifications + emails
recipient-locale catalogs
(Grandma gets Tagalog even
when the actor is English)"] U --> AI["AI stack"] AI --> W["Whisper STT
language param wired
(all 6 supported)"] AI --> C["Sage chat (Claude)
'respond in {language}'
in system prompt"] AI --> T{"Voice synthesis"} T -->|es · fr · ja · ko| T1["MeloTTS + OpenVoice
voice chat day one"] T -->|fil · th| T2["Text-first launch
voice deferred / fallback"] U --> S["Search
kuromoji (ja) · nori (ko) · thai
for transcripts + content"] style U fill:#0e3b2e,stroke:#4ade80,stroke-width:2px,color:#e8f4f0 style APP fill:#14262a,stroke:#34d399,color:#e8f4f0 style FMT fill:#14262a,stroke:#34d399,color:#e8f4f0 style N fill:#14262a,stroke:#34d399,color:#e8f4f0 style AI fill:#14262a,stroke:#34d399,color:#e8f4f0 style W fill:#14262a,stroke:#34d399,color:#e8f4f0 style C fill:#14262a,stroke:#34d399,color:#e8f4f0 style T fill:#14262a,stroke:#34d399,color:#e8f4f0 style T1 fill:#0e3b2e,stroke:#34d399,color:#e8f4f0 style T2 fill:#14262a,stroke:#fbbf24,color:#fde68a style S fill:#14262a,stroke:#34d399,color:#e8f4f0
05Launch Gates

What "shipped" means per language

flowchart LR
    G1["✅ 100% catalog
native-reviewed"] --> G2["✅ Screens pass
AI + human QA"] G2 --> G3["✅ Notifications + emails
in recipient locale"] G3 --> G4["✅ Privacy + ToS
translated"] G4 --> G5(["🚀 Language visible
in picker"]) style G1 fill:#14262a,stroke:#34d399,color:#e8f4f0 style G2 fill:#14262a,stroke:#34d399,color:#e8f4f0 style G3 fill:#14262a,stroke:#34d399,color:#e8f4f0 style G4 fill:#14262a,stroke:#34d399,color:#e8f4f0 style G5 fill:#0e3b2e,stroke:#4ade80,stroke-width:2px,color:#e8f4f0

Voice/video Sage chat is an explicit non-gate for Tagalog and Thai — text chat works in all six languages on day one; voice follows when the self-hosted TTS gains those languages.

Why this matters Families span languages. The Manila grandmother, the Paris cousin, and the Bangkok uncle belong in the same bubble — each seeing the same memories in their own words.