Bug 22789: Set non_priority column as boolean in schema
[koha-ffzg.git] / C4 / Languages.pm
index affe96c..6aa1201 100644 (file)
@@ -26,19 +26,10 @@ use Carp;
 use CGI;
 use List::MoreUtils qw( any );
 use C4::Context;
+use Koha::Caches;
+use Koha::Cache::Memory::Lite;
 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG);
 
-eval {
-    if (C4::Context->ismemcached) {
-        require Memoize::Memcached;
-        import Memoize::Memcached qw(memoize_memcached);
-
-        memoize_memcached('getTranslatedLanguages', memcached => C4::Context->memcached);
-        memoize_memcached('getFrameworkLanguages' , memcached => C4::Context->memcached);
-        memoize_memcached('getAllLanguages',        memcached => C4::Context->memcached);
-    }
-};
-
 BEGIN {
     require Exporter;
     @ISA    = qw(Exporter);
@@ -121,44 +112,41 @@ Returns a reference to an array of hashes:
 
 sub getTranslatedLanguages {
     my ($interface, $theme, $current_language, $which) = @_;
-    my $htdocs;
     my @languages;
-    my @enabled_languages;
+    my @enabled_languages =
+      ( $interface && $interface eq 'intranet' )
+      ? split ",", C4::Context->preference('language')
+      : split ",", C4::Context->preference('opaclanguages');
+
+    my $cache = Koha::Caches->get_instance;
+    my $cache_key = "languages_${interface}_${theme}";
     if ($interface && $interface eq 'opac' ) {
-        @enabled_languages = split ",", C4::Context->preference('opaclanguages');
-        $htdocs = C4::Context->config('opachtdocs');
-        if ( $theme and -d "$htdocs/$theme" ) {
-            (@languages) = _get_language_dirs($htdocs,$theme);
-        }
-        else {
-            for my $theme ( _get_themes('opac') ) {
-                push @languages, _get_language_dirs($htdocs,$theme);
-            }
+        my $htdocs = C4::Context->config('opachtdocs');
+        my $cached = $cache->get_from_cache($cache_key);
+        if ( $cached ) {
+            @languages = @{$cached};
+        } else {
+            @languages = _get_opac_language_dirs( $htdocs, $theme );
+            $cache->set_in_cache($cache_key, \@languages );
         }
     }
     elsif ($interface && $interface eq 'intranet' ) {
-        @enabled_languages = split ",", C4::Context->preference('language');
-        $htdocs = C4::Context->config('intrahtdocs');
-        if ( $theme and -d "$htdocs/$theme" ) {
-            @languages = _get_language_dirs($htdocs,$theme);
-        }
-        else {
-            foreach my $theme ( _get_themes('intranet') ) {
-                push @languages, _get_language_dirs($htdocs,$theme);
-            }
+        my $htdocs = C4::Context->config('intrahtdocs');
+        my $cached = $cache->get_from_cache($cache_key);
+        if ( $cached ) {
+            @languages = @{$cached};
+        } else {
+            @languages = _get_intranet_language_dirs( $htdocs, $theme );
+            $cache->set_in_cache($cache_key, \@languages );
         }
     }
     else {
-        @enabled_languages = split ",", C4::Context->preference('opaclanguages');
         my $htdocs = C4::Context->config('intrahtdocs');
-        foreach my $theme ( _get_themes('intranet') ) {
-            push @languages, _get_language_dirs($htdocs,$theme);
-        }
+        push @languages, _get_intranet_language_dirs( $htdocs );
+
         $htdocs = C4::Context->config('opachtdocs');
-        foreach my $theme ( _get_themes('opac') ) {
-            push @languages, _get_language_dirs($htdocs,$theme);
-        }
+        push @languages, _get_opac_language_dirs( $htdocs );
+
         my %seen;
         $seen{$_}++ for @languages;
         @languages = keys %seen;
@@ -256,6 +244,37 @@ sub getLanguages {
     return \@languages_loop;
 }
 
+sub _get_opac_language_dirs {
+    my ( $htdocs, $theme ) = @_;
+
+    my @languages;
+    if ( $theme and -d "$htdocs/$theme" ) {
+        (@languages) = _get_language_dirs($htdocs,$theme);
+    }
+    else {
+        for my $theme ( _get_themes('opac') ) {
+            push @languages, _get_language_dirs($htdocs,$theme);
+        }
+    }
+    return @languages;
+}
+
+
+sub _get_intranet_language_dirs {
+    my ( $htdocs, $theme ) = @_;
+
+    my @languages;
+    if ( $theme and -d "$htdocs/$theme" ) {
+        @languages = _get_language_dirs($htdocs,$theme);
+    }
+    else {
+        foreach my $theme ( _get_themes('intranet') ) {
+            push @languages, _get_language_dirs($htdocs,$theme);
+        }
+    }
+    return @languages;
+}
+
 =head2 _get_themes
 
 Internal function, returns an array of all available themes.
@@ -325,8 +344,6 @@ sub _build_languages_arrayref {
         my @languages_loop; # the final reference to an array of hashrefs
         my @enabled_languages = @$enabled_languages;
         # how many languages are enabled, if one, take note, some contexts won't need to display it
-        my %seen_languages; # the language tags we've seen
-        my %found_languages;
         my $language_groups;
         my $track_language_groups;
         my $current_language_regex = regex_lang_subtags($current_language);
@@ -352,8 +369,18 @@ sub _build_languages_arrayref {
             push ( @{ $language_groups->{$language_subtags_hashref->{language}} }, $language_subtags_hashref );
         }
         # $key is a language subtag like 'en'
-        while( my ($key, $value) = each %$language_groups) {
 
+        my %idx = map { $enabled_languages->[$_] => $_ } reverse 0 .. @$enabled_languages-1;
+        my @ordered_keys = sort {
+            my $aa = $language_groups->{$a}->[0]->{rfc4646_subtag};
+            my $bb = $language_groups->{$b}->[0]->{rfc4646_subtag};
+            ( exists $idx{$aa} and exists $idx{$bb} and ( $idx{$aa} cmp $idx{$bb} ) )
+            || ( exists $idx{$aa} and exists $idx{$bb} )
+            || exists $idx{$bb}
+        } keys %$language_groups;
+
+        for my $key ( @ordered_keys ) {
+            my $value = $language_groups->{$key};
             # is this language group enabled? are any of the languages within it enabled?
             my $enabled;
             for my $enabled_language (@enabled_languages) {
@@ -556,7 +583,7 @@ sub accept_language {
     }
     # No primary matches. Secondary? (ie, en-us requested and en supported)
     return $secondaryMatch if $secondaryMatch;
-    return undef;   # else, we got nothing.
+    return;   # else, we got nothing.
 }
 
 =head2 getlanguage
@@ -569,6 +596,13 @@ sub accept_language {
 sub getlanguage {
     my ($cgi) = @_;
 
+    my $memory_cache = Koha::Cache::Memory::Lite->get_instance();
+    my $cache_key = "getlanguage";
+    unless ( $cgi and $cgi->param('language') ) {
+        my $cached = $memory_cache->get_from_cache($cache_key);
+        return $cached if $cached;
+    }
+
     $cgi //= new CGI;
     my $interface = C4::Context->interface;
     my $theme = C4::Context->preference( ( $interface eq 'opac' ) ? 'opacthemes' : 'template' );
@@ -584,14 +618,14 @@ sub getlanguage {
     }
 
     # Chose language from the URL
-    $language = $cgi->param( 'language' );
-    if ( defined $language && any { $_ eq $language } @languages) {
-        return $language;
+    my $cgi_param_language = $cgi->param( 'language' );
+    if ( defined $cgi_param_language && any { $_ eq $cgi_param_language } @languages) {
+        $language = $cgi_param_language;
     }
 
     # cookie
-    if ($language = $cgi->cookie('KohaOpacLanguage') ) {
-        $language =~ s/[^a-zA-Z_-]*//; # sanitize cookie
+    if (not $language and my $cgi_cookie_language = $cgi->cookie('KohaOpacLanguage') ) {
+        ( $language = $cgi_cookie_language ) =~ s/[^a-zA-Z_-]*//; # sanitize cookie
     }
 
     # HTTP_ACCEPT_LANGUAGE
@@ -601,16 +635,36 @@ sub getlanguage {
     }
 
     # Ignore a lang not selected in sysprefs
-    if ( $language && any { $_ eq $language } @languages ) {
-        return $language;
+    if ( $language && not any { $_ eq $language } @languages ) {
+        $language = undef;
     }
 
     # Pick the first selected syspref language
-    $language = shift @languages;
-    return $language if $language;
+    $language = shift @languages unless $language;
 
     # Fall back to English if necessary
-    return 'en';
+    $language ||= 'en';
+
+    $memory_cache->set_in_cache( $cache_key, $language );
+    return $language;
+}
+
+=head2 get_rfc4646_from_iso639
+
+    Select a language rfc4646 code given an iso639 code
+
+=cut
+
+sub get_rfc4646_from_iso639 {
+
+    my $iso_code = shift;
+    my $rfc_subtag = Koha::Database->new()->schema->resultset('LanguageRfc4646ToIso639')->find({iso639_2_code=>$iso_code});
+    if ( $rfc_subtag ) {
+        return $rfc_subtag->rfc4646_subtag;
+    } else {
+        return;
+    }
+
 }
 
 1;