Menu ▾ ▴

#138 Localize the landing page into 10 languages

closed
nobody
None
2026-07-17
2026-07-17
Anonymous
No

Originally created by: kristofferR

Adds a dependency-free internationalization layer to the landing page (docs/index.html), live at https://kristofferr.github.io/Carrier/ after merge.

Languages

English, Vietnamese, Portuguese (BR), Spanish, French, Thai, Filipino, Polish, Norwegian, Arabic — chosen for Messenger's largest markets (Vietnam, Brazil, Mexico/LatAm, France, Thailand, the Philippines, Poland, the Nordics, Egypt/MENA).

What's localized

  • 132 keyed strings per locale — hero, features, the full FAQ (friendly + technical), downloads, footer, and the app-window replica's chat.
  • Cultural recasting, not just translation — each locale's fictional chat cast gets local names and relationships (Mẹ / Mãe / Mamá / Maman / แม่ / Nanay / Mama / Mamma / ماما), and the conversations are adapted (Sunday family dinner, a puppy announcement, the grandmother's tomato garden, a locale-appropriate dessert on the way — brigadeiro, flan, basbousa, sernik…).
  • Per-locale profile photos — 70 AI-generated portraits of fictional people authentic to each culture, under docs/avatars/{locale}/.
  • RTL for Arabic — the page mirrors (dir="rtl"); the app-window replica deliberately stays LTR like a real macOS screenshot, with bidi-aware text so Arabic content still reads right-to-left inside it.

How it works

A language picker in the nav, navigator.language auto-detection (with pt→pt-BR, no→nb, tl→fil fallbacks) and localStorage persistence. Still a single self-contained file — locale dictionaries are inlined; only the per-locale avatar webps are separate assets. The notification simulation, OS/architecture-aware download selection, and all accessible names (language/theme/preview controls, nav landmarks, hero icon alt) re-localize on language change.

Review notes

Ran five local crq preflight rounds; addressed every finding — architecture-specific download labels now reapply after locale changes, the notification-toast clone is translated per locale, the unread preview's timestamp localizes (including under reduced-motion), and all page-level aria-label/alt strings localize. A final confirmatory preflight could not complete (review service errors), so fleet auto-review is left enabled for this PR.

Related

Tickets: #125
Tickets: #127
Tickets: #139

