Internazionalizzazione (i18n)
Lâinternazionalizzazione (i18n) e il processo che permette alla tua applicazione Django di supportare piu lingue e formati regionali. Django include un sistema completo basato su GNU gettext che gestisce la traduzione delle stringhe, la formattazione delle date e dei numeri.
Configurazione Iniziale
Abilita lâinternazionalizzazione nel file settings.py:
# settings.py
LANGUAGE_CODE = "it" # Lingua predefinita
TIME_ZONE = "Europe/Rome"
USE_I18N = True # Abilita l'internazionalizzazione
USE_L10N = True # Abilita la localizzazione dei formati
LANGUAGES = [
("it", "Italiano"),
("en", "English"),
("es", "Espanol"),
("de", "Deutsch"),
]
LOCALE_PATHS = [
BASE_DIR / "locale",
]
Aggiungi il middleware per la gestione della lingua:
MIDDLEWARE = [
# ...
"django.middleware.locale.LocaleMiddleware",
# ...
]
Il LocaleMiddleware deve essere posizionato dopo SessionMiddleware e prima di CommonMiddleware.
Traduzione nelle Viste Python
Usa le funzioni gettext e gettext_lazy per marcare le stringhe da tradurre:
from django.utils.translation import gettext as _
from django.utils.translation import gettext_lazy as _lazy
from django.http import HttpResponse
# gettext per stringhe nelle view
def benvenuto(request):
messaggio = _("Benvenuto nella nostra piattaforma!")
return HttpResponse(messaggio)
# gettext_lazy per stringhe nei modelli e form (valutazione differita)
from django.db import models
class Articolo(models.Model):
titolo = models.CharField(_lazy("titolo"), max_length=200)
contenuto = models.TextField(_lazy("contenuto"))
class Meta:
verbose_name = _lazy("articolo")
verbose_name_plural = _lazy("articoli")
La differenza fondamentale: gettext traduce immediatamente, mentre gettext_lazy traduce solo quando la stringa viene effettivamente utilizzata. Usa gettext_lazy per definizioni di modelli, form e tutto cio che viene valutato allâavvio dellâapplicazione.
Traduzione nei Template
Django offre due tag principali per la traduzione nei template:
{% load i18n %}
<!-- Tag trans per stringhe semplici -->
<h1>{% trans "Benvenuto" %}</h1>
<p>{% trans "Scopri i nostri servizi" %}</p>
<!-- Tag blocktrans per stringhe con variabili -->
{% blocktrans with nome=utente.nome %}
Ciao {{ nome }}, bentornato!
{% endblocktrans %}
<!-- Blocktrans con plurale -->
{% blocktrans count totale=articoli|length %}
Hai {{ totale }} articolo nel carrello.
{% plural %}
Hai {{ totale }} articoli nel carrello.
{% endblocktrans %}
Generare i File di Traduzione
Dopo aver marcato tutte le stringhe, genera i file .po con makemessages:
# Crea la cartella locale se non esiste
mkdir -p locale
# Genera i file per l'inglese
python manage.py makemessages -l en
# Genera per tutte le lingue configurate
python manage.py makemessages --all
Questo crea un file locale/en/LC_MESSAGES/django.po che puoi modificare:
#: myapp/views.py:8
msgid "Benvenuto nella nostra piattaforma!"
msgstr "Welcome to our platform!"
#: templates/home.html:5
msgid "Benvenuto"
msgstr "Welcome"
Dopo aver inserito le traduzioni, compila i file:
python manage.py compilemessages
Traduzione di File JavaScript
Per tradurre stringhe nel codice JavaScript:
python manage.py makemessages -d djangojs -l en
Cambio della Lingua
Django fornisce una view integrata per cambiare lingua:
# urls.py
from django.conf.urls.i18n import i18n_patterns
urlpatterns = [
path("i18n/", include("django.conf.urls.i18n")),
]
# URL con prefisso lingua (/it/articoli/, /en/articles/)
urlpatterns += i18n_patterns(
path("articoli/", views.lista_articoli, name="lista-articoli"),
)
Nel template, un selettore di lingua:
{% load i18n %}
<form action="{% url 'set_language' %}" method="post">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}">
<select name="language" onchange="this.form.submit()">
{% get_available_languages as lingue %}
{% get_current_language as lingua_corrente %}
{% for codice, nome in lingue %}
<option value="{{ codice }}" {% if codice == lingua_corrente %}selected{% endif %}>
{{ nome }}
</option>
{% endfor %}
</select>
</form>
Conclusione
Lâinternazionalizzazione in Django e un sistema maturo e ben integrato nel framework. Con gettext, i tag {% trans %} e {% blocktrans %}, e i comandi makemessages e compilemessages, puoi rendere la tua applicazione accessibile a utenti di tutto il mondo. Ricorda di usare gettext_lazy per le definizioni dei modelli e gettext per le viste.