=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
push @languages, {
'language_code'=>$dirname,
'language_description'=>$language_set->{language_description},
- 'language_native_descrition'=>$language_set->{language_native_description} }
+ 'native_descrition'=>$language_set->{language_native_description} }
}
}
}
unless ($seen_languages{$language}) {
for my $language_code (@$all_languages) {
if ($language_subtags_hashref->{language} eq $language_code->{'subtag'}) {
- $language_code->{'language'} = $language;
- $language_code->{'language_script'} = $language_subtags_hashref->{'script'};
- $language_code->{'language_region'} = $language_subtags_hashref->{'region'};
- $language_code->{'language_variant'} = $language_subtags_hashref->{'variant'};
+ $language_code->{'language_lang'} = $language;
+ $language_code->{'language_code'} = $language_subtags_hashref->{'language'};
+ $language_code->{'script_code'} = $language_subtags_hashref->{'script'};
+ $language_code->{'region_code'} = $language_subtags_hashref->{'region'};
+ $language_code->{'variant_code'} = $language_subtags_hashref->{'variant'};
push @final_languages, $language_code;
$found_languages{$language}++;
}
# Handle languages not in our database with their code
unless ($found_languages{$language}) {
my $language_code;
- $language_code->{'language'} = $language;
+ $language_code->{'language_lang'} = $language;
$language_code->{'language_code'} = $language;
push @final_languages, $language_code;
}
}
sub language_get_description {
- my ($script,$lang) = @_;
+ my ($script,$lang,$type) = @_;
my $dbh = C4::Context->dbh;
my $desc;
- my $sth = $dbh->prepare('SELECT description FROM language_descriptions WHERE subtag=? AND lang=?');
- $sth->execute($script,$lang);
+ my $sth = $dbh->prepare('SELECT description FROM language_descriptions WHERE subtag=? AND lang=? AND type=?');
+ $sth->execute($script,$lang,$type);
while (my $descriptions = $sth->fetchrow_hashref) {
$desc = $descriptions->{'description'};
}
my ($language_script)= @_;
my $dbh = C4::Context->dbh;
my $bidi;
- my $sth = $dbh->prepare('SELECT bidi FROM language_bidi WHERE rfc4646_subtag=?');
+ my $sth = $dbh->prepare('SELECT bidi FROM language_script_bidi WHERE rfc4646_subtag=?');
$sth->execute($language_script);
while (my $result = $sth->fetchrow_hashref) {
$bidi = $result->{'bidi'};
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__