Traduction · 5 min read · Jan 20, 2026

Gettext pour sites Web statiques

Gettext pour sites Web statiques

Voici comment j’ai mis en place un système de gestion de traduction pour un site Web statique, en utilisant GNU gettext. Pour les impatients, je l’ai distillé en 11 instructions à la fin.

Objectif

Ce système permet une traduction bloc par bloc (chaîne par chaîne), ce qui est mieux que page par page car :

  • Les modifications des parties non traduites seront appliquées à toutes les traductions automatiquement (formatage, balises, images, peut-être dates, noms, liens, etc.).
  • En stockant les blocs de texte de toutes les pages ensemble, les blocs répétés n’auront besoin d’être traduits qu’une seule fois (texte du menu, mentions de droits d’auteur, titres, etc.).
  • Vous ne vous perdrez pas lorsque l’original change pendant que la traduction est encore en cours.
  • Lorsque vous modifiez un paragraphe dans l’original, il est plus facile de voir quelles parties des traductions doivent être mises à jour.

Pour un tel système, les étapes abstraites sont :

  1. Marquez d’une manière ou d’une autre chaque bloc de texte traduisible dans votre page Web. Les parties non traduisibles deviendront un cadre partagé.
  2. Extrayez les blocs dans une base de données. Traduisez.
  3. Trouvez ou écrivez un logiciel pour fusionner les blocs dans le cadre afin de recréer la page Web originale - mais avec l’option de prendre les blocs de texte soit de la base de données anglaise, soit de l’une des versions traduites de la base de données.

Gettext semblait être une possibilité évidente, et tout fonctionne parfaitement maintenant, mais cela m’a pris huit heures. La difficulté était que la documentation existante est entièrement orientée vers l’utilisation de gettext pour des programmes informatiques, pas pour des sites Web ou des documents. C’est à ce moment-là que j’ai réalisé que je devais documenter ce que j’ai fait :

Ce que j’ai fait

J’ai commencé par transformer minimalement ma page Web en un programme informatique. Cela a impliqué cinq étapes :

  1. Écrire un petit programme qui imprime du texte (une chaîne) dans un fichier.
  2. Copier la page Web dans le programme à la place de la chaîne.
  3. Insérer quelques morceaux de code standard requis par gettext.
  4. Diviser la chaîne en chaînes plus petites, séparant les traduisibles des non-traduisibles.
  5. Marquer les chaînes traduisibles avec le tag de gettext (le format des tags dépend du langage de programmation que vous utilisez, mais c’est généralement quelque chose impliquant un soulignement _ ).

Gettext fonctionne avec de nombreux langages de programmation, donc choisissez parmi les exemples qui viennent avec le package. Sur mon ordinateur, ceux-ci se trouvent dans ce dossier :
/usr/share/doc/gettext-doc/examples/
Le choix du langage n’est pas important. Le code sera très simple.

Voici mon index.html original :



Vache


Voir aussi : FSFE

Parmi les langages de programmation pris en charge, je choisis Scheme (un dialecte de Lisp). À première vue, le code ci-dessous semble complexe, mais vous n’aurez à modifier que les premier et troisième blocs. Le premier bloc définit trois variables qui devraient être explicites. Tout le texte de la page Web se trouve dans le troisième bloc. Il est divisé en blocs et j’ai mis des tags gettext pour Scheme (_ ) autour des blocs traduisibles. Voici, 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"
(_ "Vache")
   "\n\n\n

" (_ "Voir aussi : ") "" (_ "FSFE") "

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

Trois des huit chaînes sont marquées comme traduisibles. Les cinq autres font partie du cadre partagé qui sera le même peu importe la version linguistique de la page générée.

N’oubliez pas de remplacer les guillemets dans votre HTML par un guillemet inversé ( \” ), et d’ajouter quelques sauts de ligne ( \n ) pour rendre la sortie lisible. Ce sont les séquences de guillemet et de nouvelle ligne pour Scheme. Elles sont les mêmes dans quelques autres langages, mais différentes dans d’autres.

Avant de continuer, vous devez définir la variable “build-directory” sur le répertoire où se trouve generate-index.scm. Si vous ne le faites pas, tout semblera fonctionner mais votre programme n’accédera jamais aux chaînes traduites.

Cela fait, vous extrayez les chaînes traduisibles avec ces deux commandes :

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

Et ensuite, vous pouvez créer un fichier (un fichier “po”) pour les traductions françaises avec cette commande :

  • $ msginit --locale=fr

Une partie du manuel gettext dit que “msginit” est optionnel - que vous pouvez le faire manuellement à la place, mais cela n’a pas du tout fonctionné pour moi. J’ai passé deux heures à diagnostiquer ce problème. Utilisez msginit.

Cela crée fr.po que vous pouvez éditer avec n’importe quel éditeur de texte. Il y aura une ligne en haut comme ceci :

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

Si votre charset est “ASCII”, vous devriez probablement le changer en UTF-8. Si votre charset est autre et que vous recevez des messages d’erreur d’autres outils gettext (comme msgmerge) concernant des caractères invalides, alors changer le charset en UTF-8 pourrait également être la solution. Il y aura aussi un champ pour le content-transfer-encoding. Le manuel dit que cela devrait toujours être “8bit”.

Emacs est particulièrement bon pour éditer des fichiers po car il a un mode d’édition spécial pour eux.

Et ensuite, vous devez convertir votre fichier po en format mo spécial et le mettre dans le sous-répertoire où gettext s’attend à ce qu’il soit avec ces deux commandes :

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

Rendez le fichier Scheme exécutable, et c’est tout !

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, donc voici votre preuve de concept. Ensuite, je dois convertir mon site à ce système et le maintenir (en utilisant msgmerge). J’essaierai de garder des notes à publier ici.

Les instructions

  1. Créez un fichier vide generate-index.scm
  2. Copiez mon generate-index.scm (ci-dessus) dans votre fichier
  3. Ajustez le build-directory (3ème variable définie) dans generate-index.scm pour pointer vers le répertoire où se trouve votre 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. éditez fr.po pour ajouter les traductions des trois chaînes de texte
  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)
Soutenez le logiciel libre : Rejoignez le Fellowship de la FSFE

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.