Langues
Le site et l'application sont en français et en anglais. L'API, elle, parle à des programmes : elle répond toujours dans la même langue, et laisse chaque client écrire ses messages dans la langue de son utilisateur. Seuls les e-mails sont écrits par l'API, dans la langue de leur destinataire.
Ce que l'API ne traduit pas, et pourquoi
| Ce qu'elle renvoie | Comment le client le traduit |
|---|---|
| une erreur | par son code stable (week_validated), jamais par sa phrase anglaise (voir Erreurs) |
| une notification | par son type et ses paramètres (params) |
| une date | au format ISO, que le client affiche dans sa langue |
Pourquoi ? Une même réponse peut être lue par une personne en français sur le site, et en anglais sur l'application. C'est au client de savoir dans quelle langue il affiche, pas à l'API de le deviner. C'est aussi ce que font les API de GitHub ou de Google.
Les notifications : du texte et des données
Une notification garde les deux :
{
"kind": "hours_changed",
"text": "Barbara Gordon changed your working day of Tue, Oct 6.",
"params": { "action": "update", "by": "Barbara Gordon", "day": "2026-10-06" }
}text: la phrase en anglais, pour l'e-mail et les journaux ;params: les mêmes informations en données, pour que la cloche écrive la phrase dans la langue de son lecteur.
La langue d'une personne
Chaque compte a une préférence users.locale : en, fr, ou vide pour suivre la langue de l'appareil. Elle se change avec PUT /api/users/:id/preferences, et suit la personne sur tous ses appareils.
Les e-mails, dans la langue du destinataire
Les e-mails utilisent Gettext, l'outil de traduction standard d'Elixir (et de nombreux logiciels libres) :
in_language(user.locale, fn ->
deliver(user, dgettext("emails", "Reset your TimeManager password"), %{
title: dgettext("emails", "Reset your password"),
…
})
end)- Le texte anglais est écrit dans le code ; c'est aussi la clé de la traduction.
- Les traductions françaises sont dans
priv/gettext/fr/LC_MESSAGES/emails.po(etnotifications.popour les phrases des notifications). in_language/2choisit la langue du destinataire, avec l'anglais par défaut quand il n'en a pas choisi.- Les dates des e-mails (« mardi 6 octobre ») sont écrites par
LocalizedDates, dans la même langue.
Exemple de traduction :
msgid "Reset your password"
msgstr "Réinitialisez votre mot de passe"L'invitation
La personne invitée n'a pas encore choisi de langue : son invitation part dans la langue du General Manager qui l'invite.
Ajouter ou modifier un texte d'e-mail
- Écris le texte anglais dans le code, entouré de
dgettext("emails", "…"). - Mets à jour les fichiers de traduction :
mix gettext.extract --merge. - Écris la traduction dans le
msgstrcorrespondant depriv/gettext/fr/LC_MESSAGES/emails.po. - Lance
emails_in_language_test.exs: il vérifie qu'une personne qui a choisi le français reçoit ses e-mails en français (mise en page comprise), qu'une invitation part dans la langue du General Manager, et que chaque phrase de notification existe en français.
Un texte sans traduction s'affiche en anglais : rien ne casse, mais l'e-mail français est incomplet.