Traduzione Siti · 5 min read · Jan 20, 2026

Gettext per Siti Web Statici

Gettext per Siti Web Statici

Ecco come ho implementato un sistema di gestione delle traduzioni per un sito web statico, utilizzando GNU gettext. Per i più impazienti, l’ho ridotto a 11 istruzioni alla fine.

Obiettivo

Questo sistema consente la traduzione blocco per blocco (stringa per stringa), che è migliore rispetto alla traduzione pagina per pagina perché:

  • Le modifiche alle parti non tradotte verranno applicate automaticamente a tutte le traduzioni (formattazione, tag, immagini, forse date, nomi, link, ecc.).
  • Memorizzando i blocchi di testo di tutte le pagine insieme, i blocchi ripetuti dovranno essere tradotti solo una volta (testo del menu, avvisi di copyright, intestazioni, ecc.).
  • Non ti perderai quando l’originale cambia mentre la traduzione è ancora in corso.
  • Quando cambi un paragrafo nell’originale, è più facile vedere quali parti delle traduzioni devono essere aggiornate.

Per un tale sistema, i passaggi astratti sono:

  1. In qualche modo contrassegnare ogni blocco di testo traducibile nella tua pagina web. Le parti non traducibili diventeranno un frame condiviso.
  2. Estrarre i blocchi in un database. Tradurre.
  3. Trovare o scrivere un software per unire i blocchi di nuovo nel frame per ricreare la pagina web originale - ma con l’opzione di prendere i blocchi di testo dal database inglese o da una delle versioni tradotte del database.

Gettext sembrava un’opzione ovvia, e ora tutto funziona perfettamente, ma ci sono volute otto ore. La difficoltà era che la documentazione esistente è tutta orientata all’uso di gettext per programmi informatici, non per siti web o documenti. È allora che ho realizzato che dovevo documentare ciò che ho fatto:

Cosa ho fatto

Ho iniziato trasformando minimamente la mia pagina web in un programma informatico. Questo ha comportato cinque passaggi:

  1. Scrivere un piccolo programma che stampa del testo (una stringa) in un file.
  2. Copiare la pagina web nel programma al posto della stringa.
  3. Inserire alcuni pezzi di codice standard richiesti da gettext.
  4. Suddividere la stringa in stringhe più piccole, separando quelle traducibili da quelle non traducibili.
  5. Contrassegnare le stringhe traducibili con il tag di gettext (il formato dei tag dipende dal linguaggio di programmazione che usi, ma di solito è qualcosa che coinvolge un trattino basso _ ).

Gettext funziona con molti linguaggi di programmazione, quindi scegli tra gli esempi che vengono forniti con il pacchetto. Sul mio computer, questi si trovano in questa cartella:
/usr/share/doc/gettext-doc/examples/
La scelta del linguaggio non è importante. Il codice sarà semplicissimo.

Ecco il mio index.html originale:



Cow


See also: FSFE

Tra i linguaggi di programmazione supportati, scelgo Scheme (un dialetto di Lisp). A prima vista, il codice qui sotto sembra complesso, ma dovrai solo modificare i primi e i terzi blocchi. Il primo blocco definisce tre variabili che dovrebbero essere autoesplicative. Tutto il testo della pagina web è nel terzo blocco. È suddiviso in blocchi e ho messo i tag gettext per Scheme (_ ) attorno ai blocchi traducibili. Ecco qui, generate-index.scm:

