From 8cadcb8c21498f7184879d1c2797ee531ea05c26 Mon Sep 17 00:00:00 2001 From: "gerv%gerv.net" <> Date: Sat, 10 Aug 2002 23:58:59 +0000 Subject: Bug 126955 - Bugzilla should support translated/localized templates. This patch uses ACCEPT_LANGUAGE to determine which template to use. Patch by burnus; r=gerv. --- globals.pl | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) (limited to 'globals.pl') diff --git a/globals.pl b/globals.pl index cdaf84512..6f7b22d38 100644 --- a/globals.pl +++ b/globals.pl @@ -1506,6 +1506,54 @@ sub trim { return $str; } +# Make an ordered list out of a HTTP Accept-Language header see RFC 2616, 14.4 +# We ignore '*' and ;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) { + my ($lang, $qvalue) = split /;q=/; + next if not defined $lang; + $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 +sub getTemplateIncludePath () { + my @languages = sortAcceptLanguage(Param('languages')); + my @accept_language = sortAcceptLanguage($ENV{'HTTP_ACCEPT_LANGUAGE'} || ""); + my @usedlanguages; + foreach my $lang (@accept_language) { + # match exactly (case insensitive) + if(my @found = grep /^$lang$/i, @languages) { + push (@usedlanguages, $found[0]); + } + # Per RFC 1766 and RFC 2616 any language tag matches also its + # primary tag. That is en-gb matches also en but not en-uk + $lang =~ s/(-.*)//; + if($1) { + if(my @found = grep /^$lang$/i, @languages) { + push (@usedlanguages, $found[0]); + } + } + } + push(@usedlanguages, Param('defaultlanguage')); + return join(':', map("template/$_/custom:template/$_/default",@usedlanguages)); +} + ############################################################################### # Global Templatization Code @@ -1523,7 +1571,7 @@ use Template; $::template ||= Template->new( { # Colon-separated list of directories containing templates. - INCLUDE_PATH => "template/en/custom:template/en/default" , + INCLUDE_PATH => getTemplateIncludePath() , # Remove white-space before template directives (PRE_CHOMP) and at the # beginning and end of templates and template blocks (TRIM) for better -- cgit v1.2.3-24-g4f1b