# `translation.jadpo_missing`

The app supports a locale that Jadpo doesn't ship its own messages in, and the app hasn't worded them itself.

Area 10, [Configuration](/docs/configuration.md); not declinable; the next step is usually the agent's.

## Why Jadpo refuses it

Jadpo writes some text itself, such as the answer to a request it can't
read or a route that doesn't exist. It ships that wording in `en_gb` and
`en_us` only. In any other supported locale, the people and client apps
using your app would be shown English.

So the app words Jadpo's messages itself, in the root
`translations/<locale>.jadpo`, under `jadpo: { }`. Only the messages of
features the app uses count, such as the request messages once an API
serves a route.

## What it looks like








The app supports English and French, and serves one route, so Jadpo's
messages for answering requests are on. The app has no root
`translations/fr_fr.jadpo`.

domains/notes/routes/notes.jadpo:

```jadpo
use notes/types { NoteRequest, NoteShown }
use notes/actions { echo_note }

routes Notes {
    prefix: /notes

    POST / {
        authentication: RouteAuthentication.none
        input: NoteRequest
        output: NoteShown
        run: echo_note(input)
    }
}
```

```text
error: `Locale.fr_fr` is supported but Jadpo's own messages aren't worded in it
 --> app.jadpo:5:31
  |
5 |     supported: [Locale.en_gb, Locale.fr_fr]
  |                               ^^^^^^^^^^^^ no `translations/fr_fr.jadpo`
  reason: Jadpo ships its own wording in `en_gb` and `en_us` and no other locale, so users and client apps working in `Locale.fr_fr` would be shown English. An application words the messages of the features it has on itself, in the `jadpo: { }` group of the root `translations/fr_fr.jadpo`. Still to word: `invalid_request`, `invalid_input`, `route_not_found`, `method_not_allowed`, `request_too_large`, `idempotency_key_reused`, `rate_limited`, `unavailable`, `internal_fault` and `deadline_exceeded`.
  next: Run `jadpo translations builtin` to list them with their fields, then word each under `jadpo: { }` in `translations/fr_fr.jadpo` (agent)
  rule: translation.jadpo_missing
  help: https://jadpo.dev/docs/errors/translation.jadpo_missing

check failed: 1 error, 7 files
```

`(agent)` at the end of the `next:` line means your coding agent can make
the fix itself.

## How to fix it

**If French is ready**, list the messages to word, with their English
wording to translate from:

```sh
jadpo translations builtin
```

```text
Requests
  invalid_request         needs fr_fr
    The request couldn't be read. Try again.
  invalid_input           needs fr_fr
    Some of the information sent isn't valid. Check it and try again.
  route_not_found         needs fr_fr
    We couldn't find what you were looking for.
  method_not_allowed      needs fr_fr
    That isn't something this address can do.
  request_too_large       needs fr_fr
    What was sent is too big. Send less and try again.
  idempotency_key_reused  needs fr_fr
    That request was already sent with different details. Start again.
  rate_limited            needs fr_fr
    Too many requests. Wait a moment, then try again.
  unavailable             needs fr_fr
    A service this depends on isn't available right now. Try again soon.
  internal_fault          needs fr_fr
    Something went wrong on our side. Try again soon.
  deadline_exceeded       needs fr_fr
    That took too long, and nothing was saved. Try again.

Locales
  text_direction
    left_to_right  ltr
    right_to_left  rtl

11 messages: 10 need wording, 2 features

next: jadpo check  fails until the application words them
```

Then word each one under `jadpo: { }` in the root file,
`translations/fr_fr.jadpo`. The list shows `text_direction` too, but
Jadpo ships its wording in every locale, so it needs none:

```jadpo
translations {
    jadpo: {
        deadline_exceeded: "Cela a pris trop de temps, et rien n'a été enregistré. Réessayez."
        idempotency_key_reused: "Cette requête a déjà été envoyée avec d'autres détails. Recommencez."
        internal_fault: "Un problème est survenu de notre côté. Réessayez bientôt."
        invalid_input: "Certaines informations envoyées ne sont pas valides. Vérifiez-les et réessayez."
        invalid_request: "La requête n'a pas pu être lue. Réessayez."
        method_not_allowed: "Cette adresse ne permet pas cette action."
        rate_limited: "Trop de requêtes. Patientez un instant, puis réessayez."
        request_too_large: "Ce qui a été envoyé est trop volumineux. Envoyez moins et réessayez."
        route_not_found: "Nous n'avons pas trouvé ce que vous cherchiez."
        unavailable: "Un service dont dépend l'application est indisponible pour le moment. Réessayez bientôt."
    }
}
```










A client app showing French now has French text for each of Jadpo's
failures, such as `route_not_found`, in the file `jadpo check` writes for
client apps.

**If French is still being translated**, list it in `in_progress:` in
`app.jadpo`:

```jadpo
    in_progress: [Locale.fr_fr]
```










French falls back to the English that Jadpo ships until the root file
words its messages. Removing French from `in_progress:` makes the gap an
error again.

## Related

- [Jadpo's and packages' text](/docs/failures-for-client-apps.md#jadpos-and-packages-text)
- [The root wording file](/docs/failures-for-client-apps.md#the-root-wording-file)
- [The file for client apps](/docs/failures-for-client-apps.md#the-file-for-client-apps)
- [Jadpo's own messages: `builtin`](/docs/tooling-for-translations.md#jadpos-own-messages-builtin)
- [Locales still being translated: `in_progress:`](/docs/locales.md#locales-still-being-translated-in_progress)
