Internazionalizzazione e Localizzazione
Internazionalizzazione e localizzazione su Django sono gestiti separatamente e governati rispettivamente
dalla configurazione USE_I18N
e USE_L10N
nei settings. Entrambi sono abilitati per default.
Internazionalizzazione
Per abilitare la traduzione su una lingua diversa per ogni sessione utente è necessario abilitare il
middleware LocaleMiddleware
, che andremo ad aggiungere alla configurazione MIDDLEWARE
nel file
settings.py
:
MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
Questo middleware deve essere inserito tra quello che gestisce la sessione SessionMiddleware
e
CommonMiddleware
. Il middleware si occuperà di settare nella request
passata ad ogni vista
la variable LANGUAGE_CODE
contenente la lingua corrente per la sessione dell'utente.
Sempre in settings.py
è possibile configurare la lingua di default del sistema settando
LANGUAGE_CODE.
Ad esempio se vogliamo usare l'italiano per default:
LANGUAGE_CODE = 'it-it'
Le lingue per cui abilitiamo la traduzione devono essere listate esplicitamente nella configurazione
LANGUAGES
:
from django.utils.translation import gettext_lazy as _
LANGUAGES = [
('it', _('Italian'),
('en', _('English'),
]
Per far cambiare la lingua agli utenti Django offre una vista già implementata chiamata set_language
che richiede il codice della lingua passato in POST nella variabile language
.
Per essere usata basta includere le seguenti urls nel nostro progetto, ad esempio sotto il percorso
i18n
:
urlpatterns = [
...
path('i18n/', include('django.conf.urls.i18n')),
]
In questo caso la vista sarà disponibile al percorso /i18n/setlang/. Si rimanda alla documentazione di set_language per maggiori dettagli.
Lo stato delle traduzioni per le varie lingue è disponibile su transifex.
Traduzioni nelle viste
Il sistema di traduzioni di Django è un wrapper sopra alle funzioni di GNU gettext.
La funzione base per tradurre una stringa è gettext
che è consuetudine importare come _
:
from django.http import HttpResponse
from django.utils.translation import gettext as _
from django.views import View
class HomepageView(View):
def get(self, request):
return HttpResponse(_("This is the homepage"))
Traduzioni lazy
Le stringhe possono essere tradotte in modo lazy cioè tradotte nel momento specifico in cui sono
renderizzate e non quando sono definite. Queste tipo di traduzioni sono necessarie in alcuni punti
come negli attributi help_text e verbose_name dei campi dei modelli, negli attributi verbose_name
e verbose_name_plural nella classe Meta dei modelli e nel file settings.py
.
Le traduzioni di tipo lazy si fanno usando la funzione gettext_lazy
:
from django.db import models
from django.utils.translation import gettext_lazy as _
class Corso(models.Model):
titolo = models.CharField(help_text=_('Titolo'))
Template
Le traduzioni nei template vengono fatte tramite il tag translate
che opera indistintamente sia
su stringhe costanti che su variabili:
<h1>{% translate "Il titolo" %}</h1>
<h2>{% translate sottotitolo %}</h2>
Generare i file delle traduzioni
I file delle traduzioni sono cercati per default in directory chiamate locale
all'interno di ogni
applicazione configurata e in ogni directory configurata in LOCALE_PATHS.
Le directory locale
all'interno delle nostri applicazioni e quelle configurate in LOCALE_PATHS
devono essere create manualmente. È buona cosa creare una directory locale per ogni applicazione che
ha delle stringhe traducibili ed una generale per le stringhe che sono presenti nei file di progetto
o nei templates condivisi.
Per estrarre le stringhe da tradurre per una singola lingua bisogna eseguire il comando makemessages
:
django-admin makemessages -l it
In questo caso abbiamo estratto le stringhe da tradurre per la lingua italiana it
. Le stringhe vengono
estratte in file chiamati django.po
all'interno di ogni directory it
presente all'interno di ogni
directory locale
globale o della singola applicazione.
Una volta tradotti i file django.po
possono essere compilati in file django.mo
tramite il comando:
django-admin compilemessages
Localizzazione
Il sistema di localizzazione di Django permette di formattare date, orari e numeri nei template. Quando è attivato questi tipidi dato vengono formattati a seconda del linguaggio configurato nella sessione. La formattazione che inserisce il separatore per le migliaia va attivato separatamente tramite la configurazione USE_THOUSAND_SEPARATOR.
Le localizzazioni sono implementate in un file formats.py
all'interno di ogni
directory di lingua.
Nei template singoli valori possono essere localizzati o non localizzati usando i filtri localize
o unlocalize
:
{% load l10n %}
{{ value|localize }}
{{ value|unlocalize }}
Esercizi
Leggi la documentazione ufficiale sulla internazionalizzazione.
Leggi la documentazione su come settare il linguaggio preferito dagli utenti.
Consulta la documentazione sulle traduzioni lazy.
Consulta la documentazione dei comandi makemessages e compilemessages.
Leggi la documentazione ufficiale sulla localizzazione.