Bug 11848: Move language detection function in C4::Languages
authorJulian Maurice <julian.maurice@biblibre.com>
Wed, 26 Feb 2014 12:20:37 +0000 (13:20 +0100)
committerGalen Charlton <gmc@esilibrary.com>
Mon, 5 May 2014 04:29:34 +0000 (04:29 +0000)
Also store interface (intranet, opac) in context to not have to pass it
as parameter.

Signed-off-by: Bernardo Gonzalez Kriegel <bgkriegel@gmail.com>
No koha-qa errors

Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
Comments on last patch.

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
C4/Auth.pm
C4/Context.pm
C4/Languages.pm
C4/Templates.pm
catalogue/search.pl
opac/opac-search.pl
t/Languages.t [new file with mode: 0644]
t/Templates.t [deleted file]

index 9deeb9b..f6d3b55 100644 (file)
@@ -27,6 +27,7 @@ use CGI::Session;
 require Exporter;
 use C4::Context;
 use C4::Templates;    # to get the template
+use C4::Languages;
 use C4::Branch; # GetBranches
 use C4::Search::History;
 use C4::VirtualShelves;
@@ -134,6 +135,8 @@ sub get_template_and_user {
     my $in       = shift;
     my ( $user, $cookie, $sessionID, $flags );
 
+    C4::Context->interface($in->{type});
+
     my $template = C4::Templates::gettemplate(
         $in->{'template_name'},
         $in->{'type'},
@@ -480,9 +483,9 @@ sub get_template_and_user {
 
     # Check if we were asked using parameters to force a specific language
     if ( defined $in->{'query'}->param('language') ) {
-        # Extract the language, let C4::Templates::getlanguage choose
+        # Extract the language, let C4::Languages::getlanguage choose
         # what to do
-        my $language = C4::Templates::getlanguage($in->{'query'},$in->{'type'});
+        my $language = C4::Languages::getlanguage($in->{'query'});
         my $languagecookie = C4::Templates::getlanguagecookie($in->{'query'},$language);
         if ( ref $cookie eq 'ARRAY' ) {
             push @{ $cookie }, $languagecookie;
index 71a0f8c..1bc70b2 100644 (file)
@@ -1261,6 +1261,17 @@ sub IsSuperLibrarian {
     return ($userenv->{flags}//0) % 2;
 }
 
+sub interface {
+    my ($class, $interface) = @_;
+
+    if (defined $interface) {
+        $interface ||= 'opac';
+        $context->{interface} = $interface;
+    }
+
+    return $context->{interface};
+}
+
 1;
 __END__
 
index 6e258cb..930db2b 100644 (file)
@@ -19,9 +19,12 @@ package C4::Languages;
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 
-use strict; 
-#use warnings; FIXME - Bug 2505
+use strict;
+use warnings;
+
 use Carp;
+use CGI;
+use List::MoreUtils qw( any );
 use C4::Context;
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG);
 
@@ -46,7 +49,7 @@ BEGIN {
         &getLanguages
         &getAllLanguages
     );
-    @EXPORT_OK = qw(getFrameworkLanguages getTranslatedLanguages getAllLanguages getLanguages get_bidi regex_lang_subtags language_get_description accept_language);
+    @EXPORT_OK = qw(getFrameworkLanguages getTranslatedLanguages getAllLanguages getLanguages get_bidi regex_lang_subtags language_get_description accept_language getlanguage);
     $DEBUG = 0;
 }
 
@@ -552,6 +555,56 @@ sub accept_language {
     return $secondaryMatch if $secondaryMatch;
     return undef;   # else, we got nothing.
 }
+
+=head2 getlanguage
+
+    Select a language based on the URL parameter 'language', a cookie,
+    syspref available languages & browser
+
+=cut
+
+sub getlanguage {
+    my ($cgi) = @_;
+
+    $cgi //= new CGI;
+    my $interface = C4::Context->interface;
+    my $language;
+
+    my $preference_to_check =
+      $interface eq 'intranet' ? 'language' : 'opaclanguages';
+    # Get the available/valid languages list
+    my @languages = split /,/, C4::Context->preference($preference_to_check);
+
+    # Chose language from the URL
+    $language = $cgi->param( 'language' );
+    if ( defined $language && any { $_ eq $language } @languages) {
+        return $language;
+    }
+
+    # cookie
+    if ($language = $cgi->cookie('KohaOpacLanguage') ) {
+        $language =~ s/[^a-zA-Z_-]*//; # sanitize cookie
+    }
+
+    # HTTP_ACCEPT_LANGUAGE
+    if ( !$language && $ENV{HTTP_ACCEPT_LANGUAGE} ) {
+        $language = accept_language( $ENV{HTTP_ACCEPT_LANGUAGE},
+            getTranslatedLanguages( $interface, 'prog' ) );
+    }
+
+    # Ignore a lang not selected in sysprefs
+    if ( $language && any { $_ eq $language } @languages ) {
+        return $language;
+    }
+
+    # Pick the first selected syspref language
+    $language = shift @languages;
+    return $language if $language;
+
+    # Fall back to English if necessary
+    return 'en';
+}
+
 1;
 
 __END__
index 0b49862..8d13a49 100644 (file)
@@ -285,7 +285,7 @@ sub themelanguage {
     ($query) or warn "no query in themelanguage";
 
     # Select a language based on cookie, syspref available languages & browser
-    my $lang = getlanguage($query, $interface);
+    my $lang = C4::Languages::getlanguage($query);
 
     # Select theme
     my $is_intranet = $interface eq 'intranet';
@@ -307,6 +307,7 @@ sub themelanguage {
 
 sub setlanguagecookie {
     my ( $query, $language, $uri ) = @_;
+
     my $cookie = $query->cookie(
         -name    => 'KohaOpacLanguage',
         -value   => $language,
@@ -339,52 +340,4 @@ sub getlanguagecookie {
     return $cookie;
 }
 
-=head2 getlanguage
-
-    Select a language based on the URL parameter 'language', a cookie,
-    syspref available languages & browser
-
-=cut
-
-sub getlanguage {
-    my ($query, $interface) = @_;
-
-    my $preference_to_check =
-      $interface eq 'intranet' ? 'language' : 'opaclanguages';
-    # Get the available/valid languages list
-    my @languages = split /,/, C4::Context->preference($preference_to_check);
-
-    my $lang;
-
-    # Chose language from the URL
-    $lang = $query->param( 'language' );
-    if ( defined $lang && any { $_ eq $lang } @languages) {
-        return $lang;
-    }
-
-    # cookie
-    if ($query and $query->cookie('KohaOpacLanguage') ) {
-        $lang = $query->cookie('KohaOpacLanguage');
-        $lang =~ s/[^a-zA-Z_-]*//; # sanitize cookie
-    }
-
-    # HTTP_ACCEPT_LANGUAGE
-    if ( !$lang && $ENV{HTTP_ACCEPT_LANGUAGE} ) {
-        $lang = accept_language( $ENV{HTTP_ACCEPT_LANGUAGE},
-            getTranslatedLanguages( $interface, 'prog' ) );
-    }
-
-    # Ignore a lang not selected in sysprefs
-    if ( $lang && any { $_ eq $lang } @languages ) {
-        return $lang;
-    }
-
-    # Pick the first selected syspref language
-    $lang = shift @languages;
-    return $lang if $lang;
-
-    # Fall back to English if necessary
-    return 'en';
-}
-
 1;
index 29f5c83..cda5dad 100755 (executable)
@@ -160,7 +160,7 @@ my $DisplayMultiPlaceHold = C4::Context->preference("DisplayMultiPlaceHold");
 use CGI qw('-no_undef_params');
 my $cgi = new CGI;
 
-my $lang = C4::Templates::getlanguage($cgi, 'intranet');
+my ($template,$borrowernumber,$cookie);
 # decide which template to use
 my $template_name;
 my $template_type;
@@ -181,6 +181,9 @@ my ($template, $borrowernumber, $cookie) = get_template_and_user({
     flagsrequired   => { catalogue => 1 },
     }
 );
+
+my $lang = C4::Languages::getlanguage($cgi);
+
 if (C4::Context->preference("marcflavour") eq "UNIMARC" ) {
     $template->param('UNIMARC' => 1);
 }
index 00590c2..8e46005 100755 (executable)
@@ -91,7 +91,6 @@ BEGIN {
 }
 
 my ($template,$borrowernumber,$cookie);
-my $lang = C4::Templates::getlanguage($cgi, 'opac');
 # decide which template to use
 my $template_name;
 my $template_type = 'basic';
@@ -121,6 +120,9 @@ else {
     authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ),
     }
 );
+
+my $lang = C4::Languages::getlanguage($cgi);
+
 if ($template_name eq 'opac-results.tmpl') {
    $template->param('COinSinOPACResults' => C4::Context->preference('COinSinOPACResults'));
 }
diff --git a/t/Languages.t b/t/Languages.t
new file mode 100644 (file)
index 0000000..9cafbd7
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/perl
+
+# Copyright 2013 Equinox Software, Inc.
+# Copyright 2014 BibLibre
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 3 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with Koha; if not, see <http://www.gnu.org/licenses>.
+
+use Modern::Perl;
+use Test::More tests => 3;
+use Test::MockModule;
+use CGI;
+
+BEGIN {
+    use_ok('C4::Languages');
+}
+
+my @languages = (); # stores the list of active languages
+                    # for the syspref mock
+
+my $module_context = new Test::MockModule('C4::Context');
+
+$module_context->mock(
+    preference => sub {
+        my ($self, $pref) = @_;
+        if ($pref =~ /language/) {
+            return join ',', @languages;
+        } else {
+            return 'XXX';
+        }
+  },
+);
+
+delete $ENV{HTTP_ACCEPT_LANGUAGE};
+
+my $query = CGI->new();
+@languages = ('de-DE', 'fr-FR');
+is(C4::Languages::getlanguage($query), 'de-DE', 'default to first language specified in syspref (bug 10560)');
+
+@languages = ();
+is(C4::Languages::getlanguage($query), 'en', 'default to English if no language specified in syspref (bug 10560)');
diff --git a/t/Templates.t b/t/Templates.t
deleted file mode 100644 (file)
index 9343b38..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/perl
-
-# Copyright 2013 Equinox Software, Inc.
-#
-# This file is part of Koha.
-#
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with Koha; if not, see <http://www.gnu.org/licenses>.
-
-use Modern::Perl;
-use Test::More tests => 3;
-use Test::MockModule;
-use CGI;
-
-BEGIN {
-    use_ok('C4::Templates');
-}
-
-my @languages = (); # stores the list of active languages
-                    # for the syspref mock
-
-my $module_context = new Test::MockModule('C4::Context');
-
-$module_context->mock(
-    preference => sub {
-        my ($self, $pref) = @_;
-        if ($pref =~ /language/) {
-            return join ',', @languages;
-        } else {
-            return 'XXX';
-        }
-  },
-);
-
-delete $ENV{TTTP_ACCEPT_LANGUAGE};
-
-my $query = CGI->new();
-@languages = ('de-DE', 'fr-FR');
-is(C4::Templates::getlanguage($query, 'opac'), 'de-DE', 'default to first language specified in syspref (bug 10560)');
-
-@languages = ();
-is(C4::Templates::getlanguage($query, 'opac'), 'en', 'default to English if no language specified in syspref (bug 10560)');