360
|
1 package IMPL::Web::Handler::LocaleHandler;
|
|
2 use strict;
|
|
3
|
|
4 use IMPL::Const qw(:prop);
|
|
5 use IMPL::declare {
|
|
6 require => {
|
|
7 Resources => 'IMPL::Resources'
|
|
8 },
|
|
9 base => [
|
|
10 'IMPL::Object' => undef,
|
|
11 'IMPL::Object::Autofill' => '@_',
|
|
12 'IMPL::Object::Serializable' => undef
|
|
13 ],
|
|
14 props => [
|
|
15 locales => PROP_RO | PROP_LIST,
|
|
16 default => PROP_RO
|
|
17 ]
|
|
18 };
|
|
19
|
|
20 sub Invoke {
|
|
21 my ($this,$action,$nextHandler) = @_;
|
|
22
|
|
23 my @matches;
|
|
24
|
|
25 my $best = [$this->default,0];
|
|
26
|
|
27 if(my $header = $action->header('Accept-Language')) {
|
|
28 foreach my $part (split(/\s*,\s*/, $header)) {
|
|
29 my ($lang,$quality) = ($part =~ /([a-z]+(?:\-[a-z]+)*)(?:\s*;\s*q=(0\.[\d]+|1))?/i );
|
|
30
|
|
31 $quality ||=1;
|
|
32
|
|
33 foreach my $tag ($this->locales) {
|
|
34 if ( $tag =~ m/^$lang/i ) {
|
|
35 push @matches, [$tag,$quality];
|
|
36 }
|
|
37 }
|
|
38 }
|
|
39
|
|
40 foreach my $match (@matches) {
|
|
41 if ($match->[1] > $best->[1]) {
|
|
42 $best = $match;
|
|
43 }
|
|
44 }
|
|
45
|
|
46
|
|
47 }
|
|
48
|
|
49 if (my $locale = $best->[0]) {
|
|
50 Resources->SetLocale($locale);
|
|
51 }
|
|
52
|
|
53 return $nextHandler->($action);
|
|
54 }
|
|
55
|
|
56 1;
|
|
57
|
|
58 __END__
|
|
59
|
|
60 =pod
|
|
61
|
|
62 =head1 NAME
|
|
63
|
|
64 C<IMPL::Web::Handler::LocaleHandler> - handles locale for the request
|
|
65
|
|
66 =head1 SYNOPSIS
|
|
67
|
|
68 =begin code xml
|
|
69
|
|
70 <handlers type="ARRAY">
|
|
71 <item type="IMPL::Web::Handler::LocationHandler"/>
|
|
72 </handlers>
|
|
73
|
|
74 =end code xml
|
|
75
|
|
76 =cut |