diff options
Diffstat (limited to 'Bugzilla')
-rw-r--r-- | Bugzilla/Config/L10n.pm | 7 | ||||
-rw-r--r-- | Bugzilla/Install/Util.pm | 42 | ||||
-rw-r--r-- | Bugzilla/Template.pm | 109 |
3 files changed, 49 insertions, 109 deletions
diff --git a/Bugzilla/Config/L10n.pm b/Bugzilla/Config/L10n.pm index 957dce786..5a18e9d58 100644 --- a/Bugzilla/Config/L10n.pm +++ b/Bugzilla/Config/L10n.pm @@ -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; } diff --git a/Bugzilla/Install/Util.pm b/Bugzilla/Install/Util.pm index 82edefb3a..32860732b 100644 --- a/Bugzilla/Install/Util.pm +++ b/Bugzilla/Install/Util.pm @@ -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 diff --git a/Bugzilla/Template.pm b/Bugzilla/Template.pm index 8a3917c02..6f9103720 100644 --- a/Bugzilla/Template.pm +++ b/Bugzilla/Template.pm @@ -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 { |