diff options
Diffstat (limited to 'xml-i18n-extract.in')
-rw-r--r-- | xml-i18n-extract.in | 303 |
1 files changed, 303 insertions, 0 deletions
diff --git a/xml-i18n-extract.in b/xml-i18n-extract.in new file mode 100644 index 0000000..1f7fced --- /dev/null +++ b/xml-i18n-extract.in @@ -0,0 +1,303 @@ +#!@XML_I18N_TOOLS_PERL@ -w +# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*- + +# +# The XML Translation Extractor +# +# Copyright (C) 2000 Free Software Foundation. +# +# This library 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 script 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 library; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +# Authors: Kenneth Christiansen <kenneth@gnu.org> +# Darin Adler <darin@eazel.com> +# + +## Release information +my $PROGRAM = "xml-i18n-extract"; +my $PACKAGE = "xml-i18n-tools"; +my $VERSION = "0.8.2"; + +## Script options - Enable by setting value to 1 +my $ENABLE_INI = "1"; ## desktop and alike files +my $ENABLE_KEYS = "1"; ## mimetype descriptions +my $ENABLE_GLADE = "1"; ## glade files +my $ENABLE_XML = "1"; ## generic xml files + +## Loaded modules +use strict; +use File::Basename; +use Getopt::Long; + +## Scalars used by the option stuff +my $TYPE_ARG = "0"; +my $LOCAL_ARG = "0"; +my $HELP_ARG = "0"; +my $VERSION_ARG = "0"; +my $UPDATE_ARG = "0"; +my $QUIET_ARG = "0"; + +my $FILE; +my $OUTFILE; + +my $gettext_type = ""; +my $input; +my %messages = (); + +## Always print first +$| = 1; + +## Handle options +GetOptions ( + "type=s" => \$TYPE_ARG, + "local|l" => \$LOCAL_ARG, + "help|h|?" => \$HELP_ARG, + "version|v" => \$VERSION_ARG, + "update" => \$UPDATE_ARG, + "quiet|q" => \$QUIET_ARG, + ) or &error; + +&split_on_argument; + + +## Check for options. +## This section will check for the different options. + +sub split_on_argument { + + if ($VERSION_ARG) { + &version; + + } elsif ($HELP_ARG) { + &help; + + } elsif ($LOCAL_ARG) { + &place_local; + &extract; + + } elsif ($UPDATE_ARG) { + &place_normal; + &extract; + + } elsif (@ARGV > 0) { + &place_normal; + &message; + &extract; + + } else { + &help; + + } +} + +sub place_normal { + $FILE = $ARGV[0]; + $OUTFILE = "$FILE.h"; +} + +sub place_local { + $OUTFILE = fileparse($FILE, ()); + if (!-e "tmp/") { + system("mkdir tmp/"); + } + $OUTFILE = "./tmp/$OUTFILE.h" +} + +sub determine_type { + if ($TYPE_ARG =~ /^gettext\/(.*)/) { + $gettext_type=$1 + } +} + +## Sub for printing release information +sub version{ + print "${PROGRAM} (${PACKAGE}) $VERSION\n"; + print "Copyright (C) 2000 Free Software Foundation, Inc.\n"; + print "Written by Kenneth Christiansen, 2000.\n\n"; + print "This is free software; see the source for copying conditions. There is NO\n"; + print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"; + exit; +} + +## Sub for printing usage information +sub help{ + print "Usage: ${PROGRAM} [FILENAME] [OPTIONS] ...\n"; + print "Generates a header file from an xml source file.\n\nGrabs all strings "; + print "between <_translatable_node> and it's end tag,\nwhere tag are all allowed "; + print "xml tags. Read the docs for more info.\n\n"; + print " -v, --version shows the version\n"; + print " -h, --help shows this help page\n"; + print " -q, --quiet quiet mode\n"; + print "\nReport bugs to <kenneth\@gnu.org>.\n"; + exit; +} + +## Sub for printing error messages +sub error{ +# print "xml-i18n-extract: invalid option @ARGV\n"; + print "Try `${PROGRAM} --help' for more information.\n"; + exit; +} + +sub message { + print "Generating C format header file for translation.\n"; +} + +sub extract { + &determine_type; + + &convert ($FILE); + + open OUT, ">$OUTFILE"; + &msg_write; + close OUT; + + print "Wrote $OUTFILE\n" unless $QUIET_ARG; +} + +sub convert($) { + + ## Reading the file + { + local (*IN); + local $/; #slurp mode + open (IN, "<$FILE") || die "can't open $FILE: $!"; + $input = <IN>; + } + + &type_ini; + &type_keys; + &type_xml; + &type_glade; +} + +sub type_ini { + + if ($ENABLE_INI) { + + ### For generic translatable desktop files ### + + if ($gettext_type eq "ini"){ + + while ($input =~ /^_.*=(.*)$/mg) { + $messages{$1} = []; + } + } + } +} + +sub type_keys { + + if ($ENABLE_KEYS) { + + ### For generic translatable mime/keys files ### + + if ($gettext_type eq "keys"){ + while ($input =~ /^\s*_\w+=(.*)$/mg) { + $messages{$1} = []; + } + } + } +} + +sub type_xml { + + if ($ENABLE_XML) { + + ### For generic translatable XML files ### + + if ($gettext_type eq "xml"){ + + while ($input =~ /[\t\n\s]_\w+=\"([^\"]+)\"/sg) { + $messages{$1} = []; + } + + while ($input =~ /<_\w+>([^_]+)<\/_\w+>/sg) { + $messages{$1} = []; + } + + } + } +} + +sub type_glade { + + if ($ENABLE_GLADE) { + + ### For translatable Glade XML files ### + + if ($gettext_type eq "glade"){ + + my $translate = "label|title|text|format|copyright|comments| + preview_text|tooltip"; + + while ($input =~ /<($translate)>([^<]+)<\/($translate)>/sg) { + + # Glade has some bugs, especially it uses translations tags to contain little + # non-translatable content. We work around this, by not including these + # strings that only includes something like: label4, and window1 + if ($2 !~ /^(window|label)[0-9]+$/) { + $messages{$2} = []; + } + } + + while ($input =~ /<items>(..[^<]*)<\/items>/sg) { + my @items = split (/\n/, $1); + for (my $n = 0; $n < @items; $n++) { + $messages{$items[$n]} = []; + } + } + + } + } + +} + +sub msg_write { + + foreach my $message (sort keys %messages) { + + my ($tag) = @{ $messages{$message} }; + + # Replace XML entities for some special characters with + # the appropriate gettext syntax for those characters. + $message =~ s/"/\\"/mg; # " + $message =~ s/</</mg; + $message =~ s/>/>/mg; + $message =~ s/&/&/mg; + + print OUT "/* xgettext:no-c-format */\n" if $message =~ /%/; + print OUT "/* $tag */\n" if $tag; + + my @lines = split (/\n/, $message); + + for (my $n = 0; $n < @lines; $n++) { + + if ($n == 0) { + print OUT "char *s = N_(\""; + } else { + print OUT " \""; + } + + print OUT $lines[$n]; + + if ($n < @lines - 1) { + print OUT "\\n\"\n"; + } else { + print OUT "\");\n"; + } + } + } +} + |