# Translation catalogues

One file per language, named for its code: `fr.json`, `it.json`, `es.json`.

**There is deliberately no `en.json`.** The English string *is* the key, so
English is the fallback by construction and cannot drift from the source. A
file would only be a second copy of the code to forget to update.

## Format

A flat object keyed by the **English string exactly as it appears in the
source**, including punctuation and spacing:

```json
{
  "Save this Frame": "Enregistrer cette image",
  "Print size": "Taille d'impression",

  "%d frame": { "one": "%d image", "other": "%d images" }
}
```

A counted string (one wrapped in `i18n.ngettext`) may map to an object with
`one` and `other`. A plain string is fine where one form serves. **French puts
0 in the singular** — `0 image`, but `0 imágenes` in Spanish — and
`i18n._plural_form` already knows that; you only have to supply the forms.

## The rules that matter more than the format

- **Translate the intent, not the literal**, and when a string is heading past
  the space available, say it as a native speaker would in fewer words. It is
  not a layout problem until that effort fails. (Steve, 2026-07-30.)
- **Translate the DISPLAY, never the IDENTITY.** Filenames, prefs values, JSON
  keys, curve names, colorant keys and shade addresses (`1a`–`12d`) stay
  English. Those are stored values; translating one orphans somebody's curves.
- **Domain vocabulary gets decided before it gets translated.** "Reversed
  tonal scale", "clear film", "emulsion down", "digital negative", "salt
  print", "cyanotype" are terms of art with established equivalents in each
  language's alt-process community. Getting *cyanotype* wrong in French is
  worse than leaving it in English — flag it rather than guess.

## A catalogue that isn't here isn't offered

`i18n.available()` lists only languages whose file actually exists, and the
language picker hides itself when there is nothing to choose. That is
deliberate: a language you can select that changes nothing reads as a broken
control, which is worse than a language we haven't shipped yet.
