#!/usr/bin/perl # # Script generating translation templates from sources # # Miranda IM: the free IM client for Microsoft* Windows* # # Copyright 2000-2008 Miranda ICQ/IM project, # all portions of this codebase are copyrighted to the people # listed in contributors.txt. # # This program 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 program 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 program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. use POSIX; use File::Find; use strict; my $rootdir = ''; my %hash = (); my $clines = 0; my $version = '0.10.2.3'; my $time = localtime(); if (@ARGV && $ARGV[0] eq "version") { shift @ARGV; # 1st arg version major i.e. 07 for "0.7" if (@ARGV) { my $vermaj = shift @ARGV; if ($vermaj =~ /^([0-9]*)([0-9])$/) { if ($1 eq "") { $version = $2; } else { $version = "$1.$2"; } } else { $version = $vermaj; } } # 2nd arg version minor i.e. 1 for "0.7.1" if (@ARGV) { my $vermin = shift @ARGV; if ($vermin =~ /^[0-9]+$/) { $version .= ".$vermin"; } else { $version .= $vermin; } } # 3rd arg build number i.e. 36 for "0.7.1 build 36" if (@ARGV) { my $build = shift @ARGV; if ($build =~ /^[0-9]+$/) { $version .= " build $build"; } else { $version .= $build; } } } #Language Files if (!@ARGV) { create_langfile( './MirOTR', './MirOTR/Win32/langpack_english.txt', 'English (US)', '0809', 'ProgAndy', 'admin@progandy.co.cc', 'MirOTR'); } else { print "Error: Unknown module $ARGV[0]\n"; exit 1; } sub create_langfile { $rootdir = shift(@_); my $outfile = shift(@_); my $lang = shift(@_); my $locale = shift(@_); my $author = shift(@_); my $email = shift(@_); my $plugin = @_ ? shift(@_) : ''; %hash = (); my %common = (); $clines = 0; print "Building language file for $rootdir:\n"; find({ wanted => \&csearch, preprocess => \&pre_dir }, $rootdir); find({ wanted => \&rcsearch, preprocess => \&pre_dir }, $rootdir); open(WRITE, "> $outfile") or die; print WRITE < $common{$a}) } keys %common; print WRITE "; Common strings that belong to many files\n;["; print WRITE join "]\n;[", @sorted; print WRITE "]\n"; my $file = ''; foreach my $trans (sort { ($hash{$a} eq $hash{$b}) ? ($a cmp $b) : ($hash{$a} cmp $hash{$b}) } keys %hash) { if ($hash{$trans} ne $file) { $file = $hash{$trans}; print WRITE "\n; $file\n"; } print WRITE ";[$trans]\n"; } close(WRITE); print " $outfile is complete ($clines)\n\n"; } sub pre_dir { # avoid parsing some ext SDKs my @files = (); return @files if ( $File::Find::name =~/..\/extplugins/ or $File::Find::name =~/freeimage\/Source/ or $File::Find::name =~/dbrw\/sqlite3/); @files = grep { not /^\.\.?$/ } @_; return sort @files; } sub append_str { my $str = shift(@_); my $found = shift(@_); $str = substr($str, 1, length($str) - 2); if (length($str) gt 0 and $str ne "List1" and $str ne "Tree1" and $str =~ /[a-zA-Z]+/g) { my $path = $File::Find::name; $path =~ s/(\.\.\/)+miranda\///; if (!$hash{$str}) { $hash{$str} = $path; $clines ++; return 1; } elsif ($hash{$str} ne $path) { if ($hash{$str} =~ /^\d+$/) { $hash{$str} ++; } else { $hash{$str} = 1; } } } return 0; } sub csearch { if (-f $_ and ($_ =~ m/\.c(pp)?$/i or $_ =~ m/\.h(pp)?$/i)) { my $found = 0; my $file = $_; print " Processing $_ "; open(READ, "< $_") or return; my $all = ''; while (my $lines = ) { $all = $all.$lines; } close(READ); $_ = $all; while (/(?:Button_SetIcon_IcoLib|Translate[A-Z]{0,2}|LPGENT?|ICQTranslateUtfStatic)\s*\(\s*(\".*?\")\s*[,\)]/g) { $found += append_str($1, $found); } print "($found)\n"; } } sub rcsearch { if ( -f $_ and $_ =~ m/\.rc$/i) { my $found = 0; my $file = $_; print " Processing $_ "; open(READ, "< $_") or return; my $all = ''; while (my $lines = ) { $all = $all.$lines; } close(READ); $_ = $all; while (/\s*(?:CONTROL|(?:DEF)?PUSHBUTTON|[LRC]TEXT|GROUPBOX|CAPTION|MENUITEM|POPUP)\s*(\".*?\")/g) { $found += append_str($1, $found); } print "($found)\n"; } }