i18n and script to update translations
authorcasta <casta@78f58264-58f8-0310-be4b-c7ad7e3b7018>
Thu, 25 Aug 2005 12:34:20 +0000 (12:34 +0000)
committercasta <casta@78f58264-58f8-0310-be4b-c7ad7e3b7018>
Thu, 25 Aug 2005 12:34:20 +0000 (12:34 +0000)
git-svn-id: svn+ssh://svn.xwing.info/home/svn/gtk-fuser/trunk@483 78f58264-58f8-0310-be4b-c7ad7e3b7018

gtk-fuser
list-strings [new file with mode: 0755]

index 5003d2313309abd71d6376b7c38558db171a0c7c..2af6a95abb54801a18fd1c27fad96dbc14e14663 100755 (executable)
--- a/gtk-fuser
+++ b/gtk-fuser
 #
 # Guillaume Castagnino <casta@xwing.info>
 
+require 5.004;
+
 use strict;
 use utf8;
 use Gtk2::Pango;
+use POSIX qw(locale_h);
 use Data::Dumper;
 
 ###############
@@ -45,6 +48,12 @@ $build =~ s/^\$Id:\s+//g;
 $build =~ s/Z\s+\S+\s+\$$//g;
 print Dumper $passwdMap if $debug;
 
+# Configuring locale
+my $lc_messages = setlocale (LC_MESSAGES);
+my $codeset = 'default';
+$codeset = 'fr' if $lc_messages =~ m/fr/i;
+my $locale = getStrings ($codeset);
+
 ##################
 # Init Interface #
 ##################
@@ -52,17 +61,17 @@ print Dumper $passwdMap if $debug;
 use Gtk2 '-init';
 
 my $window = Gtk2::Window->new ('toplevel');
-$window->set_title ("Gtk2 fuser Front-End");
+$window->set_title (_("Gtk-Fuser : a Gtk2 fuser Front-End"));
 $window->set_default_size (640, 480);
 # Window events
 $window->signal_connect ('delete_event', \&quit);
 $window->signal_connect ('destroy', \&quit);
 
 # Buttons
-my $bKill = Gtk2::Button->new ('Tuer les processus');
-my $bSearch = Gtk2::Button->new ('(Re)Lancer la recherche');
-my $bBrowseFile = Gtk2::Button->new ('Fichier');
-my $bBrowseFolder = Gtk2::Button->new ('Répertoire');
+my $bKill = Gtk2::Button->new (_("Kill processes"));
+my $bSearch = Gtk2::Button->new (_("Launch search"));
+my $bBrowseFile = Gtk2::Button->new (_("File"));
+my $bBrowseFolder = Gtk2::Button->new (_("Directory"));
 # Connect signal buttons
 $bKill->signal_connect ('clicked', \&killPids);
 $bSearch->signal_connect ('clicked', \&search);
@@ -71,7 +80,7 @@ $bBrowseFolder->signal_connect ('clicked', \&selectFolder);
 
 # Entry
 my $pathEntry = Gtk2::Entry->new ();
-$pathEntry->set_text ("Chemin");
+$pathEntry->set_text (_("Path"));
 $pathEntry->set_activates_default (1);
 $pathEntry->signal_connect ('activate', \&search);
 
@@ -80,8 +89,6 @@ my $progressBar = Gtk2::ProgressBar->new ();
 $progressBar->set_fraction (0);
 
 # PList
-my $pTextScroll = Gtk2::ScrolledWindow->new ();
-$pTextScroll->set_policy ('automatic', 'automatic');
 my $pTextBuffer = Gtk2::TextBuffer->new ();
 $pTextBuffer->create_tag ('bold', weight => PANGO_WEIGHT_BOLD);
 $pTextBuffer->create_tag ('fixed', family => "Courier 10 pitch");
@@ -93,6 +100,9 @@ $pText->set_editable (0);
 $pText->set_cursor_visible (0);
 $pText->set_wrap_mode ('none');
 $pText->set_right_margin (20);
+my $pTextScroll = Gtk2::ScrolledWindow->new ();
+$pTextScroll->set_policy ('automatic', 'automatic');
+$pTextScroll->add ($pText);
 
 # Statutbar
 my $statusBar = Gtk2::Statusbar->new ();
