diff options
Diffstat (limited to 'lib/JWebmail/Plugin/I18N2')
-rw-r--r-- | lib/JWebmail/Plugin/I18N2/INI.pm | 84 | ||||
-rw-r--r-- | lib/JWebmail/Plugin/I18N2/Maketext.pm | 55 | ||||
-rw-r--r-- | lib/JWebmail/Plugin/I18N2/Role.pm | 39 |
3 files changed, 178 insertions, 0 deletions
diff --git a/lib/JWebmail/Plugin/I18N2/INI.pm b/lib/JWebmail/Plugin/I18N2/INI.pm new file mode 100644 index 0000000..29364bb --- /dev/null +++ b/lib/JWebmail/Plugin/I18N2/INI.pm @@ -0,0 +1,84 @@ +package JWebmail::Plugin::I18N2::INI; + +use v5.22; +use warnings; +use utf8; + +use Mojo::File; + +use Config::Tiny; + +use Role::Tiny::With; +with 'JWebmail::Plugin::I18N2::Role'; + + +sub new { + my $cls = shift; + my $conf = @_ == 1 ? shift : {@_}; + + my $self = bless {}, $cls; + + $self->_log($conf->{log} || sub { @_ = $_[0]->() if ref $_[0] eq 'CODE'; local $" = ' '; warn "@_" }); + + my @languages = keys %{$conf->{languages} // {}}; + + unless (@languages) { + @languages = map { s|^.*/(..)\.lang$|$1|r } glob("'$conf->{directory}/*.lang'"); + } + + # load languages + for my $l (@languages) { + if (my $dict = __loadi18n($conf->{directory}, $l)) { + $self->{$l} = $dict; + } + } + + return $self; +} + +sub loaded_languages { grep { $_ !~ /^_/ } keys $_[0]->%* } + +sub translate { + my $self = shift; + my $lang = shift; + my $word = shift; + + my $res = $self->{$lang}{$word}; + unless ($res) { + local $" = ' '; + $self->_log->("missing translation for $lang:'$word' @{[ caller(1) ]}[0..2]"); + } + if (@_) { + $res = sprintf($res, @_); + } + return $res; +} + +sub _log { + my $self = shift; + if (@_) { + $self->{_log} = $_[0]; + return $self; + } + else { + return $self->{_log}; + } +} + +sub __loadi18n { + my $langsubdir = shift; + my $lang = shift; + + my $langFile = "$langsubdir/$lang.lang"; + my $TXT; + + if ( -f $langFile ) { + $TXT = Config::Tiny->read($langFile, 'utf8')->{'_'}; + if ($@) { + die "error reading file $langFile: $@"; + } + } + return $TXT; +} + +1 diff --git a/lib/JWebmail/Plugin/I18N2/Maketext.pm b/lib/JWebmail/Plugin/I18N2/Maketext.pm new file mode 100644 index 0000000..a38bba7 --- /dev/null +++ b/lib/JWebmail/Plugin/I18N2/Maketext.pm @@ -0,0 +1,55 @@ +package JWebmail::Plugin::I18N2::Maketext; + +use v5.22; +use warnings; +use utf8; + +use JWebmail::I18N; + +use File::Basename 'fileparse'; + +use Role::Tiny::With; +with 'JWebmail::Plugin::I18N2::Role'; + + +sub new { + my $class = shift; + my $conf = @_ == 1 ? shift : {@_}; + + my $lexica = $conf->{directory} || [fileparse(__FILE__)]->[1] . '../I18N'; + + my @languages = keys %{$conf->{languages} // {}}; + + unless (@languages) { + use autodie; + + opendir(my $dh, $lexica); + my @res = grep { /\.pm$/ && -f "$lexica/$_" } readdir $dh; + closedir($dh); + @languages = map { scalar fileparse $_, '.pm' } @res; + @languages = map { my ($l, $c) = split '_', $_, 2; $c ? "$l-\U$c" : $l } @languages; + } + + if (my $dl = $conf->{default_language}) { push @languages, $dl; }; + my $self = {}; + for (@languages) { + $self->{$_} = JWebmail::I18N->get_handle($_) || die "unable to load language $_"; + } + + if (my $l = $conf->{log}) { + $_->logger($l) for values %$self; + } + + return bless $self, $class; +} + +sub loaded_languages { grep { $_ !~ /^_/ } keys $_[0]->%* } + +sub translate { + my $self = shift; + my $lang = shift; + my $phrase = shift; + return $self->{$lang}->maketext($phrase, @_); +} + +1 diff --git a/lib/JWebmail/Plugin/I18N2/Role.pm b/lib/JWebmail/Plugin/I18N2/Role.pm new file mode 100644 index 0000000..6ed75dc --- /dev/null +++ b/lib/JWebmail/Plugin/I18N2/Role.pm @@ -0,0 +1,39 @@ +package JWebmail::Plugin::I18N2::Role; + +use v5.22; +use warnings; +use utf8; + +use Role::Tiny; + +requires qw(translate); + + +sub languages { + require List::Util; + + my $self = shift; + my @ret = $self->loaded_languages; + + if (my $find = shift) { + return List::Util::any { $find eq $_ } @ret; + } + return wantarray ? sort @ret : @ret; +} + +1 + +__END__ + +=encoding utf-8 + +=head1 DESCRIPTION + +The translate method is called with self, the language and the word and +maybe additional arguments. + +The languages method shall report all loaded languages when called with no +argument and if a language is loaded when given an argument. + +A default languages method is provided that reads languages form the +loaded_language method. |