#!/usr/bin/guile -s
!#
(define output-filename "index.html")
(define project-name "ciarans-website")
(define build-directory "/home/ciaran/website-build/")
(use-modules (ice-9 format))
(catch #t (lambda () (setlocale LC_ALL "")) (lambda args #f))
(textdomain project-name)
(bindtextdomain project-name build-directory)
(define _ gettext)
(define page-text (string-append
   "\n"
(_ "Cow")
   "\n\n\n

" (_ "See also: ") "" (_ "FSFE") "

\n" "\n\n")) (define the-file (open-file output-filename "w")) (display page-text the-file)

Tre delle otto stringhe sono contrassegnate come traducibili. Le altre cinque fanno parte del frame condiviso che sarà lo stesso indipendentemente dalla versione linguistica della pagina che viene generata.

Ricorda di sostituire eventuali virgolette nel tuo HTML con backslash-virgolette ( \” ), e di aggiungere alcune interruzioni di riga ( \n ) per rendere l’output leggibile. Queste sono le sequenze di virgolette e di nuova riga per Scheme. Sono le stesse in alcuni altri linguaggi, ma sono diverse in altri.

Prima di continuare, devi impostare la variabile “build-directory” sulla directory in cui si trova generate-index.scm. Se non lo fai, tutto sembrerà funzionare ma il tuo programma non accederà mai alle stringhe tradotte.

Fatto ciò, estrai le stringhe traducibili con questi due comandi:

  • $ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm
  • $ mv ciarans-website.po ciarans-website.pot

E poi puoi creare un file (un file “po”) per le traduzioni in francese con questo comando:

  • $ msginit --locale=fr

Una parte del manuale di gettext dice che “msginit” è opzionale - che puoi farlo manualmente invece, ma questo non ha funzionato affatto per me. Ho passato due ore a diagnosticare quel problema. Usa msginit.

Questo crea fr.po che puoi modificare con qualsiasi editor di testo. Ci sarà una riga in cima come questa:

"Content-Type: text/plain; charset=UTF-8\n"

Se il tuo charset è “ASCII”, dovresti probabilmente cambiarlo in UTF-8. Se il tuo charset è qualcos’altro e ricevi messaggi di errore da altri strumenti gettext (come msgmerge) riguardo caratteri non validi, allora cambiare il charset in UTF-8 potrebbe essere anche la risposta. Ci sarà anche un campo per content-transfer-encoding. Il manuale dice che dovrebbe sempre essere “8bit”.

Emacs è particolarmente buono per modificare i file po perché ha una modalità di editing speciale per essi.

E poi devi convertire il tuo file po nel formato speciale mo e metterlo nella sottodirectory in cui gettext si aspetta che sia con questi due comandi:

  • $ mkdir -p fr/LC_MESSAGES
  • $ msgfmt --output-file=fr/LC_MESSAGES/ciarans-website.mo fr.po

Rendi il file Scheme eseguibile, e questo è tutto!

ciaran@hide:~/tests/simple-page$ LANGUAGE=fr ./generate-index.scm; cat index.html

Vache


Voir aussi : La FSFE

ciaran@hide:~/tests/simple-page$ LANGUAGE=en ./generate-index.scm; cat index.html Cow

See also: FSFE

ciaran@hide:~/tests/simple-page$

Ok, quindi c’è la tua prova di concetto. Next, devo convertire il mio sito a questo sistema e mantenerlo (usando msgmerge). Cercherò di tenere note da pubblicare qui.

Le istruzioni

  1. Crea un file vuoto generate-index.scm
  2. Copia il mio generate-index.scm (sopra) nel tuo file
  3. Regola la build-directory (3ª variabile definita) in generate-index.scm per puntare alla directory in cui si trova il tuo generate-index.scm
  4. $ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm
  5. $ mv ciarans-website.po ciarans-website.pot
  6. $ msginit --locale=fr
  7. modifica fr.po per aggiungere traduzioni delle tre stringhe di testo
  8. $ mkdir -p fr/LC_MESSAGES
  9. $ msgfmt --output-file=fr/LC_MESSAGES/ciarans-website.mo fr.po
  10. $ chmod +x generate-index.scm
  11. $ LANGUAGE=fr ./generate-index.scm; cat index.html


Ciaran O’Riordan, ( RSS)
Supporta il software libero: Unisciti al Fellowship di FSFE

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.