aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xml-i18n-extract.in303
-rw-r--r--xml-i18n-merge.in401
-rw-r--r--xml-i18n-update.in513
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/&quot;/\\"/mg; # "
- $message =~ s/&lt;/</mg;
- $message =~ s/&gt;/>/mg;
- $message =~ s/&amp;/&/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 {
- &not_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;
-}