ソースを参照

add i18n::useTranslationFallback()

Refs #6812
Schlaefer 10 年 前
コミット
99b5c7d9e2
3 ファイル変更72 行追加38 行削除
  1. 11 0
      src/I18n/I18n.php
  2. 31 19
      src/I18n/TranslatorRegistry.php
  3. 30 19
      tests/TestCase/I18n/I18nTest.php

+ 11 - 0
src/I18n/I18n.php

@@ -267,6 +267,17 @@ class I18n
     }
 
     /**
+     * Set if the default domain fallback is used.
+     *
+     * @param bool $enable flag to enable or disable fallback
+     * @return void
+     */
+    public static function useTranslationFallback($enable = true)
+    {
+        static::translators()->useTranslationFallback($enable);
+    }
+
+    /**
      * Destroys all translator instances and creates a new empty translations
      * collection.
      *

+ 31 - 19
src/I18n/TranslatorRegistry.php

@@ -43,17 +43,20 @@ class TranslatorRegistry extends TranslatorLocator
     protected $_defaultFormatter = 'default';
 
     /**
-     * Domain used used as fallback if translation isn't found in specified domain.
+     * Domain used as fallback if translation isn't found in original domain
      *
-     * - true: 'default'
-     * - false: disable translation fallback
-     * - string: fallback domain name
-     *
-     * @var string|bool
+     * @var string
      */
     protected $_defaultFallbackDomain = 'default';
 
     /**
+     * Enable translation fallback
+     *
+     * @var bool
+     */
+    protected $_fallback = true;
+
+    /**
      * A CacheEngine object that is used to remember translator across
      * requests.
      *
@@ -184,6 +187,17 @@ class TranslatorRegistry extends TranslatorLocator
     }
 
     /**
+     * Set if the default domain fallback is used.
+     *
+     * @param bool $enable flag to enable or disable fallback
+     * @return void
+     */
+    public function useTranslationFallback($enable = true)
+    {
+        $this->_fallback = $enable;
+    }
+
+    /**
      * Returns a new translator instance for the given name and locale
      * based of conventions.
      *
@@ -248,7 +262,7 @@ class TranslatorRegistry extends TranslatorLocator
     }
 
     /**
-     * set lookup fallback for loader
+     * Set domain fallback for loader.
      *
      * @param string $name The name of the fallback domain
      * @param callable $loader invokable loader
@@ -256,19 +270,17 @@ class TranslatorRegistry extends TranslatorLocator
      */
     public function setLoaderFallback($name, callable $loader)
     {
-        if ($name !== $this->_defaultFallbackDomain) {
-            $loader = function () use ($loader) {
-                $package = $loader();
-                if ($this->_defaultFallbackDomain !== false && !$package->getFallback()) {
-                    $fallback = $this->_defaultFallbackDomain;
-                    if ($fallback === true) {
-                        $fallback = 'default';
-                    }
-                    $package->setFallback($fallback);
-                }
-                return $package;
-            };
+        if (!$this->_fallback || $name === $this->_defaultFallbackDomain) {
+            return $loader;
         }
+        $loader = function () use ($loader) {
+            $package = $loader();
+            if (!$package->getFallback()) {
+                $package->setFallback($this->_defaultFallbackDomain);
+            }
+            return $package;
+        };
+
         return $loader;
     }
 }

+ 30 - 19
tests/TestCase/I18n/I18nTest.php

@@ -514,48 +514,59 @@ class I18nTest extends TestCase
     }
 
     /**
-     * Test that the fallback translators can be disabled
+     * Test that the translation fallback can be disabled
      *
      * @return void
      */
-    public function testFallbackTranslatorFallbackDisabled()
+    public function testFallbackTranslatorDisabled()
     {
-        I18n::defaultFallbackDomain(false);
-        I18n::translator('default', 'en_US', function () {
+        I18n::useTranslationFallback(false);
+
+        I18n::translator('default', 'fr_FR', function () {
             $package = new Package('default');
-            $package->setMessages(['Dog' => 'bark']);
+            $package->setMessages(['Dog' => 'Le bark']);
             return $package;
         });
-        I18n::translator('custom', 'en_US', function () {
+
+        I18n::translator('custom', 'fr_FR', function () {
             $package = new Package('default');
-            $package->setMessages([]);
+            $package->setMessages(['Cow' => 'Le moo']);
             return $package;
         });
-        $result = __d('custom', 'Dog');
-        $this->assertEquals('Dog', $result);
+
+        $translator = I18n::translator('custom', 'fr_FR');
+        $this->assertEquals('Le moo', $translator->translate('Cow'));
+        $this->assertEquals('Dog', $translator->translate('Dog'));
     }
 
     /**
-     * Test that an arbitrary fallback domain can be set
+     * Test that a different fallback domain can be set
      *
      * @return void
      */
-    public function testFallbackTranslatorCustomDomain()
+    public function testFallbackTranslatorSetFallbackDomain()
     {
-        $customDomain = 'foo';
-        I18n::defaultFallbackDomain($customDomain);
-        I18n::translator($customDomain, 'en_US', function () {
+        $this->assertEquals('default', I18n::defaultFallbackDomain());
+
+        $fallbackDomain = 'foo';
+        I18n::defaultFallbackDomain($fallbackDomain);
+        $this->assertEquals($fallbackDomain, I18n::defaultFallbackDomain());
+
+        I18n::translator($fallbackDomain, 'fr_FR', function () {
             $package = new Package('default');
-            $package->setMessages(['Dog' => 'bark']);
+            $package->setMessages(['Dog' => 'Le bark']);
             return $package;
         });
-        I18n::translator('custom', 'en_US', function () {
+
+        I18n::translator('custom', 'fr_FR', function () {
             $package = new Package('default');
-            $package->setMessages([]);
+            $package->setMessages(['Cow' => 'Le moo']);
             return $package;
         });
-        $result = __d('custom', 'Dog');
-        $this->assertEquals('bark', $result);
+
+        $translator = I18n::translator('custom', 'fr_FR');
+        $this->assertEquals('Le moo', $translator->translate('Cow'));
+        $this->assertEquals('Le bark', $translator->translate('Dog'));
     }
 
     /**