]> git.deb.at Git - deb/packages.git/commitdiff
Merge branch 'master' of ssh://source/srv/source.djpig.de/git/packages into ubuntu...
authorFrank Lichtenheld <frank@lichtenheld.de>
Wed, 6 Feb 2008 16:29:37 +0000 (17:29 +0100)
committerFrank Lichtenheld <frank@lichtenheld.de>
Wed, 6 Feb 2008 16:30:03 +0000 (17:30 +0100)
Conflicts:

config.sh.sed.in
cron.d/100syncarchive
cron.d/100syncarchive_amd64
cron.d/100syncarchive_backports
cron.d/100syncarchive_m68k
cron.d/100syncarchive_maintainers
cron.d/100syncarchive_volatile
cron.d/700install_static
static/debian.css
static/index.tmpl
static/packages.css.sed.in
templates/config.tmpl
templates/config/mirrors.tmpl
templates/html/download.tmpl
templates/html/show.tmpl

12 files changed:
1  2 
conf/apache.conf.sed.in
config.sh.sed.in
cron.d/100syncarchive
lib/Packages/DoSearchContents.pm
lib/Packages/Search.pm
setup-site.conf
static/debian.css
static/packages.css.sed.in
templates/config.tmpl
templates/html/download.tmpl
templates/html/head.tmpl
templates/html/show.tmpl

diff --combined conf/apache.conf.sed.in
index 4c0c90754e5a5bf7ff62961a1dbcd8b7d783390a,e6cc7f6e0a2c8068c2b947e88b7d7ae80e02d854..a3a074e97396cc24f33bb15825b284ebfb71c763
  </Directory>
  
  <VirtualHost *>
 -   ServerAdmin webmaster@debian.org
 +   ServerAdmin frank@lichtenheld.de
     DocumentRoot %TOPDIR%/www/
     ServerName %SITE%
     ErrorLog /var/log/apache2/%SITE%-error.log
     CustomLog /var/log/apache2/%SITE%-access.log combined
  
 -   Alias /cgi-bin/ %TOPDIR%/cgi-bin/
 +   ScriptAlias /cgi-bin/ %TOPDIR%/cgi-bin/
    
 -   PerlModule ModPerl::Registry
 -   PerlTaintCheck On
 -   PerlRequire %TOPDIR%/bin/mod_perl-startup
 -   PerlSwitches -T
 +#   PerlModule ModPerl::Registry
 +#   PerlTaintCheck On
 +#   PerlRequire %TOPDIR%/bin/mod_perl-startup
 +#   PerlSwitches -T
     <Location /cgi-bin/>
 -      SetHandler perl-script
 +#      SetHandler perl-script
        # mod-perl etch
 -      PerlInitHandler Apache2::Reload
 +#      PerlInitHandler Apache2::Reload
        # mod-perl sarge
        #PerlInitHandler Apache::Reload
 -      PerlHandler ModPerl::Registry
 +#      PerlHandler ModPerl::Registry
        Options +ExecCGI
 -      PerlSendHeader On
 +#      PerlSendHeader On
        allow from all
     </Location>
  
     RewriteRule ^/changelogs/ - [L]
     RewriteRule ^/Pics/ - [L]
     RewriteRule ^/about/ - [L]
 +   RewriteRule ^/ubuntu/ - [L]
     RewriteRule ^/[^/]+\.css - [L]
     RewriteRule ^/[^/]+\.js - [L]
  
     RewriteCond %{QUERY_STRING} =""
     RewriteCond %TOPDIR%/www%{REQUEST_FILENAME} -f [OR]
     RewriteCond %TOPDIR%/www%{REQUEST_FILENAME}.en.html -f [OR]
-    RewriteCond %TOPDIR%/www%{REQUEST_FILENAME} -l [OR]
-    RewriteCond %TOPDIR%/www%{REQUEST_FILENAME} -d
+    RewriteCond %TOPDIR%/www%{REQUEST_FILENAME} -l
     RewriteRule . - [L]
  
     RewriteRule ^/(.+)$ /cgi-bin/dispatcher.pl/$1 [L,PT]
diff --combined config.sh.sed.in
index f6b77f99e75186359b085437fe112f330756314e,afc9987519f32424cf8cca857f66ee130efc9e46..3c43a3f46ed7b0646a8757cd2c1aa9109e7b2567
@@@ -11,7 -11,6 +11,6 @@@ filesdir=${topdir}/file
  htmldir=${topdir}/www
  archivedir=${topdir}/archive
  podir=${topdir}/po
- localedir=%TOPDIR%/locale
  staticdir=${topdir}/static
  configdir=${topdir}/conf
  templatedir=${topdir}/templates
@@@ -25,38 -24,36 +24,40 @@@ cachedir=${topdir}/cach
  # path to private ftp directory
  #ftproot=/org/ftp.root
  
 -ftpsite=http://ftp.de.debian.org/debian
 -security_ftpsite=http://security.debian.org/debian-security
 -volatile_ftpsite=http://volatile.debian.org/debian-volatile
 -backports_ftpsite=http://backports.org/debian
 -amd64_ftpsite=http://amd64.debian.net/debian
 -debports_ftpsite=http://ftp.debian-ports.org/debian
 +ftpsite=http://archive.ubuntu.com/ubuntu
 +security_ftpsite=$ftpsite
  ddtp_ftpsite=http://ddtp.debian.net/debian
  
+ wget_cmd="wget --no-verbose --tries=2 --timeout=60" 
  root=""
  
  # Architectures
  #
- polangs="de fi fr hu ja nl uk"
- ddtplangs="ca cs da de eo es fi fr go hu it ja km_KH ko nl pl pt pt_BR ru sk sv uk zh zh_CN zh_TW"
+ polangs="de fi fr hu ja nl ru sv uk zh-cn"
+ ddtplangs="ca cs da de eo es fi fr hu it ja km-kh ko nl pl pt pt-br ru sk sv uk zh-cn zh-tw"
 -archives="us security amd64 debports backports volatile"
 -sections="main contrib non-free"
 +archives="us security"
 +sections="main multiverse restricted universe"
- parts="${sections}"
+ parts="$sections"
 -suites="sarge sarge-volatile sarge-backports etch etch-m68k etch-volatile etch-backports lenny sid experimental"
 -priorities="required important standard optional extra"
 +suites="dapper dapper-updates dapper-backports edgy edgy-updates edgy-backports feisty feisty-updates feisty-backports gutsy gutsy-updates gutsy-backports hardy"
- dists="${suites}"
+ dists="$suites"
 -architectures="alpha amd64 arm armel hppa hurd-i386 i386 ia64 kfreebsd-i386 kfreebsd-amd64 m68k mips mipsel powerpc s390 sparc"
 -arch_sarge="alpha amd64 arm hppa i386 ia64 m68k mips mipsel powerpc s390 sparc"
 -arch_etch="alpha amd64 arm hppa i386 ia64 mips mipsel powerpc s390 sparc"
 -arch_lenny="${arch_etch}"
 -arch_sid="${arch_sarge} armel hurd-i386 kfreebsd-i386 kfreebsd-amd64"
 -arch_experimental="${arch_sid}"
 -arch_lenny_proposed_updates="${arch_lenny}"
 -arch_etch_proposed_updates="${arch_etch}"
 +priorities="required important standard optional extra"
 +architectures="i386 amd64 powerpc"
 +arch_dapper="i386 amd64 powerpc"
 +arch_dapper_updates="${arch_dapper}"
 +arch_dapper_backports="${arch_dapper}"
 +arch_edgy="${arch_dapper}"
 +arch_edgy_updates="${arch_edgy}"
 +arch_edgy_backports="${arch_edgy}"
 +arch_feisty="${arch_edgy}"
 +arch_feisty_updates="${arch_feisty}"
 +arch_feisty_backports="${arch_feisty}"
 +arch_gutsy="${arch_feisty}"
 +arch_gutsy_updates="${arch_gutsy}"
 +arch_gutsy_backports="${arch_gutsy}"
 +arch_hardy="${arch_gutsy}"
 +arch_hardy_updates="${arch_hardy}"
 +arch_hardy_backports="${arch_hardy}"
  
  # Miscellaneous
  #
