comparison Lib/IMPL/Resources/StringMap.pm @ 376:a54a2faf2f7e

added localizable string maps
author cin
date Mon, 13 Jan 2014 17:52:04 +0400
parents
children a0d342ac9a36
comparison
equal deleted inserted replaced
375:441e84031c7b 376:a54a2faf2f7e
1 package IMPL::Web::Resources::StringMap;
2 use strict;
3
4 use IMPL::Const qw(:prop);
5 use IMPL::declare {
6 require => {
7 Exception => 'IMPL::Exception',
8 IOException => '-IMPL::IOException',
9 ArgException => '-IMPL::InvalidArgumentException'
10 },
11 props => [
12 _data => PROP_RW,
13 _parent => PROP_RW
14 ]
15 };
16
17 sub CTOR {
18 my ($this,$data,$parent) = @_;
19
20 die ArgException->new( data => 'A hash reference is required' )
21 unless ref($data) eq 'HASH';
22
23 die ArgException->new( data => 'A hash must contain either scalars or subs')
24 if grep not($_) || (ref($_) and ref($_) ne 'CODE'), values %$data;
25
26 $this->_data($data);
27 $this->_parent($parent);
28 }
29
30 sub GetString {
31 my ($this,$id,$args) = @_;
32
33 if(my $format = $this->_data->{$id}) {
34 return $this->FormatString($format,$args);
35 } else {
36 return $this->_parent? $this->_parent->GetString($id,$args) : "[$id]";
37 }
38
39 }
40
41 sub FormatString {
42 my ($self,$text,$args) = @_;
43
44 $args ||= {};
45 $resolver ||= \&_defaultResolver;
46 $text ||= '';
47
48 $string =~ s/%(\w+(?:\.\w+)*)%/$self->GetValue($args,$1,"\[$1\]")/ge;
49
50 return $string;
51
52 }
53
54 sub GetValue {
55 my ($self,$obj,$path,$default) = @_;
56
57 foreach my $chunk (split /\./,$path) {
58 return $default unless $obj;
59 if (ref $obj eq 'HASH') {
60 $obj = $obj->{$chunk};
61 } else {
62 $obj = $self->Resolve($obj,$chunk);
63 }
64 }
65 return $obj||'<undef>';
66 }
67
68 sub Resolve {
69 my ($self,$obj,$prop) = @_;
70
71 return ( eval { $obj->can($prop) } ? $obj->$prop() : undef );
72 }
73
74 sub _LoadMap {
75 my ($self,$file,$parent) = @_;
76
77 my $data = do $file;
78 my $e = $@;
79 die Exception->new("Failed to load file '$file'", $e) if $e;
80 die IOException->new("Failed to load file '$file'", $!) if not defined $data and $!;
81 die Exception->new("Failed to load file '$file'", "A hash data is expected") unless ref($data) eq 'HASH';
82
83 return $self->new($data,$parent);
84 }
85
86 1;
87
88 __END__
89
90 =pod
91
92 =head1 NAME
93
94 C<IMPL::Web::Resources::StringMap>
95
96 =head1 SYNOPSIS
97
98 My/App/locale/default/Search.labels
99
100 My/App/locale/en/Search.map
101
102 =begin code
103
104 {
105 TitleLabel => 'Search results',
106 ViewLabel => 'View %name%', # same as sub { $_[0]->Format('View %name%',$_[1]) }
107 ResultsCountLabel => sub {
108 my ($self,$args) = @_;
109
110 $args ||= {};
111
112 if (not $args->{count}) {
113 return "No items found";
114 } elsif($args->{count} == 1) {
115 return "Found one item";
116 } else {
117 return $self->Format("Found %count% items", $args);
118 }
119 }
120 }
121
122 =end code
123
124 =head1 DESCRIPTION
125
126 =head
127
128 =cut