Merge branch 'fix-mail-trover-2772-2773' into 'v2.0'

Fix translation overrides

See merge request lemonldap-ng/lemonldap-ng!282
This commit is contained in:
Maxime Besson 2022-08-25 14:58:02 +00:00
commit 621c88535a
4 changed files with 69 additions and 25 deletions

View File

@ -290,6 +290,9 @@ For example ``templates/myskin/en.json``:
You can also create a file called ``all.json`` to override messages in
all languages.
.. versionchanged:: 2.0.15
Translations in lemonldap-ng.ini now take priority over translations from skin files
Menu tabs
~~~~~~~~~

View File

@ -29,6 +29,22 @@ None
2.0.15
------
Translation overrides in lemonldap-ng.ini now take priority over skin
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Previously, the presence of a translation JSON file within a skin prevented
translation messages defined in ``lemonldap-ng.ini`` from being used.
Additionally, it was not possible to translate strings in email templates using
a custom skin file.
These two bugs are now fixed, be sure to check that you do not have duplicate
translations in ``lemonldap-ng.ini`` and in your skin files (``*.json``). If you do,
the translation in ``lemonldap-ng.ini`` will now take priority.
See :ref:`documentation on translating messages <intlmessages>` for
details
New Captcha API
~~~~~~~~~~~~~~~

View File

@ -73,8 +73,9 @@ sub translate {
. " ($self->{conf}->{templateDir}/$lang_code.json or $self->{conf}->{templateDir}/common/mail/en.json)";
$json = join '', <F>;
close F;
my $lang = from_json( $json, { allow_nonref => 1 } );
my $langOver = from_json( $self->p->trOver, { allow_nonref => 1 } );
my $lang = from_json( $json, { allow_nonref => 1 } );
my $langOver =
from_json( $self->p->getTrOver($req), { allow_nonref => 1 } );
if ($langOver) {
for my $k ( keys %{ $langOver->{all} || {} } ) {

View File

@ -872,6 +872,52 @@ sub _dump {
return;
}
# Warning: this function returns a JSON string
sub getTrOver {
my ( $self, $req, $templateDir ) = @_;
my $templateDir //= $self->conf->{templateDir} . '/' . $self->getSkin($req);
unless ( $self->trOverCache->{$templateDir} ) {
# Override messages
my $trOverMessages = JSON::from_json( $self->trOver );
opendir( DIR, $templateDir );
my @langfiles = grep( /\.json$/, readdir(DIR) );
close(DIR);
foreach my $file (@langfiles) {
my ($lang) = ( $file =~ /^(\w+)\.json/ );
$self->logger->debug("Use $file to override messages");
if ( open my $json, "<", $templateDir . "/" . $file ) {
my $trdata;
eval {
local $/ = undef;
$trdata = JSON::from_json(<$json>);
};
if ($@) {
$self->logger->warn("Ignoring $file because of error: $@");
}
if ( ref($trdata) eq "HASH" ) {
for my $msg ( keys %$trdata ) {
# lemonldap-ng.ini has priority
$trOverMessages->{$lang}->{$msg} //= $trdata->{$msg};
}
}
}
else {
$self->logger->error("Unable to read $file");
}
}
$self->trOverCache->{$templateDir} = JSON::to_json($trOverMessages);
}
return $self->trOverCache->{$templateDir};
}
sub sendHtml {
my ( $self, $req, $template, %args ) = @_;
@ -888,29 +934,7 @@ sub sendHtml {
$self->logger->debug("-> Trying to load $tmpl");
}
# Override messages
my $trOverMessages = JSON::from_json( $self->trOver );
unless ( $self->trOverCache->{$templateDir} ) {
opendir( DIR, $templateDir );
my @langfiles = grep( /\.json$/, readdir(DIR) );
close(DIR);
foreach my $file (@langfiles) {
my ($lang) = ( $file =~ /^(\w+)\.json/ );
$self->logger->debug("Use $file to override messages");
if ( open my $json, "<", $templateDir . "/" . $file ) {
local $/ = undef;
$trOverMessages->{$lang} = JSON::from_json(<$json>);
}
else {
$self->logger->error("Unable to read $file");
}
}
$self->trOverCache->{$templateDir} = JSON::to_json($trOverMessages);
}
$args{params}->{TROVER} = $self->trOverCache->{$templateDir};
$args{params}->{TROVER} = $self->getTrOver( $req, $templateDir );
my $res = $self->SUPER::sendHtml( $req, $template, %args );
push @{ $res->[1] },