Bash scripts can now easily internationalized with gettext.

 Here's how:

 Indicate the package's name when the scripts starts by adding a...
TEXTDOMAIN=package_name

 Mark any internationalizable string this way:

before: echo  "Hello"
after : echo $"Hello"

 That tells bash (2.0) to look for those strings in the corresponding file
(/usr/share/aa/LC_MESSAGES/package.mo).

 xgettext won't extract i18n messages from scripts. Bash has an included
feature to do so, but I find it unusable. So I'm enclosing a script  (with a
little of Perl) to extract messages from scripts.

 Then you may use the other gettext utilites, as msgmerge and msgfmt.

 If you want to see a working example, download the new `bug' source
archive.

 Bye...! Let's internationalize Debian!
/usr/bin/perl -ne '
if (/\$(".*[^\\]")/)
{
        $_ = $1;
        s/\\/\\\\/g;
        print $_, ";;;", $ARGV, ":" , $. , "\n" ;
} elsif (/\$\"(.*)$/)
        {
                $_ = $1;
                s/\\/\\\\/g;
                $line=$.;
                $msg="\"" . $_ . "\\n";
                $_ = <>;
                chomp;
                s/\\/\\\\/g;
                while(!/[^\\]"/)
                {
                        s/"/\\"/g;
                        $msg .= $_ . "\\n";
                        $_ = <>;
                        chomp;
                        s/\\/\\\\/g;
                }
                s/^(.*[^\\])".*$/$1/;
                s/"/\\"/g;
                $msg.=$_ . "\"";
                print $msg, ";;;", $ARGV, ":" , $line , "\n" ;
        }
close(ARGV) if (eof);
' $@ | sort |
perl -ne '
BEGIN {
        $saved_msgid="";
        $saved_pos="";
}

chomp;
($msgid,$pos)=split /\;\;\;/;

if ( $msgid eq $saved_msgid )
{
        $saved_pos = $saved_pos . " " . $pos;
} else
{
        if ($saved_msgid ne "")
        {
                print "#: " , $saved_pos , "\n";
                print "msgid ", $saved_msgid , "\n";
                print "msgstr \"\"\n\n";
        }
        $saved_pos = $pos;
        $saved_msgid = $msgid;
        $saved_msgid =~ s/([^\\])\\n/$1\\n"\n"/g;
}

END {
        if ($saved_msgid ne "")
        {
                print "#: ", $saved_pos, "\n";
                print "msgid ", $saved_msgid, "\n";
                print "msgstr \"\"\n\n";
        }
}
'

Reply via email to