=cut
$VERSION = 3.00;
@ISA = qw(Exporter);
-@EXPORT_OK = qw(getFrameworkLanguages getTranslatedLanguages getAllLanguages get_bidi regex_lang_subtags language_get_description);
+@EXPORT_OK = qw(getFrameworkLanguages getTranslatedLanguages getAllLanguages get_bidi regex_lang_subtags language_get_description accept_language);
my $DEBUG = 0;
=head2 getFrameworkLanguages
return $bidi;
};
+sub accept_language {
+ # referenced http://search.cpan.org/src/CGILMORE/I18N-AcceptLanguage-1.04/lib/I18N/AcceptLanguage.pm
+ my ($clientPreferences,$supportedLanguages) = @_;
+ # There should be no whitespace anways, but a cleanliness/sanity check
+ $clientPreferences =~ s/\s//g;
+
+ # Prepare the list of client-acceptable languages
+ my @languages = ();
+ foreach my $tag (split(/,/, $clientPreferences)) {
+ my ($language, $quality) = split(/\;/, $tag);
+ $quality =~ s/^q=//i if $quality;
+ $quality = 1 unless $quality;
+ next if $quality <= 0;
+ # We want to force the wildcard to be last
+ $quality = 0 if ($language eq '*');
+ # Pushing lowercase language here saves processing later
+ push(@languages, { quality => $quality,
+ language => $language,
+ lclanguage => lc($language) });
+ }
+ # Prepare the list of server-supported languages
+ my %supportedLanguages = ();
+ my %secondaryLanguages = ();
+ foreach my $language (@$supportedLanguages) {
+ warn "SUP: ".$language->{language_code};
+ $supportedLanguages{lc($language->{language_code})} = $language->{language_code};
+ if ($language->{language_code} =~ /^([^-]+)-?/) {
+ $secondaryLanguages{lc($1)} = $language->{language_code};
+ }
+ }
+
+ # Reverse sort the list, making best quality at the front of the array
+ @languages = sort { $b->{quality} <=> $a->{quality} } @languages;
+ my $secondaryMatch = '';
+ foreach my $tag (@languages) {
+ if (exists($supportedLanguages{$tag->{lclanguage}})) {
+ # Client en-us eq server en-us
+ return $supportedLanguages{$tag->{language}} if exists($supportedLanguages{$tag->{language}});
+ return $supportedLanguages{$tag->{lclanguage}};
+ } elsif (exists($secondaryLanguages{$tag->{lclanguage}})) {
+ # Client en eq server en-us
+ return $secondaryLanguages{$tag->{language}} if exists($secondaryLanguages{$tag->{language}});
+ return $supportedLanguages{$tag->{lclanguage}};
+ } elsif ($tag->{lclanguage} =~ /^([^-]+)-/ && exists($secondaryLanguages{$1}) && $secondaryMatch eq '') {
+ # Client en-gb eq server en-us
+ $secondaryMatch = $secondaryLanguages{$1};
+ } elsif ($tag->{lclanguage} =~ /^([^-]+)-/ && exists($secondaryLanguages{$1}) && $secondaryMatch eq '') {
+ # Client en-us eq server en
+ $secondaryMatch = $supportedLanguages{$1};
+ } elsif ($tag->{lclanguage} eq '*') {
+ # * matches every language not already specified.
+ # It doesn't care which we pick, so let's pick the default,
+ # if available, then the first in the array.
+ #return $acceptor->defaultLanguage() if $acceptor->defaultLanguage();
+ return $supportedLanguages->[0];
+ }
+ }
+ # No primary matches. Secondary? (ie, en-us requested and en supported)
+ return $secondaryMatch if $secondaryMatch;
+}
1;
__END__
require Exporter;
use C4::Context;
-use C4::Languages qw(getTranslatedLanguages get_bidi regex_lang_subtags language_get_description);
+use C4::Languages qw(getTranslatedLanguages get_bidi regex_lang_subtags language_get_description accept_language );
use HTML::Template::Pro;
use vars qw($VERSION @ISA @EXPORT);
@ISA = qw(Exporter);
push @EXPORT, qw(
- &themelanguage &gettemplate setlanguagecookie pagination_bar
-);
-
-#Output
-push @EXPORT, qw(
- &output_html_with_http_headers
+ &themelanguage &gettemplate setlanguagecookie pagination_bar &output_html_with_http_headers
);
}
my $path = C4::Context->preference('intranet_includes') || 'includes';
- # warn "PATH : $path";
my ( $theme, $lang ) = themelanguage( $htdocs, $tmplbase, $interface, $query );
my $opacstylesheet = C4::Context->preference('opacstylesheet');
);
# Bidirectionality
- my $language_subtags_hashref = regex_lang_subtags($lang);
+ my $current_lang = regex_lang_subtags($lang);
my $bidi;
- $bidi = get_bidi($language_subtags_hashref->{script}) if $language_subtags_hashref->{script};
+ $bidi = get_bidi($current_lang->{script}) if $current_lang->{script};
# Languages
- my $current_lang = regex_lang_subtags($lang);
my @template_languages;
my $languages_loop = getTranslatedLanguages($interface,$theme);
+
for my $language_hashref (@$languages_loop) {
$language_hashref->{'current_lang'} = $current_lang->{'language'};
$language_hashref->{'native_description'} = language_get_description($language_hashref->{'language_code'},$language_hashref->{'language_code'},'language');
- warn "($language_hashref->{'language_code'},$language_hashref->{'current_lang'},$language_hashref->{'script_code'}";
+ #warn "($language_hashref->{'language_code'},$language_hashref->{'current_lang'},$language_hashref->{'script_code'}";
$language_hashref->{'locale_description'} = language_get_description($language_hashref->{'language_code'},$language_hashref->{'current_lang'},'language');
$language_hashref->{'language_description'} = language_get_description($language_hashref->{'language_code'},$language_hashref->{'current_lang'},'language');
$language_hashref->{'script_description'} = language_get_description($language_hashref->{'script_code'},$language_hashref->{'current_lang'},'script');
#---------------------------------------------------------------------------------------------------------
# FIXME - POD
sub themelanguage {
- my ( $htdocs, $tmpl, $section, $query ) = @_;
+ my ( $htdocs, $tmpl, $interface, $query ) = @_;
+
+ # Set some defaults for language and theme
+ # First, check the user's preferences
+ my $lang;
+ $lang = accept_language($ENV{HTTP_ACCEPT_LANGUAGE},getTranslatedLanguages($interface,'prog'));
- # if (!$query) {
- # warn "no query";
- # }
+ # But, if there's a cookie set, obey it
+ $lang = $query->cookie('KohaOpacLanguage') if $query->cookie('KohaOpacLanguage');
- # set some defaults for language and theme
- my $lang = $query->cookie('KohaOpacLanguage');
+ # Fall back to English
$lang = 'en' unless $lang;
my $theme = 'prog';
my $dbh = C4::Context->dbh;
my @languages;
my @themes;
- if ( $section eq "intranet" ) {
+ if ( $interface eq "intranet" ) {
@languages = split " ", C4::Context->preference("opaclanguages");
@themes = split " ", C4::Context->preference("template");
pop @languages, $lang if $lang;
foreach my $la (@languages) {
for ( my $pass = 1 ; $pass <= 2 ; $pass += 1 ) {
$la =~ s/([-_])/ $1 eq '-'? '_': '-' /eg if $pass == 2;
- if ( -e "$htdocs/$th/$la/modules/$tmpl" ) {
+ if ( -e "$htdocs/$th/$la/".($interface eq 'intranet'?"modules":"")."/$tmpl" ) {
$theme = $th;
$lang = $la;
last THEME;