Engineering Notes

Nota 06 / Internazionalizzazione

Django i18n: verifica lingua, URL e metadati

Tradurre il testo non basta. Cambio lingua, link interni e metadati SEO devono descrivere la stessa versione della pagina.

Una lingua, più segnali incoerenti

Una pagina italiana può avere il testo tradotto ma link interni tedeschi, canonical tedesco e commenti del codice in un’altra lingua. Uno screen reader può inoltre usare la pronuncia sbagliata se lang non corrisponde al contenuto. Un catalogo compilato correttamente dice poco su questi errori.

Definisci prima quali pagine sono interamente tradotte. Solo queste versioni devono comparire nel selettore di lingua, negli hreflang e nella sitemap. Un ripiego tedesco in una lista inglese richiede un’etichetta chiara e lang="de" sul testo tedesco; non è una traduzione inglese dell’articolo.

Lascia risolvere la route a Django

Per le pagine interamente tradotte usa una route nominata dentro i18n_patterns come fonte dell’URL. Con prefix_default_language=False il tedesco conserva il percorso originale; italiano e inglese ricevono il prefisso. Esegui reverse() nel relativo contesto override(). La corrispondenza resta corretta anche se cambia la struttura degli URL.

Python · metadati URL per pagine interamente tradotte
from django.urls import reverse
from django.utils.translation import override

LANGUAGES = ("de", "it", "en")


def page_metadata(route_name, language, host="https://codlab.de"):
    if language not in LANGUAGES:
        raise ValueError("unsupported language")
    # Pagine interamente tradotte, con le route reali di Django.
    urls = {}
    for code in LANGUAGES:
        with override(code):
            urls[code] = host + reverse(route_name)
    return {
        "canonical": urls[language],
        "alternates": {**urls, "x-default": urls["de"]},
        "inLanguage": language,
    }

La pagina servita come contratto

Per ogni lingua verifica stato HTTP, html lang, un solo titolo principale, description, canonical e og:url. Ogni hreflang deve puntare alla traduzione esistente della stessa pagina e ricevere il collegamento reciproco. x-default può indicare il tedesco. In TechArticle, inLanguage deve coincidere con l’edizione.

Il test locale esegue la funzione con le route Engineering reali del clone. Verifica i tre URL, una lingua non supportata e il ripristino della lingua precedentemente attiva. Il controllo nel browser verifica poi metadati e link realmente renderizzati. Nessuna di queste prove sostituisce la lettura della traduzione.

Cataloghi ed edizioni complete

gettext è adatto all’interfaccia condivisa. I testi editoriali lunghi possono avere edizioni versionate proprie, purché un’edizione mancante produca un errore visibile anziché un ripiego tedesco silenzioso. Compila i PO modificati prima del test: un MO vecchio può nascondere un sorgente corretto.

L’esempio presuppone la stessa route nominata per tre edizioni complete. Per un blog tradotto solo in parte serve un registro delle traduzioni disponibili e, se necessario, slug diversi per lingua. Anche la cache deve distinguere la lingua. Controlla inoltre commenti nei blocchi di codice e date: entrambi sono contenuti visibili.