diff --combined cron.d/100syncarchive
index 789063b51ce944e3bb374262bd4765b5ee50f692,a6b0e83429e311517cdc601ef62531842dabd198..f71f8168526ded38cbbc4dd21ef56139682b1573
@@@ -15,29 -15,34 +15,29 @@@ the
          echo "retrieve Release(.gpg) $dist"
        test -d us/${dist} || mkdir -p us/${dist}
        (cd us/${dist} &&
-           wget -q -N ${ftpsite}/dists/${dist}/Release &&
-           wget -q -N ${ftpsite}/dists/${dist}/Release.gpg )
+           $wget_cmd -N ${ftpsite}/dists/${dist}/Release &&
+           $wget_cmd -N ${ftpsite}/dists/${dist}/Release.gpg )
          
        foo=\$arch_${dist//-/_}
        for arch in `eval echo $foo`
        do
 -          test ! "$arch" = "kfreebsd-i386" || continue
 -          test ! "$arch" = "kfreebsd-amd64" || continue
 -          test ! "$arch" = "armel" || continue
            for part in ${parts}
            do
                echo retrieve Packages $dist/$part/$arch
                test -d us/${dist}/${part}/binary-${arch} || mkdir -p us/${dist}/${part}/binary-${arch}
                (cd us/${dist}/${part}/binary-${arch} &&
-                   wget -q -N ${ftpsite}/dists/${dist}/${part}/binary-${arch}/Packages.gz)
+                   $wget_cmd -N ${ftpsite}/dists/${dist}/${part}/binary-${arch}/Packages.gz)
            done
 -          #FIXME: no Contents files for p-u
 -          test ! "$dist" = "experimental" || continue
            echo retrieve Contents $dist/$arch
            (cd us/${dist} &&
-               wget -q -N ${ftpsite}/dists/${dist}/Contents-${arch}.gz)
+               $wget_cmd -N ${ftpsite}/dists/${dist}/Contents-${arch}.gz)
        done
        for part in ${parts}
        do
            echo retrieve Sources $dist/$part
            test -d us/${dist}/${part}/source || mkdir -p us/${dist}/${part}/source
              (cd us/${dist}/${part}/source &&
-                 wget -q -N ${ftpsite}/dists/${dist}/${part}/source/Sources.gz)
+                 $wget_cmd -N ${ftpsite}/dists/${dist}/${part}/source/Sources.gz)
        done
      done
  else
@@@ -52,6 -57,9 +52,6 @@@
        foo=\$arch_${dist//-/_}
        for arch in `eval echo $foo`
        do
 -          test ! "$arch" = "kfreebsd-i386" || continue
 -          test ! "$arch" = "kfreebsd-amd64" || continue
 -          test ! "$arch" = "armel" || continue
            for part in ${parts}
            do
                echo retrieve Packages $dist/$part/$arch
@@@ -59,6 -67,8 +59,6 @@@
                rsync -t ${localdir}/dists/${dist}/${part}/binary-${arch}/Packages.gz \
                    us/${dist}/${part}/binary-${arch}/Packages.gz
            done
 -          #FIXME: no Contents files for p-u
 -          test ! "$dist" = "experimental" || continue
            echo retrieve Contents $dist/$arch
            rsync -t ${localdir}/dists/${dist}/Contents-${arch}.gz \
                us/${dist}/Contents-${arch}.gz
@@@ -75,23 -85,23 +75,23 @@@ f
  
  # security archive
  #
 -for dist in sarge etch lenny
 +for dist in $dists
  do
      echo "retrieve Release(.gpg) $dist"
      test -d security/${dist} || mkdir -p security/${dist}
      (cd security/${dist} &&
-       wget -q -N ${security_ftpsite}/dists/${dist}-security/Release &&
-       wget -q -N ${security_ftpsite}/dists/${dist}-security/Release.gpg )
 -      $wget_cmd -N ${security_ftpsite}/dists/${dist}/updates/Release &&
 -      $wget_cmd -N ${security_ftpsite}/dists/${dist}/updates/Release.gpg )
++      $wget_cmd -N ${security_ftpsite}/dists/${dist}-security/Release &&
++      $wget_cmd -N ${security_ftpsite}/dists/${dist}-security/Release.gpg )
          
      foo=\$arch_${dist//-/_}
      for arch in `eval echo $foo`
      do
        for part in ${parts}
        do
 -      echo retrieve Packages $dist/$part/security/$arch
 +      echo retrieve Packages $dist-security/$part/$arch
        test -d security/${dist}/${part}/binary-${arch} || mkdir -p security/${dist}/${part}/binary-${arch}
        (cd  security/${dist}/${part}/binary-${arch} &&
-           wget -q -N ${security_ftpsite}/dists/${dist}-security/${part}/binary-${arch}/Packages.gz)
 -          $wget_cmd -N ${security_ftpsite}/dists/${dist}/updates/${part}/binary-${arch}/Packages.gz)
++          $wget_cmd -N ${security_ftpsite}/dists/${dist}-security/${part}/binary-${arch}/Packages.gz)
        done
      done
      for part in ${parts}
          echo retrieve Sources $dist/$part/security
          test -d security/${dist}/${part}/source || mkdir -p security/${dist}/${part}/source
          (cd security/${dist}/${part}/source &&
-             wget -q -N ${security_ftpsite}/dists/${dist}-security/${part}/source/Sources.gz)
 -            $wget_cmd -N ${security_ftpsite}/dists/${dist}/updates/${part}/source/Sources.gz)
++            $wget_cmd -N ${security_ftpsite}/dists/${dist}-security/${part}/source/Sources.gz)
      done
  done
