Browse Source

Added a chain messages loader to automatically load .mo files if available

Jose Lorenzo Rodriguez 11 years ago
parent
commit
1545f99942

+ 61 - 0
src/I18n/ChainMessagesLoader.php

@@ -0,0 +1,61 @@
+<?php
+/**
+ * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link          http://cakephp.org CakePHP(tm) Project
+ * @since         3.0.0
+ * @license       http://www.opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\I18n;
+
+use Aura\Intl\Package;
+
+/**
+ *
+ *
+ */
+class ChainMessagesLoader {
+
+	protected $_loaders = [];
+
+	public function __construct(array $loaders) {
+		$this->_loaders = $loaders;
+	}
+
+	public function __invoke() {
+		foreach ($this->_loaders as $k => $loader) {
+			if (!is_callable($loader)) {
+				throw new \RuntimeException(
+					sprintf('Loader "%s" in the chain is not a valid callable'),
+					$k
+				);
+			}
+
+			$package = $loader();
+
+			if (!$package) {
+				continue;
+			}
+
+			if (!($package instanceof Package)) {
+				throw new \RuntimeException(
+					sprintf('Loader "%s" in the chain did not return a valid Package object'),
+					$k
+				);
+			}
+
+			if (count($package->getMessages())) {
+				return $package;
+			}
+		}
+
+		return new Package;
+	}
+
+}

+ 10 - 2
src/I18n/I18n.php

@@ -64,11 +64,19 @@ class I18n {
 		try {
 			return static::translators()->get($package);
 		} catch (LoadException $e) {
-			static::translator($package, $locale, new MessagesFileLoader($package, $locale));
-			return static::translators()->get($package);
+			return static::_fallbackTranslator($package, $locale);
 		}
 	}
 
+	protected static function _fallbackTranslator($package, $locale) {
+		$chain = new ChainMessagesLoader([
+			new MessagesFileLoader($package, $locale, 'mo'),
+			new MessagesFileLoader($package, $locale, 'po')
+		]);
+		static::translator($package, $locale, $chain);
+		return static::translators()->get($package);
+	}
+
 /**
  * Used by the translation functions in basics.php
  * Returns a translated string based on current language and translation files stored in locale folder

+ 9 - 0
tests/TestCase/I18n/I18nTest.php

@@ -37,4 +37,13 @@ class I18nTest extends TestCase {
 		$this->assertEquals('%d is 1 (po translated)', $translator->translate('%d = 1'));
 	}
 
+/**
+ * Tests that the translator can automatically load messages from a .mo file
+ *
+ * @return void
+ */
+	public function testTranslatorLoadMoFile() {
+		$translator = I18n::translator('default', 'es_ES');
+		$this->assertEquals('Plural Rule 6 (translated)', $translator->translate('Plural Rule 1'));
+	}
 }

tests/test_app/TestApp/Locale/rule_6_mo/LC_MESSAGES/default.mo → tests/test_app/TestApp/Locale/es/LC_MESSAGES/default.mo