View | Details | Raw Unified | Return to bug 11848
Collapse All | Expand All

(-)a/C4/Auth.pm (-2 / +5 lines)
Lines 27-32 use CGI::Session; Link Here
27
require Exporter;
27
require Exporter;
28
use C4::Context;
28
use C4::Context;
29
use C4::Templates;    # to get the template
29
use C4::Templates;    # to get the template
30
use C4::Languages;
30
use C4::Branch; # GetBranches
31
use C4::Branch; # GetBranches
31
use C4::VirtualShelves;
32
use C4::VirtualShelves;
32
use Koha::AuthUtils qw(hash_password);
33
use Koha::AuthUtils qw(hash_password);
Lines 139-144 sub get_template_and_user { Link Here
139
    my $in       = shift;
140
    my $in       = shift;
140
    my ( $user, $cookie, $sessionID, $flags );
141
    my ( $user, $cookie, $sessionID, $flags );
141
142
143
    C4::Context->interface($in->{type});
144
142
    my $template = C4::Templates::gettemplate(
145
    my $template = C4::Templates::gettemplate(
143
        $in->{'template_name'},
146
        $in->{'template_name'},
144
        $in->{'type'},
147
        $in->{'type'},
Lines 470-478 sub get_template_and_user { Link Here
470
473
471
    # Check if we were asked using parameters to force a specific language
474
    # Check if we were asked using parameters to force a specific language
472
    if ( defined $in->{'query'}->param('language') ) {
475
    if ( defined $in->{'query'}->param('language') ) {
473
        # Extract the language, let C4::Templates::getlanguage choose
476
        # Extract the language, let C4::Languages::getlanguage choose
474
        # what to do
477
        # what to do
475
        my $language = C4::Templates::getlanguage($in->{'query'},$in->{'type'});
478
        my $language = C4::Languages::getlanguage($in->{'query'});
476
        my $languagecookie = C4::Templates::getlanguagecookie($in->{'query'},$language);
479
        my $languagecookie = C4::Templates::getlanguagecookie($in->{'query'},$language);
477
        if ( ref $cookie eq 'ARRAY' ) {
480
        if ( ref $cookie eq 'ARRAY' ) {
478
            push @{ $cookie }, $languagecookie;
481
            push @{ $cookie }, $languagecookie;
(-)a/C4/Context.pm (+11 lines)
Lines 1264-1269 sub IsSuperLibrarian { Link Here
1264
    return ($userenv->{flags}//0) % 2;
1264
    return ($userenv->{flags}//0) % 2;
1265
}
1265
}
1266
1266
1267
sub interface {
1268
    my ($class, $interface) = @_;
1269
1270
    if (defined $interface) {
1271
        $interface ||= 'opac';
1272
        $context->{interface} = $interface;
1273
    }
1274
1275
    return $context->{interface};
1276
}
1277
1267
1;
1278
1;
1268
__END__
1279
__END__
1269
1280
(-)a/C4/Languages.pm (-3 / +56 lines)
Lines 19-27 package C4::Languages; Link Here
19
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
20
21
21
22
use strict; 
22
use strict;
23
#use warnings; FIXME - Bug 2505
23
use warnings;
24
24
use Carp;
25
use Carp;
26
use CGI;
27
use List::MoreUtils qw( any );
25
use C4::Context;
28
use C4::Context;
26
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG);
29
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG);
27
30
Lines 45-51 BEGIN { Link Here
45
        &getTranslatedLanguages
48
        &getTranslatedLanguages
46
        &getAllLanguages
49
        &getAllLanguages
47
    );
50
    );
48
    @EXPORT_OK = qw(getFrameworkLanguages getTranslatedLanguages getAllLanguages get_bidi regex_lang_subtags language_get_description accept_language);
51
    @EXPORT_OK = qw(getFrameworkLanguages getTranslatedLanguages getAllLanguages get_bidi regex_lang_subtags language_get_description accept_language getlanguage);
49
    $DEBUG = 0;
52
    $DEBUG = 0;
50
}
53
}
51
54
Lines 530-535 sub accept_language { Link Here
530
    return $secondaryMatch if $secondaryMatch;
533
    return $secondaryMatch if $secondaryMatch;
531
    return undef;   # else, we got nothing.
534
    return undef;   # else, we got nothing.
532
}
535
}
536
537
=head2 getlanguage
538
539
    Select a language based on the URL parameter 'language', a cookie,
540
    syspref available languages & browser
541
542
=cut
543
544
sub getlanguage {
545
    my ($cgi) = @_;
546
547
    $cgi //= new CGI;
548
    my $interface = C4::Context->interface;
549
    my $language;
550
551
    my $preference_to_check =
552
      $interface eq 'intranet' ? 'language' : 'opaclanguages';
553
    # Get the available/valid languages list
554
    my @languages = split /,/, C4::Context->preference($preference_to_check);
555
556
    # Chose language from the URL
557
    $language = $cgi->param( 'language' );
558
    if ( defined $language && any { $_ eq $language } @languages) {
559
        return $language;
560
    }
561
562
    # cookie
563
    if ($language = $cgi->cookie('KohaOpacLanguage') ) {
564
        $language =~ s/[^a-zA-Z_-]*//; # sanitize cookie
565
    }
566
567
    # HTTP_ACCEPT_LANGUAGE
568
    if ( !$language && $ENV{HTTP_ACCEPT_LANGUAGE} ) {
569
        $language = accept_language( $ENV{HTTP_ACCEPT_LANGUAGE},
570
            getTranslatedLanguages( $interface, 'prog' ) );
571
    }
572
573
    # Ignore a lang not selected in sysprefs
574
    if ( $language && any { $_ eq $language } @languages ) {
575
        return $language;
576
    }
577
578
    # Pick the first selected syspref language
579
    $language = shift @languages;
580
    return $language if $language;
581
582
    # Fall back to English if necessary
583
    return 'en';
584
}
585
533
1;
586
1;
534
587
535
__END__
588
__END__
(-)a/C4/Templates.pm (-49 / +2 lines)
Lines 282-288 sub themelanguage { Link Here
282
    ($query) or warn "no query in themelanguage";
282
    ($query) or warn "no query in themelanguage";
283
283
284
    # Select a language based on cookie, syspref available languages & browser
284
    # Select a language based on cookie, syspref available languages & browser
285
    my $lang = getlanguage($query, $interface);
285
    my $lang = C4::Languages::getlanguage($query);
286
286
287
    # Select theme
287
    # Select theme
288
    my $is_intranet = $interface eq 'intranet';
288
    my $is_intranet = $interface eq 'intranet';
Lines 304-309 sub themelanguage { Link Here
304
304
305
sub setlanguagecookie {
305
sub setlanguagecookie {
306
    my ( $query, $language, $uri ) = @_;
306
    my ( $query, $language, $uri ) = @_;
307
307
    my $cookie = $query->cookie(
308
    my $cookie = $query->cookie(
308
        -name    => 'KohaOpacLanguage',
309
        -name    => 'KohaOpacLanguage',
309
        -value   => $language,
310
        -value   => $language,
Lines 336-387 sub getlanguagecookie { Link Here
336
    return $cookie;
337
    return $cookie;
337
}
338
}
338
339
339
=head2 getlanguage
340
341
    Select a language based on the URL parameter 'language', a cookie,
342
    syspref available languages & browser
343
344
=cut
345
346
sub getlanguage {
347
    my ($query, $interface) = @_;
348
349
    my $preference_to_check =
350
      $interface eq 'intranet' ? 'language' : 'opaclanguages';
351
    # Get the available/valid languages list
352
    my @languages = split /,/, C4::Context->preference($preference_to_check);
353
354
    my $lang;
355
356
    # Chose language from the URL
357
    $lang = $query->param( 'language' );
358
    if ( defined $lang && any { $_ eq $lang } @languages) {
359
        return $lang;
360
    }
361
362
    # cookie
363
    if ($query and $query->cookie('KohaOpacLanguage') ) {
364
        $lang = $query->cookie('KohaOpacLanguage');
365
        $lang =~ s/[^a-zA-Z_-]*//; # sanitize cookie
366
    }
367
368
    # HTTP_ACCEPT_LANGUAGE
369
    if ( !$lang && $ENV{HTTP_ACCEPT_LANGUAGE} ) {
370
        $lang = accept_language( $ENV{HTTP_ACCEPT_LANGUAGE},
371
            getTranslatedLanguages( $interface, 'prog' ) );
372
    }
373
374
    # Ignore a lang not selected in sysprefs
375
    if ( $lang && any { $_ eq $lang } @languages ) {
376
        return $lang;
377
    }
378
379
    # Pick the first selected syspref language
380
    $lang = shift @languages;
381
    return $lang if $lang;
382
383
    # Fall back to English if necessary
384
    return 'en';
385
}
386
387
1;
340
1;
(-)a/catalogue/search.pl (-1 / +3 lines)
Lines 160-166 use CGI qw('-no_undef_params'); Link Here
160
my $cgi = new CGI;
160
my $cgi = new CGI;
161
161
162
my ($template,$borrowernumber,$cookie);
162
my ($template,$borrowernumber,$cookie);
163
my $lang = C4::Templates::getlanguage($cgi, 'intranet');
164
# decide which template to use
163
# decide which template to use
165
my $template_name;
164
my $template_name;
166
my $template_type;
165
my $template_type;
Lines 181-186 else { Link Here
181
    flagsrequired   => { catalogue => 1 },
180
    flagsrequired   => { catalogue => 1 },
182
    }
181
    }
183
);
182
);
183
184
my $lang = C4::Languages::getlanguage($cgi);
185
184
if (C4::Context->preference("marcflavour") eq "UNIMARC" ) {
186
if (C4::Context->preference("marcflavour") eq "UNIMARC" ) {
185
    $template->param('UNIMARC' => 1);
187
    $template->param('UNIMARC' => 1);
186
}
188
}
(-)a/opac/opac-search.pl (-1 / +3 lines)
Lines 90-96 BEGIN { Link Here
90
}
90
}
91
91
92
my ($template,$borrowernumber,$cookie);
92
my ($template,$borrowernumber,$cookie);
93
my $lang = C4::Templates::getlanguage($cgi, 'opac');
94
# decide which template to use
93
# decide which template to use
95
my $template_name;
94
my $template_name;
96
my $template_type = 'basic';
95
my $template_type = 'basic';
Lines 120-125 else { Link Here
120
    authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ),
119
    authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ),
121
    }
120
    }
122
);
121
);
122
123
my $lang = C4::Languages::getlanguage($cgi);
124
123
if ($template_name eq 'opac-results.tmpl') {
125
if ($template_name eq 'opac-results.tmpl') {
124
   $template->param('COinSinOPACResults' => C4::Context->preference('COinSinOPACResults'));
126
   $template->param('COinSinOPACResults' => C4::Context->preference('COinSinOPACResults'));
125
}
127
}
(-)a/t/Templates.t (-5 / +5 lines)
Lines 1-6 Link Here
1
#!/usr/bin/perl
1
#!/usr/bin/perl
2
2
3
# Copyright 2013 Equinox Software, Inc.
3
# Copyright 2013 Equinox Software, Inc.
4
# Copyright 2014 BibLibre
4
#
5
#
5
# This file is part of Koha.
6
# This file is part of Koha.
6
#
7
#
Lines 22-28 use Test::MockModule; Link Here
22
use CGI;
23
use CGI;
23
24
24
BEGIN {
25
BEGIN {
25
    use_ok('C4::Templates');
26
    use_ok('C4::Languages');
26
}
27
}
27
28
28
my @languages = (); # stores the list of active languages
29
my @languages = (); # stores the list of active languages
Lines 41-51 $module_context->mock( Link Here
41
  },
42
  },
42
);
43
);
43
44
44
delete $ENV{TTTP_ACCEPT_LANGUAGE};
45
delete $ENV{HTTP_ACCEPT_LANGUAGE};
45
46
46
my $query = CGI->new();
47
my $query = CGI->new();
47
@languages = ('de-DE', 'fr-FR');
48
@languages = ('de-DE', 'fr-FR');
48
is(C4::Templates::getlanguage($query, 'opac'), 'de-DE', 'default to first language specified in syspref (bug 10560)');
49
is(C4::Languages::getlanguage($query), 'de-DE', 'default to first language specified in syspref (bug 10560)');
49
50
50
@languages = ();
51
@languages = ();
51
is(C4::Templates::getlanguage($query, 'opac'), 'en', 'default to English if no language specified in syspref (bug 10560)');
52
is(C4::Languages::getlanguage($query), 'en', 'default to English if no language specified in syspref (bug 10560)');
52
- 

Return to bug 11848