00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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.