]> git.proxmox.com Git - proxmox-i18n.git/blobdiff - jsgettext.pl
update Traditional Chinese translations
[proxmox-i18n.git] / jsgettext.pl
index 00b095339c008675ac31d467521459c164ebd5ae..7f758fd9e5b3f5f7e0fb0c2ca0f46690df59dd58 100755 (executable)
@@ -1,17 +1,15 @@
 #!/usr/bin/perl
 
 use strict;
-use Time::Local;
-use PVE::Tools;
-use Data::Dumper;
-use Locale::PO;
-use Getopt::Std;
+use warnings;
+
 use Encode;
+use Getopt::Long;
+use Locale::PO;
+use Time::Local;
 
 my $options = {};
-
-getopts('o:b:', $options) ||
-    die "unable to parse options\n";
+GetOptions($options, 'o=s', 'b=s', 'p=s') or die "unable to parse options\n";
 
 my $dirs = [@ARGV];
 
@@ -21,6 +19,8 @@ foreach my $dir (@$dirs) {
     die "no such directory '$dir'\n" if ! -d $dir;
 }
 
+my $projectId = $options->{p} || die "missing project ID\n";
+
 my $basehref = {};
 if (my $base = $options->{b}) {
     my $aref = Locale::PO->load_file_asarray($base) ||
@@ -42,43 +42,55 @@ if (my $base = $options->{b}) {
     }
 }
 
-my $sources = [];
+sub find_js_sources {
+    my ($base_dirs) = @_;
+
+    my $find_cmd = 'find ';
+    # shell quote heuristic, with the (here safe) assumption that the dirs don't contain single-quotes
+    $find_cmd .= join(' ', map { "'$_'" } $base_dirs->@*);
+    $find_cmd .= ' -name "*.js"';
+    open(my $find_cmd_output, '-|', "$find_cmd | sort") or die "Failed to execute command: $!";
+
+    my $sources = [];
+    while (my $line = <$find_cmd_output>) {
+       chomp $line;
+       print "F: $line\n";
+       push @$sources, $line;
+    }
+    close($find_cmd_output);
 
-my $findcmd = [['find', @$dirs, '-name', '*.js'],['sort']];
-PVE::Tools::run_command($findcmd, outfunc => sub {
-    my $line = shift;
-    print "F: $line\n";
-    push @$sources, $line;
-});
+    return $sources;
+}
 
-my $header = <<__EOD;
+my $header = <<'__EOD';
 Proxmox message catalog.
-Copyright (C) 2011-2017 Proxmox Server Solutions GmbH
-This file is free software: you can redistribute it and\/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-Proxmox Support Team <support\@proxmox.com>, 2017.
+
+Copyright (C) Proxmox Server Solutions GmbH
+
+This file is free software: you can redistribute it and/or modify it under the terms of the GNU
+Affero General Public License as published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+-- Proxmox Support Team <support\@proxmox.com>
 __EOD
 
 my $ctime = scalar localtime;
 
-my $href = {};
-my $po = new Locale::PO(-msgid=> '',
-                       -comment=> $header,
-                       -fuzzy=> 1,
-                       -msgstr=>
-                       "Project-Id-Version: proxmox-mailgateway 5.0\n" .
-                       "Report-Msgid-Bugs-To: <support\@proxmox.com>\n" .
-                       "POT-Creation-Date: $ctime\n" .
-                       "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n" .
-                       "Last-Translator: FULL NAME <EMAIL\@ADDRESS>\n" .
-                       "Language-Team: LANGUAGE <support\@proxmox.com>\n" .
-                       "MIME-Version: 1.0\n" .
-                       "Content-Type: text/plain; charset=UTF-8\n" .
-                       "Content-Transfer-Encoding: 8bit\n");
-
-$href->{''} = $po;
+my $href = {
+    '' => Locale::PO->new(
+       -msgid => '',
+       -comment => $header,
+       -fuzzy => 1,
+       -msgstr => "Project-Id-Version: $projectId\n"
+           ."Report-Msgid-Bugs-To: <support\@proxmox.com>\n"
+           ."POT-Creation-Date: $ctime\n"
+           ."PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+           ."Last-Translator: FULL NAME <EMAIL\@ADDRESS>\n"
+           ."Language-Team: LANGUAGE <support\@proxmox.com>\n"
+           ."MIME-Version: 1.0\n"
+           ."Content-Type: text/plain; charset=UTF-8\n"
+           ."Content-Transfer-Encoding: 8bit\n",
+    ),
+};
 
 sub extract_msg {
     my ($filename, $linenr, $line) = @_;
@@ -87,41 +99,35 @@ sub extract_msg {
 
     while(1) {
        my $text;
-       if ($line =~ m/\Wgettext\s*\((("((?:[^"\\]++|\\.)*+)")|('((?:[^'\\]++|\\.)*+)'))\)/g) {
+       if ($line =~ m/\bgettext\s*\((("((?:[^"\\]++|\\.)*+)")|('((?:[^'\\]++|\\.)*+)'))\)/g) {
            $text = $3 || $5;
        }
-       
        last if !$text;
-
-       if ($basehref->{$text}) {
-           return;
-       }
-       
+       return if $basehref->{$text};
        $count++;
 
        my $ref = "$filename:$linenr";
 
        if (my $po = $href->{$text}) {
            $po->reference($po->reference() . " $ref");
-       } else {   
-           my $po = new Locale::PO(-msgid=> $text, -reference=> $ref, -msgstr=> '');
-           $href->{$text} = $po;
+       } else {
+           $href->{$text} = Locale::PO->new(-msgid=> $text, -reference=> $ref, -msgstr=> '');
        }
-    };
-
-    die "can't extract gettext message in '$filename' line $linenr\n"
-       if !$count;
+    }
+    die "can't extract gettext message in '$filename' line $linenr\n" if !$count;
+    return;
 }
 
+my $sources = find_js_sources($dirs);
+
 foreach my $s (@$sources) {
-    open(SRC, $s) || die "unable to open file '$s' - $!\n";
-    while(defined(my $line = <SRC>)) {
-       next if $line =~ m/^function gettext/;
-       if ($line =~ m/gettext\s*\(/) {
+    open(my $SRC_FH, '<', $s) || die "unable to open file '$s' - $!\n";
+    while(defined(my $line = <$SRC_FH>)) {
+       if ($line =~ m/gettext\s*\(/ && $line !~ m/^\s*function gettext/) {
            extract_msg($s, $., $line);
        }
     }
-    close(SRC);
+    close($SRC_FH);
 }
 
 my $filename = $options->{o} // "messages.pot";