[PYTHON] Permettre aux utilisateurs de Django d'avoir des paramètres de langue et de fuseau horaire pour changer de langue de manière dynamique et changer l'affichage de l'heure

Chose que tu veux faire

cette

Je souhaite que l'utilisateur définisse la langue et le fuseau horaire

Fans de Django, Django (salutations).

Nous connaissons le support de Django pour I18N et L10N. Et vous savez à quel point il est facile d'exploiter ces pouvoirs.

Spécifiez simplement * LANGUAGE_CODE * comme * USE_I18N = True * si vous avez besoin d'une traduction multilingue, * USE_L10N = True * si vous avez besoin d'une localisation de format et * TIMEZONE * comme * USE_TZ = True * si vous voulez faire correspondre le fuseau horaire. ..

Ensuite, vous pouvez créer une application globale en demandant simplement à Google Translation ou DeepL Translation de créer un fichier de traduction. Si vous créez une application à l'aide de Django, vous pouvez rapidement créer une application avec une expansion internationale à l'esprit.

Mais il y a un problème.

Si vous avez créé une application avec une expansion internationale à l'esprit et qu'elle a été utilisée par des pays japonais, américains, français et asiatiques, où devriez-vous changer les paramètres de langue?

Oui, ** settings.py **. Cependant, si vous manipulez le paramètre * LANGUAGE_CODE *, Django affichera la langue spécifiée à la fin. Si * LANGUAGE_CODE * est défini sur * ja *, Django s'affichera en japonais pour chaque personne dans chaque pays. Dans ce cas, il devient difficile de comprendre à quoi servait l'internationalisation.

Personnellement, ce n'est pas étonnant, mais la norme Django ne permet pas aux utilisateurs de modifier même les paramètres du fuseau horaire, sans parler de la langue. Cette fois, il s'agit de permettre aux utilisateurs de le modifier eux-mêmes.

Comment ça fonctionne

À propos de LANGUE

Le code de base est extrait du manuel de django. Transmettez la langue que vous souhaitez utiliser à * translation.activate * et définissez la valeur dans le cookie. Désormais, vous ne pouvez changer que la langue que Django utilisera pendant cette session.

from django.conf import settings
from django.http import HttpResponse
from django.utils import translation
user_language = 'fr'
translation.activate(user_language)
response = HttpResponse(...)
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, user_language)

Cette fois pour le modèle utilisateur

À propos de TIME ZONE

Le code de base est extrait du manuel de django. Passez le fuseau horaire que vous souhaitez utiliser à * timezone.activate *.

import pytz

from django.utils import timezone

class TimezoneMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        tzname = request.session.get('django_timezone')
        if tzname:
            timezone.activate(pytz.timezone(tzname))
        else:
            timezone.deactivate()
        return self.get_response(request)

Sur la base de ces codes, le reste consiste à personnaliser le modèle utilisateur pour fournir des champs pour les paramètres de langue et de fuseau horaire que vous pouvez modifier vous-même.

C'est pourquoi j'ai préparé django-user-g11n.

django-user-g11n

django-user-g11n prépare un modèle utilisateur personnalisé de Django, et en héritant de "TimeZoneAndUserLanguageSupportMixin", il a deux champs, * language * et * timezone *, dans le modèle utilisateur, et il est défini à l'aide du middleware. Changez dynamiquement la langue et le fuseau horaire.

À propos, g11n est une abréviation de (Globalisation) et fait référence à I18n + L10N.

Comment utiliser

Avant, si vous souhaitez essayer l'échantillon immédiatement, veuillez vous reporter à «Utilisation de l'échantillon».

Tout d'abord, installez Django et django-user-g11n.

$ pip install django django-user-g11n

Ensuite, démarrez le projet en utilisant django-admin.py.

$ django-admin.py startproject example

Ensuite, créez un modèle utilisateur personnalisé. Pour plus de commodité, le nom de l'application est * comptes *.

$ manage.py startapp accounts

Une fois que vous avez créé votre application, modifiez * accounts / models.py * pour ajouter un modèle utilisateur personnalisé. À ce moment-là, il hérite de * UserLanguageSupportMixin * et * UserTimeZoneSupportMixin *.

from django.contrib.auth import models as auth_models
from user_g11n.models import UserLanguageSupportMixin, UserTimeZoneSupportMixin


class User(UserTimeZoneSupportMixin,
           UserLanguageSupportMixin,
           auth_models.AbstractUser):
    pass

Vient ensuite la modification de * settings.py *.

Modifications apportées à settings.py

Ajoutez l'application pour le modèle utilisateur personnalisé créé cette fois et user-g11n à * INSTALLED_APPS *.

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    .
    .
    .
    'accounts',  # Your Custom user model application
    'user_g11n', # Add
)

Puis modifiez MIDDLEWARE pour ajouter * UserLanguageMiddleware * et * UserTimeZoneMiddleware *.

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    .
    .
    .
    'user_g11n.middleware.UserLanguageMiddleware', # Add
    'user_g11n.middleware.UserTimeZoneMiddleware', # Add
]

Spécifiez ensuite AUTH_USER_MODEL pour activer le modèle utilisateur personnalisé.

AUTH_USER_MODEL = 'accounts.User'

Ensuite, définissez respectivement I18N, L10N, TZ et TIME_ZONE.

USE_I18N = True

USE_L10N = True

USE_TZ = True

TIME_ZONE = "Asia/Tokyo" # Change to your local timezone

Une fois la modification terminée, effectuez la migration et créez une base de données.

$ ./manage.py makemigrations && ./manage.py migrate

C'est tout. Ensuite, créez un super-utilisateur et changez la langue et le fuseau horaire sur l'écran de gestion des utilisateurs pour changer l'affichage en temps réel.

Utilisez l'échantillon

Cette application Django est en cours de développement sur GitHub.

Faire cloner le projet

$ docker-compose up

Après cela, vous pouvez essayer l'exemple d'application en accédant à [http: // localhost: 8000](http: // localhost: 8000).

Résumé

c'est tout

Recommended Posts

Permettre aux utilisateurs de Django d'avoir des paramètres de langue et de fuseau horaire pour changer de langue de manière dynamique et changer l'affichage de l'heure
réglage du fuseau horaire et de la langue de django
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé d'afficher l'heure et la météo d'aujourd'hui w