index 73955d36556e6a3e10f503de3a87b20918dc9a6f,272b23522d6b1322d910ee913cb18abed99a5889..fd19f0f058e30c620fbef439a65b91162af04e59
@@@ -18,25 -18,27 +18,27 @@@ use Packages::Config qw( $DBDIR @SUITE
  
  sub do_search_contents {
      my ($params, $opts, $page_content) = @_;
+     my $cat = $opts->{cat};
  
      if ($params->{errors}{keywords}) {
-       fatal_error( _g( "keyword not valid or missing" ) );
+       fatal_error( $cat->g( "keyword not valid or missing" ) );
        $opts->{keywords} = [];
      } elsif (grep { length($_) < 2 } @{$opts->{keywords}}) {
-       fatal_error( _g( "keyword too short (keywords need to have at least two characters)" ) );
+       fatal_error( $cat->g( "keyword too short (keywords need to have at least two characters)" ) );
      }
      if ($params->{errors}{suite}) {
-       fatal_error( _g( "suite not valid or not specified" ) );
+       fatal_error( $cat->g( "suite not valid or not specified" ) );
      }
  
      #FIXME: that's extremely hacky atm
      if ($params->{values}{suite}{no_replace}[0] eq 'default') {
        $params->{values}{suite}{no_replace} =
 -          $params->{values}{suite}{final} = $opts->{suite} = [ 'etch' ];
 +          $params->{values}{suite}{final} = $opts->{suite} = [ 'gutsy' ];
      }
  
      if (@{$opts->{suite}} > 1) {
-       fatal_error( sprintf( _g( "more than one suite specified for contents search (%s)" ), "@{$opts->{suite}}" ) );
+       fatal_error( $cat->g( "more than one suite specified for contents search (%s)",
+                             "@{$opts->{suite}}" ) );
      }
  
      my @keywords = @{$opts->{keywords}};
@@@ -77,7 -79,7 +79,7 @@@
            close FILENAMES or warn "fgrep error: $!\n";
        } else {
  
-           error(_g("The search mode you selected doesn't support more than one keyword."))
+           error($cat->g("The search mode you selected doesn't support more than one keyword."))
                if @keywords;
  
            my $kw = reverse $first_kw;
        my $file = shift @$result;
        my %pkgs;
        foreach (@$result) {
-           my ($pkg, $arch) = split /:/, $_;
+           my ($pkg, $arch) = split m/:/, $_;
            next unless $opts->{h_archs}{$arch};
            $pkgs{$pkg}{$arch}++;
            $archs{$arch}++ unless $arch eq 'all';
diff --combined lib/Packages/Search.pm
index ea6dcfad631a3fa99504e8cd1f30d304b6755984,c33f1425322e0ddb10f0d18c51b2ef214919ea8b..2e5dee983b938ca3c1c8f1333337dcfe0ac7a2d3
@@@ -74,16 -74,16 +74,16 @@@ sub read_entry_all 
      while (my ($suite, $provides) = each %virt) {
        next if $suite eq '-';
        if ($opts->{h_suites}{$suite}) {
-           push @$results, [ $key, "-", $suite, 'virtual', 'v', 'v', 'v', 'v',
+           push @$results, [ $key, "-", $suite, 'virtual', 'v', 'v', 'v', 'v', 'v',
                              $provides];
        } else {
-           push @$non_results, [ $key, "-", $suite, 'virtual', 'v', 'v', 'v', 'v',
+           push @$non_results, [ $key, "-", $suite, 'virtual', 'v', 'v', 'v', 'v', 'v',
                                  $provides];
        }
      }
  
      foreach (split(/\000/o, $result||'')) {
-       my @data = split ( /\s/o, $_, 8 );
+       my @data = split ( /\s/o, $_, 9 );
        debug( "Considering entry ".join( ':', @data), 2) if DEBUG;
        if ($opts->{h_suites}{$data[1]}
            && ($opts->{h_archs}{$data[2]} || $data[2] eq 'all')
@@@ -101,14 -101,13 +101,14 @@@ sub read_entry 
      read_entry_all( $hash, $key, $results, \@non_results, $opts );
  }
  
 -#FIXME: make configurable
 -my %fallback_suites = (
 -                     'sarge-backports' => 'sarge',
 -                     'sarge-volatile' => 'sarge',
 -                     'etch-backports' => 'etch',
 -                     'etch-volatile' => 'etch',
 -                     experimental => 'sid' );
 +sub fallback_suite {
 +    my $suite = shift;
 +    if ($suite =~ /^(\S+)-(?:updates|backports)/) {
 +      return $1;
 +    } else {
 +      return undef;
 +    }
 +}
  
  sub read_entry_simple {
      my ($hash, $key, $archives, $suite) = @_;
      # with correctly, but it's adequate enough for now
      return [ $virt{$suite} ] unless defined $result;
      foreach (split /\000/o, $result) {
-       my @data = split ( /\s/o, $_, 8 );
+       my @data = split ( /\s/o, $_, 9 );
        debug( "use entry: @data", 2 ) if DEBUG && $data[1] eq $suite;
        return [ $virt{$suite}, @data ] if $data[1] eq $suite;
      }
 -    if (my $fb_suite = $fallback_suites{$suite}) {
 +    if (my $fb_suite = fallback_suite($suite)) {
        my $fb_result = read_entry_simple( $hash, $key, $archives, $fb_suite );
        my $fb_virt = shift(@$fb_result);
        $virt{$suite} .= $virt{$suite} ? " $fb_virt" : $fb_virt if $fb_virt;
@@@ -165,14 -164,22 +165,22 @@@ sub do_names_search 
  
      my $first_keyword = lc shift @$keywords;
      @$keywords = map { lc $_ } @$keywords;
-         
      my ($key, $prefixes) = ($first_keyword, '');
-     my %pkgs;
+     my (%pkgs, %pkgs_min);
      $postfixes->seq( $key, $prefixes, R_CURSOR );
      while (index($key, $first_keyword) >= 0) {
-       if ($prefixes =~ /^\001(\d+)/o) {
-           debug( "$key has too many hits", 2 ) if DEBUG;
-           $too_many_hits += $1;
+       if ($prefixes =~ /^(\^)?\001(\d+)/o) {
+           debug("$key has too many hits", 2 ) if DEBUG;
+           $too_many_hits += $2;
+           if ($1) { # use the empty prefix
+               foreach my $k (@$keywords) {
+                   next unless $key =~ /\Q$k\E/;
+               }
+               debug("add key $key", 2) if DEBUG;
+               $pkgs{$key}++;
+               $pkgs_min{$key}++;
+           }
        } else {
          PREFIX:
            foreach (split /\000/o, $prefixes) {
                foreach my $k (@$keywords) {
                    next PREFIX unless $word =~ /\Q$k\E/;
                }
-               debug( "add word $word", 2) if DEBUG;
+               debug("add word $word", 2) if DEBUG;
                $pkgs{$word}++;
+               $pkgs_min{$word}++ if $_ eq '';
            }
        }
        last if $postfixes->seq( $key, $prefixes, R_NEXT ) != 0;
-       last if $too_many_hits or keys %pkgs >= 100;
+       last if keys %pkgs_min >= 100;
      }
-     
-     my $no_results = keys %pkgs;
-     if ($too_many_hits || ($no_results >= 100)) {
-       $too_many_hits += $no_results;
-       %pkgs = ( $first_keyword => 1 ) unless @$keywords;
+     my $nr = keys %pkgs;
+     my $min_nr = keys %pkgs_min;
+     debug("nr=$nr min_nr=$min_nr too_many_hits=$too_many_hits", 1) if DEBUG;
+     if ($nr >= 100) {
+       $too_many_hits += $nr - $min_nr + 1;
+       %pkgs = %pkgs_min;
      }
      foreach my $pkg (sort keys %pkgs) {
        &$read_entry( $packages, $pkg, $results, $non_results, $opts );
@@@ -283,7 -293,9 +294,9 @@@ sub find_similar 
      undef $db;
  
      debug ("ORDER: @order", 2) if DEBUG;
-     return @order[0..10];
+     my $last = 10;
+     $last = $#order if $#order < $last;
+     return @order[0..$last];
  }
  
  sub find_binaries {
diff --combined setup-site.conf
index 0000000000000000000000000000000000000000,edaf9b67f8eabc3aa37f68f685f4cc8ef4420501..4cf450274510301ab55bd972bad11dddb7489a60
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,2 +1,2 @@@
 -topdir=/srv/packages.debian.org
 -site=packages.debian.net
++topdir=/srv/packages.ubuntu.com-new
++site=packages2.ubuntu.lichtenheld.net
diff --combined static/debian.css
index 0fb88aaca232f50a1e0529745cf3b85ddb5523fb,fce9493b3312b7867ae98ff9905d14daba9eb389..d18bc878726edc11de40df2b7498f4faa05e748a
@@@ -1,3 -1,38 +1,3 @@@
 -/* css file for debian web site - Jutta Wrage 2004 */
 -
 -/* all pages have a header, outer inner and footer
 -leftcol and maincol can be omitted, there will be other boxes
 -to replace later (eg. two content columns)
 -normal page:
 -<div id="header">
 -  <div id="upperheader">
 -     <div id="logo">
 -     </div> <!-- end logo -->
 -     <div id="serverselect">
 -     </div> <!-- end serverselect -->
 -  </div> <!-- end upperheader -->
 -  <div id="navbar">
 -  </div> <!-- end navbar -->
 -</div> <!-- end header -->
 -<div id="outer">
 -  <div id="inner">
 -    <div id="leftcol">
 -      Leftcol is for menus - if omitted, maincol can be omitted, too
 -    </div> <!-- end leftcol -->
 -    <div id="maincol">
 -      Maincol with margin left is for the content
 -      But content may go directly to inner
 -    </div> <!-- end maincol -->
 -  </div> <!-- end inner -->
 -  <div id="footer">
 -    <hr class="hidecss"> This line is a divider for lynx
 -  </div> <!-- end footer -->
 -</div> <!-- end outer -->
 -color logo #C60036
 -cd-pages: bgcolor="#e09e86" - navbar
 -*/
 -
 -/* { border: 1px solid yellow; } */
  html, body {
        color: #000000;
        background-color: #FFFFFF;
@@@ -24,15 -59,152 +24,15 @@@ acronym 
  hr.hidecss {
        border: 0;
  }
 +.hidecss {
 +        display: none;
 +}
  
  hr {
        border-bottom: 0;
        border-top: 1px solid #BFC3DC;
  }
  
 -samp {
 -      display: block;
 -      margin-left: 2em;
 -}
 -div.sampleblock {
 -      width: 80%;
 -      margin: auto;
 -      font-family:courier, serif;
 -      font-size: 90%;
 -}
 -div.quoteblock {
 -      width: 75%;
 -      margin: auto;
 -      font-size: 90%;
 -      text-align: justify;
 -}
 -
 -.quoteblock div.preimg {
 -      float: left;
 -      margin-top: 0.2em;
 -}
 -.quoteblock cite {
 -      display: block;
 -      text-align: right;
 -}
 -blockquote.question {
 -      font-style: italic;
 -}
 -blockquote.question p span {
 -      font-style: normal;
 -      width: 10%;
 -}
 -#pagewidth {
 -      width: 100%;
 -      text-align: left;
 -}
 -
 -/* now the header*/
 -#header {
 -      margin-left: -3px;
 -      width: 100%;
 -      height: auto;
 -}
 -
 -/* upper nested header box*/
 -#upperheader {
 -      width: 100%;
 -      margin-top: 11px;
 -      height: auto;
 -      /* height: 4.8em; */
 -      background: #FFFFFF;
 -}
 -
 -#logo {
 -      float: left;
 -      margin-left: 6px;
 -      background: #FFFFFF;
 -}
 -
 -#serverselect {
 -      float: right;
 -      display: block;
 -      padding-top: 1px;
 -      margin-right: 6px;
 -      margin-left: auto;
 -      text-align: right;
 -      top: 0;
 -      right: 0;
 -}
 -
 -#serverselect:lang(de) {
 -      width: 15em;
 -}
 -#serverselect:lang(en) {
 -      width: 13em;
 -}
 -
 -#serverselect p {
 -      color: #990000;
 -      font-size: 0.8em;
 -      font-weight: normal;
 -}
 -
 -#serverselect p select {
 -      font-size: 88%;
 -}
 -
 -#serverselect p input {
 -      font-size: 88%;
 -}
 -.centerlogo {
 -      margin-left: 260px;
 -      margin-right: auto;
 -      width: 125px;
 -      text-align: center;
 -      vertical-align: bottom;
 -}
 -#cdlogo {
 -}
 -
 -#navbar {
 -      /* margin-top: 1em; */
 -      clear: both;
 -      padding-left: 0px;
 -      /* margin-top: 5px; */
 -      padding-top: 6px;
 -      padding-bottom: 4px;
 -      width: 100%;
 -      height: auto;
 -      text-align: center;
 -      background: #DF0451;
 -}
 -#navbar ul {
 -      display: inline;
 -      list-style-type: none; 
 -      padding-left:  0px;
 -      line-height: 1.5em;
 -}
 -#navbar ul li {
 -      display: inline;
 -      margin: 0;
 -      white-space: nowrap;
 -}
 -#navbar a {
 -      color: #FFFFFF;
 -      text-decoration: none;
 -      padding: 0.2em 0.4em 0.2em 0.4em;
 -      background-color: #000084;
 -      border: 1px solid #000084;
 -      font-family: Arial, Helvetica, sans-serif;
 -      font-weight: bold;
 -      font-size: 0.9em;
 -}
 -#navbar a:hover {
 -      background: #0000CC;
 -}
 -#navbar .hidecss, .hidecss {
 -      display: none;
 -}
 -
  /* the rest of page out of two nested boxes around */
  
  #outer {
        /* overflow: auto; */
  }
  
 -#leftcol {
 -      float: left;
 -      margin: 0em 0.4em 0 0;
 -      padding-left: 0;
 -      padding-bottom: 1em;
 -      width: auto;
 -      background: #BBDDFF;
 -      font-size: 0.9em;
 -      font-family: Arial, Helvetica, sans-serif;
 -      border: 1px solid #BBDDFF;
 -      /* overflow: auto; */
 -}
 -#leftcol a:link, #leftcol a:visited {
 -      display: block;
 -}
 -#leftcol a:hover {
 -      background-color: #DDEEFF;
 -      /* background-color: #FFFFFF; */
 -}
 -#leftcol ul {
 -      margin: 2px;
 -      padding: 0;
 -      list-style-type: none;
 -      font-weight: bold;
 -}
 -#leftcol ul.votemenu {
 -      width: 11em;
 -}
 -#leftcol ul.cdmenu {
 -      width: 12em;
 -}
 -#leftcol ul.votemenu ul li, #leftcol ul.cdmenu ul li {
 -      padding-bottom: 0.4em;
 -}
 -#leftcol li ul {
 -      display: inline;
 -}
 -#leftcol ul li {
 -      padding: 0.2em 0;
 -}
 -#leftcol ul ul {
 -      font-size: 0.9em;
 -      margin: 0;
 -}
 -#leftcol ul li a {
 -      line-height: 1.2em;
 -      padding-right: 0.5em;
 -      /* padding: 0.2em 0 0.3em 0em; */
 -}
 -#leftcol ul ul li a {
 -      font-weight: normal;
 -      padding: 0.1em 0.5em;
 -      line-height: 1.1em;
 -}
 -#leftcol ul ul li {
 -      padding-top: 0;
 -}
 -#leftcol p {
 -      margin-left: 2px;
 -      margin-right: 2px;
 -}
 -#leftcol p a {
 -      display: block;
 -      margin: 0;
 -}
 -#leftcol p img {
 -      margin-left: 1em;
 -}
 -
 -#maincol {
 -      background: #FFFFFF;
 -      margin-left: 12em;
 -      margin-right: 0.5em;
 -      margin-bottom: 1em;
 -}
 -
 -#maincol:lang(en), #maincol:lang(cz), #maincol:lang(ko),
 -      #maincol:lang(no), #maincol:lang(sk), #maincol:lang(tr),
 -      #maincol:lang(zh-CN), #maincol:lang(zh-HK), #maincol:lang(zh-TW) {
 -      margin-left: 10em;
 -}
 -
  #lefthalfcol {
        float: left;
        margin-left: 0em;
        margin-right: 0.2em;
  }
  
 +
  #footer {
        clear: both;
        width: 100%;
        padding-top: 3px;
        bottom: 0;
        text-align: center;
