#!/usr/bin/perl # Based on umtrans.pl version 1.0 (April 8, 2001) by Clifford Adams. # Extracts translation strings from wiki script and extensions. use strict; use warnings; use v5.10; use utf8; binmode(STDOUT, ":encoding(UTF-8)"); my $help = q{ NAME oddtrans - complement translation tables for Oddmuse SYNOPSIS oddtrans [OPTIONS]... [FILE]... DESCRIPTION Read all the calls to T(), Ts(), and Tss() from all FILEs, and print them on standard output, followed by their translation (usually the empty string unless you use -l to load a library). -l load a library from a previous run; you can use multiple -l EXAMPLES oddtrans -l german-utf8.pl wiki.pl modules/*.pl > new-german-utf8.pl }; our %Translate = (); my $arg = shift; while ($arg =~ /^-l/) { my $file; $file = substr($arg, 3) if length($arg) > 2; $file = shift unless $file; die $help unless -f $file; my %backup = %Translate; header_info_extract($file); # keep the header information of the translation files do "./$file" or die "Cannot do $file"; foreach my $key (keys %Translate) { $backup{$key} = $Translate{$key}; } %Translate = %backup; $arg = shift; } unshift(@ARGV, $arg); # shove the last one back because it is not -l! print "our \%Translate = grep(!/^#/, split(/\\n/,<<'END_OF_TRANSLATION'));\n"; undef $/; # slurp foreach my $file (@ARGV) { open(my $fh, "<:encoding(UTF-8)", $file) or die "Cannot open $file: $!"; $_ = <$fh>; # join split strings s/'\s*\.\s*'//g; s/"\s*\.\s*"//g; # extract calls to T, Ts and Tss while(/Ts?s?\(\'([^']+)/g) { trans($file, $1); } while(/Ts?s?\(\"([^"]+)/g) { trans($file, $1); } } print "#\nEND_OF_TRANSLATION\n"; my %seen = (); my %read = (); sub trans { my ($file, $string) = @_; my ($result); $result = ''; $result = $Translate{$string} if (defined($Translate{$string})); return ' ' if ($seen{$string}); marker($file) unless $read{$file}; $seen{$string} = 1; print $string . "\n" . $result . "\n"; return ' '; } sub marker { my $file = shift; $read{$file} = 1; # place marker print "#" x 80, "\n"; print "# $file\n"; print "#" x 80, "\n"; } my $header = 0; sub header_info_extract { return if $header++; my $file = shift; open(FILE, "<:encoding(utf8)", $file) or die "Can't open $file because: $!"; foreach () { last if (/^our %Translate = /); print; } close FILE; } sub AddModuleDescription { # Do nothin; this function is just there such that the translation # files can be run. }