From a45cc4e47579f978a78e5dcd2d39ca058913d8dd Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Wed, 30 Sep 2009 14:40:59 +0000 Subject: fix the translation chaos, hopefully now it works git-svn-id: svn://tug.org/texlive/trunk@15576 c570f23f-e606-0410-a88d-b1316a301751 --- Master/tlpkg/TeXLive/trans.pl | 193 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 Master/tlpkg/TeXLive/trans.pl (limited to 'Master/tlpkg/TeXLive') diff --git a/Master/tlpkg/TeXLive/trans.pl b/Master/tlpkg/TeXLive/trans.pl new file mode 100644 index 00000000000..dbfcef3b43a --- /dev/null +++ b/Master/tlpkg/TeXLive/trans.pl @@ -0,0 +1,193 @@ +#!/usr/bin/env perl +# $Id: trans.pl 14198 2009-07-09 11:39:06Z preining $ +# +# Copyright 2009 Norbert Preining +# This file is licensed under the GNU General Public License version 2 +# or any later version. +# +# translation infrastructure for TeX Live programs +# if $::lang is set then that one is used +# if $::lang is unset try to auto-deduce it from LC_MESSAGES/Registry +# if $::opt_lang is set use that instead +# +# this module implements parsing .po files, but no specialities of .po +# files are supported. Only reading of msgstr and msgid and concatenating +# multiple lines. Furthermore, strings replacements are done: +# \n -> +# \" -> " +# \\ -> \ +# + +use strict; +$^W = 1; + +use utf8; +no utf8; + +if (defined($::opt_lang)) { + $::lang = $::opt_lang; + if ($::lang eq "zh") { + # set language to simplified chinese + $::lang = "zh-cn"; + } +} else { + if ($^O =~ /^MSWin(32|64)$/i) { + # trying to deduce automatically the country code + my $foo = TeXLive::TLWinGoo::reg_country(); + if ($foo) { + $::lang = $foo; + } else { + debug("Didn't get any usuful code from reg_country: $foo...\n"); + } + } else { + # we load POSIX and locale stuff + require POSIX; + import POSIX qw/locale_h/; + # now we try to deduce $::lang + my $loc = setlocale(&POSIX::LC_MESSAGES); + my ($lang,$area,$codeset); + if ($loc =~ m/^([^_.]*)(_([^.]*))?(\.([^@]*))?(@.*)?$/) { + $lang = defined($1)?$1:""; + $area = defined($3)?$3:""; + if ($lang eq "zh") { + if ($area =~ m/^(TW|HK)$/i) { + $lang = "zh-tw"; + } else { + # fallback to zh-cn for anything else, that is + # zh-cn, zh-sg, zh, and maybe something else + $lang = "zh-cn"; + } + } + } + $::lang = $lang if ($lang); + } +} + + +our %TRANS; + +# +# __ takes a string argument and checks that it +sub __ ($@) { + my $key = shift; + my $ret; + # if no $::lang is set just return without anything + if (!defined($::lang)) { + $ret = $key; + } else { + $ret = $key; + $key =~ s/\\/\\\\/g; + $key =~ s/\n/\\n/g; + $key =~ s/"/\\"/g; + # if the translation is defined return it + if (defined($TRANS{$::lang}->{$key})) { + $ret = $TRANS{$::lang}->{$key}; + if ($::debug_translation && ($key eq $ret)) { + print STDERR "probably untranslated in $::lang: >>>$key<<<\n"; + } + } else { + # if we cannot find it, return $s itself + if ($::debug_translation && $::lang ne "en") { + print STDERR "no translation in $::lang: >>>$key<<<\n"; + } + # $ret is already set initially + } + } + # translate back $ret: + $ret =~ s/\\n/\n/g; + $ret =~ s/\\"/"/g; + $ret =~ s/\\\\/\\/g; + return sprintf($ret, @_); +} + +if (($::lang ne "en") && ($::lang ne "C")) { + if (! -r "$::installerdir/tlpkg/translations/$::lang.po") { + tlwarn ("\n Sorry, no translations available for $::lang; falling back to English. + Make sure that you have the package \"texlive-msg-translations\" installed. + (If you'd like to help translate the installer's messages, please see + http://tug.org/texlive/doc.html#install-tl-xlate for information.)\n\n"); + } else { + # merge the translated strings into the text string + open(LANG, "<$::installerdir/tlpkg/translations/$::lang.po"); + my $msgid; + my $msgstr; + my $inmsgid; + my $inmsgstr; + while () { + chomp; + next if m/^\s*#/; + if (m/^\s*$/) { + if ($inmsgid) { + debug("msgid $msgid without msgstr in $::lang.po\n"); + $inmsgid = 0; + $inmsgstr = 0; + $msgid = ""; + $msgstr = ""; + next; + } + if ($inmsgstr) { + if ($msgstr) { + if (!utf8::decode($msgstr)) { + warn("decoding string to utf8 didn't work: $msgstr\n"); + } + # we decode msgid too to get \\ and not \ + if (!utf8::decode($msgid)) { + warn("decoding string to utf8 didn't work: $msgid\n"); + } + $TRANS{$::lang}{$msgid} = $msgstr; + } else { + ddebug("untranslated $::lang: ...$msgid...\n"); + } + $inmsgid = 0; + $inmsgstr = 0; + $msgid = ""; + $msgstr = ""; + next; + } + next; + } + if (m/^msgid\s+"(.*)"\s*$/) { + if ($msgid) { + warn("stray msgid line: $_"); + next; + } + $inmsgid = 1; + $msgid = $1; + next; + } + if (m/^"(.*)"\s*$/) { + if ($inmsgid) { + $msgid .= $1; + } elsif ($inmsgstr) { + $msgstr .= $1; + } else { + tlwarn("cannot parse $::lang.po line: $_\n"); + } + next; + } + if (m/^msgstr\s+"(.*)"\s*$/) { + if (!$inmsgid) { + tlwarn("msgstr $1 without msgid\n"); + next; + } + $msgstr = $1; + $inmsgstr = 1; + $inmsgid = 0; + } + } + close(LANG); + } +} + + +1; + +__END__ + +### Local Variables: +### perl-indent-level: 2 +### tab-width: 2 +### indent-tabs-mode: nil +### End: +# vim:set tabstop=2 expandtab: # + -- cgit v1.2.3