Skip to content
This repository has been archived by the owner on Jan 30, 2020. It is now read-only.

Commit

Permalink
Merge pull request zendframework/zendframework#5825 from poisa/add/ph…
Browse files Browse the repository at this point in the history
…pMemoryArray

New class Translator\Loader\PhpMemoryArray
  • Loading branch information
weierophinney committed Mar 10, 2014
182 parents 4db5d34 + 95dd270 + 144fb7e + 712a04b + 4dbc11a + c99b627 + 740abb6 + 9b5478d + 91a23e2 + 8649d44 + 3f353b0 + d340adb + 1e0e8f4 + 5c4289e + fb94cca + 2a3844c + 906bbcf + 3d9b8bb + 84844ae + 62fc651 + b0a3dd4 + 0dca0ef + 910bbbf + e574b9b + f30ec7d + 1fa84de + 41b8543 + 9e2c9d5 + 913f51c + 39924f3 + c2a11e1 + 61b9322 + 413a38b + e51b2b8 + 20e328b + 6437ec0 + e9b8476 + 95e54a0 + 7ea3aed + df6a706 + a82fc82 + 7c2a059 + 4fefb53 + 599ee3a + ea3fc65 + f6c04c2 + 6591e3d + a4f76e3 + 33c7531 + 2d59782 + 8152327 + e56ce9b + db9b18f + b88635a + a262823 + b79aef6 + c2284e4 + 70193eb + 96acf77 + 9675426 + 5f02411 + 0dafea7 + 15dc674 + 4a2447d + e6eb7f3 + e9499c5 + 272b15f + 11c7758 + 6f0e918 + 5f4980a + ecca95a + 88b5971 + ecb8d13 + 9de1c08 + 44aad17 + 13269e9 + 654cdb6 + dc708db + 380ffba + ff67e7f + fe2e025 + 95f0efa + 68cc4b3 + bf13b96 + 8870381 + 56480f4 + 1fa90d7 + 5c7fe1f + abe9bc1 + a33cacd + cdd7d9f + 6a261b1 + 5e594c4 + 01c1241 + 30d1dd2 + d4af079 + c9aa9b4 + 10f47ca + ef20fa1 + 2187ae2 + e7f3993 + db93d37 + aa57612 + 4af81d8 + 2f90998 + 3013404 + 69d83fe + f383ca9 + 1b26f48 + 054f09d + 0c86829 + f22d81a + e7ebffe + 72a7a54 + cc09223 + ab99f58 + 2c69e37 + b6ccfbc + b92a5da + 773a133 + 9ee28ff + 5865e20 + 63c7303 + 73371d0 + b96f402 + b36e36b + 60fa081 + a1d27a6 + 43e9240 + 9e59ae6 + be1ce44 + 5a6465d + 7e455b4 + 83d837e + 28bc01e + 215be48 + efcc8e0 + 5192ae6 + 7e1ba0f + dec8ccf + 94afc0f + 8c3ea5f + d680762 + 9092473 + 041fc63 + ea6499d + 1f59300 + a75142b + f592cc2 + f523aef + 2d12221 + 34ad758 + 23cc229 + 1fa15a0 + 6b74fc7 + 1472e82 + d816ccc + 7b26586 + 08d26c4 + a5cc444 + fe92acf + 6bd67b2 + 371ba41 + 3e839cb + 0cf26a5 + 8651b9e + a313570 + 7a1829c + 39d06a8 + c05aee7 + 04f4340 + 2494ed2 + 952fe57 + 5d8a1d9 + 147d497 + a17086b + 8848167 + 9f9c3cd + 86bbe35 + 7b574c6 + 06374ae + 42424bf commit 64d144d
Show file tree
Hide file tree
Showing 4 changed files with 211 additions and 0 deletions.
77 changes: 77 additions & 0 deletions src/Translator/Loader/PhpMemoryArray.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace Zend\I18n\Translator\Loader;

use Zend\I18n\Exception;
use Zend\I18n\Translator\Plural\Rule as PluralRule;
use Zend\I18n\Translator\TextDomain;

