Fix Translation to load related language more reliably
authorEileen McNaughton <emcnaughton@wikimedia.org>
Wed, 10 May 2023 03:59:35 +0000 (15:59 +1200)
committerEileen McNaughton <emcnaughton@wikimedia.org>
Wed, 10 May 2023 22:41:21 +0000 (10:41 +1200)
CRM/Core/BAO/TranslateGetWrapper.php
CRM/Core/BAO/Translation.php
tests/phpunit/CRM/Core/BAO/MessageTemplateTest.php

index 67214b24260562a18893ee110313eee3a2ad2807..b5b1eca99cffb6861d712901733ca2aa8505691e 100644 (file)
@@ -37,7 +37,7 @@ class CRM_Core_BAO_TranslateGetWrapper {
       }
       $toSet = array_intersect_key($this->fields[$value['id']], $value);
       $value = array_merge($value, $toSet);
-      $value['actual_language'] = $this->translatedLanguage;
+      $value['actual_language'] = $this->translatedLanguage[$value['id']];
     }
     return $result;
   }
index 61c9007db5fc56a2a98122829bde02e0c7e7caee..c81cc46eeef89840083ab422dfdd0ccc2994480e 100644 (file)
@@ -196,7 +196,9 @@ class CRM_Core_BAO_Translation extends CRM_Core_DAO_Translation implements HookI
         //n }
         foreach ($translated['fields'] ?? [] as $field) {
           \Civi::$statics[__CLASS__]['translate_fields'][$apiRequest['entity']][$communicationLanguage]['fields'][$field['entity_id']][$field['entity_field']] = $field['string'];
-          \Civi::$statics[__CLASS__]['translate_fields'][$apiRequest['entity']][$communicationLanguage]['language'] = $translated['language'];
+          if (!isset(\Civi::$statics[__CLASS__]['translate_fields'][$apiRequest['entity']][$communicationLanguage]['language'][$field['entity_id']])) {
+            \Civi::$statics[__CLASS__]['translate_fields'][$apiRequest['entity']][$communicationLanguage]['language'][$field['entity_id']] = $field['language'];
+          }
         }
       }
       if (!empty(\Civi::$statics[__CLASS__]['translate_fields'][$apiRequest['entity']][$communicationLanguage])) {
@@ -237,14 +239,24 @@ class CRM_Core_BAO_Translation extends CRM_Core_DAO_Translation implements HookI
     }
     $fields = $translations->execute();
     $languages = [];
-    foreach ($fields as $index => $field) {
-      $languages[$field['language']][$index] = $field;
+    foreach ($fields as $field) {
+      $languages[$field['language']][$field['entity_id'] . $field['entity_field']] = $field;
     }
 
     $bizLocale = $userLocale->renegotiate(array_keys($languages));
-    return $bizLocale
-      ? ['fields' => $languages[$bizLocale->nominal], 'language' => $bizLocale->nominal]
-      : [];
+    if ($bizLocale) {
+      $fields = $languages[$bizLocale->nominal];
+
+      foreach ($languages as $language => $languageFields) {
+        if ($language !== $bizLocale->nominal) {
+          // Merge in any missing entities. Ie we might have a translation for one template in es_MX but
+          // need to fall back to es_ES for another.
+          $fields = array_merge($languageFields, $fields);
+        }
+      }
+      return ['fields' => $fields, 'language' => $bizLocale->nominal];
+    }
+    return [];
   }
 
 }
index d666cc1e363cf986752e2cee902571e524bfddff..f0c30e66389e9cf232fe4b486b2fa6f276f6c807 100644 (file)
@@ -211,7 +211,7 @@ class CRM_Core_BAO_MessageTemplateTest extends CiviUnitTestCase {
       ->execute()->indexBy('workflow_name');
     $firstTemplate = array_key_first($messageTemplates);
     $secondTemplate = array_key_last($messageTemplates);
-    foreach ($messageTemplates  as $workflowName => $messageTemplate) {
+    foreach ($messageTemplates as $workflowName => $messageTemplate) {
       $records = [
         ['entity_field' => 'msg_subject', 'string' => 'subject - Spanish', 'language' => 'es_ES'],
         ['entity_field' => 'msg_html', 'string' => 'html -Spanish', 'language' => 'es_ES'],