(dev/core#1546) Fix translation of seed data
authorTim Otten <totten@civicrm.org>
Thu, 23 Jan 2020 03:31:17 +0000 (19:31 -0800)
committerTim Otten <totten@civicrm.org>
Thu, 23 Jan 2020 03:47:07 +0000 (19:47 -0800)
Overview
--------

This fixes a regression in which seed data is not translated.

Before
------

The `civicrm_data.*.mysql` files are not translated.

After
-----

The `civicrm_data.*.mysql` files are translated.

There's a unit-test to check this.

Comments
--------

This regression stems from #15411, which aimed to allow extensions to define
custom variants of `ts()`.  The crux of the issue is "What happens if you
try to translate a string before the system is bootstrapped - before the
extension is loaded?  What's your fallback behavior?"

In #15411, it used a fallback behavior of "do no translation".  In theory,
you shouldn't really get into this scenario since UIs are pretty much always
generated post-boot.

However, it turns out that there is a situation where you have an un-booted
system and need to translate strings -- i.e. when generating the localized
`civicrm_data.*.mysql` data.  Hence the bug.

This patch preserves most of the changes from #15411, but it changes the
fallback behavior from "do no translation" to "use the built-in/default
translator".

CRM/Core/I18n.php
tests/phpunit/E2E/Core/LocalizedDataTest.php [new file with mode: 0644]

index 57877c96a5cd9f1c3ec01bddb580009dcfb9ccb3..be23d592ff0ca6e440e674d393760947fa3f5e0a 100644 (file)
@@ -774,10 +774,6 @@ function ts($text, $params = []) {
         $function = $config->customTranslateFunction;
       }
     }
-    else {
-      // don't _translate_ anything until bootstrap has progressed enough
-      $params['skip_translation'] = 1;
-    }
   }
 
   $activeLocale = CRM_Core_I18n::getLocale();
diff --git a/tests/phpunit/E2E/Core/LocalizedDataTest.php b/tests/phpunit/E2E/Core/LocalizedDataTest.php
new file mode 100644 (file)
index 0000000..a1d1318
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+namespace E2E\Core;
+
+/**
+ * Class LocalizedDataTest
+ * @package E2E\Core
+ * @group e2e
+ */
+class LocalizedDataTest extends \CiviEndToEndTestCase {
+
+  /**
+   * Smoke test to check that "civicrm_data*.mysql" files contain
+   * translated strings.
+   */
+  public function testLocalizedData() {
+    $getSql = function($locale) {
+      $path = \Civi::paths()->getPath("[civicrm.root]/sql/civicrm_data.{$locale}.mysql");
+      $this->assertFileExists($path);
+      return file_get_contents($path);
+    };
+    $sqls = [
+      'de_DE' => $getSql('de_DE'),
+      'fr_FR' => $getSql('fr_FR'),
+    ];
+    $pats = [
+      'de_DE' => '/new_organization.*Neue Organisation/i',
+      'fr_FR' => '/new_organization.*Nouvelle organisation/i',
+    ];
+
+    $match = function($sqlLocale, $patLocale) use ($pats, $sqls) {
+      return (bool) preg_match($pats[$patLocale], $sqls[$sqlLocale]);
+    };
+
+    $this->assertTrue($match('de_DE', 'de_DE'), 'The German SQL should match the German pattern.');
+    $this->assertTrue($match('fr_FR', 'fr_FR'), 'The French SQL should match the French pattern.');
+    $this->assertFalse($match('de_DE', 'fr_FR'), 'The German SQL should not match the French pattern.');
+    $this->assertFalse($match('fr_FR', 'de_DE'), 'The French SQL should not match the German pattern.');
+  }
+
+}