/**
* PHP array loader.
*/
class PhpMemoryArray implements RemoteLoaderInterface
{
/**
* @var array
*/
protected $messages;

public function __construct($messages)
{
$this->messages = $messages;
}

/**
* Load translations from a remote source.
*
* @param string $locale
* @param string $textDomain
*
* @throws \Zend\I18n\Exception\InvalidArgumentException
* @return \Zend\I18n\Translator\TextDomain|null
*/
public function load($locale, $textDomain)
{
if (!is_array($this->messages)) {
throw new Exception\InvalidArgumentException(sprintf(
'Expected an array, but received %s',
gettype($this->messages)
));
}

if (!isset($this->messages[$textDomain])) {
throw new Exception\InvalidArgumentException(sprintf(
'Expected textdomain "%s" to be an array, but it is not set',
$textDomain)
);
}

if (!isset($this->messages[$textDomain][$locale])) {
throw new Exception\InvalidArgumentException(sprintf(
'Expected locale "%s" to be an array, but it is not set',
$locale)
);
}

$textDomain = new TextDomain($this->messages[$textDomain][$locale]);

if (array_key_exists('', $textDomain)) {
if (isset($textDomain['']['plural_forms'])) {
$textDomain->setPluralRule(
PluralRule::fromString($textDomain['']['plural_forms'])
);
}

unset($textDomain['']);
}

return $textDomain;
}
}
90 changes: 90 additions & 0 deletions test/Translator/Loader/PhpMemoryArrayTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace ZendTest\I18n\Translator\Loader;

use PHPUnit_Framework_TestCase as TestCase;
use Locale;
use Zend\I18n\Translator\Loader\PhpmemoryArray as PhpMemoryArrayLoader;

class PhpMemoryArrayTest extends TestCase
{
protected $testFilesDir;
protected $originalLocale;
protected $originalIncludePath;

public function setUp()
{
if (!extension_loaded('intl')) {
$this->markTestSkipped('ext/intl not enabled');
}

$this->originalLocale = Locale::getDefault();
Locale::setDefault('en_US');

$this->testFilesDir = realpath(__DIR__ . '/../_files/phpmemoryarray');
}

public function tearDown()
{
if (extension_loaded('intl')) {
Locale::setDefault($this->originalLocale);
}
}
public function testLoaderFailsToLoadNonArray()
{
$loader = new PhpMemoryArrayLoader('foo');
$this->setExpectedException('Zend\I18n\Exception\InvalidArgumentException',
'Expected an array, but received');
$loader->load('en_US', 'default');
}

public function testLoaderFailsToLoadMissingTextDomain()
{
$loader = new PhpMemoryArrayLoader(array());
$this->setExpectedException('Zend\I18n\Exception\InvalidArgumentException',
'Expected textdomain "default" to be an array, but it is not set');
$loader->load('en_US', 'default');
}

public function testLoaderFailsToLoadNonArrayLocale()
{
$loader = new PhpMemoryArrayLoader(array('default' => array()));
$this->setExpectedException('Zend\I18n\Exception\InvalidArgumentException',
'Expected locale "en_US" to be an array, but it is not set');
$loader->load('en_US', 'default');
}

public function testLoaderLoadsEmptyArray()
{
$loader = new PhpMemoryArrayLoader(include $this->testFilesDir . '/translation_empty.php');
$textDomain = $loader->load('en_US', 'default');
$this->assertInstanceOf('Zend\I18n\Translator\TextDomain', $textDomain);
}

public function testLoaderReturnsValidTextDomain()
{
$loader = new PhpMemoryArrayLoader(include $this->testFilesDir . '/translation_en.php');
$textDomain = $loader->load('en_US', 'default');

$this->assertEquals('Message 1 (en)', $textDomain['Message 1']);
$this->assertEquals('Message 4 (en)', $textDomain['Message 4']);
}

public function testLoaderLoadsPluralRules()
{
$loader = new PhpMemoryArrayLoader(include $this->testFilesDir . '/translation_en.php');
$textDomain = $loader->load('en_US', 'default');

$this->assertEquals(2, $textDomain->getPluralRule()->evaluate(0));
$this->assertEquals(0, $textDomain->getPluralRule()->evaluate(1));
$this->assertEquals(1, $textDomain->getPluralRule()->evaluate(2));
$this->assertEquals(2, $textDomain->getPluralRule()->evaluate(10));
}
}
15 changes: 15 additions & 0 deletions test/Translator/_files/phpmemoryarray/translation_empty.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

return array(
'default' => array(
'en_US' => array(
),
),
);
29 changes: 29 additions & 0 deletions test/Translator/_files/phpmemoryarray/translation_en.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

return array(
'default' => array(
'en_US' => array(
'' => array(
'plural_forms' => 'nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);'
),
'Message 1' => 'Message 1 (en)',
'Message 2' => 'Message 2 (en)',
'Message 3' => 'Message 3 (en)',
'Message 4' => 'Message 4 (en)',
'Message 5' => array(
0 => 'Message 5 (en) Plural 0',
1 => 'Message 5 (en) Plural 1',
2 => 'Message 5 (en) Plural 2'
),
'Cooking furniture' => 'Küchen Möbel (en)',
'Küchen Möbel' => 'Cooking furniture (en)',
),
),
);

0 comments on commit 64d144d

Please sign in to comment.