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 1261-1266 sub IsSuperLibrarian { Link Here
1261
    return ($userenv->{flags}//0) % 2;
1261
    return ($userenv->{flags}//0) % 2;
1262
}
1262
}
1263
1263
1264
sub interface {
1265
    my ($class, $interface) = @_;
1266
1267
    if (defined $interface) {
1268
        $interface ||= 'opac';
1269
        $context->{interface} = $interface;
1270
    }
1271
1272
    return $context->{interface};
1273
}
1274
1264
1;
1275
1;
1265
__END__
1276
__END__
1266
1277
(-)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 46-52 BEGIN { Link Here
46
        &getLanguages
49
        &getLanguages
47
        &getAllLanguages
50
        &getAllLanguages
48
    );
51
    );
49
    @EXPORT_OK = qw(getFrameworkLanguages getTranslatedLanguages getAllLanguages getLanguages get_bidi regex_lang_subtags language_get_description accept_language);
52
    @EXPORT_OK = qw(getFrameworkLanguages getTranslatedLanguages getAllLanguages getLanguages get_bidi regex_lang_subtags language_get_description accept_language getlanguage);
50
    $DEBUG = 0;
53
    $DEBUG = 0;
51
}
54
}
52
55
Lines 552-557 sub accept_language { Link Here
552
    return $secondaryMatch if $secondaryMatch;
555
    return $secondaryMatch if $secondaryMatch;
553
    return undef;   # else, we got nothing.
556
    return undef;   # else, we got nothing.
554
}
557
}
558
559
=head2 getlanguage
560
561
    Select a language based on the URL parameter 'language', a cookie,
562
    syspref available languages & browser
563
564
=cut
565
566
sub getlanguage {
567
    my ($cgi) = @_;
568
569
    $cgi //= new CGI;
570
    my $interface = C4::Context->interface;
571
    my $language;
572
573
    my $preference_to_check =
574
      $interface eq 'intranet' ? 'language' : 'opaclanguages';
575
    # Get the available/valid languages list
576
    my @languages = split /,/, C4::Context->preference($preference_to_check);
577
578
    # Chose language from the URL
579
    $language = $cgi->param( 'language' );
580
    if ( defined $language && any { $_ eq $language } @languages) {
581
        return $language;
582
    }
583
584
    # cookie
585
    if ($language = $cgi->cookie('KohaOpacLanguage') ) {
586
        $language =~ s/[^a-zA-Z_-]*//; # sanitize cookie
587
    }
588
589
    # HTTP_ACCEPT_LANGUAGE
590
    if ( !$language && $ENV{HTTP_ACCEPT_LANGUAGE} ) {
591
        $language = accept_language( $ENV{HTTP_ACCEPT_LANGUAGE},
592
            getTranslatedLanguages( $interface, 'prog' ) );
593
    }
594
595
    # Ignore a lang not selected in sysprefs
596
    if ( $language && any { $_ eq $language } @languages ) {
597
        return $language;
598
    }
599
600
    # Pick the first selected syspref language
601
    $language = shift @languages;
602
    return $language if $language;
603
604
    # Fall back to English if necessary
605
    return 'en';
606
}
607
555
1;
608
1;
556
609
557
__END__
610
__END__
(-)a/C4/Templates.pm (-49 / +2 lines)
Lines 285-291 sub themelanguage { Link Here
285
    ($query) or warn "no query in themelanguage";
285
    ($query) or warn "no query in themelanguage";
286
286
287
    # Select a language based on cookie, syspref available languages & browser
287
    # Select a language based on cookie, syspref available languages & browser
288
    my $lang = getlanguage($query, $interface);
288
    my $lang = C4::Languages::getlanguage($query);
289
289
290
    # Select theme
290
    # Select theme
291
    my $is_intranet = $interface eq 'intranet';
291
    my $is_intranet = $interface eq 'intranet';
Lines 307-312 sub themelanguage { Link Here
307
307
308
sub setlanguagecookie {
308
sub setlanguagecookie {
309
    my ( $query, $language, $uri ) = @_;
309
    my ( $query, $language, $uri ) = @_;
310
310
    my $cookie = $query->cookie(
311
    my $cookie = $query->cookie(
311
        -name    => 'KohaOpacLanguage',
312
        -name    => 'KohaOpacLanguage',
312
        -value   => $language,
313
        -value   => $language,
Lines 339-390 sub getlanguagecookie { Link Here
339
    return $cookie;
340
    return $cookie;
340
}
341
}
341
342
342
=head2 getlanguage
343
344
    Select a language based on the URL parameter 'language', a cookie,
345
    syspref available languages & browser
346
347
=cut
348
349
sub getlanguage {
350
    my ($query, $interface) = @_;
351
352
    my $preference_to_check =
353
      $interface eq 'intranet' ? 'language' : 'opaclanguages';
354
    # Get the available/valid languages list
355
    my @languages = split /,/, C4::Context->preference($preference_to_check);
356
357
    my $lang;
358
359
    # Chose language from the URL
360
    $lang = $query->param( 'language' );
361
    if ( defined $lang && any { $_ eq $lang } @languages) {
362
        return $lang;
363
    }
364
365
    # cookie
366
    if ($query and $query->cookie('KohaOpacLanguage') ) {
367
        $lang = $query->cookie('KohaOpacLanguage');
368
        $lang =~ s/[^a-zA-Z_-]*//; # sanitize cookie
369
    }
370
371
    # HTTP_ACCEPT_LANGUAGE
372
    if ( !$lang && $ENV{HTTP_ACCEPT_LANGUAGE} ) {
373
        $lang = accept_language( $ENV{HTTP_ACCEPT_LANGUAGE},
374
            getTranslatedLanguages( $interface, 'prog' ) );
375
    }
376
377
    # Ignore a lang not selected in sysprefs
378
    if ( $lang && any { $_ eq $lang } @languages ) {
379
        return $lang;
380
    }
381
382
    # Pick the first selected syspref language
383
    $lang = shift @languages;
384
    return $lang if $lang;
385
386
    # Fall back to English if necessary
387
    return 'en';
388
}
389
390
1;
343
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