[PYTHON] Ermöglichen Sie Django-Benutzern Sprach- und Zeitzoneneinstellungen, um Sprachen dynamisch zu wechseln und die Zeitanzeige zu wechseln

Was du machen willst

Dies

Ich möchte, dass der Benutzer die Sprache und die Zeitzone einstellt

Django-Fans, Django (Grüße).

Wir sind mit Djangos Unterstützung für I18N und L10N vertraut. Und Sie wissen, dass es sehr einfach ist, diese Kräfte zu nutzen.

Geben Sie einfach * LANGUAGE_CODE * als * USE_I18N = True * an, wenn Sie eine mehrsprachige Übersetzung benötigen, * USE_L10N = True *, wenn Sie eine Formatlokalisierung benötigen, und * TIMEZONE * als * USE_TZ = True *, wenn Sie der Zeitzone entsprechen möchten. ..

Anschließend können Sie eine globale Anwendung erstellen, indem Sie Google Translation oder DeepL Translation auffordern, eine Übersetzungsdatei zu erstellen. Wenn Sie eine Anwendung mit Django erstellen, können Sie schnell eine Anwendung mit Blick auf die internationale Expansion erstellen.

Aber es gibt ein Problem.

Wenn Sie eine App mit Blick auf die internationale Expansion erstellt haben und diese von Japanern, Amerikanern, Franzosen und asiatischen Ländern verwendet wurde, wo sollten Sie die Spracheinstellungen ändern?

Ja, ** settings.py **. Wenn Sie jedoch mit der Einstellung * LANGUAGE_CODE * herumspielen, wird Django am Ende in der angegebenen Sprache ausgegeben. Wenn * LANGUAGE_CODE * auf * ja * gesetzt ist, wird Django für jede Person in jedem Land auf Japanisch angezeigt. In diesem Fall wird es schwierig zu verstehen, wofür die Internationalisierung war.

Persönlich ist dies kein Wunder, aber der Django-Standard erlaubt es Benutzern nicht, selbst Zeitzoneneinstellungen zu ändern, geschweige denn Sprache. Dieses Mal geht es darum, Benutzern zu erlauben, es selbst zu ändern.

Wie es funktioniert

Über SPRACHE

Der Basiscode lautet Auszug aus dem Handbuch von django. Übergeben Sie die Sprache, die Sie verwenden möchten, an * translation.activate * und legen Sie den Wert im Cookie fest. Sie können jetzt nur die Sprache wechseln, die Django während dieser Sitzung verwendet.

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)

Diesmal für das Benutzermodell

Über TIME ZONE

Der Basiscode lautet Auszug aus dem Handbuch von django. Übergeben Sie die Zeitzone, die Sie verwenden möchten, an * 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)

Basierend auf diesen Codes besteht der Rest darin, das Benutzermodell so anzupassen, dass Felder für Sprach- und Zeitzoneneinstellungen bereitgestellt werden, die Sie selbst ändern können.

Deshalb habe ich [django-user-g11n] vorbereitet (https://pypi.org/project/django-user-g11n/).

django-user-g11n

django-user-g11n erstellt ein benutzerdefiniertes Benutzermodell von Django. Durch das Erben von "TimeZoneAndUserLanguageSupportMixin" enthält das Benutzermodell zwei Felder, * language * und * timezone *, und wird mithilfe von Middleware festgelegt. Ändern Sie dynamisch die Sprache und die Zeitzone.

G11n ist übrigens eine Abkürzung für (Globalization) und bezieht sich auf I18n + L10N.

Wie benutzt man

Wenn Sie das Beispiel sofort ausprobieren möchten, lesen Sie bitte "Verwenden des Beispiels".

Installieren Sie zuerst Django und django-user-g11n.

$ pip install django django-user-g11n

Starten Sie dann das Projekt mit django-admin.py.

$ django-admin.py startproject example

Erstellen Sie als Nächstes ein benutzerdefiniertes Benutzermodell. Der Einfachheit halber lautet der Anwendungsname * Konten *.

$ manage.py startapp accounts

Nachdem Sie Ihre App erstellt haben, ändern Sie * accounts / models.py *, um ein benutzerdefiniertes Benutzermodell hinzuzufügen. Zu diesem Zeitpunkt erbt es * UserLanguageSupportMixin * und * 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

Als nächstes folgt die Änderung von * settings.py *.

Änderungen an settings.py

Fügen Sie die App für das diesmal erstellte benutzerdefinierte Benutzermodell und user-g11n zu * INSTALLED_APPS * hinzu.

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
)

Ändern Sie dann MIDDLEWARE, um * UserLanguageMiddleware * und * UserTimeZoneMiddleware * hinzuzufügen.

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
]

Geben Sie dann AUTH_USER_MODEL an, um das benutzerdefinierte Benutzermodell zu aktivieren.

AUTH_USER_MODEL = 'accounts.User'

Als nächstes setzen Sie I18N, L10N, TZ bzw. TIME_ZONE.

USE_I18N = True

USE_L10N = True

USE_TZ = True

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

Wenn die Änderung abgeschlossen ist, führen Sie die Migration durch und erstellen Sie eine Datenbank.

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

Das ist es. Erstellen Sie anschließend einen Superuser und ändern Sie die Sprache und Zeitzone auf dem Benutzerverwaltungsbildschirm, um die Anzeige in Echtzeit zu wechseln.

Verwenden Sie die Probe

Diese Django-App wird [auf GitHub] entwickelt (https://github.com/salexkidd/django-user-g11n/).

Lassen Sie das Projekt klonen

$ docker-compose up

Danach können Sie die Beispiel-App ausprobieren, indem Sie auf [http: // localhost: 8000](http: // localhost: 8000) zugreifen.

Zusammenfassung

das ist alles

Recommended Posts

Ermöglichen Sie Django-Benutzern Sprach- und Zeitzoneneinstellungen, um Sprachen dynamisch zu wechseln und die Zeitanzeige zu wechseln
Django Zeitzoneneinstellung und Spracheinstellung
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
Ich habe versucht, die Uhrzeit und das heutige Wetter anzuzeigen