Skip to content

Commit

Permalink
Added a chain messages loader to automatically load .mo files if avai…
Browse files Browse the repository at this point in the history
…lable
  • Loading branch information
lorenzo committed Jul 20, 2014
1 parent 77d8c11 commit 1545f99
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 2 deletions.
61 changes: 61 additions & 0 deletions 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;
}

}
12 changes: 10 additions & 2 deletions src/I18n/I18n.php
Expand Up @@ -64,11 +64,19 @@ public static function translator($package = 'default', $locale = null, callable
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
Expand Down
9 changes: 9 additions & 0 deletions tests/TestCase/I18n/I18nTest.php
Expand Up @@ -37,4 +37,13 @@ public function testDefaultTranslator() {
$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'));
}
}

0 comments on commit 1545f99

Please sign in to comment.