svnno****@sourc*****
svnno****@sourc*****
2012年 4月 15日 (日) 12:33:38 JST
Revision: 21 http://sourceforge.jp/projects/miranda-jp/svn/view?view=rev&revision=21 Author: taguchi-ch Date: 2012-04-15 12:33:37 +0900 (Sun, 15 Apr 2012) Log Message: ----------- add modified lpgen.pl Added Paths: ----------- trunk/miranda-tools/ trunk/miranda-tools/lpgen/ trunk/miranda-tools/lpgen/lpgen.pl -------------- next part -------------- Added: trunk/miranda-tools/lpgen/lpgen.pl =================================================================== --- trunk/miranda-tools/lpgen/lpgen.pl (rev 0) +++ trunk/miranda-tools/lpgen/lpgen.pl 2012-04-15 03:33:37 UTC (rev 21) @@ -0,0 +1,228 @@ +#!/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.7svn'; +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( + '../../miranda', + '../../miranda/i18n/langpack_english.txt', + 'English (US)', '0809', + 'Miranda IM Development Team', + 'proje****@miran*****', + 'Scriver,avs,chat,clist,clist_nicer,db3x,db3x_mmap,dbrw,advaimg,import,modernb,mwclist,png2dib,srmm,tabsrmm,AimOscar,Gadu-Gadu,IRC,IcqOscarJ,JabberG,MSN,Yahoo'); +} +elsif ($ARGV[0] eq "core") { + create_langfile('../../miranda/src', + '../../miranda/i18n/core-translation.txt', + 'English (US)', '0809', + 'Miranda IM Development Team', + 'proje****@miran*****'); +} +elsif ($ARGV[0] eq "srmm") { + create_langfile('../../miranda/plugins/SRMM/', + '../../miranda/plugins/SRMM/Docs/srmm-translation.txt', + 'English (US)', '0809', + 'Miranda IM Development Team', + 'proje****@miran*****'); +} +elsif ($ARGV[0] eq "import") { + create_langfile('../../miranda/plugins/Import/', + '../../miranda/plugins/Import/docs/import-translation.txt', + 'English (US)', '0809', + 'Miranda IM Development Team', + 'proje****@miran*****'); +} +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 $plugins = @_ ? 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 <<HEADER; +Miranda Language Pack Version 1 +Locale: $locale +Authors: $author +Author-email: $email +Last-Modified-Using: Miranda IM $version +Plugins-included: $plugins +; Generated by lpgen on $time +; Translations: $clines + +HEADER + foreach my $trans (keys %hash) { + if ($hash{$trans} =~ /^\d+$/) { + $common{$trans} = $hash{$trans}; + delete $hash{$trans}; + } + } + + my @sorted = sort { (floor($common{$b}/20) == floor($common{$a}/20)) ? ($a cmp $b) : ($common{$b} <=> $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 = <READ>) { + $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 = <READ>) { + $all = $all.$lines; + } + close(READ); + $_ = $all; + s/\"\"/\\\"/g; + while (/\s*(?:CONTROL|(?:DEF)?PUSHBUTTON|[LRC]TEXT|GROUPBOX|CAPTION|MENUITEM|POPUP)\s*(\"[^\\]*?(\\.[^\\]*?)*\")/g) { + $found += append_str($1, $found); + } + print "($found)\n"; + } +}