diff options
author | Jannis M. Hoffmann <jannis.hoffmann@rwth-aachen.de> | 2022-05-09 00:51:36 +0200 |
---|---|---|
committer | Jannis M. Hoffmann <jannis.hoffmann@rwth-aachen.de> | 2022-05-09 00:51:36 +0200 |
commit | 0583b0115114ba9357789d3aa153c472eb7071ab (patch) | |
tree | 16885616efed9d704639259881f58bd6748a1d7b /lib | |
parent | 77992072b7963d9a96c11a3913f553c820cc21da (diff) |
improvements to i18n development experience
Diffstat (limited to 'lib')
-rw-r--r-- | lib/JWebmail/I18N.pm | 32 | ||||
-rw-r--r-- | lib/JWebmail/I18N/de.pm (renamed from lib/JWebmail/I18N/de_de.pm) | 93 | ||||
-rw-r--r-- | lib/JWebmail/I18N/en.pm | 18 | ||||
-rw-r--r-- | lib/JWebmail/I18N/en_us.pm | 13 | ||||
-rw-r--r-- | lib/JWebmail/Plugin/I18N2.pm | 50 |
5 files changed, 144 insertions, 62 deletions
diff --git a/lib/JWebmail/I18N.pm b/lib/JWebmail/I18N.pm index 576c413..190f4be 100644 --- a/lib/JWebmail/I18N.pm +++ b/lib/JWebmail/I18N.pm @@ -1,8 +1,40 @@ package JWebmail::I18N; +use v5.22; +use warnings; +use utf8; + use parent 'Locale::Maketext'; +sub init { + my $self = shift; + $self->SUPER::init(@_); + + $self->fail_with('log_on_failure'); +} + +sub fallback_languages { return (); } + +sub log_on_failure { + my $self = shift; + my $prase = shift; + $self->logger->("missing translation for @{[$self->language_tag]}:'$prase'"); + $self->failure_handler_auto($prase, @_); +} + +sub logger { + my $self = shift; + if (@_) { + $self->{_jwm_logger} = $_[0]; + return $self; + } + else { + return $self->{_jwm_logger}; + } +} + + 1 __END__ diff --git a/lib/JWebmail/I18N/de_de.pm b/lib/JWebmail/I18N/de.pm index 637e88f..1b364fb 100644 --- a/lib/JWebmail/I18N/de_de.pm +++ b/lib/JWebmail/I18N/de.pm @@ -1,4 +1,4 @@ -package JWebmail::I18N::de_de; +package JWebmail::I18N::de; use v5.22; use warnings; @@ -8,60 +8,85 @@ use parent 'JWebmail::I18N'; our %Lexicon = ( - 'login' => 'anmelden', - 'userid' => 'nuzerkennung', - 'password' => 'passwort', - 'failed' => 'fehlgeschlagen', + ## mainlayout + 'version' => 'Version', 'about' => 'über', - 'mbox_size' => 'mailboxgröße', - # and = und - 'subject' => 'betreff', - 'version' => 'version', + + ## writemail + # qw(subject send back) + 'send to' => 'senden an', + 'answer_to' => 'antworten gehen an', + 'content' => 'Inhalt', + 'attach file' => 'Datei anhängen', + + ## readmail + # qw(subject date size) + 'content-type' => 'inhaltsart', + 'back' => 'zurück', 'from' => 'von', 'to' => 'für', 'cc' => 'cc', - 'date' => 'datum', - 'size' => 'größe', - 'content-type' => 'inhaltsart', - 'send to' => 'senden an', - 'answer_to' => 'antworten gehen an', - 'content' => 'inhalt', - 'check_all' => 'alle markieren', - 'move' => 'verschieben', - 'nr' => 'nummer', - 'status' => 'mehrteilig', - 'logout' => 'abmelden', - 'compose' => 'schreiben', - 'search' => 'suche', + 'bcc' => 'bcc', + 'and' => 'und', + + ## _pagination1 + 'page [_1] of [_2]' => 'Seite [_1] von [_2]', + + ## _pagination2 + 'page' => 'Seite', 'of' => 'von', - 'messages' => 'nachrichten', - 'new' => 'neu', - 'mbox_size' => 'mailboxgröße', - 'home' => 'übersicht', - 'no' => 'nein', - 'yes' => 'ja', - 'page' => 'seite', 'next' => 'nächste', 'last' => 'letzte', 'first' => 'erste', 'previous' => 'vorherige', + + ## _display_top_nav + 'logout' => 'abmelden', + 'search' => 'suche', + 'compose' => 'schreiben', + + ## _display_headers + 'recipient' => 'empfänger', + 'date' => 'datum', + 'subject' => 'betreff', + 'size' => 'größe', 'sender' => 'gesendet von', - 'back' => 'zurück', + 'status' => 'mehrteilig', + # 'no' => 'nein', + # 'yes' => 'ja', - # Mailboxen + ## _display_folders + '[_1] of [_2] messages' => '[_1] von [_2] Nachrichten', + ', [_1] new' => ', [_1] Neue', + ' - mailbox size: [_1]', => ' - Mailboxgröße: [_1]', + '_mailbox_root' => 'Stammverzeichnis', + + ## _display_folders mailbox names 'queue' => 'warteschlange', 'drafts' => 'vorlagen', 'home' => 'wurzelverzeichnis', + 'home' => 'übersicht', + + ## _display_bot_nav + 'check all' => 'alle markieren', + 'move' => 'verschieben', + 'move to' => 'verschieben nach', + + ## displayheaders + 'This folder is empty!' => 'Dieses Verzeichnis ist leer!', - # Fehler + ## login + 'login' => 'anmelden', + 'userid' => 'nuzerkennung', + 'password' => 'passwort', + + ## Controller 'No active session.' => 'Keine aktive Sitzung.', 'Login failed!' => 'Einloggen fehlgeschlagen!', - 'no_folder' => 'Dieses Verzeichnis gibt es nicht.', 'error_send' => 'Die Nachricht konnte nicht gesendet werden.', 'succ_send' => 'Die Nachricht wurde verschikt.', 'succ_move' => 'Nachrichten wurden verschoben.', - 'empty_folder' => 'Dies Verzeichnis ist leer.', ); diff --git a/lib/JWebmail/I18N/en.pm b/lib/JWebmail/I18N/en.pm new file mode 100644 index 0000000..a57d1eb --- /dev/null +++ b/lib/JWebmail/I18N/en.pm @@ -0,0 +1,18 @@ +package JWebmail::I18N::en; + +use v5.22; +use warnings; +use utf8; + +use parent 'JWebmail::I18N'; + + +our %Lexicon = ( + _AUTO => 1, + + # _display_folders + '_mailbox_root' => 'Home', +); + + +1 diff --git a/lib/JWebmail/I18N/en_us.pm b/lib/JWebmail/I18N/en_us.pm deleted file mode 100644 index 22de05e..0000000 --- a/lib/JWebmail/I18N/en_us.pm +++ /dev/null @@ -1,13 +0,0 @@ -package JWebmail::I18N::en_us; - -use v5.22; -use warnings; -use utf8; - -use parent 'JWebmail::I18N'; - - -our %Lexicon = (_AUTO => 1); - - -1 diff --git a/lib/JWebmail/Plugin/I18N2.pm b/lib/JWebmail/Plugin/I18N2.pm index 8c57ec5..31d6234 100644 --- a/lib/JWebmail/Plugin/I18N2.pm +++ b/lib/JWebmail/Plugin/I18N2.pm @@ -25,15 +25,17 @@ package JWebmail::Plugin::I18N2::Maketext { 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 $dl = $conf->{default_language}) { - $self->{$dl} = JWebmail::I18N->get_handle($dl) || die "unable to load language $dl"; + if (my $l = $conf->{log}) { + $_->logger($l) for values %$self; } return bless $self, $class; @@ -42,7 +44,7 @@ package JWebmail::Plugin::I18N2::Maketext { sub languages { my $self = shift; if (@_) { - return exists $self->{$_[0]}; + return exists $self->{$_[0] || ''}; } return wantarray ? sort keys $self->%* : scalar keys $self->%*; } @@ -53,7 +55,6 @@ package JWebmail::Plugin::I18N2::Maketext { my $phrase = shift; return $self->{$lang}->maketext($phrase, @_); } - } package JWebmail::Plugin::I18N2::Translator { @@ -66,6 +67,10 @@ package JWebmail::Plugin::I18N2::Translator { 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) { @@ -73,20 +78,19 @@ package JWebmail::Plugin::I18N2::Translator { } # load languages - my $self = {}; for my $l (@languages) { if (my $dict = __loadi18n($conf->{directory}, $l)) { $self->{$l} = $dict; } } - return bless $self, $cls; + return $self; } sub languages { my $self = shift; if (@_) { - return exists $self->{$_[0]}; + return exists $self->{$_[0] || ''}; } return wantarray ? sort keys $self->%* : scalar keys $self->%*; } @@ -95,7 +99,27 @@ package JWebmail::Plugin::I18N2::Translator { my $self = shift; my $lang = shift; my $word = shift; - return $self->{$lang}{$word}; + + 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 { @@ -172,6 +196,7 @@ sub register { my $t = $translator->( default_language => $defaultLang, directory => $fileLocation, + log => sub { $i18n_log->warn(@_) }, %{$conf->{rest} // {}} ); @@ -199,12 +224,7 @@ sub register { my $word = shift; my $lang = $c->stash('lang'); - my $res = $t->translate($lang, $word, @_); - unless ($res) { - local $" = ' '; - $app->log->warn('[' . __PACKAGE__ . "] missing translation for $lang:'$word' @{[ caller(1) ]}[0..2]"); - } - return $res; + return $t->translate($lang, $word, @_); }); # modify incoming and generated urls @@ -212,7 +232,7 @@ sub register { my $c = shift; unshift @{ $c->req->url->path->parts }, '' - unless $t->languages($c->req->url->path->parts->[0] || ''); + unless $t->languages($c->req->url->path->parts->[0]); my $ext_match = $c->match->with_roles('JWebmail::Plugin::I18N2::Match::Role'); $ext_match->_i18n2_stash($c->stash); |