summaryrefslogtreecommitdiffstats
path: root/globals.pl
diff options
context:
space:
mode:
authorgerv%gerv.net <>2002-08-11 01:58:59 +0200
committergerv%gerv.net <>2002-08-11 01:58:59 +0200
commit8cadcb8c21498f7184879d1c2797ee531ea05c26 (patch)
tree5c6f66a32da57160b98513e9de1e052afd7d1503 /globals.pl
parenta52f0b4135b629b9651145ad51bc2791b7feaeac (diff)
downloadbugzilla-8cadcb8c21498f7184879d1c2797ee531ea05c26.tar.gz
bugzilla-8cadcb8c21498f7184879d1c2797ee531ea05c26.tar.xz
Bug 126955 - Bugzilla should support translated/localized templates. This patch uses ACCEPT_LANGUAGE to determine which template to use. Patch by burnus; r=gerv.
Diffstat (limited to 'globals.pl')
-rw-r--r--globals.pl50
1 files changed, 49 insertions, 1 deletions
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 <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) {
+ 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