-       margin: 0px;
+       margin: 1em 0 0 0;
 -      border-top: 1px solid #BFC3DC;
 +      border-top: 1px solid #000;
  }
  
  #fineprint {
        font-size: 0.85em;
  }
  
 -.bordertop { border-top: 1px solid #BFC3DC; }
 +.bordertop { border-top: 1px solid #000; }
  
  dl.gloss dt {
        font-weight: bold;
        margin: 0px;
  }
  
 -#main {
 -      background: #bbddff;
 -      padding: 1em 0; /* have some padding to get rid of collapsed margins */
 -}
 -
  /* classes for cards */
 -
  .cardleft {
        margin: 0 0 1em;
        float: left;
        /* the next two lines xpand the div to heigth of left inner div */
        overflow: auto;
  }
 -
 -div.lefthalf {
 -      float: left;
 -      width: 49%;
 -      border: 0;
 -      margin: 0; 
 -      padding: 0;
 -}
 -
 -div.righthalf {
 -      border: 0;
 -      margin: 0;
 -      padding: 0;
 -}
  /* colors for packages, warnings and news in ports */
  .warning, dt.new, .no {
        color: red; /* FF0000 */
@@@ -168,6 -441,13 +168,6 @@@ table.ridgetable, table.reltable 
        border-style: ridge;
        border-collapse: collapse;
  }
 -table.vote {
 -      margin: 0 auto;
 -      border-width: 3px;
 -      border-color: gray;
 -      border-style: ridge;
 -      border-collapse: collapse;
 -}
  #pcontentsres col, #pcontentsres th, #pdownload th, #pdownload td, table.ridgetable th, table.ridgetable td,
        table.reltable td, table.reltable th {
        border: 2px #BFC3DC;
  table.reltable th {
        background-color: #44CCCC;
  }
 -table.vote th {
 -      border: 1px solid gray;
 -      background-color: #DDDDDD;
 -}
 -table.vote td {
 -      border: 1px solid gray;
 -      padding: 4px;
 -}
  table.reltable tr.odd {
        background-color: #FFFFFF;
  }
  table.reltable tr.even {
        background-color: #DDDDDD;
  }
 -table.stattrans {
 -      margin: 0 auto;
 -      width: 95%;
 -      border: 1px solid black;
 -      background-color: #cdc9c9;
 -}
 -table.stattrans th {
 -      text-align: center;
 -      padding: 2px;
 -}
 -table.stattrans td {
 -      text-align: right;
 -      padding: 2px;
 -}
 -table.stattrans tbody th {
 -      text-align: left;
 -      font-weight: normal;
 -}
 -
 -/* partners */
 -.partnertype {
 -      background-color: #DD0000;
 -      padding: 0.2em 0 0.2em 1em;
 -      color: #FFFFFF;
 -
 -}
 -div.partnerlogo {
 -      display: table-cell;
 -      vertical-align: middle;
 -      text-align: center;
 -      width: 30%;
 -}
 -div.partnerdesc {
 -      display: table-cell;
 -      font-size: 85%;
 -}
 -div.cdflash {
 -      background-color: #E09E86;
 -      width: 80%;
 -      margin: auto;
 -      text-align: center;
 -}
 -.cdrsync {
 -      color: #6B1300;
 -}
 -/* debian installer */
 -
 -.dierror {
 -      background-color: #FF6060;
 -}
 -.dibad {
 -      background-color: #F7FF60;
 -}
 -.digood {
 -      background-color: #7AFF71;
 -}
 -
 -/* useful classes */
 -
 -th.eventheader {
 -      background-color: #BBDDFF;
 -}
 -.center {
 -      text-align: center;
 -}
 -.right {
 -      text-align: right;
 -}
 -ul.circlelist {
 -      list-style-type: circle;
 -}
 -.centerdiv table {
 -      margin-left: auto;
 -      margin-right: auto;
 -}
 -ul.discless {
 -      list-style-type: none;
 -}
 -.top, img.ico {
 -      vertical-align: top;
 -}
 -img.ico {
 -      float: left;
 -      margin: 0 0.2em 0 0;
 -}
 -img.rightico {
 -      float: right;
 -      vertical-align: top;
 -      margin: 0 0 0 0.2em;
 -}
 -img.cve {
 -      vertical-align: -25px;
 -}
 -.y2kok, .yes {
 -      color: #00BB00;
 -}
 -.y2kok2 {
 -      color: #00BBBB;
 -}
 -.bluehead {
 -      color: #0000FF !important;
 -}
 -span.halfsize {
 -      font-size: 80%;
 -}
 -span.ddpbooktitle, span.merchtitle {
 -      font-size: larger;
 -}
 -a:link { color: #0000FF; }
 -a:visited { color: #800080; }
 -a:hover { color: #F000FF; }
 -a:active { color: #FF0000; }
 -
 -.navpara a, col.y2k {
 -      white-space: nowrap;
 -      /* this is to keep from breaking at whitespace in anchors */
 -}
  
  /* language dependent stuff */
  /* quotes */
@@@ -225,3 -630,9 +225,3 @@@ html[lang|="zh"] strong 
        direction: rtl;
        text-align: right;
  }
 -
 -#leftcol, #navbar, #navbar a {
 -      -moz-border-radius: 15px;
 -      /* this goes to the end as the css validator does not like it
 -      will be replaced by border-radius with css3 */
 -}
index fbe7b28ed25eeebe8b406ced72bd419af561a4f8,0e5ae372f5983f252f5f56b6059c181b8dd3b42e..6e26dcb1d7ccbf9841e2983307e6895e559aed47
@@@ -44,20 -44,13 +44,20 @@@ h1 
               font-size: smaller;
               margin-left: 1em;
               float: right;
 -             background-color: #BBDDFF;
 -             border: thin solid #BFC3DC;
 +             background-color: white;
 +           color: #5B4832;
 +             border: thin solid #5B4832;
               padding: 1em .5em;
               width: auto;
  }
 +#pmoreinfo h2 {
 +             border-bottom: none;
 +           color: #5B4832;
 +}
  #pmoreinfo h3 {
               border-top: thin solid black;
 +           border-bottom: none;
 +           color: #5B4832;
  }
  
  /*
@@@ -257,8 -250,7 +257,8 @@@ table#pdeplegend, #pdownload table 
        padding: .3em;
        border-top: solid gray thin;
        border-bottom: solid gray thin;
 -      background-color: #bdf;
 +        background-color: #dbba75;
 +      color: #5B4832;
  }
  #psearchres li {
        margin-top: 1em;
        padding-left: 1em;
        padding-top: 6px;
        padding-bottom: 4px;
-       width: auto;
        height: auto;
        text-align: left;
 -      background: #DF0451;
 -      color: yellow;
 +        background-color: white;
 +      color: #5B4832;
 +        border-bottom: thin solid #5B4832;
        font-size: smaller;
        font-weight: bold;
  }
        margin: 0;
        white-space: nowrap;
  }
 -#pnavbar a {
 -      color: yellow;
 -      text-decoration: none;
 +#pnavbar a, #pmoreinfo a {
 +      color: #5B4832;
  }
  #pnavbar a:hover {
  }
  .pvcslink { 
  }
  
 -#pnavbar, .pconstantnag, #psitewidemsg {
 +.pconstantnag, #psitewidemsg {
        -moz-border-radius: 15px;
        /* this goes to the end as the css validator does not like it
        will be replaced by border-radius with css3 */
diff --combined templates/config.tmpl
index 4194dadd8b7e006ac1626d8f02b5fce844ad7fa9,c99694e5c4f063bdf823e9c0b46e9b358c1ac910..451b0e60ff668c10c2acc1863274302ab129ff83
@@@ -1,52 -1,59 +1,60 @@@
  [%- DEFAULT
     charset = 'UTF-8'
-    lang = 'en'
+    po_lang = 'en'
+    ddtp_lang = 'en'
  
 -   organisation = 'Debian'
 -   homepage = 'http://www.debian.org/'
 -   packages_homepage = 'http://packages.debian.net/'
 +   organisation = 'Ubuntu'
 +   homepage = 'http://www.ubuntu.com/'
 +   packages_homepage = 'http://packages.ubuntu.lichtenheld.net/'
     searchformurl = packages_homepage
     search_url = '/'
     tags_url = 'http://debtags.alioth.debian.org/'
     bugs_url = 'http://bugs.debian.org/'
 +   launchpad_url = 'https://launchpad.net/distros/ubuntu/+source/'
     pts_url = 'http://packages.qa.debian.org/'
     ddpo_url = 'http://qa.debian.org/developer.php?login='
     src_bugs_url = bugs_url _ 'src:'
 -   mirror_url = 'http://ftp.debian.org/'
 -   security_mirror = 'security.debian.org'
 -   security_mirror_url = security_mirror _ '/debian-security'
 -   security_suite_suffix = '/updates'
 -   changelogs_url = 'http://packages.debian.org/changelogs/'
 +   mirror_url = 'http://archive.ubuntu.com/'
++   security_mirror = 'security.ubuntu.com'
++   security_mirror_url = security_mirror _ '/ubuntu'
++   security_suite_suffix = '-security'
 +   changelogs_url = 'http://changelogs.ubuntu.com/changelogs/'
     policy_url = 'http://www.debian.org/doc/debian-policy/'
 -   cn_help_url = homepage _ 'intro/cn'
 +#   cn_help_url = homepage _ 'intro/cn'
     logo = {
        url => homepage,
          src => '/Pics/openlogo-nd-25.png',
          alt => organisation,
     }
     copyright = {
 -      url => 'http://www.spi-inc.org/',
 -        name => 'SPI Inc.',
 -        years => '1997 - ' _ timestamp.year,
 +      url => 'http://www.canonical.com/',
 +        name => 'Canonical Ltd.',
 +        years => timestamp.year,
     }
     license = {
 -      url => homepage _ 'license'
 +      url => homepage _ 'legal'
     }
     trademark = {
        name => copyright.name,
        url => homepage _ 'trademark'
     }
     contact = {
 -      name => g('Debian Web Mailinglist'),
 -      mail => 'debian-www@lists.debian.org',
 -        url => homepage _ 'contact',
 +      name => 'Frank Lichtenheld',
 +      mail => 'frank@lichtenheld.de',
 +        url => homepage _ 'support',
     }
     admin = {
 -      name => g('%s Webmaster', organisation),
 -      mail => 'webmaster@debian.org',
 +      name => 'Frank Lichtenheld',
 +      mail => 'frank@lichtenheld.de',
     }
     trademarknotes = g('%s is a <a href="%s">trademark</a> of %s', organisation, trademark.url, trademark.name)
  -%]
  [%-
     # possible values for importance: high, normal, low
     sitewidemsg = { importance => "high",
 -                 txt => g('Please note that this is an experimental version of <a href="http://packages.debian.org/">packages.debian.org</a>. Errors and obsolete information should be expected') }
 +                 txt => g('Please note that this is an experimental version of <a href="http://packages.ubuntu.com/">packages.ubuntu.com</a>. Errors and obsolete information should be expected') }
  -%]