Discussion

  • Anonymous

    Anonymous - 2026-07-17

    Originally posted by: kristofferR

    @coderabbitai review

     
  • Anonymous

    Anonymous - 2026-07-17

    Originally posted by: coderabbitai[bot]

    ✅ Action performed Review finished. > Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.
     
  • Anonymous

    Anonymous - 2026-07-17

    Originally posted by: coderabbitai[bot]

    [!IMPORTANT]

    Review skipped

    Review was skipped as selected files did not have any reviewable changes.


    💤 Files selected but had no reviewable changes (71)

    • docs/avatars/ar/alex.webp
    • docs/avatars/ar/ben.webp
    • docs/avatars/ar/dad.webp
    • docs/avatars/ar/maya.webp
    • docs/avatars/ar/mom.webp
    • docs/avatars/ar/nana.webp
    • docs/avatars/ar/sam.webp
    • docs/avatars/en/alex.webp
    • docs/avatars/en/ben.webp
    • docs/avatars/en/dad.webp
    • docs/avatars/en/maya.webp
    • docs/avatars/en/mom.webp
    • docs/avatars/en/nana.webp
    • docs/avatars/en/sam.webp
    • docs/avatars/es/alex.webp
    • docs/avatars/es/ben.webp
    • docs/avatars/es/dad.webp
    • docs/avatars/es/maya.webp
    • docs/avatars/es/mom.webp
    • docs/avatars/es/nana.webp
    • docs/avatars/es/sam.webp
    • docs/avatars/fil/alex.webp
    • docs/avatars/fil/ben.webp
    • docs/avatars/fil/dad.webp
    • docs/avatars/fil/maya.webp
    • docs/avatars/fil/mom.webp
    • docs/avatars/fil/nana.webp
    • docs/avatars/fil/sam.webp
    • docs/avatars/fr/alex.webp
    • docs/avatars/fr/ben.webp
    • docs/avatars/fr/dad.webp
    • docs/avatars/fr/maya.webp
    • docs/avatars/fr/mom.webp
    • docs/avatars/fr/nana.webp
    • docs/avatars/fr/sam.webp
    • docs/avatars/nb/alex.webp
    • docs/avatars/nb/ben.webp
    • docs/avatars/nb/dad.webp
    • docs/avatars/nb/maya.webp
    • docs/avatars/nb/mom.webp
    • docs/avatars/nb/nana.webp
    • docs/avatars/nb/sam.webp
    • docs/avatars/pl/alex.webp
    • docs/avatars/pl/ben.webp
    • docs/avatars/pl/dad.webp
    • docs/avatars/pl/maya.webp
    • docs/avatars/pl/mom.webp
    • docs/avatars/pl/nana.webp
    • docs/avatars/pl/sam.webp
    • docs/avatars/pt-BR/alex.webp
    • docs/avatars/pt-BR/ben.webp
    • docs/avatars/pt-BR/dad.webp
    • docs/avatars/pt-BR/maya.webp
    • docs/avatars/pt-BR/mom.webp
    • docs/avatars/pt-BR/nana.webp
    • docs/avatars/pt-BR/sam.webp
    • docs/avatars/th/alex.webp
    • docs/avatars/th/ben.webp
    • docs/avatars/th/dad.webp
    • docs/avatars/th/maya.webp
    • docs/avatars/th/mom.webp
    • docs/avatars/th/nana.webp
    • docs/avatars/th/sam.webp
    • docs/avatars/vi/alex.webp
    • docs/avatars/vi/ben.webp
    • docs/avatars/vi/dad.webp
    • docs/avatars/vi/maya.webp
    • docs/avatars/vi/mom.webp
    • docs/avatars/vi/nana.webp
    • docs/avatars/vi/sam.webp
    • docs/index.html


    ⚙️ Run configuration

    Configuration used: Path: .coderabbit.yaml

    Review profile: ASSERTIVE

    Plan: Pro

    Run ID: 23361a10-d188-414c-81cc-554c76ecd997


    📥 Commits

    Reviewing files that changed from the base of the PR and between [2fb509] and 9c0ae008a837ed1718cbffdb67d60fcd3c89d7ad.


    📒 Files selected for processing (71)

    • docs/avatars/ar/alex.webp
    • docs/avatars/ar/ben.webp
    • docs/avatars/ar/dad.webp
    • docs/avatars/ar/maya.webp
    • docs/avatars/ar/mom.webp
    • docs/avatars/ar/nana.webp
    • docs/avatars/ar/sam.webp
    • docs/avatars/en/alex.webp
    • docs/avatars/en/ben.webp
    • docs/avatars/en/dad.webp
    • docs/avatars/en/maya.webp
    • docs/avatars/en/mom.webp
    • docs/avatars/en/nana.webp
    • docs/avatars/en/sam.webp
    • docs/avatars/es/alex.webp
    • docs/avatars/es/ben.webp
    • docs/avatars/es/dad.webp
    • docs/avatars/es/maya.webp
    • docs/avatars/es/mom.webp
    • docs/avatars/es/nana.webp
    • docs/avatars/es/sam.webp
    • docs/avatars/fil/alex.webp
    • docs/avatars/fil/ben.webp
    • docs/avatars/fil/dad.webp
    • docs/avatars/fil/maya.webp
    • docs/avatars/fil/mom.webp
    • docs/avatars/fil/nana.webp
    • docs/avatars/fil/sam.webp
    • docs/avatars/fr/alex.webp
    • docs/avatars/fr/ben.webp
    • docs/avatars/fr/dad.webp
    • docs/avatars/fr/maya.webp
    • docs/avatars/fr/mom.webp
    • docs/avatars/fr/nana.webp
    • docs/avatars/fr/sam.webp
    • docs/avatars/nb/alex.webp
    • docs/avatars/nb/ben.webp
    • docs/avatars/nb/dad.webp
    • docs/avatars/nb/maya.webp
    • docs/avatars/nb/mom.webp
    • docs/avatars/nb/nana.webp
    • docs/avatars/nb/sam.webp
    • docs/avatars/pl/alex.webp
    • docs/avatars/pl/ben.webp
    • docs/avatars/pl/dad.webp
    • docs/avatars/pl/maya.webp
    • docs/avatars/pl/mom.webp
    • docs/avatars/pl/nana.webp
    • docs/avatars/pl/sam.webp
    • docs/avatars/pt-BR/alex.webp
    • docs/avatars/pt-BR/ben.webp
    • docs/avatars/pt-BR/dad.webp
    • docs/avatars/pt-BR/maya.webp
    • docs/avatars/pt-BR/mom.webp
    • docs/avatars/pt-BR/nana.webp
    • docs/avatars/pt-BR/sam.webp
    • docs/avatars/th/alex.webp
    • docs/avatars/th/ben.webp
    • docs/avatars/th/dad.webp
    • docs/avatars/th/maya.webp
    • docs/avatars/th/mom.webp
    • docs/avatars/th/nana.webp
    • docs/avatars/th/sam.webp
    • docs/avatars/vi/alex.webp
    • docs/avatars/vi/ben.webp
    • docs/avatars/vi/dad.webp
    • docs/avatars/vi/maya.webp
    • docs/avatars/vi/mom.webp
    • docs/avatars/vi/nana.webp
    • docs/avatars/vi/sam.webp
    • docs/index.html

    You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

    Use the checkbox below for a quick retry:
    - [ ] 🔍 Trigger review

    ✨ Finishing Touches
    🧪 Generate unit tests (beta) - [ ] Create PR with unit tests - [ ] Commit unit tests in branch `feat/landing-i18n`

    Comment @coderabbitai help to get the list of available commands.

     

    Related

    Commit: [2fb509]

  • Anonymous

    Anonymous - 2026-07-17

    Ticket changed by: kristofferR

    • status: open --> closed
     

Log in to post a comment.