+
+=head2 getlanguage
+
+ Select a language based on the URL parameter 'language', a cookie,
+ syspref available languages & browser
+
+=cut
+
+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' );
+ my $language;
+
+ my $preference_to_check =
+ $interface eq 'intranet' ? 'language' : 'opaclanguages';
+ # Get the available/valid languages list
+ my @languages;
+ my $preference_value = C4::Context->preference($preference_to_check);
+ if ($preference_value) {
+ @languages = split /,/, $preference_value;
+ }
+
+ # Chose language from the URL
+ my $cgi_param_language = $cgi->param( 'language' );
+ if ( defined $cgi_param_language && any { $_ eq $cgi_param_language } @languages) {
+ $language = $cgi_param_language;
+ }
+
+ # 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
+ if ( !$language && $ENV{HTTP_ACCEPT_LANGUAGE} ) {
+ $language = accept_language( $ENV{HTTP_ACCEPT_LANGUAGE},
+ getTranslatedLanguages( $interface, $theme ) );
+ }
+
+ # Ignore a lang not selected in sysprefs
+ if ( $language && not any { $_ eq $language } @languages ) {
+ $language = undef;
+ }
+
+ # Pick the first selected syspref language
+ $language = shift @languages unless $language;
+
+ # Fall back to English if necessary
+ $language ||= 'en';
+
+ $memory_cache->set_in_cache( $cache_key, $language );
+ return $language;
+}
+