From 84d3ca2b89b2cbcf325cb2e0281c8cc9da1606a0 Mon Sep 17 00:00:00 2001 From: Maxime Besson Date: Mon, 11 Jul 2022 17:09:33 +0200 Subject: [PATCH 1/3] Use skin translation files when sending mail (#2772) --- .../lib/Lemonldap/NG/Portal/Lib/SMTP.pm | 5 +- .../lib/Lemonldap/NG/Portal/Main/Run.pm | 47 ++++++++++++------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/SMTP.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/SMTP.pm index a4463586b..c6935dd67 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/SMTP.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/SMTP.pm @@ -73,8 +73,9 @@ sub translate { . " ($self->{conf}->{templateDir}/$lang_code.json or $self->{conf}->{templateDir}/common/mail/en.json)"; $json = join '', ; 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} || {} } ) { diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Run.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Run.pm index 3f77b406a..224f8ddd5 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Run.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Run.pm @@ -872,26 +872,17 @@ sub _dump { return; } -sub sendHtml { - my ( $self, $req, $template, %args ) = @_; +# Warning: this function returns a JSON string +sub getTrOver { + my ( $self, $req, $templateDir ) = @_; - my $templateDir = $self->conf->{templateDir} . '/' . $self->getSkin($req); - $self->templateDir( [ $templateDir, @{ $self->templateDir } ] ); - - # Check template - $args{templateDir} = $templateDir; - my $tmpl = $args{templateDir} . "/$template.tpl"; - unless ( -f $tmpl ) { - $self->logger->debug("Template $tmpl not found"); - $args{templateDir} = $self->conf->{templateDir} . '/bootstrap'; - $tmpl = $args{templateDir} . "/$template.tpl"; - $self->logger->debug("-> Trying to load $tmpl"); - } - - # Override messages - my $trOverMessages = JSON::from_json( $self->trOver ); + 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); @@ -910,7 +901,27 @@ sub sendHtml { $self->trOverCache->{$templateDir} = JSON::to_json($trOverMessages); } - $args{params}->{TROVER} = $self->trOverCache->{$templateDir}; + + return $self->trOverCache->{$templateDir}; +} + +sub sendHtml { + my ( $self, $req, $template, %args ) = @_; + + my $templateDir = $self->conf->{templateDir} . '/' . $self->getSkin($req); + $self->templateDir( [ $templateDir, @{ $self->templateDir } ] ); + + # Check template + $args{templateDir} = $templateDir; + my $tmpl = $args{templateDir} . "/$template.tpl"; + unless ( -f $tmpl ) { + $self->logger->debug("Template $tmpl not found"); + $args{templateDir} = $self->conf->{templateDir} . '/bootstrap'; + $tmpl = $args{templateDir} . "/$template.tpl"; + $self->logger->debug("-> Trying to load $tmpl"); + } + + $args{params}->{TROVER} = $self->getTrOver( $req, $templateDir ); my $res = $self->SUPER::sendHtml( $req, $template, %args ); push @{ $res->[1] }, From ec1a1c11b86dd23acdfd88e3390e83b2f8179e59 Mon Sep 17 00:00:00 2001 From: Maxime Besson Date: Tue, 12 Jul 2022 10:18:12 +0200 Subject: [PATCH 2/3] Fix skin translations overriding llng.ini messages (#2773) --- .../lib/Lemonldap/NG/Portal/Main/Run.pm | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Run.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Run.pm index 224f8ddd5..df5440bfe 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Run.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Run.pm @@ -891,8 +891,21 @@ sub getTrOver { 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>); + 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"); From 17800cd00b6eef8143dd91988ea260c1b2f0b927 Mon Sep 17 00:00:00 2001 From: Maxime Besson Date: Wed, 24 Aug 2022 15:46:38 +0200 Subject: [PATCH 3/3] Document changes from #2772 #2773 --- doc/sources/admin/portalcustom.rst | 3 +++ doc/sources/admin/upgrade_2_0_x.rst | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/doc/sources/admin/portalcustom.rst b/doc/sources/admin/portalcustom.rst index 2b85ca266..a551cceed 100644 --- a/doc/sources/admin/portalcustom.rst +++ b/doc/sources/admin/portalcustom.rst @@ -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 ~~~~~~~~~ diff --git a/doc/sources/admin/upgrade_2_0_x.rst b/doc/sources/admin/upgrade_2_0_x.rst index 47e1dd707..2cf9d05d7 100644 --- a/doc/sources/admin/upgrade_2_0_x.rst +++ b/doc/sources/admin/upgrade_2_0_x.rst @@ -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 ` for +details + New Captcha API ~~~~~~~~~~~~~~~