# Formulaires en deux langues

Un même formulaire peut parler français et anglais. Les gens le voient dans leur langue, toutes les
réponses arrivent au même endroit, et vos rapports ne se séparent pas en deux.

## Comment ça fonctionne

Votre formulaire a une langue par défaut, avec son texte en place. L’autre langue est un ensemble de
textes traduits, enregistrés avec votre brouillon et publiés avec lui. Chaque choix garde une seule
valeur enregistrée, peu importe la langue dans laquelle on le lit : `sales` reste `sales`, qu’on ait vu
« Ventes » ou « Sales ».

Deux langues sont incluses dans tous les forfaits. Le français et l’anglais sont offerts dès maintenant.

## Ce que les gens voient

Sur une page hébergée, dans un script intégré et sur un domaine personnalisé :

- **La bonne langue d’abord.** La page suit l’adresse, comme `?locale=en-CA`, puis le choix fait
  précédemment, puis la langue du navigateur, puis votre langue par défaut.
- **Un sélecteur de langue** en haut du formulaire, aux couleurs de votre formulaire, chaque langue
  étant nommée dans cette langue. Vous pouvez le masquer avec `languageSwitch`.
- **Ce qu’on a tapé reste** quand on change de langue, à n’importe quelle étape. Les mots de passe ne
  suivent jamais.
- **Les pages d’état aussi.** Un formulaire fermé ou pas encore ouvert le dit dans la langue de la personne.
- **Les messages dans sa langue,** avec vos propres messages traduits et les nôtres déjà inclus.

## Ajouter une langue

La traduction dans le générateur s’en vient. Pour l’instant, envoyez vos textes avec la définition du
formulaire par l’API. Consultez [Traductions](/fr/guides/form-reference/#traductions) pour voir tout ce qui se traduit.

```json
{
  "settings": {
    "behavior": { "language": "fr-CA", "languages": ["en-CA"] }
  },
  "translations": {
    "en-CA": {
      "strings": {
        "form.label": "Contact us",
        "fields.topic.label": "Department",
        "fields.topic.choices.sales": "Sales"
      }
    }
  }
}
```

**Pour activer une langue, tous ses textes doivent être là.** S’il en manque un, la demande est refusée
avec `FORM_LANGUAGE_INCOMPLETE`, à moins de l’accepter avec `allowIncompleteLanguages`. Ensuite, la langue
reste activée. Si vous ajoutez une question plus tard, elle s’affiche dans votre langue par défaut jusqu’à
ce que vous la traduisiez, et la publication vous indique combien de textes il manque.

Une traduction ne contient que du texte. Elle ne peut changer ni le type d’une question, ni une règle, ni
la valeur d’un choix.

## Les choix

Chaque choix a une valeur enregistrée et les mots que les gens lisent. Changer les mots ne change jamais la
valeur : les conditions, les règles de livraison et les réponses passées continuent de fonctionner. Le
générateur affiche la valeur en petit sous chaque choix.

## Ce que vous voyez

- **Votre avis** reste dans votre langue par défaut, avec les mots du choix et une ligne indiquant la langue
  utilisée par la personne.
- **L’application et le CSV** affichent les mots de chaque choix et la langue. Cochez **Valeurs enregistrées**
  à l’exportation pour obtenir plutôt les valeurs.
- **Le courriel de confirmation** part dans la langue de la personne. Consultez
  [Courriels de confirmation](/fr/guides/confirmation-emails/).

Dans un modèle de courriel, `{{fields.topic}}` donne les mots, et `{{raw.fields.topic}}` la valeur enregistrée.

## Sur votre propre formulaire, dans votre code

Si votre site a ses propres traductions, gardez-les. Utilisez vos libellés avec les valeurs enregistrées, et
envoyez la langue de la personne avec chaque demande, pour que les messages et la confirmation concordent :

```js
{ "fields": { "email": "lea@example.com" }, "metadata": { "locale": "fr-CA" } }
```

Les messages intégrés de Formerie reviennent dans cette langue même si le formulaire ne l’offre pas. Les codes
ne changent jamais, alors votre code peut continuer à s’y fier. `GET .../schema?locale=fr-CA` renvoie le
formulaire dans une seule langue, avec `languages` qui liste ce qui est offert.

## Pas encore offert

- La traduction dans le générateur.
- Une option `locale` dans les composants de la trousse JavaScript. D’ici là, un formulaire dessiné par la
  trousse à partir de son schéma utilise un formulaire par langue, ou `metadata.locale` pour les messages.
- D’autres langues que le français et l’anglais.
