diff options
Diffstat (limited to 'util')
-rwxr-xr-x | util/jsgen.pl | 117 |
1 files changed, 62 insertions, 55 deletions
diff --git a/util/jsgen.pl b/util/jsgen.pl index 4d82bc95..fd216d7e 100755 --- a/util/jsgen.pl +++ b/util/jsgen.pl @@ -22,57 +22,57 @@ use LangFile; use VNDB::L10N; -sub l10n { - # parse the .js code to find the l10n keys to use - my $js = shift; - my @keys; - push @keys, $1 ? quotemeta($1) : qr/$2/ while($js =~ m{(?:mt\('([a-z0-9_]+)'[,\)]|l10n /([^/]+)/)}g); - # also add the _lang_* for all languages for which we have a translation - my $jskeys_lang = join '|', VNDB::L10N::languages(); - push @keys, qr/_lang_(?:$jskeys_lang)/; - # fetch the corresponding text from lang.txt - my %lang; # key1 => { lang1 => .., lang2 => .. }, key2 => { .. } +my %lang; # lang1 => { key1 => .., key22 => .. }, lang2 => { .. } + +sub l10n_load { + # fetch all text from lang.txt my $lang = LangFile->new(read => "$ROOT/data/lang.txt"); - my $cur; # 0 = none/excluded, 1 = TL lines my $key; while((my $l = $lang->read())) { my $type = shift @$l; - if($type eq 'key') { - my $k = shift @$l; - $cur = grep $k =~ /$_/, @keys; - $key = $k; - } - if($type eq 'tl' && $cur) { - my($lang, $sync, $val) = @$l; - next if !$val; - $lang{$key}{$lang} = $val; - } + $key = shift @$l if $type eq 'key'; + $lang{$l->[0]}{$key} = $l->[2] if $type eq 'tl'; } +} + + +sub l10n { + my($lang, $js) = @_; - # generate JS code + # parse the .js code and replace mt()'s that can be modified in-place, otherwise add to the @keys + my @keys; + $js =~ s{(?:mt\('([a-z0-9_]+)'([,\)])|l10n /([^/]+)/)}# + my($k, $s, $q) = ($1, $2, $3); + my $v = $k ? $lang{$lang}{$k} || $lang{'en'}{$k} : ''; + if($q) { $q ne '<perl regex>' && push @keys, qr/$q/; '' } + elsif($s eq ')' && $v && $v !~ /[\~\[\]]/) { + $v =~ s/"/\\"/g; + $v =~ s/\n/\\n/g; + qq{"$v"} + } else { + push @keys, quotemeta($k); + "mt('$k'$s" + } + #eg; + # also add the _lang_* for all languages for which we have a translation + my $jskeys_lang = join '|', VNDB::L10N::languages(); + push @keys, qr/_lang_(?:$jskeys_lang)/; + + # generate header my $r = "L10N_STR = {\n"; my $first = 1; - for my $key (sort keys %lang) { + for my $key (sort keys %{$lang{$lang}}) { + next if !grep $key =~ /$_/, @keys; $r .= ",\n" if !$first; $first = 0; - $r .= sprintf qq| %s: {\n|, $key !~ /^[a-z0-9_]+$/ ? "'$key'" : $key;; - my $firstk = 1; - for (sort keys %{$lang{$key}}) { - $r .= ",\n" if !$firstk; - $firstk = 0; - my $lang = $_; - $lang = qq{"$lang"} if $lang =~ /^(?:as|do|if|in|is)$/; # reserved two-char words - my $val = $lang{$key}{$_}; - $val =~ s/"/\\"/g; - $val =~ s/\n/\\n/g; - $r .= sprintf qq| %s: "%s"|, $lang, $val; - } - $r .= "\n }"; + my $val = $lang{$lang}{$key} || $lang{'en'}{$key}; + $val =~ s/"/\\"/g; + $val =~ s/\n/\\n/g; + $r .= sprintf qq| %s: "%s"|, $key !~ /^[a-z0-9_]+$/ ? "'$key'" : $key, $val; } - $r .= "\n};\n"; - $r .= 'L10N_LANG = [ '.join(', ', map qq{"$_"}, VNDB::L10N::languages()).' ];'; - return "$r\n"; + $r .= "\n};"; + return ("$r\n", $js); } @@ -98,24 +98,31 @@ sub resolutions { sub jsgen { - # JavaScript::Minifier::XS doesn't correctly handle perl's unicode, - # so just do everything in raw bytes instead. - open my $JS, '<', "$ROOT/data/script.js" or die $!; + l10n_load(); + my $common = ''; + $common .= resolutions(); + $common .= sprintf "rlst_rstat = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{rlst_rstat}}; + $common .= sprintf "rlst_vstat = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{rlst_vstat}}; + $common .= sprintf "cookie_prefix = '%s';\n", $S{cookie_prefix}; + $common .= sprintf "age_ratings = [ %s ];\n", join ',', map !defined $_ ? -1 : $_, @{$S{age_ratings}}; + $common .= sprintf "languages = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{languages}}; + $common .= sprintf "platforms = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{platforms}}; + $common .= sprintf "media = [ %s ];\n", join ', ', map qq{"$_"}, sort keys %{$S{media}}; + $common .= sprintf "release_types = [ %s ];\n", join ', ', map qq{"$_"}, sort @{$S{release_types}}; + $common .= sprintf "L10N_LANG = [ %s ];\n", join(', ', map qq{"$_"}, VNDB::L10N::languages()); + + open my $JS, '<:utf8', "$ROOT/data/script.js" or die $!; my $js .= join '', <$JS>; close $JS; - my $head = encode_utf8(l10n($js)) . "\n"; - $head .= sprintf "rlst_rstat = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{rlst_rstat}}; - $head .= sprintf "rlst_vstat = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{rlst_vstat}}; - $head .= sprintf "cookie_prefix = '%s';\n", $S{cookie_prefix}; - $head .= sprintf "age_ratings = [ %s ];\n", join ',', map !defined $_ ? -1 : $_, @{$S{age_ratings}}; - $head .= sprintf "languages = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{languages}}; - $head .= sprintf "platforms = [ %s ];\n", join ', ', map qq{"$_"}, @{$S{platforms}}; - $head .= sprintf "media = [ %s ];\n", join ', ', map qq{"$_"}, sort keys %{$S{media}}; - $head .= sprintf "release_types = [ %s ];\n", join ', ', map qq{"$_"}, sort @{$S{release_types}}; - $head .= resolutions(); - open my $NEWJS, '>', "$ROOT/static/f/script.js" or die $!; - print $NEWJS $JavaScript::Minifier::XS::VERSION ? JavaScript::Minifier::XS::minify($head.$js) : $head.$js; - close $NEWJS; + + for my $l (VNDB::L10N::languages()) { + my($head, $body) = l10n($l, $js); + # JavaScript::Minifier::XS doesn't correctly handle perl's unicode, so manually encode + my $content = encode_utf8($head . $common . $body); + open my $NEWJS, '>', "$ROOT/static/f/js/$l.js" or die $!; + print $NEWJS $JavaScript::Minifier::XS::VERSION ? JavaScript::Minifier::XS::minify($content) : $content; + close $NEWJS; + } } jsgen; |