ADR 010 — Locale layout and metadata modes
Status: Accepted
Date: 2026-05-17
Deciders: Abdisamed Mohamed
Related ADRs: ADR 008
Context
Repos use different on-disk locale shapes (flat_file, locale_directory + structure). Writer commands (sync, generate) also support plain string vs structured leaves for translation workflows. Layout fingerprints feed files.json; metadata flags can conflict in one sync invocation.
Decision
- Layout is config-driven —
locales.mode,locales.structure,locales.directory,locales.source; fingerprint stored infiles.jsonaslocalesLayout. A mismatch triggers a full analysis rebuild (safe default). - Schema-first keys — shape comes from source scans, not from mirroring arbitrary nested source JSON.
- Leaf modes:
legacy_string(default) vsstructured(localeLeaves.modeor--metadataon writers).sync --strip-metadatarolls structured leaves back to plain strings. - Flag precedence: if both
--metadataand--strip-metadataare passed, strip wins; emiti18nprune.sync.metadata_flag_conflictso automation detects ambiguous intent. generate --metadatacontrols persistence of structured leaves; metadata is still computed during processing when not persisted.
Implementation
ts
export default {
locales: {
source: 'en',
directory: 'messages',
mode: 'locale_directory',
structure: 'locale_per_dir',
},
localeLeaves: {
mode: 'legacy_string',
},
};bash
# Ambiguous intent — strip wins, warning issued
i18nprune sync --metadata --strip-metadata --target jaConsequences
Positive
- One cache fingerprint detects layout refactors before silent wrong-locale reads.
- Structured leaves support review workflows without forking file formats per command.
Negative
locale_directoryrequires explicitstructure; misconfiguration fails early but needs clear docs.- Mixed metadata flags confuse operators unless the warning code is monitored.
Mitigation
Alternatives Considered
Infer layout from disk only (no config fingerprint)
- Pros: Less config.
- Cons: Ambiguous when multiple patterns coexist; unsafe cache reuse.
Separate file formats per command
- Pros: Simpler per-command writers.
- Cons:
syncvsgeneratedrift; rejected in favor of shared leaf normalization.
References
- Locales config
- sync command
- generate command
- sync issues — metadata_flag_conflict
- Git:
43482aelocales.source enforcement; cache layout fingerprint infiles.json