diff options
author | mkanat%bugzilla.org <> | 2009-11-18 08:06:45 +0100 |
---|---|---|
committer | mkanat%bugzilla.org <> | 2009-11-18 08:06:45 +0100 |
commit | 3606f75dd1d18e5a3419c0b679ba3288fd203cf5 (patch) | |
tree | 9d8c75d71cceb60d11eb7df1db27aacb293d6dae | |
parent | a44e152480c9c22ca9b3a89da774317c5590d21b (diff) | |
download | bugzilla-3606f75dd1d18e5a3419c0b679ba3288fd203cf5.tar.gz bugzilla-3606f75dd1d18e5a3419c0b679ba3288fd203cf5.tar.xz |
Bug 421265: Let the user easily override the language used to display HTML pages
Patch by Jacques Supcik <jacques@supcik.org> r=mkanat, a=mkanat
-rw-r--r-- | Bugzilla/Install/Util.pm | 35 | ||||
-rw-r--r-- | Bugzilla/Template.pm | 8 | ||||
-rw-r--r-- | js/global.js | 9 | ||||
-rw-r--r-- | skins/standard/global.css | 12 | ||||
-rw-r--r-- | template/en/default/bug/create/create.html.tmpl | 2 | ||||
-rw-r--r-- | template/en/default/global/header.html.tmpl | 34 |
6 files changed, 94 insertions, 6 deletions
diff --git a/Bugzilla/Install/Util.pm b/Bugzilla/Install/Util.pm index e53164d25..effb39ee8 100644 --- a/Bugzilla/Install/Util.pm +++ b/Bugzilla/Install/Util.pm @@ -127,15 +127,28 @@ sub install_string { } sub include_languages { + # If we are in CGI mode (not in checksetup.pl) and if the function has + # been called without any parameter, then we cache the result of this + # function in Bugzilla->request_cache. This is done to improve the + # performance of the template processing. + my $to_be_cached = 0; + if (exists $ENV{'SERVER_SOFTWARE'} and not @_) { + my $cache = Bugzilla->request_cache; + if (exists $cache->{include_languages}) { + return @{$cache->{include_languages}} + } + $to_be_cached = 1; + } my ($params) = @_; $params ||= {}; # Basically, the way this works is that we have a list of languages # that we *want*, and a list of languages that Bugzilla actually # supports. The caller tells us what languages they want, by setting - # $ENV{HTTP_ACCEPT_LANGUAGE} or $params->{only_language}. The languages - # we support are those specified in $params->{use_languages}. Otherwise - # we support every language installed in the template/ directory. + # $ENV{HTTP_ACCEPT_LANGUAGE}, using the "LANG" cookie or setting + # $params->{only_language}. The languages we support are those + # specified in $params->{use_languages}. Otherwise we support every + # language installed in the template/ directory. my @wanted; if ($params->{only_language}) { @@ -143,6 +156,15 @@ sub include_languages { } else { @wanted = _sort_accept_language($ENV{'HTTP_ACCEPT_LANGUAGE'} || ''); + # Don't use the cookie if we are in "checksetup.pl". The test + # with $ENV{'SERVER_SOFTWARE'} is the same as in + # Bugzilla:Util::i_am_cgi. + if (exists $ENV{'SERVER_SOFTWARE'}) { + my $cgi = Bugzilla->cgi; + if (defined (my $lang = $cgi->cookie('LANG'))) { + unshift @wanted, $lang; + } + } } my @supported; @@ -175,6 +197,13 @@ sub include_languages { push(@usedlanguages, 'en'); } + # Cache the result if we are in CGI mode and called without parameter + # (see the comment at the top of this function). + if ($to_be_cached) { + my $cache = Bugzilla->request_cache; + $cache->{include_languages} = \@usedlanguages; + } + return @usedlanguages; } diff --git a/Bugzilla/Template.pm b/Bugzilla/Template.pm index fa7247243..ba0a035bb 100644 --- a/Bugzilla/Template.pm +++ b/Bugzilla/Template.pm @@ -729,6 +729,14 @@ sub create { # Currently logged in user, if any # If an sudo session is in progress, this is the user we're faking 'user' => sub { return Bugzilla->user; }, + + # Currenly active language + # XXX Eventually this should probably be replaced with something + # like Bugzilla->language. + 'current_language' => sub { + my ($language) = include_languages(); + return $language; + }, # If an sudo session is in progress, this is the user who # started the session. diff --git a/js/global.js b/js/global.js index 77e40d4c8..2d3974150 100644 --- a/js/global.js +++ b/js/global.js @@ -110,3 +110,12 @@ function check_mini_login_fields( suffix ) { window.alert( mini_login_constants.warning ); return false; } + +function set_language( value ) { + YAHOO.util.Cookie.set('LANG', value, + { + expires: new Date('January 1, 2038'), + path: BUGZILLA.param.cookie_path + }); + window.location.reload() +} diff --git a/skins/standard/global.css b/skins/standard/global.css index 64c73c3d5..8eb7cc3b1 100644 --- a/skins/standard/global.css +++ b/skins/standard/global.css @@ -61,6 +61,18 @@ padding: 0.5em; } + #lang_links_container { + float: right; + } + #lang_links_container .links { + border: none; + padding: .5em; + } + + .lang_current { + font-weight: bold; + } + #message { border: 1px solid red; margin: 0.3em 0em; diff --git a/template/en/default/bug/create/create.html.tmpl b/template/en/default/bug/create/create.html.tmpl index f466f7704..21f7959a2 100644 --- a/template/en/default/bug/create/create.html.tmpl +++ b/template/en/default/bug/create/create.html.tmpl @@ -33,7 +33,7 @@ style_urls = [ 'skins/standard/create_attachment.css', 'skins/standard/yui/calendar.css' ] javascript_urls = [ "js/attachment.js", "js/util.js", "js/yui/calendar.js", - "js/field.js", "js/yui/cookie.js", "js/TUI.js" ] + "js/field.js", "js/TUI.js" ] onload = 'set_assign_to();' %] diff --git a/template/en/default/global/header.html.tmpl b/template/en/default/global/header.html.tmpl index f8044976d..904a89d45 100644 --- a/template/en/default/global/header.html.tmpl +++ b/template/en/default/global/header.html.tmpl @@ -191,6 +191,7 @@ <![endif]--> <script src="js/yui/yahoo-dom-event.js" type="text/javascript"></script> + <script src="js/yui/cookie.js" type="text/javascript"></script> <script src="js/global.js" type="text/javascript"></script> <script type="text/javascript"> <!-- @@ -199,6 +200,18 @@ YAHOO.util.Event._simpleRemove(window, "unload", YAHOO.util.Event._unload); } + [%# The language selector needs javascript to set its cookie, + # so it is hidden in HTML/CSS by the "bz_default_hidden" class. + # If the browser can run javascript, it will then "unhide" + # the language selector using the following code. + #%] + function unhide_language_selector() { + YAHOO.util.Dom.removeClass( + 'lang_links_container', 'bz_default_hidden' + ); + } + YAHOO.util.Event.onDOMReady(unhide_language_selector); + [%# Make some Bugzilla information available to all scripts. # We don't import every parameter and constant because we # don't want to add a lot of uncached JS to every page. @@ -278,9 +291,26 @@ </tr> </table> -[% PROCESS "global/common-links.html.tmpl" qs_suffix = "_top" %] +<table id="lang_links_container" cellpadding="0" cellspacing="0" + class="bz_default_hidden"><tr><td> +[% IF Bugzilla.languages.size > 1 %] + <ul class="links"> + [% FOREACH lang = Bugzilla.languages.sort %] + <li>[% IF NOT loop.first %]<span class="separator"> | </span>[% END %] + [% IF lang == current_language %] + <span class="lang_current">[% lang FILTER html FILTER upper %]</span> + [% ELSE %] + <a href="#" onclick="set_language('[% lang FILTER none %]');"> + [%- lang FILTER html FILTER upper %]</a> + [% END %] + </li> + [% END %] + </ul> +[% END %] +</td></tr></table> -</div> +[% PROCESS "global/common-links.html.tmpl" qs_suffix = "_top" %] +</div> [%# header %] <div id="bugzilla-body"> |