]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 374331: Bugzilla::Template should use template_include_path from Bugzilla::Instal...
authormkanat%bugzilla.org <>
Sun, 6 May 2007 00:50:54 +0000 (00:50 +0000)
committermkanat%bugzilla.org <>
Sun, 6 May 2007 00:50:54 +0000 (00:50 +0000)
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=myk, a=mkanat

Bugzilla/Config/L10n.pm
Bugzilla/Install/Util.pm
Bugzilla/Template.pm
template/en/default/admin/params/l10n.html.tmpl

index 957dce786f0456f70adf5bf510ade888299c0ff5..5a18e9d58b59a66fb51e6d69cf952606dec9099c 100644 (file)
@@ -49,13 +49,6 @@ sub get_param_list {
    type => 't' ,
    default => 'en' ,
    checker => \&check_languages
-  },
-
-  {
-   name => 'defaultlanguage',
-   type => 't' ,
-   default => 'en' ,
-   checker => \&check_languages
   } );
   return @param_list;
 }
index 82edefb3a75eaf11202dd3cefb440629aeacf0e2..32860732ba0f85e6e5c3137d8d680aafaf07d4db 100644 (file)
@@ -38,6 +38,7 @@ our @EXPORT_OK = qw(
     indicate_progress
     install_string
     is_web
+    template_include_path
     vers_cmp
 );
 
@@ -454,6 +455,47 @@ inside of the string.
 
 =back
 
+=item C<template_include_path>
+
+Used by L<Bugzilla::Template> and L</install_string> to determine the
+directories where templates are installed. Templates can be installed
+in many places. They're listed here in the basic order that they're
+searched:
+
+=over
+
+=item extensions/C<$extension>/template/C<$language>/C<$project>
+
+=item extensions/C<$extension>/template/C<$language>/custom
+
+=item extensions/C<$extension>/template/C<$language>/default
+
+=item template/C<$language>/C<$project>
+
+=item template/C<$language>/custom
+
+=item template/C<$language>/default
+
+=back
+
+C<$project> has to do with installations that are using the C<$ENV{PROJECT}>
+variable to have different "views" on a single Bugzilla.
+
+The F<default> directory includes templates shipped with Bugzilla.
+
+The F<custom> directory is a directory for local installations to override
+the F<default> templates. Any individual template in F<custom> will
+override a template of the same name and path in F<default>.
+
+C<$language> is a language code, C<en> being the default language shipped
+with Bugzilla. Localizers ship other languages.
+
+C<$extension> is the name of any directory in the F<extensions/> directory.
+Each extension has its own directory.
+
+Note that languages are sorted by the user's preference (as specified
+in their browser, usually), and extensions are sorted alphabetically.
+
 =item C<vers_cmp>
 
 =over
index 8a3917c0238ee6a58d6bad61572cd8e805f0d473..6f91037201fd25400052e445baeccdf037b45377 100644 (file)
@@ -36,6 +36,7 @@ use strict;
 
 use Bugzilla::Constants;
 use Bugzilla::Install::Requirements;
+use Bugzilla::Install::Util qw(template_include_path);
 use Bugzilla::Util;
 use Bugzilla::User;
 use Bugzilla::Error;
@@ -78,113 +79,17 @@ sub _load_constants {
     return \%constants;
 }
 
