Thanks to no LSB, we need to keep seperate handlers for each domain.
authorJan Schneider <jan@horde.org>
Wed, 12 Jan 2011 12:09:52 +0000 (13:09 +0100)
committerJan Schneider <jan@horde.org>
Wed, 12 Jan 2011 12:09:52 +0000 (13:09 +0100)
framework/Translation/lib/Horde/Translation.php
framework/Translation/test/Horde/Translation/WrapperTest.php

index d53ce93..eda8a6d 100644 (file)
@@ -36,11 +36,11 @@ abstract class Horde_Translation
     static protected $_directory;
 
     /**
-     * The handler providing the actual translations.
+     * The handlers providing the actual translations.
      *
-     * @var Horde_Translation_Handler
+     * @var array
      */
-    static protected $_handler;
+    static protected $_handlers = array();
 
     /**
      * Loads a translation handler class pointing to the library's translations
@@ -54,24 +54,25 @@ abstract class Horde_Translation
         if (!self::$_domain || !self::$_directory) {
             throw new Horde_Translation_Exception('The domain and directory properties must be set by the class that extends Horde_Translation.');
         }
-        self::setHandler(new $handlerClass(self::$_domain, self::$_directory));
+        self::setHandler(self::$_domain, new $handlerClass(self::$_domain, self::$_directory));
     }
 
     /**
-     * Assigns a translation handler object to $_handler.
+     * Assigns a translation handler object to $_handlers.
      *
      * Type hinting isn't used on purpose. You should extend a custom
      * translation handler passed here from the Horde_Translation interface,
      * but technically it's sufficient if you provide the API of that
      * interface.
      *
+     * @param string $domain                      The translation domain.
      * @param Horde_Translation_Handler $handler  An object implementing the
      *                                            Horde_Translation_Handler
      *                                            interface.
      */
-    static public function setHandler($handler)
+    static public function setHandler($domain, $handler)
     {
-        self::$_handler = $handler;
+        self::$_handlers[$domain] = $handler;
     }
 
     /**
@@ -84,10 +85,10 @@ abstract class Horde_Translation
      */
     static public function t($message)
     {
-        if (!self::$_handler) {
+        if (!isset(self::$_handlers[self::$_domain])) {
             self::loadHandler('Horde_Translation_Handler_Gettext');
         }
-        return self::$_handler->t($message);
+        return self::$_handlers[self::$_domain]->t($message);
     }
 
     /**
@@ -102,9 +103,9 @@ abstract class Horde_Translation
      */
     static public function ngettext($singular, $plural, $number)
     {
-        if (!self::$_handler) {
+        if (!isset(self::$_handlers[self::$_domain])) {
             self::loadHandler('Horde_Translation_Handler_Gettext');
         }
-        return self::$_handler->ngettext($singular, $plural, $number);
+        return self::$_handlers[self::$_domain]->ngettext($singular, $plural, $number);
     }
 }
index 9a9e79f..a350fb7 100644 (file)
@@ -13,12 +13,13 @@ class Horde_Translation_WrapperTest extends Horde_Translation_TestBase
 {
     public function testWrappers()
     {
-        $this->assertEquals('1 Woche', sprintf(Horde_Translation_TestWrapper::ngettext('%d week', '%d weeks', 1), 1));
-        $this->assertEquals('Heute', Horde_Translation_TestWrapper::t('Today'));
+        $this->assertEquals('Heute', Horde_Translation_TestWrapperA::t('Today'));
+        $this->assertEquals('1 Woche', sprintf(Horde_Translation_TestWrapperA::ngettext('%d week', '%d weeks', 1), 1));
+        $this->assertEquals('Morgen', Horde_Translation_TestWrapperB::t('Tomorrow'));
     }
 }
 
-class Horde_Translation_TestWrapper extends Horde_Translation
+class Horde_Translation_TestWrapperA extends Horde_Translation
 {
     static public function t($message)
     {
@@ -34,3 +35,20 @@ class Horde_Translation_TestWrapper extends Horde_Translation
         return parent::ngettext($singular, $plural, $number);
     }
 }
+
+class Horde_Translation_TestWrapperB extends Horde_Translation
+{
+    static public function t($message)
+    {
+        self::$_domain = 'Horde_Other';
+        self::$_directory = dirname(__FILE__) . '/locale';
+        return parent::t($message);
+    }
+
+    static public function ngettext($singular, $plural, $number)
+    {
+        self::$_domain = 'Horde_Other';
+        self::$_directory = dirname(__FILE__) . '/locale';
+        return parent::ngettext($singular, $plural, $number);
+    }
+}