Bug 7282 - invalid language selection

- ensure that without cookie, language selection is based on browser
  preferences
- refactor function to obtain langugage for stem in search (opac + intranet)

Signed-off-by: Frédéric Demians <f.demians@tamil.fr>

To reproduce the bug:

- Activate en and fr-FR for OPAC
- Clear your browser cookies
- Select your language preference in your browser: fr, fr-fr, en
- Load OPAC main page
- OPAC is displayed in English, rather than French as asked by browser
  preferences

  Apply the patch and test:

  - Clear your browser cookies
  - Load OPAC main page
  - Pages are displayed in French

Signed-off-by: Paul Poulain <paul.poulain@biblibre.com>
This commit is contained in:
Frère Sébastien Marie 2011-12-01 19:02:11 +01:00 committed by Paul Poulain
parent 8a87f15605
commit 0ad7e76cb7
3 changed files with 33 additions and 24 deletions

View file

@ -273,21 +273,10 @@ sub themelanguage {
($query) or warn "no query in themelanguage";
# Select a language based on cookie, syspref available languages & browser
my $is_intranet = $interface eq 'intranet';
my @languages = split(",", C4::Context->preference(
$is_intranet ? 'language' : 'opaclanguages'));
my $lang;
$lang = getlanguagecookie($query);
unless ($lang) {
my $http_accept_language = $ENV{ HTTP_ACCEPT_LANGUAGE };
$lang = accept_language( $http_accept_language,
getTranslatedLanguages($interface,'prog') );
}
# Ignore a lang not selected in sysprefs
$lang = undef unless first { $_ eq $lang } @languages;
# Fall back to English if necessary
$lang = 'en' unless $lang;
my $lang = getlanguage($query, $interface);
# Select theme
my $is_intranet = $interface eq 'intranet';
my @themes = split(" ", C4::Context->preference(
$is_intranet ? "template" : "opacthemes" ));
push @themes, 'prog';
@ -317,16 +306,36 @@ sub setlanguagecookie {
);
}
sub getlanguagecookie {
my ($query) = @_;
sub getlanguage {
my ($query, $interface) = @_;
# Select a language based on cookie, syspref available languages & browser
my $is_intranet = $interface eq 'intranet';
my @languages = split(",", C4::Context->preference(
$is_intranet ? 'language' : 'opaclanguages'));
my $lang;
if ($query->cookie('KohaOpacLanguage')){
$lang = $query->cookie('KohaOpacLanguage') ;
}else{
$lang = $ENV{HTTP_ACCEPT_LANGUAGE};
# cookie
if ( $query->cookie('KohaOpacLanguage') ) {
$lang = $query->cookie('KohaOpacLanguage');
$lang =~ s/[^a-zA-Z_-]*//; # sanitize cookie
}
$lang =~ s/[^a-zA-Z_-]*//; #sanitzie
# HTTP_ACCEPT_LANGUAGE
unless ($lang) {
my $http_accept_language = $ENV{ HTTP_ACCEPT_LANGUAGE };
$lang = accept_language( $http_accept_language,
getTranslatedLanguages($interface,'prog') );
}
# Ignore a lang not selected in sysprefs
$lang = undef unless first { $_ eq $lang } @languages;
# Fall back to English if necessary
$lang = 'en' unless $lang;
return $lang;
}

View file

@ -471,7 +471,7 @@ my ( $error,$query,$simple_query,$query_cgi,$query_desc,$limit,$limit_cgi,$limit
my @results;
## I. BUILD THE QUERY
my $lang = C4::Templates::getlanguagecookie($cgi);
my $lang = C4::Templates::getlanguage($cgi, 'intranet');
( $error,$query,$simple_query,$query_cgi,$query_desc,$limit,$limit_cgi,$limit_desc,$stopwords_removed,$query_type) = buildQuery(\@operators,\@operands,\@indexes,\@limits,\@sort_by,$scan,$lang);
## parse the query_cgi string and put it into a form suitable for <input>s

View file

@ -388,7 +388,7 @@ my ($error,$query,$simple_query,$query_cgi,$query_desc,$limit,$limit_cgi,$limit_
my @results;
## I. BUILD THE QUERY
my $lang = C4::Templates::getlanguagecookie($cgi);
my $lang = C4::Templates::getlanguage($cgi, 'opac');
( $error,$query,$simple_query,$query_cgi,$query_desc,$limit,$limit_cgi,$limit_desc,$stopwords_removed,$query_type) = buildQuery(\@operators,\@operands,\@indexes,\@limits,\@sort_by, 0, $lang);
sub _input_cgi_parse ($) {