From c7c5d0e6fc3bc51e8f8a2ebdb7e3814007fda10d Mon Sep 17 00:00:00 2001 From: Eileen McNaughton Date: Sat, 24 Jun 2023 17:36:11 -0700 Subject: [PATCH] Follow up to #26618 - set locale consistently when exporting model --- .../Traits/LocalizationTrait.php | 37 +++++++++++++++++++ Civi/WorkflowMessage/Traits/TemplateTrait.php | 4 +- Civi/WorkflowMessage/WorkflowMessage.php | 5 +++ .../WorkflowMessageInterface.php | 7 ++++ 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/Civi/WorkflowMessage/Traits/LocalizationTrait.php b/Civi/WorkflowMessage/Traits/LocalizationTrait.php index 51aa90503f..8bbf68b2ee 100644 --- a/Civi/WorkflowMessage/Traits/LocalizationTrait.php +++ b/Civi/WorkflowMessage/Traits/LocalizationTrait.php @@ -19,6 +19,18 @@ trait LocalizationTrait { */ protected $locale; + /** + * The language that was requested to be rendered. + * + * This may not be the rendered locale - as the requested language + * might be available. This is primarily for extensions to use in + * custom workflow messages. + * + * @var string|null + * @scope tokenContext + */ + protected $requestedLocale; + /** * @return string */ @@ -35,6 +47,31 @@ trait LocalizationTrait { return $this; } + /** + * Get the requested locale. + * + * This may differ from the rendered locale (e.g. if a translation is not + * available). It is not used in core but extensions may leverage this + * information. + * + * @return string + */ + public function getRequestedLocale(): ?string { + return $this->locale; + } + + /** + * Set the requested locale. + * + * @param string|null $requestedLocale + * + * @return $this + */ + public function setRequestedLocale(?string $requestedLocale): self { + $this->requestedLocale = $requestedLocale; + return $this; + } + protected function validateExtra_localization(&$errors) { $allLangs = \CRM_Core_I18n::languages(); if ($this->locale !== NULL && !isset($allLangs[$this->locale])) { diff --git a/Civi/WorkflowMessage/Traits/TemplateTrait.php b/Civi/WorkflowMessage/Traits/TemplateTrait.php index f0aeba9cf9..73d6f41272 100644 --- a/Civi/WorkflowMessage/Traits/TemplateTrait.php +++ b/Civi/WorkflowMessage/Traits/TemplateTrait.php @@ -11,6 +11,7 @@ namespace Civi\WorkflowMessage\Traits; +use Civi\Api4\Contact; use Civi\Api4\MessageTemplate; /** @@ -56,10 +57,11 @@ trait TemplateTrait { $model = $this; $language = $model->getLocale(); if (empty($language) && !empty($model->getContactID())) { - $language = \Civi\Api4\Contact::get(FALSE)->addWhere('id', '=', $this->getContactID())->addSelect('preferred_language')->execute()->first()['preferred_language']; + $language = Contact::get(FALSE)->addWhere('id', '=', $this->getContactID())->addSelect('preferred_language')->execute()->first()['preferred_language']; } [$mailContent, $translatedLanguage] = self::loadTemplate((string) $model->getWorkflowName(), $model->getIsTest(), $model->getTemplateId(), $model->getGroupName(), $model->getTemplate(), $language); $model->setLocale($translatedLanguage ?? $model->getLocale()); + $model->setRequestedLocale($language); return $mailContent; } diff --git a/Civi/WorkflowMessage/WorkflowMessage.php b/Civi/WorkflowMessage/WorkflowMessage.php index 8d9296b67e..d15def34bc 100644 --- a/Civi/WorkflowMessage/WorkflowMessage.php +++ b/Civi/WorkflowMessage/WorkflowMessage.php @@ -126,12 +126,17 @@ class WorkflowMessage { public static function exportAll(WorkflowMessageInterface $model): array { // The format is defined to match the traditional format of CRM_Core_BAO_MessageTemplate::sendTemplate(). // At the top level, it is an "envelope", but it also has keys for other sections. + $swapLocale = !$model->getLocale() ? NULL : \CRM_Utils_AutoClean::swapLocale($model->getLocale()); + $values = $model->export('envelope'); $values['tplParams'] = $model->export('tplParams'); $values['tokenContext'] = $model->export('tokenContext'); if (isset($values['tokenContext']['contactId'])) { $values['contactId'] = $values['tokenContext']['contactId']; } + if ($swapLocale) { + $swapLocale->cleanup(); + } return $values; } diff --git a/Civi/WorkflowMessage/WorkflowMessageInterface.php b/Civi/WorkflowMessage/WorkflowMessageInterface.php index 8bf9156e6f..198f5d5268 100644 --- a/Civi/WorkflowMessage/WorkflowMessageInterface.php +++ b/Civi/WorkflowMessage/WorkflowMessageInterface.php @@ -78,6 +78,13 @@ interface WorkflowMessageInterface { */ public function assertValid($strict = FALSE); + /** + * Get the locale in use, if set. + * + * @return string|null + */ + public function getLocale(): ?string; + /** * Render a message template. * -- 2.25.1