-# Make an ordered list out of a HTTP Accept-Language header see RFC 2616, 14.4
-# We ignore '*' and <language-range>;q=0
-# For languages with the same priority q the order remains unchanged.
-sub sortAcceptLanguage {
-    sub sortQvalue { $b->{'qvalue'} <=> $a->{'qvalue'} }
-    my $accept_language = $_[0];
-
-    # clean up string.
-    $accept_language =~ s/[^A-Za-z;q=0-9\.\-,]//g;
-    my @qlanguages;
-    my @languages;
-    foreach(split /,/, $accept_language) {
-        if (m/([A-Za-z\-]+)(?:;q=(\d(?:\.\d+)))?/) {
-            my $lang   = $1;
-            my $qvalue = $2;
-            $qvalue = 1 if not defined $qvalue;
-            next if $qvalue == 0;
-            $qvalue = 1 if $qvalue > 1;
-            push(@qlanguages, {'qvalue' => $qvalue, 'language' => $lang});
-        }
-    }
-
-    return map($_->{'language'}, (sort sortQvalue @qlanguages));
-}
-
 # Returns the path to the templates based on the Accept-Language
 # settings of the user and of the available languages
 # If no Accept-Language is present it uses the defined default
 # Templates may also be found in the extensions/ tree
 sub getTemplateIncludePath {
-    my $lang = Bugzilla->request_cache->{'language'} || "";
-    # Return cached value if available
-
-    my $include_path = Bugzilla->request_cache->{"template_include_path_$lang"};
-    return $include_path if $include_path;
-
-    my $templatedir = bz_locations()->{'templatedir'};
-    my $project     = bz_locations()->{'project'};
-
-    my $languages = trim(Bugzilla->params->{'languages'});
-    if (not ($languages =~ /,/)) {
-       if ($project) {
-           $include_path = [
-               "$templatedir/$languages/$project",
-               "$templatedir/$languages/custom",
-               "$templatedir/$languages/default"
-           ];
-       } else {
-           $include_path = [
-               "$templatedir/$languages/custom",
-               "$templatedir/$languages/default"
-           ];
-       }
-    }
-    my @languages       = sortAcceptLanguage($languages);
-    # If $lang is specified, only consider this language.
-    my @accept_language = ($lang) || sortAcceptLanguage($ENV{'HTTP_ACCEPT_LANGUAGE'} || "");
-    my @usedlanguages;
-    foreach my $language (@accept_language) {
-        # Per RFC 1766 and RFC 2616 any language tag matches also its 
-        # primary tag. That is 'en' (accept language)  matches 'en-us',
-        # 'en-uk' etc. but not the otherway round. (This is unfortunately
-        # not very clearly stated in those RFC; see comment just over 14.5
-        # in http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4)
-        if(my @found = grep /^\Q$language\E(-.+)?$/i, @languages) {
-            push (@usedlanguages, @found);
-        }
-    }
-    push(@usedlanguages, Bugzilla->params->{'defaultlanguage'});
-    if ($project) {
-        $include_path = [
-           map((
-               "$templatedir/$_/$project",
-               "$templatedir/$_/custom",
-               "$templatedir/$_/default"
-               ), @usedlanguages
-            )
-        ];
-    } else {
-        $include_path = [
-           map((
-               "$templatedir/$_/custom",
-               "$templatedir/$_/default"
-               ), @usedlanguages
-            )
-        ];
-    }
-    
-    # add in extension template directories:
-    my @extensions = glob(bz_locations()->{'extensionsdir'} . "/*");
-    foreach my $extension (@extensions) {
-        trick_taint($extension); # since this comes right from the filesystem
-                                 # we have bigger issues if it is insecure
-        push(@$include_path,
-            map((
-                $extension."/template/".$_),
-               @usedlanguages));
-    }
-    
-    # remove duplicates since they keep popping up:
-    my @dirs;
-    foreach my $dir (@$include_path) {
-        push(@dirs, $dir) unless grep ($dir eq $_, @dirs);
-    }
-    Bugzilla->request_cache->{"template_include_path_$lang"} = \@dirs;
-    
-    return Bugzilla->request_cache->{"template_include_path_$lang"};
+    my $cache = Bugzilla->request_cache;
+    my $lang  = $cache->{'language'} || "";
+    $cache->{"template_include_path_$lang"} ||= template_include_path({
+        use_languages => trim(Bugzilla->params->{'languages'}),
+        only_language => $lang });
+    return $cache->{"template_include_path_$lang"};
 }
 
 sub get_format {
index 1ab062cca5e38dae91c540576b2155a359261ff4..8fbdcdb55972789e9f03fe5984c2aee9991e4f8d 100644 (file)
                "to be displayed. Note that you must install the appropriate " _
                "language pack before adding a language to this Param. The " _
                "language used is the one in this list with the highest " _
-               "q-value in the user's Accept-Language header.<br> " _
-               "Available languages: $available_languages" ,
+               "q-value in the user's Accept-Language header.<br><br> " _
 
-  defaultlanguage => "The UI language $terms.Bugzilla falls back on if no suitable " _
-                     "language is found in the user's Accept-Language header." }
-%]
+               "If the none of these languages are in the user's" _
+               " Accept-Language header, the first item in this list will be" _
+               " used. <br><br>" _
+
+               "Available languages: $available_languages"
+} %]