# HG changeset patch # User cin # Date 1385557958 -14400 # Node ID eff7f75a4408aab55f262d1de18f26748b744ad0 # Parent 39842eedd923304f6fdb24a65e7d28acd93b8900 added cookie support for the request language detection diff -r 39842eedd923 -r eff7f75a4408 Lib/IMPL/Web/Handler/LocaleHandler.pm --- a/Lib/IMPL/Web/Handler/LocaleHandler.pm Tue Nov 26 03:22:44 2013 +0400 +++ b/Lib/IMPL/Web/Handler/LocaleHandler.pm Wed Nov 27 17:12:38 2013 +0400 @@ -13,43 +13,51 @@ ], props => [ locales => PROP_RO | PROP_LIST, - default => PROP_RO + default => PROP_RO, + cookie => PROP_RO ] }; sub Invoke { my ($this,$action,$nextHandler) = @_; - my @matches; - - my $best = [$this->default,0]; + my $locale; - if(my $header = $action->header('Accept-Language')) { - foreach my $part (split(/\s*,\s*/, $header)) { - my ($lang,$quality) = ($part =~ /([a-z]+(?:\-[a-z]+)*)(?:\s*;\s*q=(0\.[\d]+|1))?/i ); - - $quality ||=1; - - foreach my $tag ($this->locales) { - if ( $tag =~ m/^$lang/i ) { - push @matches, [$tag,$quality]; - } - } - } - - foreach my $match (@matches) { - if ($match->[1] > $best->[1]) { - $best = $match; - } - } - - + if ($this->cookie and my $cookie = $action->cookie($this->cookie)) { + ($locale) = grep /^$cookie/i, $this->locales; } - if (my $locale = $best->[0]) { - Resources->SetLocale($locale); + unless($locale) { + my @matches; + + my $best = [$this->default,0]; + + if(my $header = $action->header('Accept-Language')) { + foreach my $part (split(/\s*,\s*/, $header)) { + my ($lang,$quality) = ($part =~ /([a-z]+(?:\-[a-z]+)*)(?:\s*;\s*q=(0\.[\d]+|1))?/i ); + + $quality ||=1; + + foreach my $tag ($this->locales) { + if ( $tag =~ m/^$lang/i ) { + push @matches, [$tag,$quality]; + } + } + } + + foreach my $match (@matches) { + if ($match->[1] > $best->[1]) { + $best = $match; + } + } + + } + + $locale = $best->[0]; } + Resources->SetLocale($locale) if $locale; + return $nextHandler->($action); } @@ -68,7 +76,14 @@ =begin code xml - + + + en-US + ru-RU + + en-US + lang + =end code xml diff -r 39842eedd923 -r eff7f75a4408 _test/Resources/person.xsd --- a/_test/Resources/person.xsd Tue Nov 26 03:22:44 2013 +0400 +++ b/_test/Resources/person.xsd Wed Nov 27 17:12:38 2013 +0400 @@ -3,9 +3,10 @@ targetNamespace="http://implab.org/person/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://implab.org/person/" + xmlns:impl="http://implab.org/schemas/impl-bindings" elementFormDefault="qualified" > - +