+ [%# @translators: . = decimal_point , = thousands_sep, see Number::Format %]
+ [%- USE num = Number.Format( decimal_point => g('.'),
+                            thousands_sep => g(','),
+                            decimal_fill  => 1 ) -%]
index 200e07e1f882fd692d89880b80cf74c9e8bed070,8cd30c5fbce5681a862d4bcb5de47de6aab0b269..a021d5559623d232ed72c7cc3b96bfbbe08a14c4
@@@ -30,7 -30,7 +30,7 @@@ deb http://<em>[% mirrors.$archive.euro
  <p>[% g('Replacing <em>%s</em> with the mirror in question.', mirrors.$archive.europa.0) %]
  [% ELSE %]
  <pre>
- deb http://security.ubuntu.com/ubuntu [% suite _ "-security" %] main [% section IF section != main_section %]
+ deb [% 'http://' _ security_mirror_url %] [% suite _ security_suite_suffix %] main [% section IF section != main_section %]
  </pre>
  [%- END %]
  [% IF suite == "experimental" %]
@@@ -49,7 -49,7 +49,7 @@@
    <p>[% g('You can download the requested file from the <tt>%s</tt> subdirectory at any of these sites:',
        filename.directory) %]</p>
    <div class="cardleft">
 -  [% FOREACH continent IN [ 'north_america', 'south_america', 'asia', 'africa' ] %]
 +  [% FOREACH continent IN [ 'north_america', 'south_america', 'asia', 'africa', 'australia' ] %]
      [% IF a.$continent %]
        <p><em>[% continents.$continent %]</em></p>
        <ul>
@@@ -60,7 -60,7 +60,7 @@@
      [% END %]
    [% END %]
    </div><div class="cardright">
 -  [% FOREACH continent IN [ 'europa','australia' ] %]
 +  [% FOREACH continent IN [ 'europa' ] %]
      [% IF a.$continent %]
        <p><em>[% continents.$continent %]</em></p>
        <ul>
@@@ -73,8 -73,9 +73,9 @@@
    </div>
  [% ELSE %]
  <p>[% g('You can download the requested file from the <tt>%s</tt> subdirectory at:', filename.directory) %]</p>
- <ul><li><a href="http://security.ubuntu.com/ubuntu/[% filename.full %]">security.ubuntu.com/ubuntu</a></li></ul>
- <p>[% g('Ubuntu security updates are currently officially distributed only via <tt>security.ubuntu.com</tt>.') %]</p>
+ <ul><li><a href="http://[% security_mirror_url %]/[% filename.full %]">[% security_mirror_url %]</a></li></ul>
+ <p>[% g('%s security updates are officially distributed only via <tt>%s</tt>.',
+       organisation, security_mirror) %]</p>
  [% END %]
  
  <div id="pdownloadnotes">
@@@ -98,7 -99,7 +99,7 @@@
  
  <h3>[% g('More information on <kbd>%s</kbd>:', filename.file) %]</h3>
  <table id="pdownloadmeta">
- <tr><th>[% g('Exact Size') %]</th>    <td class="size">[% g('%s Byte (%s %s)', size, pkgsize, pkgsize_unit) %]</td>
+ <tr><th>[% g('Exact Size') %]</th>    <td class="size">[% g('%s Byte (%s %s)', size, num.format_number(pkgsize,1), pkgsize_unit) %]</td>
  <tr><th>[% g('MD5 checksum') %]</th>  <td><tt>[% md5sum %]</tt></td>
  <tr><th>[% g('SHA1 checksum') %]</th> <td><tt>[% sha1 || g('Not Available') %]</tt></td>
  <tr><th>[% g('SHA256 checksum') %]</th>       <td><tt>[% sha256  || g('Not Available') %]</tt></td>
diff --combined templates/html/head.tmpl
index 86458a3387e5fe09b46054ba0406246dab09b731,866641cf4c7d40dbe088c600fdf326f98f4679d6..c0923f81bafd06352c5d28a4e4a9e01936203bc8
@@@ -1,8 -1,8 +1,8 @@@
  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
- <html lang="[% lang %]">
+ <html lang="[% po_lang %]">
  <head>
  <title>[% organisation %] -- [% title_tag %]</title>
- <link rev="made" href="[% admin.mail %]">
+ <link rev="made" href="mailto:[% admin.mail %]">
  <meta http-equiv="Content-Type" content="text/html; charset=[% charset %]">
  <meta name="Author" content="[% admin.name %], [% admin.mail %]">
  <meta name="Description" content="[% description %]">
@@@ -12,8 -12,6 +12,8 @@@
  <link href="/debian.css" rel="stylesheet" type="text/css" media="all">
  <link href="/packages.css" rel="stylesheet" type="text/css" media="all">
  <link href="/packages-site.css" rel="stylesheet" type="text/css" media="all">
 +<link href="/ubuntu/ubuntu.css" rel="stylesheet" type="text/css" media="all">
 +<link href="/ubuntu/masthead.css" rel="stylesheet" type="text/css" media="all">
  [% IF rss_alternate %]
  <link rel="alternate" type="application/rss+xml" title="RSS" href="[% rss_alternate %]">
  [% END %]
  [% sitewidemsg.txt %]
  </div>
  [%- END -%]
 -<div id="header">
 -   <div id="upperheader">
 +    <div id="pageWrapper">
 +      <div id="mastWrapper">
 +        <div id="masthead">
 +          <a class="imageLink"
 +             href="[% homepage %]">&nbsp;</a>
  
 -   <div id="logo">
 -  <!-- very Debian specific use of the logo stuff -->
 -  <a href="[% logo.url %]"><img src="[% logo.src %]" alt="" /></a>
 -  <a href="[% logo.url %]"><img src="/Pics/debian-small.png" alt="[% logo.alt %]" width="90" height="31"></a>
 -</div> <!-- end logo -->
 +          <a class="hiddenStructure"
 +             href="[% homepage %]/#documentContent">Skip
 +             to content</a>
  
  [%- IF print_search_field %]
  [% checked = 'checked="checked"'
     selected = 'selected="selected"' %]
 +<div id="search">
  <form method="GET" action="/search">
  <div id="hpacketsearch">
  [% IF search_field_values.mode %]<input type="hidden" name="mode" value="[% search_field_values.mode %]">[% END %]
  <span style="font-size: 60%"><a href="[% searchformurl %]">[% g('all options') %]</a></span>
  </div> <!-- end hpacketsearch -->
  </form>
 +</div>
  [% END %]
  
 -</div> <!-- end upperheader -->
 +     <!-- masthead content begin -->
 +    <h5 class="hiddenStructure">Sections</h5>    
 +    <div id="nav">
 +      <ul>        
 +      </ul>
 +    </div> <!-- nav -->
 +    <!-- masthead content end -->
 +    </div> <!-- masthead -->
 +   </div>  <!-- mastWrapper -->
  
 -<p class="hidecss"><a href="#inner">[% g('skip the navigation') %]</a></p>
 +<div class="visualClear"></div>
  <div id="pnavbar">
   &gt;&gt; <a href="[% homepage %]" title="[% g('%s Homepage', organisation) %]">[% organisation %]</a>
   &gt;&gt; <a href="[% packages_homepage %]" title="[% g('%s Packages Homepage', organisation) %]">[% g('Packages') %]</a>
  [% END %]
  </div> <!-- end navbar -->
  
 -</div> <!-- end header -->
 -<div id="outer">
 -<div id="inner">
 +<div class="inside">
 +<div id="content" class="">
 +<div class="documentContent" id="region-content">
  
  [%- IF page_title %]
 -  <h1>[% page_title %]</h1>
 +  <h1 class="documentFirstHeading">[% page_title %]</h1>
    [%- PROCESS 'html/messages.tmpl' -%]
  [% END -%]
diff --combined templates/html/show.tmpl
index 8f04246934cd9e78ca4ef89be5f8af6c511dca3d,048b7d0d6d72f62116b67dfa34b8672d8694ce69..0bc5fa2acd03742d8d91c87ce77b8d871aa58cf9
@@@ -16,7 -16,8 +16,8 @@@
      nav_arr.push( { prefix=>g('Section:'), title=>g('All packages in this section'), url=>make_url("$subsection/"), name=>subsection } );
      nav_arr.push( { prefix=>g('Package:'), name=>pkg } ); -%]
  [% desclang = 'en';
-    SET desclang = lang IF desc.$lang.long %]
+    SET desclang = po_lang IF desc.$po_lang.long;
+    SET desclang = ddtp_lang IF desc.$ddtp_lang.long %]
  [%- PROCESS 'html/head.tmpl'
     title_tag = is_source ? g('Details of source package %s in %s', pkg, suite)
                         : g('Details of package %s in %s', pkg, suite)
@@@ -29,7 -30,7 +30,7 @@@
    navigation = nav_arr
  -%]
  <!-- show.tmpl -->
