diff options
Diffstat (limited to 'lib/JWebmail/Plugin')
-rw-r--r-- | lib/JWebmail/Plugin/I18N.pm | 215 | ||||
-rw-r--r-- | lib/JWebmail/Plugin/INIConfig.pm | 136 |
2 files changed, 0 insertions, 351 deletions
diff --git a/lib/JWebmail/Plugin/I18N.pm b/lib/JWebmail/Plugin/I18N.pm deleted file mode 100644 index 55b1a39..0000000 --- a/lib/JWebmail/Plugin/I18N.pm +++ /dev/null @@ -1,215 +0,0 @@ -package JWebmail::Plugin::I18N; - -use Mojo::Base 'Mojolicious::Plugin'; - -use Mojolicious::Controller; -use Mojo::File; -use Mojo::Util 'monkey_patch'; - -use Config::Tiny; - - -has '_language_loaded' => sub { {} }; - - -sub register { - my ($self, $app, $conf) = @_; - $conf //= {}; - - my $i18n_log = $app->log->context('[' . __PACKAGE__ . ']'); - - # config - # 1. what languages - # 2. where are the files - # 3. fallback language - # - # look for languages automatically - my $defaultLang = $conf->{default_language} || 'en'; - my $fileLocation = $conf->{directory} && Mojo::File->new($conf->{directory})->is_abs - ? $conf->{directory} - : $app->home->child($conf->{directory} || 'lang'); - my @languages = keys %{$conf->{languages} // {}}; - - unless (@languages) { - @languages = map { $_ =~ s|^.*/(..)\.lang$|$1|r } glob("$fileLocation/*.lang"); - } - - $app->defaults(lang => $defaultLang); - $app->defaults(languages => [@languages]); - - # load languages - my $TXT; - for my $l (@languages) { - $TXT->{$l} = _loadi18n($fileLocation, $l, $i18n_log); - } - - { - local $" = ','; - $i18n_log->info("loaded languages (@languages)"); - } - - $self->_language_loaded( { map { $_ => 1 } @languages } ); - - # add translator as helper - my $i18n = sub { - my ($lang, $word) = @_; - $TXT->{$lang}{$word} || scalar( - local $" = ' ', - $lang && $word ? $app->log->warn('[' . __PACKAGE__ . "] missing translation for $lang:$word @{[ caller(2) ]}[0..2]") : (), - '', - ) - }; - $app->helper( l => sub { my $c = shift; $i18n->($c->stash->{lang}, shift) } ); - - # rewrite url - $app->hook(before_dispatch => sub { $self->read_language_hook(@_) }); - - # patch url_for - my $mojo_url_for = Mojolicious::Controller->can('url_for'); - my $i18n_url_for = sub { - my $c = shift; - my $url = $mojo_url_for->($c, @_); - - my $args = (ref $_[0] eq 'HASH' and $_[0]) || (ref $_[1] eq 'HASH' and $_[1]) || do { my %x = @_[(@_ % 2) .. $#_]; \%x }; - my $lang = $args->{lang} // $c->stash->{lang}; - - if ( $lang && (ref $_[0] eq 'HASH' || !ref $_[0] && ($_[0]//'') !~ m![:@/.]!) ) { - unshift @{ $url->path->parts }, $lang - if ($url->path->parts->[0] // '') ne $lang; - $url = $url->to_abs(Mojo::URL->new('/')); - } - - return $url; - }; - monkey_patch 'Mojolicious::Controller', url_for => $i18n_url_for; - - 0 -} - - -sub read_language_hook { - my $self = shift; - my $c = shift; - - # URL detection - if (my $path = $c->req->url->path) { - - my $part = $path->parts->[0]; - - if ( $part && $self->_language_loaded->{$part} ) { - # Ignore static files - return if $c->res->code; - - $c->app->log->debug('[' . __PACKAGE__ . "] Found language $part in URL $path"); - - # Save lang in stash - $c->stash(lang => $part); - - if ( @{ $path->parts } == 1 && !$path->trailing_slash ) { - return $c->redirect_to($c->req->url->path->trailing_slash(1)); # default controller adds language back - } - - # Clean path - shift @{$path->parts}; - $path->trailing_slash(0); - } - } -} - - -sub _loadi18n { - - my $langsubdir = shift; - my $lang = shift; - my $log = shift; - - my $langFile = "$langsubdir/$lang.lang"; - my $TXT; - - if ( -f $langFile ) { - $TXT = Config::Tiny->read($langFile, 'utf8')->{'_'}; - if ($@ || !defined $TXT) { - $log->error("error reading file $langFile: $@"); - } - } - else { - $log->warn("language file $langFile does not exist!"); - } - return $TXT; -} - - -1 - -__END__ - -=encoding utf8 - -=head1 NAME - -JWebmail::Plugin::I18N - Custom Made I18N Support Inspired by Mojolicious::Plugin::I18N - -=head1 SYNOPSIS - - $app->plugin('I18N', { - languages => [qw(en de es)], - default_language => 'en', - directory => '/path/to/language/files/', - }) - - # in your controller - $c->l('hello') - - # in your templates - <%= l 'hello' %> - - @@ de.lang - login = anmelden - userid = nuzerkennung - passwd = passwort - failed = fehlgeschlagen - about = über - - example.com/de/myroute # $c->stash('lang') eq 'de' - example.com/myroute # $c->stash('lang') eq $defaultLanguage - - # on example.com/de/myroute - url_for('my_other_route') #=> example.com/de/my_other_route - - url_for('my_other_route', lang => 'es') #=> example.com/es/my_other_route - -=head1 DESCRIPTION - -L<JWebmail::Plugin::I18N> provides I18N support. - -The language will be taken from the first path segment of the url. -Be carefult with colliding routes. - -Mojolicious::Controller::url_for is patched so that the current language will be kept for -router named urls. - -=head1 OPTIONS - -=head2 default_language - -The default language when no other information is provided. - -=head2 directory - -Directory to look for language files. - -=head2 languages - -List of allowed languages. -Files of the pattern "$lang.lang" will be looked for. - -=head1 HELPERS - -=head2 l - -This is used for your translations. - - $c->l('hello') - $app->helper('hello')->() - -=cut diff --git a/lib/JWebmail/Plugin/INIConfig.pm b/lib/JWebmail/Plugin/INIConfig.pm deleted file mode 100644 index 08e1ef1..0000000 --- a/lib/JWebmail/Plugin/INIConfig.pm +++ /dev/null @@ -1,136 +0,0 @@ -package JWebmail::Plugin::INIConfig; -use Mojo::Base 'Mojolicious::Plugin::Config'; - -use List::Util 'all'; - -use Config::Tiny; - - -sub parse { - my ($self, $content, $file, $conf, $_app) = @_; - - my $ct = Config::Tiny->new(); - my $config = $ct->read_string($content, 'utf8'); - die qq{Can't parse config "$file": } . $ct->errstr unless defined $config; - - $config = _process_config($config) unless $conf->{flat}; - - return $config; -} - - -sub _process_config { - my $val_prev = shift; - my %val = %$val_prev; - - # arrayify section with number keys - for my $key (keys %val) { - if (keys %{$val{$key}} && all { $_ =~ /\d+/} keys %{$val{$key}}) { - my $tmp = $val{$key}; - $val{$key} = []; - - for (keys %$tmp) { - $val{$key}[$_] = $tmp->{$_}; - } - } - } - - # merge top section - my $top_section = $val{'_'}; - delete $val{'_'}; - for (keys %$top_section) { - $val{$_} = $top_section->{$_} unless $val{$_}; - } - - # make implicit nesting explicit - for my $key (grep { $_ =~ /^\w+(::\w+)+$/} keys %val) { - - my @sections = split m/::/, $key; - my $x = \%val; - my $y; - for (@sections) { - $x->{$_} = {} unless ref $x->{$_};# eq 'HASH'; - $y = $x; - $x = $x->{$_}; - } - # merge - if (ref $val{$key} eq 'ARRAY') { - $y->{$sections[-1]} = []; - $x = $y->{$sections[-1]}; - for ( keys @{ $val{$key} } ) { - $x->[$_] = $val{$key}[$_]; - } - } - else { - for ( keys %{ $val{$key} } ) { - $x->{$_} = $val{$key}{$_}; - } - } - delete $val{$key}; - } - - return \%val -} - - -1 - -__END__ - -=encoding utf-8 - -=head1 NAME - -INIConfig - Reads in ini config files. - -=head1 SYNOPSIS - - $app->plugin('INIConfig'); - - @@ my_app.conf - - # global section - key = val ; line comment - [section] - other_key = other_val - [other::section] - 0 = key1 - 1 = key2 - 2 = key3 - -=head1 DESCRIPTION - -INI configuration is simple with limited nesting and propper comments. -For more precise specification on the syntax see the Config::Tiny documentation -on cpan. - -=head1 OPTIONS - -=head2 default - -Sets default configuration values. - -=head2 ext - -Sets file extension defaults to '.conf'. - -=head2 file - -Sets file name default '$app->moniker'. - -=head2 flat - -Keep configuration to exactly two nesting levels for all -and disable auto array conversion. - -=head1 METHODS - -=head2 parse - -overrides the parse method of Mojolicious::Plugin::Config - -=head1 DEPENDENCIES - -Config::Tiny - -=cut |