summaryrefslogtreecommitdiff
path: root/lib/JWebmail
diff options
context:
space:
mode:
authorJannis M. Hoffmann <jannis.hoffmann@rwth-aachen.de>2022-05-09 00:51:36 +0200
committerJannis M. Hoffmann <jannis.hoffmann@rwth-aachen.de>2022-05-09 00:51:36 +0200
commit0583b0115114ba9357789d3aa153c472eb7071ab (patch)
tree16885616efed9d704639259881f58bd6748a1d7b /lib/JWebmail
parent77992072b7963d9a96c11a3913f553c820cc21da (diff)
improvements to i18n development experience
Diffstat (limited to 'lib/JWebmail')
-rw-r--r--lib/JWebmail/I18N.pm32
-rw-r--r--lib/JWebmail/I18N/de.pm (renamed from lib/JWebmail/I18N/de_de.pm)93
-rw-r--r--lib/JWebmail/I18N/en.pm18
-rw-r--r--lib/JWebmail/I18N/en_us.pm13
-rw-r--r--lib/JWebmail/Plugin/I18N2.pm50
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);