Skip to content

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 renvoieComment le client le traduit
une erreurpar son code stable (week_validated), jamais par sa phrase anglaise (voir Erreurs)
une notificationpar son type et ses paramètres (params)
une dateau 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 :

json
{
  "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) :

elixir
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 (et notifications.po pour les phrases des notifications).
  • in_language/2 choisit 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 :

po
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 ​

  1. Écris le texte anglais dans le code, entouré de dgettext("emails", "…").
  2. Mets à jour les fichiers de traduction : mix gettext.extract --merge.
  3. Écris la traduction dans le msgstr correspondant de priv/gettext/fr/LC_MESSAGES/emails.po.
  4. 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.