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 :

Les liens m’ayant bien aidé :

Vus : 371
Publié par David Mercereau : 37