Changeset 30331

Show
Ignore:
Timestamp:
02/20/09 12:52:05 (4 years ago)
Author:
daisuke
Message:

add detection from http header value, handle incoming localizer specs in the constructor

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/Data-Localize/trunk/lib/Data/Localize.pm

    r30083 r30331  
    33package Data::Localize; 
    44use Moose; 
     5use Moose::Util::TypeConstraints; 
    56use MooseX::AttributeHelpers; 
    67use I18N::LangTags (); 
     
    5657# Localizers are the actual minions that perform the localization. 
    5758# They must register themselves 
     59subtype 'Data::Localize::LocalizerListArg' 
     60    => as 'ArrayRef' 
     61    => where { 
     62        ! grep { ! blessed $_ || ! $_->does('Data::Localize::Localizer') } @$_; 
     63    } 
     64    => message { 
     65        'localizers must be a list of Data::Localize::Localizer implementors' 
     66    } 
     67; 
     68coerce 'Data::Localize::LocalizerListArg' 
     69    => from 'ArrayRef[HashRef]' 
     70    => via { 
     71        my $ret = [ map { 
     72            my $args  = $_; 
     73            my $klass = delete $args->{class}; 
     74            if ($klass !~ s/^\+//) { 
     75                $klass = "Data::Localize::$klass"; 
     76            } 
     77            Class::MOP::load_class($klass); 
     78            $klass->new(%$args); 
     79        } @$_ ]; 
     80        return $ret; 
     81    } 
     82; 
     83 
    5884has 'localizers' => ( 
    5985    metaclass => 'Collection::Array', 
    6086    is => 'rw', 
    61     isa => 'ArrayRef', 
     87    isa => 'Data::Localize::LocalizerListArg', 
     88    coerce => 1, 
    6289    default => sub { +[] }, 
    6390    provides => { 
     
    81108 
    82109no Moose; 
     110no Moose::Util::TypeConstraints; 
     111 
     112sub BUILD { 
     113    my $self = shift; 
     114    if ($self->count_localizers > 0) { 
     115        foreach my $loc (@{ $self->localizers }) { 
     116            $loc->register($self); 
     117        } 
     118    } 
     119    return $self; 
     120} 
    83121 
    84122sub _build_fallback_languages { 
     
    104142    if (&DEBUG) { 
    105143        print STDERR "[Data::Localize]: detect_languages auto-detected ", join(", ", map { "'$_'" } @lang ), "\n"; 
     144    } 
     145    return wantarray ? @lang : \@lang; 
     146} 
     147 
     148sub detect_languages_from_header { 
     149    my $self = shift; 
     150    my @lang = I18N::LangTags::implicate_supers(  
     151        I18N::LangTags::Detect->http_accept_langs( $_[0] || $ENV{HTTP_ACCEPT_LANGUAGE}), 
     152        $self->fallback_languages, 
     153    ); 
     154    if (&DEBUG) { 
     155        print STDERR "[Data::Localize]: detect_languages_from_header detected ", join(", ", map { "'$_'" } @lang ), "\n"; 
    106156    } 
    107157    return wantarray ? @lang : \@lang;