Perl/Glade/Gettext – Multilingue programme
Suite à un email d’une personne intéressée par la traduction de Xsshfs en Espagnol j’ai découvert Gettext n’ayant pas trouvé beaucoup de documentation précise je vais faire un petit HelloWorld en Perl Glade (pour l’interface GTK) et Locale::gettext
Le petit bout de programme que nous allons faire dépend de libgtk2-gladexml-perl & de liblocale-gettext-perl
Création des fichier de traduction
Après création du fichier Glade (que vous pouvez télécharger ici : helloworld.glade) il faut s’assurer que tous les champs que l’on souhaite traduire on la balise « translate » à « yes »
$ grep translatable helloworld.glade <property name="title" translatable="yes">HelloWorld</property> <property name="label" translatable="yes">Hello World</property> <property name="label" translatable="yes">Just one button</property>
Du coup nous allons extraire les données à traduire du fichier glade avec xgettext
$ mkdir po $ xgettext --sort-output --keyword=translatable -o po/helloworld.pot helloworld.glade
Ouvrez le fichier po/helloworld.pot et compléter avec votre adresse email / nom ect…
Ensuite faites des copies de ce fichier et commencer la traduction (dans notre exemple Anglais -> Français) :
$ cp po/helloworld.pot po/fr.po $ vi po/fr.po ... #: helloworld.glade:20 msgid "Hello World" msgstr "Bonjour tout le monde" #: helloworld.glade:8 msgid "HelloWorld" msgstr "Bonjour" #: helloworld.glade:36 msgid "Just one button" msgstr "Juste un bouton"
Théoriquement les traductions dans un système linux se trouve dans le chemin /usr/share/locale/fr/LC_MESSAGES mais nous allons les mettre dans un répertoire enfant (./locale) pour notre exemple. Ces traductions sont à « compiler » en .mo
$ mkdir ./locale/fr/LC_MESSAGES $ msgfmt ./po/fr.po -o ./locale/fr/LC_MESSAGES/helloworld.mo
Intégration dans le perl
Voici le fichier helloworld.pl
#!/usr/bin/perl -w use helloworld ; Gtk2->main ;
Et voici le fichier helloworld.pm
package rappels ; use strict; use warnings "all"; use Locale::gettext; use vars qw($gladexml) ; # $gladexml est donc la variable qui fera référence à l'arbre xml # de l'application. # On initialise la valeur de la variable quand l'arbre est créé # dans le module principale sub init { # Démarage de l'interface graphique $gladexml = $X::gladexml ; bindtextdomain("helloworld", "./locale"); textdomain("helloworld"); # Sans traduction print "HelloWorld\\n"; # Avec traduction print gettext("HelloWorld"), "\\n"; } sub on_window1_delete_event{ Gtk2->main_quit ; } sub on_bouton_quitter_clicked{ Gtk2->main_quit ; } 1 ; package X ; use strict ; use Locale::gettext; bindtextdomain("helloworld", "./locale"); textdomain("helloworld"); require Exporter ; use vars qw(@EXPORT_OK) ; @EXPORT_OK = qw ($gladexml) ; use vars qw($gladexml) ; use Gtk2 '-init' ; use Gtk2::GladeXML ; # On crée l'arbre xml complet. Attention, toutes les fenêtres déclarées # visibles dans le menu Propriétés->commun->visible, seront affichées # quand on lancera "Gtk2->main". $gladexml = Gtk2::GladeXML->new('helloworld.glade' ) ; # On initialise les variables du module rappels. rappels::init () ; # On connecte les fonctions de rappels de l'arbre xml # à leurs définitions qui sont contenues dans le module rappels. $gladexml->signal_autoconnect_from_package('rappels' ) ; 1 ;
Tester
Mon poste est en français, je vais donc tester en français puis en forçant l’anglais :
$ echo $LANG fr_FR.UTF-8 $ perl helloworld.pl HelloWorld Bonjour $ # L'interface doit aussi s'afficher en français $ LANG=en_US.utf-8 $ perl helloworld.pl HelloWorld HelloWorld $ # L'interface doit aussi s'afficher en anglais
Téléchargement
Vous pouvez télécharger l’intégralité du HellloWorld.pl :