- [% PROCESS 'html/menu.inc' %]
+ [% PROCESS 'html/util.inc' %]
  [% FOREACH s IN suites %]
     [% '<div id="pothers">' IF loop.first %]
     [%- IF s == suite -%]
  <h2>[% g('Links for %s', pkg) %]</h2>
  <h3>[% g('Debian Resources:') %]</h3>
  <ul>
- <li><a href="[% launchpad_url _ (is_source ? pkg : src.pkg) _ '/+bugs' | uri %]">[% g('Bug Reports') %]</a></li>
 -<li><a href="[% (is_source ? src_bugs_url : bugs_url) _ pkg %]">[% g('Bug Reports') %]</a></li>
 -
 -[% IF src.pkg -%]
 -<li><a href="[% pts_url _ src.pkg %]">[% g('Developer Information (PTS)') %]</a></li>
 -[% ELSIF is_source %]
 -<li><a href="[% pts_url _ pkg %]">[% g('Developer Information (PTS)') %]</a></li>
 -[%- END %]
++<li><a href="[% launchpad_url _ (is_source ? pkg : src.pkg) _ '/+bugs' %]">[% g('Bug Reports') %]</a></li>
  
  [% IF files && (!archive or archive == main_archive or archive == 'security') %]
  <li><a href="[% changelogs_url _ files.changelog.path %]">[% g('%s Changelog', organisation) %]</a></li>
  [%- ELSE -%]
    <h3>[% g('Maintainers:') %]</h3>
  [%- END %]
