Adopt Lingui and author the Eciperay voice object (i18n foundation)

Open
#465 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
35/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Active
Tech stack
react-native, typescript

Research direction

Start by reading the Lingui setup and validating its Plural macro with React Native 0.88/Metro and the web transform pipeline; the issue names no files or tests to start from. Then review the locale precedence and strict catalog extraction/compile requirements, plus the voice chart scope. Done means the spike and fallback decision are recorded, CI and locale handling are wired, and the voice work is completed when the design-system slot types/provider are available.

Written by the indexing model from the issue text.

Description

enhancement priority-p2

The app-side half of the i18n program decided 2026-11-07 (architecture: spudly/design-system#539 — voice-as-theme: the DS defines the typed voice/copy slot system and ships no strings; this app authors every word).

Decisions already made (2026-11-07):

  • Library: Lingui (compiler-driven extraction, native ICU, PO catalogs in this repo).
  • Locales: en-US only for now; other languages later — build the full machinery from day one so adding a language is a translation job, not an engineering project.
  • Web SSR is planned (see #304): the setup must be SSR-ready — compiled catalogs load isomorphically, locale negotiation is server-aware (stored user choice > Accept-Language/device > en-US), no browser-only singleton assumptions.
  • Hermes: ship @formatjs/intl-locale + @formatjs/intl-pluralrules polyfills (Hermes lacks Intl.PluralRules/Intl.Locale).

Scope:
0. Spike first: validate Lingui on React Native 0.88 / Metro — including the Plural macro — and in the web build's transform pipeline. If the spike fails, fall back to i18next and note it here.

  1. Lingui setup, web + native: PO catalogs in-repo, lingui extract/compile wired into CI in strict mode (missing keys fail the build), locale detection via expo-localization / react-native-localize with the precedence above.
  2. Author the Eciperay voice: the voice chart lives in this repo next to the catalogs — the capable kitchen companion: warm and welcoming, capable and unflappable, dry wit with a hint of sarcasm aimed at situations (never at the cook), encouraging and never guilt-y; errors and safety copy stay plain. Build the app's voice object filling the DS slot types from design-system #539.
  3. Page-unique copy flows through catalogs into page copy props; shared-component text comes from the voice object. Add the en-XA pseudo-locale to the test matrix — it is the standing second locale until real translations arrive.

Sequencing: steps 0–1 and the voice chart are independent and can start now; the voice-object wiring waits on design-system #539 shipping its slot types/provider.

Dominant language
TypeScript
Stars
0
Forks
0
Avg merge
8h 48m
Merged PRs (30d)
209

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from spudly/eciperay

All issues in spudly/eciperay

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.