From 56fc7f69b2e2a59ac5e60176f82822f27c92fad2 Mon Sep 17 00:00:00 2001 From: vti Date: Wed, 20 Aug 2008 00:38:40 +0300 Subject: [PATCH] New dispatcher that chooses language obeing browser's I18N tags. --- Makefile.PL | 2 ++ blog.yml.example | 6 +++++- lib/Blog/Dispatcher.pm | 22 ++++++++++++++++++---- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/Makefile.PL b/Makefile.PL index 3ea03ed..a117500 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -33,6 +33,8 @@ requires( 'HTTP::Date' => '', 'Hash::Merge' => '', 'Parse::BBCode' => '', + + 'I18N::LangTags::Detect' => '' ); catalyst(); diff --git a/blog.yml.example b/blog.yml.example index 65683e7..44b346d 100644 --- a/blog.yml.example +++ b/blog.yml.example @@ -4,7 +4,11 @@ author: vti copyright: '2008 GPL' title_en: 'My Cool Blog' description: 'About me' -language: 'en' + +default_language: 'en' +languages: + - [ 'ru', 'Русский' ] + - [ 'en', 'English' ] authentication: default_realm: 'admins' diff --git a/lib/Blog/Dispatcher.pm b/lib/Blog/Dispatcher.pm index c1ad801..b1fb3c4 100644 --- a/lib/Blog/Dispatcher.pm +++ b/lib/Blog/Dispatcher.pm @@ -4,15 +4,17 @@ use strict; use base 'Catalyst::Dispatcher'; +use I18N::LangTags::Detect; + sub prepare_action { my $self = shift; my ( $c ) = @_; my @path = split /\//, $c->req->path; - if ( $path[ 0 ] && grep { $path[ 0 ] eq $_ } - @{ $c->available_languages } ) - { + my @languages = map { $_->[0] } @{ $c->config->{ languages } }; + push @languages, $c->config->{ default_language } || 'en' unless scalar @languages; + if ( $path[ 0 ] && grep { $path[ 0 ] eq $_ } @languages ) { my $language = $path[ 0 ]; shift @path; @@ -20,7 +22,19 @@ sub prepare_action { $c->languages( [ $language ] ); } else { - $c->languages( [ $c->config->{ language } || 'en' ] ); + my $language = $c->config->{ default_language } || 'en'; + + my @browser_languages = I18N::LangTags::Detect::detect(); + $c->log->debug('User wants ' . join(',',@browser_languages)); + + foreach my $tag (@browser_languages) { + if ( grep { $_ eq $tag } @languages ) { + $language = $tag; + last; + } + } + + $c->languages( [ $language ] ); } $c->log->debug('Setting ' . $c->language . ' language'); -- 2.11.4.GIT