- [%- FOREACH maintainers -%]
+ [%- FOREACH maintainers;
+   mailarchiveurl = '';
+   IF (matches = mail.match('^(.*)@lists\.debian\.org$'));
+       mailarchiveurl = 'http://lists.debian.org/' _ matches.0 _ '/';
+   ELSIF (matches = mail.match('^(.*)@lists\.alioth\.debian\.org$'));
+       mailarchiveurl = 'http://lists.alioth.debian.org/pipermail/' _ matches.0 _ '/';
+   END -%]
    [%- '<ul>' IF loop.first -%]
-       <li><a href="mailto:[% mail %]">[% name | html %]</a></li>
+       <li><a href="mailto:[% mail %]">[% name | html %]</a>
 -      (<a href="[% ddpo_url _ mail %]" title="[% g("An overview over the maintainer's packages and uploads") %]">[% g('QA Page') %]</a>
 -      [%- IF mailarchiveurl %], <a href="[% mailarchiveurl %]" title="[% g('Archive of the Maintainer Mailinglist') %]">[% g('Mail Archive') %]</a>[% END %])
++      [%- IF mailarchiveurl %](<a href="[% mailarchiveurl %]" title="[% g('Archive of the Maintainer Mailinglist') %]">[% g('Mail Archive') %]</a>)[% END %]
+       </li>
    [%- '</ul>' IF loop.last -%]
  [%- END -%]
  
     IF url %]
  <h3>[% g('External Resources:') %]</h3>
  <ul>
- <li><a href="[% url | uri %]">[% g('Homepage') %]</a> [[% extract_host(url) %]]</li>
+ <li><a href="[% url | uri %]">[% g('Homepage') %]</a> [[% extract_host(url) | html %]]</li>
  </ul>
  [% END %]
  
  
  [% IF desc %]
  <div id="pdesctab">
- <div id="pdesc">
  [% UNLESS is_virtual %]
