summaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--defparams.pl10
-rw-r--r--globals.pl50
2 files changed, 59 insertions, 1 deletions
diff --git a/defparams.pl b/defparams.pl
index 45e67d532..3e3fd441d 100644
--- a/defparams.pl
+++ b/defparams.pl
@@ -139,6 +139,16 @@ sub check_urlbase {
return "";
}
+DefParam("languages",
+ "A comma-separated list of RFC 1766 language tags. These identify the languages in which you wish Bugzilla output 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.",
+ "t",
+ "en");
+
+DefParam("defaultlanguage",
+ "The UI language Bugzilla falls back on if no suitable language is found in the user's Accept-Language header.",
+ "t",
+ "en");
+
DefParam("cookiepath",
"Directory path under your document root that holds your Bugzilla installation. Make sure to begin with a /.",
"t",
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