V0.29.0
Name:v0.29.0Status:planning

v0.29.0 — Multi-language support (i18n foundation)

Makes Refrakt's framework-generated text — labels, navigation chrome, accessibility strings, structural headings, and client-side behavior strings — localizable, so a site built for a non-English locale no longer shows English UI chrome around translated content. This milestone delivers the string-resolution foundation of SPEC-035. Serving the same site in multiple languages (route trees, switcher, auto-detect) remains a deliberate Non-Goal that this foundation is explicitly constrained to allow later without breaking changes.

Milestone burndown: 0 open work items remaining; peak 11, started Jul 170369Jul 17Jul 30
Open work items Ideal burndown
Progress 11/11 work items
Related 12
History 2
  1. 9c7bd86
    Created (planning)by bjornolofandersson
  2. d92ad0c
    Content editedby Claude
    plan: accept SPEC-035, add v0.29.0 milestone + i18n work breakdown

Work Items

Done 11
WORK-502 main
i18n resolution foundation — locale config, LocaleContext, resolvers, fallback
The P0 foundation every other zone builds on: the locale/strings surface on ThemeConfig, the value types, the render-scoped LocaleContext slice, the resolver helpers, and the per-key fallback precedence. Nothing else in SPEC-035 can land without this.
high moderate
4/4 criteria
WORK-503 main
Thread LocaleContext into the engine label renderers
buildStructureElement() and the MetaField block renderers currently emit labels as literals and have no access to config — they receive only (entry, name, modifierValues, icons). This is the previously-unstated prerequisite for localizing Zone 1. Thread the narrow LocaleContext (Decision D6) through, matching the engine's existing convention of passing explicit slices.
high moderate
3/3 criteria
WORK-504 main
Localize structure & meta-field labels (Zone 1) with auto-derived keys
The highest-visibility surface: the ~68 labels emitted via StructureEntry.label and MetaField.label. Resolve both through the locale table using auto-derived keys.
high moderate
4/4 criteria
WORK-505 main
Localize layout chrome (Zone 3) and computed transforms (Zone 4)
The two server-side chrome surfaces that are visible on every page: ~14 layout strings and the 4 computed-navigation strings. Both already receive config-derived data, so this is mostly wiring resolveLocaleString.
high simple
3/3 criteria
WORK-506 main
refrakt i18n extract command (+ --check + MCP)
Auto-derived keys (Decision D1) are only usable if authors and translators can discover them, so this command is the load-bearing mitigation, not a convenience. It emits the full derivable key set with English defaults as a JSON dictionary — the same shape as translation files (Decision D3), so extract → translate → commit <locale>.json round-trips.
high moderate
4/4 criteria
WORK-507 main
Localize behavior strings (Zone 5) — inline delivery
The ~45 client-side strings across packages/behaviors/src/behaviors/ and .../elements/. Behaviors have no server config, so translations are delivered inline (Decision D4): no fetched endpoint.
medium moderate
4/4 criteria
WORK-508 main
Localize programmatic (Zone 2) and enum-as-text (Zone 6) display values
Two smaller server-side surfaces: strings built in code (postTransform / plan render) and rune attribute values that double as visible display text.
medium moderate
3/4 criteria
WORK-509 main
Plugin translation bundles + mergePlugins() wiring
Give plugins a slot to ship their own translations and wire it into the merge so a configured locale resolves plugin-scoped keys. This is the mechanism first-party and community plugins both use.
medium moderate
4/4 criteria
WORK-510 main
knownSections canonicalSlug + i18nAliases — stable-slug follow-up
knownSections shipped (WORK-024, via SPEC-037) but without the localization shape SPEC-035 called for. slugify() still derives the section wrapper's data-name from raw heading text, so a non-English heading (## Akzeptanzkriterien) produces a different slug than ## Acceptance Criteria, breaking CSS selectors and cross-locale anchors. This item closes that gap. The canonicalSlug half can proceed independently (the framework already exists); the i18nAliases half layers on locale resolution.
low moderate
4/4 criteria
WORK-511 main
Cross-adapter lang attribute (Zone 8) + Intl number/duration/currency formatting
Two small correctness follow-ups that ride on the locale field.
low simple
3/3 criteria
WORK-512 main
First-party translation bundles (phased, demand-driven)
Ship refrakt's own translations for the universal chrome so a site owner sets locale and gets a localized UI with zero dictionary authoring. Phased after the mechanism; the initial language tier is demand-driven (Decision D7/D8).
low moderate
4/4 criteria