Traduction automatique supervisée
Ce contenu est traduit à l'aide d'une génération automatique guidée par des glossaires et des guides de style élaborés par des humains. Le texte n'étant pas relu manuellement ligne par ligne, des erreurs ou des tournures maladroites peuvent occasionnellement apparaître.
En cas de divergence, la version anglaise constitue la source de référence.
Internationalisation et fuseaux horaires
Avec starlette-admin, vous pouvez localiser les chaînes de l'interface par utilisateur et convertir les dates et heures affichées vers le fuseau horaire local du visiteur, indépendamment de la manière dont votre base de données les stocke.
Exemple complet : Pour une application fonctionnelle et complète illustrant l'internationalisation et les fuseaux horaires, consultez examples/10-i18n-timezone dans le dépôt GitHub.
Installer l'extra i18n
La prise en charge des traductions nécessite Babel. Sans lui, l'admin fonctionne toujours, mais il se rabat sur l'anglais et ignore le formatage des dates et des nombres selon la locale.
Définir la locale
from sqlalchemy import create_engine
from starlette_admin import I18nConfig
from starlette_admin.contrib.sqla import Admin
from starlette_admin.i18n import SUPPORTED_LOCALES
engine = create_engine("sqlite:///admin.sqlite")
admin = Admin(
engine,
title="My Admin",
i18n_config=I18nConfig(
default_locale="en",
language_switcher=SUPPORTED_LOCALES,
),
secret_key="a-long-random-string",
)
i18n_config vaut None par défaut, ce qui fait fonctionner l'admin en anglais. Lorsque vous passez une I18nConfig, l'admin installe LocaleMiddleware. Ce middleware résout une locale à chaque requête et l'expose aux templates ainsi qu'aux fonctions de traduction (gettext et lazy_gettext) dans tout votre code de champs et de vues.
Le paramètre language_switcher ajoute un menu déroulant à la barre de navigation de l'admin afin que les utilisateurs puissent sélectionner leur locale. Laissez-le à None, sa valeur par défaut, pour masquer le sélecteur et vous appuyer sur default_locale et sur la détection par requête.
Référence de I18nConfig
| Attribut | Type | Défaut | Description |
|---|---|---|---|
default_locale |
str |
"en" |
Locale utilisée lorsqu'aucun cookie ni en-tête ne correspond à une locale prise en charge. |
language_cookie_name |
str | None |
"language" |
Cookie lu pour détecter la locale de l'utilisateur. Définissez-le à None pour désactiver. |
language_header_name |
str | None |
"Accept-Language" |
En-tête lu en l'absence du cookie. Définissez-le à None pour désactiver. |
language_switcher |
list[str] | None |
None |
Locales proposées dans le sélecteur de la barre de navigation. None masque le sélecteur. |
Comment la locale est détectée
LocaleMiddleware résout la locale une fois par requête, dans cet ordre :
- Cookie : La valeur de
language_cookie_name, si elle correspond à une locale intégrée prise en charge. - En-tête : L'en-tête
Accept-Language, ou l'en-tête que vous avez défini danslanguage_header_name, soumis à la même vérification de validité. - Défaut : La
default_locale, lorsque ni le cookie ni l'en-tête ne correspondent.
Les locales intégrées prises en charge (starlette_admin.i18n.SUPPORTED_LOCALES) sont l'allemand, l'anglais, le français, le portugais, le russe, le turc, ainsi que le chinois simplifié et traditionnel. Lorsqu'un utilisateur sélectionne une langue dans la barre de navigation, le sélecteur écrit le cookie de langue, si bien que le choix persiste d'une requête à l'autre sans stockage de session côté serveur.
Fuseaux horaires
from sqlalchemy import create_engine
from starlette_admin import TimezoneConfig
from starlette_admin.contrib.sqla import Admin
engine = create_engine("sqlite:///admin.sqlite")
admin = Admin(
engine,
title="My Admin",
timezone_config=TimezoneConfig(
default_timezone="UTC",
database_timezone="UTC",
timezone_switcher=["UTC", "Europe/Paris", "America/New_York", "Asia/Tokyo"],
),
secret_key="a-long-random-string",
)
Note
Contrairement à i18n_config, timezone_config n'est pas None par défaut. Si vous l'omettez, la classe Admin construit une TimezoneConfig() pour vous, de sorte que la conversion des fuseaux horaires est active dès l'installation. L'admin traite les datetimes naïfs comme étant dans le database_timezone, qui vaut "UTC" par défaut, et les affiche à chaque utilisateur en "UTC", la valeur par défaut de default_timezone, sauf si l'utilisateur en sélectionne un autre.
Comment le fuseau horaire est détecté
TimezoneMiddleware résout le fuseau horaire une fois par requête :
- Cookie : La valeur de
timezone_cookie_name, qui vaut"timezone"par défaut, si elle est présente. - Défaut : Le
default_timezone, sinon.
Le sélecteur de fuseau horaire de la barre de navigation écrit ce cookie, exactement comme le sélecteur de langue. Les fuseaux horaires n'ont pas d'équivalent de l'en-tête Accept-Language car les navigateurs n'en envoient pas ; la détection repose donc entièrement sur les cookies. Un JavaScript côté client qui lit Intl.DateTimeFormat().resolvedOptions().timeZone définit généralement ce cookie, tout comme le sélecteur lui-même.
Comment les valeurs des champs sont converties
DateTimeField et ArrowField convertissent les valeurs entre le database_timezone et le fuseau horaire résolu du visiteur.
- Lecture (liste, détail, export) : L'admin traite une valeur naïve provenant de votre base de données comme une valeur dans le
database_timezoneet la convertit vers le fuseau horaire du visiteur avant de la formater. - Écriture (formulaires de création et d'édition) : L'admin traite une valeur soumise comme une valeur dans le fuseau horaire du visiteur et la convertit vers le
database_timezoneavant qu'elle n'atteigne votre modèle.
Ainsi, deux administrateurs situés dans des fuseaux horaires différents peuvent modifier la même ligne et voir chacun les heures dans leur heure locale, tandis que la base de données conserve un seul fuseau horaire cohérent.
Référence de TimezoneConfig
| Attribut | Type | Défaut | Description |
|---|---|---|---|
default_timezone |
str |
"UTC" |
Fuseau horaire utilisé lorsqu'aucun cookie n'est défini. Accepte tout nom de fuseau horaire IANA. |
timezone_cookie_name |
str | None |
"timezone" |
Cookie lu pour détecter le fuseau horaire du visiteur. Définissez-le à None pour désactiver. |
database_timezone |
str |
"UTC" |
Fuseau horaire supposé de vos datetimes stockés. |
timezone_switcher |
list[str] | None |
None |
Fuseaux horaires proposés dans le sélecteur de la barre de navigation. None masque le sélecteur. |
use_user_locale_timezone |
bool |
True |
Préférer un fuseau horaire déduit de la locale de l'utilisateur au default_timezone. |
Pour restreindre ce que les utilisateurs peuvent sélectionner, passez une liste timezone_switcher plus courte. Pour imposer un seul fuseau horaire à tous les visiteurs, définissez timezone_switcher à None et fixez directement default_timezone, par exemple à "Europe/Paris" à l'échelle de l'entreprise.
Le sélecteur de la barre de navigation affiche le nom d'affichage et le décalage UTC de chaque fuseau horaire grâce aux variables globales de template get_timezone et get_timezone_display_name. Le guide Templates documente ces variables globales ainsi que toutes les autres.
Et ensuite :