summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfranck cuny <franck@lumberjaph.net>2010-05-27 20:36:11 +0200
committerfranck cuny <franck@lumberjaph.net>2010-05-27 20:36:11 +0200
commitc8601d93f056efcc018587a6c79cde2f61aeb224 (patch)
tree3e04478f483f5aff3f62140bd627a1ed7b437f2a
parentinitial commit (diff)
downloadplack-middleware-i18n-c8601d93f056efcc018587a6c79cde2f61aeb224.tar.gz
detect locale from http headers
-rw-r--r--lib/Plack/Middleware/i18n.pm44
-rw-r--r--t/01_basic.t15
2 files changed, 39 insertions, 20 deletions
diff --git a/lib/Plack/Middleware/i18n.pm b/lib/Plack/Middleware/i18n.pm
index 28d4536..6a6e927 100644
--- a/lib/Plack/Middleware/i18n.pm
+++ b/lib/Plack/Middleware/i18n.pm
@@ -2,8 +2,10 @@ package Plack::Middleware::i18n;
use strict;
use warnings;
+
use Plack::Util;
use Plack::Util::Accessor qw/default_lang/;
+use Plack::Request;
use I18N::LangTags;
use I18N::LangTags::Detect;
@@ -12,23 +14,35 @@ our $VERSION = '0.01';
use parent 'Plack::Middleware';
sub call {
- my $self = shift;
- my $res = $self->app->(@_);
-
- my $h = Plack::Util::headers($res->[1]);
-
- my @languages = ($self->default_lang) if $self->default_lang;
- push @languages,
- I18N::LangTags::implicate_supers(
- I18N::LangTags::Detect->http_accept_langs($h->get('Accept-Language')));
-
- # XXX store languages in psgix.languages
- # XXX if session, store in session too
- # XXX maybe redirect to appropriate location ?
-
- return $res;
+ my ($self, $env) = @_;
+
+ my $locale;
+
+ if (my $lang = $env->{'HTTP_ACCEPT_LANGUAGE'}) {
+ $locale = (
+ split(
+ '-',
+ ( I18N::LangTags::implicate_supers(
+ I18N::LangTags::Detect->http_accept_langs($lang)
+ )
+ )[0]
+ )
+ )[0];
+ }
+ else {
+ $locale = $self->default_lang // 'en';
+ }
+
+ $env->{'psgix.locale'} = $locale;
+
+ if (my $session = $env->{'psgix.session'}) {
+ $session->{locale} = $locale;
+ }
+
+ $self->app->($env);
}
+
1;
__END__
diff --git a/t/01_basic.t b/t/01_basic.t
index 630bd55..c18f862 100644
--- a/t/01_basic.t
+++ b/t/01_basic.t
@@ -8,20 +8,25 @@ use HTTP::Request::Common;
my $handler = builder {
enable "i18n";
sub {
- [ '200', ['Content-Type' => 'text/html', 'Accept-Language' => 'fr'],
- ['Hello world']
+ my $env = shift;
+ [ '200',
+ ['Content-Type' => 'text/html',],
+ ['locale is ' . $env->{'psgix.locale'}]
];
};
};
test_psgi
- app => $handler,
- client => sub {
+ app => $handler,
+ client => sub {
my $cb = shift;
{
my $req = GET "http://localhost/";
+ $req->header('Accept-Language' => 'fr-FR,de;q=0.8');
ok my $res = $cb->($req);
+ is $res->content, 'locale is fr';
}
-};
+ };
done_testing();
+