diff options
-rw-r--r-- | xml-i18n-extract.in | 303 | ||||
-rw-r--r-- | xml-i18n-merge.in | 401 | ||||
-rw-r--r-- | xml-i18n-update.in | 513 |
3 files changed, 0 insertions, 1217 deletions
diff --git a/xml-i18n-extract.in b/xml-i18n-extract.in deleted file mode 100644 index 1f7fced..0000000 --- a/xml-i18n-extract.in +++ /dev/null @@ -1,303 +0,0 @@ -#!@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"; - } - } - } -} - diff --git a/xml-i18n-merge.in b/xml-i18n-merge.in deleted file mode 100644 index f492f4d..0000000 --- a/xml-i18n-merge.in +++ /dev/null @@ -1,401 +0,0 @@ -#!@XML_I18N_TOOLS_PERL@ -w - -# -# The XML Translation Merge Tool -# -# Copyright (C) 2000 Free Software Foundation. -# Copyright (C) 2000, 2001 Eazel, Inc -# -# 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: Maciej Stachowiak <mjs@eazel.com> -# Kenneth Christiansen <kenneth@gnu.org> -# Darin Adler <darin@eazel.com> -# - - -## Release information -my $PROGRAM = "xml-i18n-merge"; -my $PACKAGE = "xml-i18n-tools"; -my $VERSION = "0.8.2"; - -## Script options - Enable by setting value to 1 -my $ENABLE_XML = "1"; - -## Loaded modules -use strict; -use File::Basename; -use Getopt::Long; - -## Scalars used by the option stuff -my $HELP_ARG = "0"; -my $VERSION_ARG = "0"; -my $XML_STYLE_ARG = "0"; -my $KEYS_STYLE_ARG = "0"; -my $DESKTOP_STYLE_ARG = "0"; -my $QUIET_ARG = "0"; - - -## Handle options -GetOptions ( - "help|h|?" => \$HELP_ARG, - "version|v" => \$VERSION_ARG, - "quiet|q" => \$QUIET_ARG, - "xml-style|o" => \$XML_STYLE_ARG, - "keys-style|k" => \$KEYS_STYLE_ARG, - "desktop-style|d" => \$DESKTOP_STYLE_ARG - ) or &error; - - -my $PO_DIR; -my $FILE; -my $OUTFILE; - -my @languages; -my %po_files_by_lang = (); -my %translations = (); - -&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 ($XML_STYLE_ARG && @ARGV > 2) { - &place_normal; - &message; - &preparation; - &xml_merge_translations; - } elsif ($KEYS_STYLE_ARG && @ARGV > 2) { - &place_normal; - &message; - &preparation; - &keys_merge_translations; - } elsif ($DESKTOP_STYLE_ARG && @ARGV > 2) { - &place_normal; - &message; - &preparation; - &desktop_merge_translations; - } else { - &help; - } -} - - -sub place_normal { - $PO_DIR = $ARGV[0]; - $FILE = $ARGV[1]; - $OUTFILE = $ARGV[2]; -} - - -## Sub for printing release information -sub version{ - print "${PROGRAM} (${PACKAGE}) ${VERSION}\n"; - print "Written by Maciej Stachowiak and Kenneth Christiansen, 2000.\n\n"; - print "Copyright (C) 2000 Free Software Foundation, Inc.\n"; - print "Copyright (C) 2000, 2001 Eazel, Inc.\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} [OPTIONS] PO_DIRECTORY FILENAME OUTPUT_FILE\n"; - print "Generates an xml file that includes translated versions of some attributes,\n"; - print "from an untranslated source and a po directory that includes translations.\n"; - print " -v, --version shows the version\n"; - print " -h, --help shows this help page\n"; - print " -q, --quiet quiet mode\n"; - print " -o, --xml-style includes translations in the xml style\n"; - print " -k, --keys-style includes translations in the keys style\n"; - print " -d, --desktop-style includes translations in the desktop style\n"; - print "\nReport bugs to <mjs\@eazel.com>.\n"; - exit; -} - - -## Sub for printing error messages -sub error{ -# print "xml-i18n-merge: invalid option @ARGV\n"; - print "Try `${PROGRAM} --help' for more information.\n"; - exit; -} - - -sub message { - print "Merging translations into $OUTFILE.\n" unless $QUIET_ARG; -} - - - -sub preparation { - &gather_po_files; - &create_translation_database; -} - - - -# General-purpose code for looking up translations in .po files - -sub gather_po_files -{ - my @po_files = glob("${PO_DIR}/*.po"); - - @languages = map (&po_file2lang, @po_files); - - foreach my $lang (@languages) { - $po_files_by_lang{$lang} = shift (@po_files); - } -} - -sub po_file2lang -{ - my $tmp = $_; - $tmp =~ s/^.*\/(.*)\.po$/$1/; - return $tmp; -} - - -sub create_translation_database -{ - foreach my $lang (@languages) { - - my $po_file = $po_files_by_lang{$lang}; - - open PO_FILE, "<$po_file"; - - while (<PO_FILE>) { - if (/^#,.*fuzzy/) { - $_ = <PO_FILE>; next; - } - if (/^msgid "(.*)"/ ) { - my $msgid = $1; - $_ = <PO_FILE>; - - if (/^msgstr "(.+)"/) { - my $msgstr = $1; - $translations{$lang . "|" . $msgid} = $msgstr; - # print "[$lang]$msgstr\n"; - } - } - } - } -} - -sub lookup_translations -{ - my ($value) = @_; - - my %transmap = (); - - foreach my $lang (@languages) { - my $translation = lookup_translation ($value, $lang); - - if ($translation) { - $transmap{$lang} = $translation; - } - } - - return %transmap; -} - - -sub lookup_translation -{ - my ($string, $lang) = @_; - $string =~ s/\+/\\+/g; - - my $salt = "$lang|$string"; - - if ($translations{$salt}) { - return $translations{$salt}; - } - - return ""; -} - - -sub entity_encode_translations -{ - my %transmap = @_; - - foreach my $key (keys %transmap) { - $transmap{$key} = entity_encode ($transmap{$key}); - } - - return %transmap; -} - - -sub entity_encode -{ - my ($pre_encoded) = @_; - - $pre_encoded =~ s/\\(.)/$1/g; - my @list_of_chars = unpack ('C*', $pre_encoded); - - return join ('', map (&entity_encode_int, @list_of_chars)); -} - -sub entity_encode_int -{ - if ($_ > 127 || $_ == 34 || $_ == 38) { - return "&#" . $_ . ";"; - } else { - return chr $_; - } -} - - - - - -## OAF/XML-specific merge code - -sub xml_merge_translations -{ - my $xml_source; { - local (*INPUT); - local $/; # slurp mode - open INPUT, "<$FILE" or die "can't open $FILE: $!"; - $xml_source = <INPUT>; - close INPUT; - } - - open OUTPUT, ">$OUTFILE"; - - while ($xml_source =~ /[ \t]*<[^<]*\s_\w+="[^"]*"[^<]*>/m) { - print OUTPUT $`; - my $orig_node = $&; - $xml_source = $'; - - my $non_translated_line = $orig_node; - $non_translated_line =~ s/_(\w+)="/$1="/; - - my $new_node = $non_translated_line; - - my $value_str = $orig_node; - $value_str =~ s/.*_\w+="([^"]*)".*/$1/s; - - if ($value_str) { - my %value_translation_map = entity_encode_translations - (lookup_translations ($value_str)); - - foreach my $key (keys %value_translation_map) { - my $translation = $value_translation_map{$key}; - - my $translated_line = $orig_node; - $translated_line =~ s/name="([^"]*)"/name="$1-$key"/; - $translated_line =~ s/(\s*)_(\w+)="[^"]*"/$1$2="$translation"/; - - $new_node .= "\n$translated_line"; - } - } - - $xml_source = $new_node . $xml_source; - } - - print OUTPUT $xml_source; - - close OUTPUT; -} - -sub keys_merge_translations -{ - open INPUT, "<${FILE}"; - - open OUTPUT, ">${OUTFILE}"; - - while (<INPUT>) { - chomp; - if (/^\s*_\w+=.*/) { - my $orig_line = $_; - - my $non_translated_line = $orig_line; - $non_translated_line =~ s/_([^="]*)=/$1=/; - - print OUTPUT "${non_translated_line}\n"; - - my $value_str = $orig_line; - $value_str =~ s/.*_\w+=(.*)/$1/; - - if ($value_str) { - my %value_translation_map = lookup_translations ($value_str); - - foreach my $key (sort keys %value_translation_map) { - my $translation = $value_translation_map{$key}; - - my $translated_line = $orig_line; - $translated_line =~ s/_([^="]*)=([^\n]*)/\[$key]$1=$translation/; - print OUTPUT "$translated_line\n"; - } - } - } else { - print OUTPUT "$_\n"; - } - } - - close OUTPUT; - close INPUT; -} - -sub desktop_merge_translations -{ - open INPUT, "<${FILE}"; - - open OUTPUT, ">${OUTFILE}"; - - while (<INPUT>) { - chomp; - if (/^\s*_\w+=.*/) { - my $orig_line = $_; - - my $non_translated_line = $orig_line; - $non_translated_line =~ s/_([^="]*)=/$1=/; - - print OUTPUT "${non_translated_line}\n"; - - my $value_str = $orig_line; - $value_str =~ s/.*_\w+=(.*)/$1/; - - if ($value_str) { - my %value_translation_map = lookup_translations ($value_str); - - foreach my $key (sort keys %value_translation_map) { - my $translation = $value_translation_map{$key}; - - my $translated_line = $orig_line; - $translated_line =~ s/^_([^="]*)=([^\n]*)/$1\[$key]=$translation/; - print OUTPUT "$translated_line\n"; - } - } - } else { - print OUTPUT "$_\n"; - } - } - - close OUTPUT; - close INPUT; - -} diff --git a/xml-i18n-update.in b/xml-i18n-update.in deleted file mode 100644 index 374741b..0000000 --- a/xml-i18n-update.in +++ /dev/null @@ -1,513 +0,0 @@ -#!@XML_I18N_TOOLS_PERL@ -w - -# The GNOME Translation Update Tool -# -# 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. -# -# Author(s): Kenneth Christiansen - -## Release information -my $PROGRAM = "xml-i18n-update"; -my $VERSION = "0.8.2"; -my $_PACKAGE = "xml-i18n-tools"; - -## Loaded modules -use strict; -use Getopt::Long; -use Cwd; -use File::Copy; -use File::Find; - -## Scalars used by the option stuff -my $LANG = $ARGV[0]; -my $HELP_ARG = "0"; -my $VERSION_ARG = "0"; -my $DIST_ARG = "0"; -my $POT_ARG = "0"; -my $HEADERS_ARG = "0"; -my $MAINTAIN_ARG = "0"; -my $REPORT_ARG = "0"; -my $VERBOSE = "0"; - -my @languages; -my %po_files_by_lang = (); - -my $xml_extension = "xml|ui|glade|desktop\.in|directory\.in|" - ."soundlist\.in|keys\.in|kdelnk\.in|oaf(\.in)+"; - -my $PACKAGE = &find_package_name; - -## Always print as the first thing -$| = 1; - -## Give error if script is run without an argument -if (! $LANG){ - print "${PROGRAM}: missing file arguments\n"; - print "Try `${PROGRAM} --help' for more information.\n"; - exit; -} - -## Handle options -GetOptions ( - "help|h|?" => \$HELP_ARG, - "version|v" => \$VERSION_ARG, - "dist|d" => \$DIST_ARG, - "pot|p" => \$POT_ARG, - "headers|s" => \$HEADERS_ARG, - "maintain|m" => \$MAINTAIN_ARG, - "report|r" => \$REPORT_ARG, - "verbose|x" => \$VERBOSE - ) or &invalid_option; - - -## Use the supplied arguments -## Check for options. -## This section will check for the different options. - -sub split_on_argument { - - if ($VERSION_ARG) { - &version; - - } elsif ($HELP_ARG) { - &help; - - } elsif ($DIST_ARG) { - &merging; - &status; - - } elsif ($POT_ARG) { - &gen_headers; - &generate_pot; - - } elsif ($HEADERS_ARG) { - &gen_headers; - exit; - - } elsif ($MAINTAIN_ARG) { - &maintain; - - } elsif ($REPORT_ARG) { - &show_status; - - } elsif ($LANG) { - if ($LANG =~ /^-/){ ## not an option - &help; - } else { - &main; - } - - } else { - &help; - } -} - -&split_on_argument; - -sub main -{ - if(-s "$LANG.po"){ - print "Working, please wait..." unless $VERBOSE; - &gen_headers; - &generate_pot; - &merging; - &status; - } - - ## Report error if the language file supplied - ## to the command line is non-existent - else { - ¬_existing; - } -} - -sub determine_type($) { - my $type = $_; - - my $gettext_type; - - if ($type =~ /\[type: (gettext\/[^\]].*)]/) { - $gettext_type=$1; - } - elsif ($type =~ /(xml|ui|oaf(\.in)+)$/) { - $gettext_type="gettext\/xml"; - } - elsif ($type =~ /glade$/) { - $gettext_type="gettext\/glade"; - } - elsif ($type =~ /desktop(\.in)+$/) { - $gettext_type="gettext\/ini"; - } - elsif ($type =~ /directory(\.in)+$/) { - $gettext_type="gettext\/ini"; - } - elsif ($type =~ /kdelnk(\.in)+$/) { - $gettext_type="gettext\/ini"; - } - elsif ($type =~ /keys(\.in)+$/) { - $gettext_type="gettext\/keys"; - } - else { $gettext_type=""; } - - return $gettext_type; -} - -sub version{ - - ## Print version information - print "${PROGRAM} (${_PACKAGE}) $VERSION\n"; - print "Written by Kenneth Christiansen <kenneth\@gnome.org>, 2000.\n\n"; - print "Copyright (C) 2000 Free Software Foundation, Inc.\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 help -{ - ## Print usage information - print "Usage: ./${PROGRAM} [OPTIONS] ...LANGCODE\n"; - print "Updates pot files and merge them with the translations.\n\n"; - print " -H, --help shows this help page\n"; - print " -P, --pot generate the pot file only\n"; - print " -S, --headers generate the XML headerfiles in POTFILES.in\n"; - print " -M, --maintain search for missing files in POTFILES.in\n"; - print " -R, --report creates a status report for the module.\n"; - print " -X, --verbose show lots of feedback\n"; - print " -V, --version shows the version\n"; - print "\nExamples of use:\n"; - print "${PROGRAM} --pot just creates a new pot file from the source\n"; - print "${PROGRAM} da created new pot file and updated the da.po file\n\n"; - print "Report bugs to <kenneth\@gnome.org>.\n"; - exit; -} - -sub maintain -{ - my (@buf_i18n_plain, - @buf_i18n_xml, - @buf_potfiles, - @buf_potfiles_ignore, - @buf_allfiles, - @buf_allfiles_sorted, - @buf_potfiles_sorted - ); - - ## Search and find all translatable files - find sub { push @buf_i18n_plain, "$File::Find::name" if /\.(c|y|cc|c\+\+|h|gob)$/ }, ".."; - find sub { push @buf_i18n_xml, "$File::Find::name" if /\.($xml_extension)$/ }, ".."; - - open(POTFILES, "POTFILES.in") || die "$PROGRAM: there's no POTFILES.in!!!\n"; - @buf_potfiles = <POTFILES>; - - print "Searching for missing translatable files...\n"; - - ## Check if we should ignore some found files, when - ## comparing with POTFILES.in - if (-s "POTFILES.skip"){ - open FILE, "POTFILES.skip"; - while (<FILE>) { - if (/^[^#]/){ - push @buf_potfiles_ignore, $_; - } - } - print "Found POTFILES.skip: Ignoring files...\n"; - @buf_potfiles = (@buf_potfiles_ignore, @buf_potfiles); - } - - foreach my $file (@buf_i18n_plain){ - open FILE, "<$file"; - while (<FILE>) { - if (/_\(\"/){ - ## Remove the first 3 chars and add newline - push @buf_allfiles, unpack("x3 A*", $file) . "\n"; - last; - } - } - } - - foreach my $file (@buf_i18n_xml){ - open FILE, "<$file"; - while (<FILE>) { - if (/\s_(.*)=\"/){ - ## Remove the first 3 chars and add newline - push @buf_allfiles, unpack("x3 A*", $file) . "\n"; - last; - } - } - } - - @buf_allfiles_sorted = sort (@buf_allfiles); - @buf_potfiles_sorted = sort (@buf_potfiles); - - my %in2; - foreach (@buf_potfiles_sorted) { - $in2{$_} = 1; - } - - my @result; - - foreach (@buf_allfiles_sorted){ - if (!exists($in2{$_})){ - push @result, $_ - } - } - - ## Save file with information about the files missing - ## if any, and give information about this proceedier - if(@result){ - open OUT, ">missing"; - print OUT @result; - print "\nHere is the result:\n\n", @result, "\n"; - print "The file \"missing\" has been placed in the current directory.\n"; - print "Files supposed to be ignored should be placed in \"POTFILES.skip\"\n"; - } - - ## If there is nothing to complain about, notice the user - else{ - print "\nWell, it's all perfect! Congratulation!\n"; - } -} - -sub invalid_option -{ - ## Handle invalid arguments - print "${PROGRAM}: invalid option -- $LANG\n"; - print "Try `${PROGRAM} --help' for more information.\n"; - exit 1; -} - -sub gen_headers -{ - my $XML_I18N_EXTRACT = `which xml-i18n-extract 2>/dev/null`; - chomp $XML_I18N_EXTRACT; - - $XML_I18N_EXTRACT = $ENV{"XML_I18N_EXTRACT"} if $ENV{"XML_I18N_EXTRACT"}; - - ## Generate the .h header files, so we can allow glade and - ## xml translation support - if (! -s $XML_I18N_EXTRACT) - { - print "\n *** The xml-i18n-extract script wasn't found!" - ."\n *** Without this xml-i18n-update can not generate files.\n"; - exit; - } - else - { - open FILE, "<POTFILES.in"; - while (<FILE>) { - chomp; - - ## Find xml files in POTFILES.in and generate the - ## files with help from the xml-i18n-extract script - - my $gettext_type=&determine_type($1); - - if (/\.($xml_extension)$/ || /^\[/){ - $_ =~ s/^\[[^\[].*]\s*//; - my $filename = "../$_"; - - if ($VERBOSE){ - system($XML_I18N_EXTRACT, "--update", "--type=$gettext_type", $filename); - } else { - system($XML_I18N_EXTRACT, "--update", "--type=$gettext_type", "--quiet", $filename); - } - } - } - close FILE; - } -} - -sub generate_pot -{ - ## Generate the potfiles from the POTFILES.in file - - print "Building the $PACKAGE.pot...\n" if $VERBOSE; - - move("POTFILES.in", "POTFILES.in.old"); - - open INFILE, "<POTFILES.in.old"; - open OUTFILE, ">POTFILES.in"; - while (<INFILE>) { - s/\.($xml_extension)$/$&.h/; - s/^\[.*]\s*(.*)/$1.h/; - print OUTFILE $_; - } - close OUTFILE; - close INFILE; - - my $gettext_test ="test \! -f $PACKAGE\.po \|\| \( rm -f \.\/$PACKAGE\.pot " - ."&& mv $PACKAGE\.po \.\/$PACKAGE\.pot \)"; - - system("xgettext", "--default-domain\=$PACKAGE", "--directory\=\.\.", - "--add-comments", "--keyword\=\_", "--keyword\=N\_", - "--files-from\=\.\/POTFILES\.in"); - - system($gettext_test); - - print "Wrote $PACKAGE.pot\n" if $VERBOSE; - - move("POTFILES.in.old", "POTFILES.in"); - - print "Removing generated header (.h) files..." if $VERBOSE; - - open FILE, "<POTFILES.in"; - while (<FILE>) - { - chomp; - unlink "../$_.h" if /\.($xml_extension)$/; - } - close FILE; - print "done\n" if $VERBOSE; -} - -sub merging -{ - if ($ARGV[1]){ - $LANG = $ARGV[1]; - } else { - $LANG = $ARGV[0]; - } - - if ($ARGV[0] ne "--dist" && $ARGV[0] ne "-D") { - print "Merging $LANG.po with $PACKAGE.pot..." if $VERBOSE; - } - - &perform_merge($LANG); - ## Remove the "messages" trash file generated by gettext - unlink "messages"; -} - -sub perform_merge -{ - my ($LANG) = @_; - - copy("$LANG.po", "$LANG.po.old") || die "copy failed: $!"; - - ## Preform merge - system("msgmerge", "$LANG.po.old", "$PACKAGE.pot", "-o", "$LANG.po"); - - ## Remove the backup file - unlink "$LANG.po.old"; -} - -sub not_existing -{ - ## Report error if supplied language file is non-existing - print "$PROGRAM: sorry, $LANG.po does not exist!\n"; - print "Try `$PROGRAM --help' for more information.\n"; - exit; -} - -sub gather_po_files -{ - my @po_files = glob("./*.po"); - - @languages = map (&po_file2lang, @po_files); - - foreach my $lang (@languages) { - $po_files_by_lang{$lang} = shift (@po_files); - } -} - -sub po_file2lang -{ - my $tmp = $_; - $tmp =~ s/^.*\/(.*)\.po$/$1/; - return $tmp; -} - -sub status -{ - ## Print statistics - system("msgfmt", "--statistics", "$LANG.po"); - print "\n"; -} - -sub show_status -{ - &gen_headers; - &generate_pot; - &gather_po_files; - - foreach my $lang (@languages){ - print "$lang: "; - &perform_merge($lang); - } - - print "\n\n * Current translation support in $PACKAGE \n\n"; - - foreach my $lang (@languages){ - print "$lang: "; - ## Print statistics - system("msgfmt", "--statistics", "$lang.po"); - } -} - -sub find_package_name -{ - my $base_dirname = getcwd(); - $base_dirname =~ s@.*/@@; - - my ($conf_in, $src_dir); - - if ($base_dirname eq "po") { - if (-f "../configure.in") { - $conf_in = "../configure.in"; - } else { - my $makefile_source; - local (*IN); - open (IN, "<Makefile") || die "can't open Makefile: $!"; - - while (<IN>) { - if (/^top_srcdir[ \t]*=/) { - $src_dir = $_; - # print "${src_dir}\n"; - - $src_dir =~ s/^top_srcdir[ \t]*=[ \t]*([^ \t\n\r]*)/$1/; - # print "${src_dir}\n"; - chomp $src_dir; - $conf_in = "$src_dir" . "/configure.in" . "\n"; - last; - } - } - - $conf_in || die "Cannot find top_srcdir in Makefile." - } - - my $conf_source; { - local (*IN); - local $/; # slurp mode - open (IN, "<$conf_in") || die "can't open $conf_in: $!"; - $conf_source = <IN>; - } - - if ($conf_source =~ /AM_INIT_AUTOMAKE\(([^,]*),(.*)/) { - my $package_name = $1; - if ($package_name =~ /^[\$](.*)/){ - if ($conf_source =~ /$1=(.*)/) { - $package_name = $1; - } - } - return $package_name; - } - } - - print "$PROGRAM: Unable to determine package name.\n" . - "Make sure to run this script inside the po directory.\n"; - exit; -} |