@@ -108,7 +118,6 @@ $hbox->pack_start ($bBrowseFile, 0, 0, 0);
 $hbox->pack_start ($bBrowseFolder, 0, 0, 0);
 $vbox->pack_start ($hbox, 0, 0, 4);
 $vbox->pack_start ($bSearch, 0, 0, 2);
-$pTextScroll->add ($pText);
 $vbox->pack_start ($pTextScroll, 1, 1, 2);
 $vbox->pack_start ($bKill, 0, 0, 2);
 $vbox->pack_start ($progressBar, 0, 0, 4);
@@ -169,7 +178,7 @@ sub search
         print "Opening /proc/$p/status\n" if $debug;
         if (not (open (PINFO, "/proc/$p/status")))
         {
-            print STDERR "Impossible d'ouvrir /proc/$p/status\n";
+            print STDERR _("Can't open")." /proc/$p/status\n";
             next;
         }
         while (<PINFO>)
@@ -183,23 +192,23 @@ sub search
         if ($pinfo =~ m/c/ and -r "/proc/$p/cwd") # cwd
         {
             my $cwd = readlink ("/proc/$p/cwd") if -l "/proc/$p/cwd";
-            $fdList->{"%> Répertoire courant : $cwd"} = 1 if $cwd =~ m/$regexpText/;
+            $fdList->{"%> "._("Current directory")." : $cwd"} = 1 if $cwd =~ m/$regexpText/;
         }
         if ($pinfo =~ m/e/ and -r "/proc/$p/exe") # exe
         {
             my $exe = readlink ("/proc/$p/exe") if -l "/proc/$p/exe";
-            $fdList->{"%> $exe en cours d'exécution"} = 1 if $exe =~ m/$regexpText/;
+            $fdList->{"%> $exe "._("currently running")} = 1 if $exe =~ m/$regexpText/;
         }
         if ($pinfo =~ m/r/ and -r "/proc/$p/root") # root
         {
             my $root = readlink ("/proc/$p/root") if -l "/proc/$p/root";
-            $fdList->{"%> Répertoire racine : $root"} = 1 if $root =~ m/$regexpText/;
+            $fdList->{"%> "._("Root directory")." : $root"} = 1 if $root =~ m/$regexpText/;
         }
         # Search for openned handles in searchText path
         next if not -r "/proc/$p/fd";
         if (not (opendir (FDDIR, "/proc/$p/fd")))
         {
-            print STDERR "Impossible d'ouvrir /proc/$p/fd\n";
+            print STDERR  _("Can't open")." /proc/$p/fd\n";
             next;
         }
         my @fds = readdir (FDDIR);
@@ -292,9 +301,9 @@ sub setText
         my $name = $process->{name};
         my $uid = $process->{uid};
         my $fdsList = $process->{fds};
-        $pTextBuffer->insert_with_tags_by_name ($iter, "- Processus : ", 'gapbold');
+        $pTextBuffer->insert_with_tags_by_name ($iter, _("- Process : "), 'gapbold');
         $pTextBuffer->insert_with_tags_by_name ($iter, "$name ($pid)\n", 'underline');
-        $pTextBuffer->insert_with_tags_by_name ($iter, "- Propriétaire : ", 'bold');
+        $pTextBuffer->insert_with_tags_by_name ($iter, _("- Owner : "), 'bold');
         $pTextBuffer->insert ($iter, "$uid\n");
         for my $path (sort keys %$fdsList)
         {
@@ -314,7 +323,7 @@ sub confirmBox
     my $dialog = Gtk2::MessageDialog->new ($window,
                                        [qw/modal destroy-with-parent/],
                                        'question', 'ok-cancel',
-                                       "Êtes-vous sur de vouloir tuer $nb processus ?");
+                                       _("Are you sure to want to kill ").$nb._(" processes ?"));
     my $return = $dialog->run ();
     $dialog->destroy ();
     yield ();
@@ -330,14 +339,14 @@ sub infoBox
         $dialog = Gtk2::MessageDialog->new ($window,
                                        [qw/modal destroy-with-parent/],
                                        'info', 'ok',
-                                       "$nb processus toujours en vie");
+                                       $nb._("processes still alive"));
     }
     else
     {
         $dialog = Gtk2::MessageDialog->new ($window,
                                        [qw/modal destroy-with-parent/],
                                        'info', 'ok',
-                                       "Opération réussie");
+                                       _("Operation succesfull"));
     }
     $dialog->run ();
     $dialog->destroy ();
