/
I18n.pm
80 lines (70 loc) · 1.57 KB
/
I18n.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package Bio::Graphics::Browser2::I18n;
# $Id$
use strict;
my %TABLES;
sub new {
my $class = shift;
my $dir = shift;
if (exists $TABLES{$dir}) {
return $TABLES{$dir};
} else {
my $self = bless {
dir => $dir,
lang => [],
},ref $class || $class;
$TABLES{$dir} = $self;
return $self;
}
}
sub dir {
my $self = shift;
my $d = $self->{dir};
$self->{dir} = shift if @_;
$d;
}
sub language {
my $self = shift;
my $d = $self->{lang};
if (@_) {
my @lang = ();
for my $l (map {lc $_} @_) { # lowercase all
push @lang,$l;
(my $bare = $l) =~ s/-\w+$//;
push @lang,$bare if $bare ne $l;
}
$self->{lang} = \@lang;
}
@$d;
}
sub tr {
my $self = shift;
my $symbol = uc shift;
my $lang_table = $self->tr_table($self->language);
my $def_table = $self->tr_table('POSIX');
my $translated = $lang_table->{$symbol} || $def_table->{$symbol};
return unless $translated;
local $^W = 0; # quashing uninit variable warning
return @_ ? sprintf($translated,map {CGI::escapeHTML($_)} @_) : $translated;
}
sub translate {
shift->tr(@_);
}
sub tr_table {
my $self = shift;
my @languages = @_;
my $table;
for my $lang (@languages) {
$self->{tr}{$lang} = $self->read_table($lang)
unless exists $self->{tr}{$lang};
return $self->{tr}{$lang} if $self->{tr}{$lang};
}
return {}; # language could not be loaded
}
sub read_table {
my $self = shift;
my $language = shift;
my $path = join '/',$self->dir,"$language.pm";
my $table = do $path;
$table;
}
1;