+ <div id="pdesc" [% "lang=\"$desclang\"" IF desclang != po_lang %]>
        [% IF desc.$desclang.short %]
        <h2>[% desc.$desclang.short %]</h2>
        <p>[% desc.$desclang.long %]
        [% END %]
  [% ELSE %]
+ <div id="pdesc">
        <p>[% g('This is a <em>virtual package</em>. See the <a href="%s">Debian policy</a> for a <a href="%sch-binary.html#s-virtual_pkg">definition of virtual packages</a>.',
                policy_url, policy_url) %]</p>
  [% END %]
      <div id="ptags"><p>
      <a href="[% tags_url %]edit.html?pkg=[% pkg | uri %]">[% g('Tags') %]</a>:
    [%- END %]
-   [% facet = tag.0;
-      facet_name = debtags_voc.$facet;
-      tag_id = "$tag.0::$tag.1";
-      tag_name = debtags_voc.$tag_id;
+   [% facet = tag.0; lfacet = "$facet-$po_lang"; 
+      facet_name = debtags_voc.$lfacet;
+      SET facet_name = debtags_voc.$facet UNLESS facet_name;
+      tag_id = "$tag.0::$tag.1"; ltag = "$tag_id-$po_lang";
+      tag_name = debtags_voc.$ltag;
+      SET tag_name = debtags_voc.$tag_id UNLESS tag_name;
     %]
    [% facet_name _ ': ' UNLESS old_facet && facet == old_facet %]
    [% IF tag_name %]
-    <a href="/about/debtags#[% string2id(tag_id) %]">[% tag_name %]</a>[% ', ' UNLESS loop.last %]
+    <a href="/about/debtags#[% string2id(tag_id) %]">[% tag_name | html %]</a>[% ', ' UNLESS loop.last %]
    [% ELSE %]
    [% tag_id %][% ', ' UNLESS loop.last %]
    [% END %]
    [%- END %]
  [% END %]
  
- [% FOREACH providers %]
+ [% FOREACH p IN providers %]
    [% IF loop.first %]<div id="pdeps"><h2>[% g('Packages providing %s', pkg) %]</h2><dl>[% END %]
-     <dt>[% IF available %]<a href="[% make_url(name,'','source','') %]">[% name %]</a>[% ELSE %][% name %][% END %]</dt>
-     <dd>[% desc %]</dd>
+     <dt>[% IF p.available %]<a href="[% make_url(p.name,'','source','') %]">[% p.name %]</a>[% ELSE; p.name; END %]</dt>
+     [% PROCESS desc_i18n_dd trans_desc=p.trans_desc desc=p.desc %]
    [% '</dl></div>' IF loop.last %]
  [% END %]
  </div> <!-- pdesctab -->
  [% END %]
  
- [% FOREACH binaries %]
+ [% FOREACH b IN binaries %]
    [% IF loop.first %]<div id="pbinaries">[% g('The following binary packages are built from this source package:') %]<dl>[% END %]
-     <dt>[% IF available %]<a href="[% make_url(name,'','source','') %]">[% name %]</a>[% ELSE %][% name %][% END %]</dt>
-     <dd>[% desc %]</dd>    
+     <dt>[% IF b.available %]<a href="[% make_url(b.name,'','source','') %]">[% b.name %]</a>[% ELSE; b.name; END %]</dt>
+     [% PROCESS desc_i18n_dd trans_desc=b.trans_desc desc=b.desc %]
    [% '</dl></div>' IF loop.last %]
  [% END %]
  
      [% '<li>' UNLESS is_old_pkgs %]
      [% FOREACH alternatives %]
        [% '<dl>' IF loop.first %]
-       <dt>[% IF loop.first %]<span class="nonvisual">[% id %]:</span>[% ELSE %]or [% END %]
+       <dt>[% IF loop.first %]<span class="nonvisual">[% id %]:</span>[% ELSE %][% g('or ') %][% END %]
        [% IF suite %]<a href="[% make_url(name,'','suite',suite,'source','') %]">[% name %]</a>[% ELSE %][% name %][% END %]
        [% ' (' _ version _ ')' IF version %]
          [% ' [' _ arch_str _ ']' IF arch_str %]</dt>
        [%- IF !is_old_pkgs -%]
-         <dd>[% desc -%]
+         [% PROCESS desc_i18n_dd no_end_tag=1 trans_desc=trans_desc desc=desc -%]
          [%- IF providers.pkgs.size > 0 -%]
          [% IF providers.also;
                '<br>' _ g('also a virtual package provided by');
                g('virtual package provided by');
             END; %]
          [% js_id = name %]
-           <span id="js_[% js_id %]" class="p_js_elem"></span> <span id="html_[% js_id %]">[% FOREACH provider IN providers.pkgs %]<a href="[% make_url(provider,'','suite',suite,'source','') %]">[% provider %]</a>[% ', ' UNLESS loop.last %][% END %]</span>
+           <span id="js_[% js_id %]" class="p_js_elem"></span> <span id="html_[% js_id %]">[% FOREACH provider IN providers.pkgs.sort %]<a href="[% make_url(provider,'','suite',suite,'source','') %]">[% provider %]</a>[% ', ' UNLESS loop.last %][% END %]</span>
        [% IF providers.pkgs.size > 10 %]
-       <script type="text/javascript">init_toggle_elem("[% js_id %]",[% g('%u providing packages', providers.pkgs.size) %]</script>
+       <script type="text/javascript">init_toggle_elem("[% js_id %]","[% g('show %u providing packages', providers.pkgs.size) %]", "[% g('hide %u providing packages', providers.pkgs.size) %]")</script>
        [% END %]
          [% END %]
          </dd>
    [%- END %]
  
  <tr>
- [% download_url = pkg _ '/' _ d.arch _ '/download'
-    filelist_url = pkg _ '/' _ d.arch _ '/filelist' %]
- <th><a href="[% make_url(download_url) | uri %]">[% d.arch %]</a>
+ [% download_url = pkg _ '/download'
+    filelist_url = pkg _ '/filelist' %]
+ <th><a href="[% make_url(download_url,'','arch',d.arch) %]">[% d.arch %]</a>
  [%- SET a = d.archive; IF mirrors.$a.unofficial_port  %] <strong>[% g('(unofficial port)') %]</strong>[% END %]</th>
  [% vnorm = d.version.replace( '\+b\d+$', '' ); vlatest = version.replace( '\+b\d+$', '' );
     vup = vnorm.replace( '-[^-]+$', '' ); vuplatest = vlatest.replace( '-[^-]+$', '' );
        version_class = 'vold';
     END %]
  [% "<td class='$version_class'>$d.version</td>" IF versions.multiple %]
- <td class="size">[% g('%.1f&nbsp;kB', d.pkgsize) %]</td><td class="size">[% g('%u&nbsp;kB', d.instsize) %]</td>
+ <td class="size">[% g('%s&nbsp;kB', num.format_number(d.pkgsize,1)) %]</td><td class="size">[% g('%s&nbsp;kB', d.instsize) %]</td>
  <td>
  [% IF d.contents_avail %]
-   [<a href="[% make_url(filelist_url) | uri %]">[% g('list of files') %]</a>]
+   [<a href="[% make_url(filelist_url,'','arch',d.arch) %]">[% g('list of files') %]</a>]
  [% ELSE %]
    [% g('no current information') %]
  [% END %]
  
  <tr>
  <td><a href="[% server _ path %]">[% filename %]</a></td>
- <td>[% g('%.1f&nbsp;kB', size) %]</td>
+ <td>[% g('%s&nbsp;kB', num.format_number(size,1)) %]</td>
  <td class="md5sum">[% md5sum %]</td>
  </tr>