@@ -347,7 +356,7 @@ sub infoBox
 sub selectFile
 {
     my $fs = Gtk2::FileChooserDialog->new (
-            "Choisir un fichier",
+            _("Choose a file"),
             $window,
             'open',
             'gtk-cancel' => 'cancel',
@@ -363,7 +372,7 @@ sub selectFile
 sub selectFolder
 {
     my $fs = Gtk2::FileChooserDialog->new (
-            "Choisir un répertoire",
+            _("Choose a folder"),
             $window,
             'select-folder',
             'gtk-cancel' => 'cancel',
@@ -406,3 +415,51 @@ sub quit
     return 0;
 }
 
+##################
+# i18n functions #
+##################
+
+# We are not using standard i18n, since we want a "one file" application
+
+sub _
+{
+    my $text = shift;
+    return $text if $codeset eq 'default';
+    if (not defined $locale->{$text})
+    {
+        print STDERR "Warning, \"$text\" not translated\n";
+        return $text;
+    }
+    return $locale->{$text};
+}
+
+sub getStrings
+{
+    my $lang = shift;
+    my %strings = (
+        fr => {
+            "Gtk-Fuser : a Gtk2 fuser Front-End" => "Gtk-Fuser : frontal pour fuser en Gtk2",
+            "Kill processes" => "Tuer les processus",
+            "Launch search" => "(Re)Lancer la recherche",
+            "File" => "Fichier",
+            "Directory" => "Répertoire",
+            "Path" => "Chemin",
+            "Can't open" => "Impossible d'ouvrir",
+            "Current directory" => "Répertoire courant",
+            "currently running" => "en cours d'exécution",
+            "Root directory" => "Répertoire racine",
+            "Can't open" => "Impossible d'ouvrir",
+            "- Process : " => "- Processus : ",
+            "- Owner : " => "- Propriétaire : ",
+            "Are you sure to want to kill " => "Êtes-vous sur de vouloir tuer ",
+            " processes ?" => " processus ?",
+            "processes still alive" => " processus toujours en vie",
+            "Operation succesfull" => "Opération réussie",
+            "Choose a file" => "Choisir un fichier",
+            "Choose a folder" => "Choisir un répertoire",
+        },
+    );
+    return if $lang eq 'default' or not defined $strings{$lang};
+    return $strings{$lang};
+}
+
diff --git a/list-strings b/list-strings
new file mode 100755 (executable)
index 0000000..20c010b
--- /dev/null
@@ -0,0 +1,78 @@
+#!/usr/bin/perl -w
+# $Id$
+
+# list-strings, an util to extract translated strings from a file
+# part of gtk-fuser, a perl-gtk2 frontend to fuser (from psmisc)
+# Copyright (C) 2005 Guillaume Castagnino
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+# Guillaume Castagnino <casta@xwing.info>
+
+use strict;
+use utf8;
+use encoding 'utf8';
+use Data::Dumper;
+
+my $file = $ARGV[0];
+my @currentStrings;
+
+open FILE, $file or die "Error opening $file\n";
+print "====================================\nlanguage template\n====================================\n";
+print "        lang_code => {\n";
+while (my $ligne = <FILE>)
+{
+    my @match = ($ligne =~ m/_\(([^\)]+)\)/g);
+    for my $val (@match)
+    {
+        $val =~ s/^"|'//;
+        $val =~ s/"|'$//;
+        push @currentStrings, $val;
+        print "            \"$val\" =>\n";
+    }
+}
+print "        }\n";
+close FILE;
+
+my %strings;
+
+open FILE, $file or die "Error opening $file\n";
+my $content = "";
+my $start = 0;
+while (my $ligne = <FILE>)
+{
+    chomp $ligne;
+    $start = 1 if $ligne =~ m/^\s+my \%strings = \(/;
+    $content .= $ligne if $start == 1;
+    $start = 0 if $ligne =~ m/^\s+\);/;
+}
+close FILE;
+
+$content =~ s/my \%strings =//;
+%strings = eval $content;
+
+print "====================================\nUpdated \%strings version :\n====================================\n";
+print "    my %strings = (\n";
+for my $lang (keys %strings)
+{
+    print "        $lang => {\n";
+    my $langHash = $strings{$lang};
+    for my $key (@currentStrings)
+    {
+        print "            \"$key\" => \"$langHash->{$key}\",\n";
+    }
+    print "        },\n";
+}
+print "    );\n";