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);
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;
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.
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);
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) {
}
# 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
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' );
}
# 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
}
# 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;