Skip to content

Commit

Permalink
Translations
Browse files Browse the repository at this point in the history
  • Loading branch information
bajb committed Mar 19, 2019
1 parent f7a432d commit c3b8967
Show file tree
Hide file tree
Showing 15 changed files with 380 additions and 34 deletions.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"packaged/helpers": "~1.0||^2.0"
},
"require-dev": {
"phpunit/phpunit": "~4.6"
"phpunit/phpunit": "~8.0"
},
"autoload": {
"psr-4": {
Expand Down
9 changes: 2 additions & 7 deletions phpunit.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,15 @@
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
>
>
<testsuites>
<testsuite>
<testsuite name="tests">
<directory>tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">src</directory>
</whitelist>
<blacklist>
<directory suffix=".php">vendor</directory>
<directory suffix=".php">tests</directory>
</blacklist>
</filter>
</phpunit>
17 changes: 3 additions & 14 deletions src/Translatable.php
Original file line number Diff line number Diff line change
@@ -1,20 +1,9 @@
<?php

namespace Packaged\I18n;

interface Translatable
{
public function _($text, array $args = null): string;

public function _p($singular, $plural, int $n, array $args = null): string;

/**
* @param string $simplePlural - shortcut for _p(text,texts,n) written as _sp(text(s),n)
* @param int $n
* @param array|null $args
* @return mixed
*/
public function _sp($simplePlural, int $n, array $args = null): string;
public function _($text, array $replacements = null): string;

public function _c($text, $plural, $n, array $args = null): string;
}
public function _p($singular, $plural, int $n, array $replacements = null): string;
}
29 changes: 17 additions & 12 deletions src/TranslatableTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,31 @@

namespace Packaged\I18n;

use Packaged\I18n\Translators\Translator;

trait TranslatableTrait
{
public function _($text, array $args = null): string
{
// TODO: Implement _() method.
}
abstract protected function getTranslator(): Translator;

public function _p($singular, $plural, int $n, array $args = null): string
public function _($text, array $replacements = null): string
{
// TODO: Implement _p() method.
return $this->getTranslator()->_($text, $replacements);
}

public function _sp($simplePlural, int $n, array $args = null): string
public function _p($singular, $plural, int $n, array $replacements = null): string
{
return $this->_p(str_replace('(s)', '', $simplePlural), str_replace('(s)', 's', $simplePlural), $n, $args);
return $this->getTranslator()->_p($singular, $plural, $n, $replacements);
}

public function _c($text, $plural, $n, array $args = null): string
/**
* @param string $simplePlural - shortcut for _p(text,texts,n) written as _sp("text(s)",n)
* @param int $n
* @param array|null $replacements
*
* @return mixed
*/
public function _sp($simplePlural, int $n, array $replacements = null): string
{
// TODO: Implement _c() method.
return $this->_p(str_replace('(s)', '', $simplePlural), str_replace('(s)', 's', $simplePlural), $n, $replacements);
}

}
}
20 changes: 20 additions & 0 deletions src/Translators/AbstractTranslator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php
namespace Packaged\I18n\Translators;

abstract class AbstractTranslator implements Translator
{
protected function _applyReplacements(string $text, array $replacements = null): string
{
if($replacements === null || empty($replacements))
{
return $text;
}

foreach($replacements as $key => $value)
{
$text = str_replace('{' . $key . '}', $value, $text);
}

return $text;
}
}
15 changes: 15 additions & 0 deletions src/Translators/ReplacementsOnlyTranslator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php
namespace Packaged\I18n\Translators;

class ReplacementsOnlyTranslator extends AbstractTranslator
{
public function _($text, array $replacements = null): string
{
return $this->_applyReplacements($text, $replacements);
}

public function _p($singular, $plural, int $n, array $replacements = null): string
{
return $this->_applyReplacements($n == 1 ? $singular : $plural, $replacements);
}
}
20 changes: 20 additions & 0 deletions src/Translators/ReverseTranslator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php
namespace Packaged\I18n\Translators;

class ReverseTranslator extends AbstractTranslator
{
public function _($text, array $replacements = null): string
{
return $this->_applyReplacements($this->_reverse($text), $replacements);
}

public function _p($singular, $plural, int $n, array $replacements = null): string
{
return $this->_applyReplacements($this->_reverse($n == 1 ? $singular : $plural), $replacements);
}

protected function _reverse($text)
{
return preg_replace_callback('/(?!\{)\b(\w+)\b(?!\})/', function ($str) { return strrev($str[0]); }, $text);
}
}
25 changes: 25 additions & 0 deletions src/Translators/StarTranslator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php
namespace Packaged\I18n\Translators;

class StarTranslator extends AbstractTranslator
{
public function _($text, array $replacements = null): string
{
return $this->_applyReplacements($this->_applyStars($text), $replacements);
}

public function _p($singular, $plural, int $n, array $replacements = null): string
{
return $this->_applyReplacements($this->_applyStars($n == 1 ? $singular : $plural), $replacements);
}

protected function _applyStars($text)
{
return preg_replace_callback(
'/(?!\{)\b(\w+)\b(?!\})/',
function ($str) { return str_repeat('*', strlen($str[0])); },
$text
);
}

}
8 changes: 8 additions & 0 deletions src/Translators/Translator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php
namespace Packaged\I18n\Translators;

use Packaged\I18n\Translatable;

interface Translator extends Translatable
{
}
53 changes: 53 additions & 0 deletions src/Translators/WordJumbleTranslator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php
namespace Packaged\I18n\Translators;

class WordJumbleTranslator extends AbstractTranslator
{
const STYLE_RSORT = 'rsort';
const STYLE_SORT = 'sort';
const STYLE_SHUFFLE = 'shuffle';

protected $_style;

public function __construct($style = self::STYLE_SHUFFLE)
{
$this->_style = $style;
}

public function _($text, array $replacements = null): string
{
return $this->_applyReplacements($this->_jumble($text), $replacements);
}

public function _p($singular, $plural, int $n, array $replacements = null): string
{
return $this->_applyReplacements($this->_jumble($n == 1 ? $singular : $plural), $replacements);
}

protected function _jumble($text)
{
return preg_replace_callback(
'/(?!\{)\b(\w+)\b(?!\})/',
function ($str) {
$chars = str_split($str[0]);

$first = array_shift($chars);
$last = array_pop($chars);
switch($this->_style)
{
case self::STYLE_SHUFFLE:
shuffle($chars);
break;
case self::STYLE_RSORT:
rsort($chars);
break;
case self::STYLE_SORT:
sort($chars);
break;
}
return $first . implode('', $chars) . $last;
},
$text
);
}
}
34 changes: 34 additions & 0 deletions tests/Supporting/TranslatedTextTestClass.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php
namespace Tests\Supporting;

use Packaged\I18n\Translatable;
use Packaged\I18n\TranslatableTrait;
use Packaged\I18n\Translators\Translator;

class TranslatedTextTestClass implements Translatable
{
public function __construct(Translator $translator)
{
$this->_translator = $translator;
}

use TranslatableTrait;

protected $_translator;

/**
* @param Translator $translator
*
* @return TranslatedTextTestClass
*/
public function setTranslator(Translator $translator): TranslatedTextTestClass
{
$this->_translator = $translator;
return $this;
}

protected function getTranslator(): Translatable
{
return $this->_translator;
}
}
42 changes: 42 additions & 0 deletions tests/Translators/ReplacementsOnlyTranslatorTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

namespace Tests\Translators;

use Packaged\I18n\Translators\ReplacementsOnlyTranslator;
use PHPUnit\Framework\TestCase;
use Tests\Supporting\TranslatedTextTestClass;

class ReplacementsOnlyTranslatorTest extends TestCase
{
protected function _getTester()
{
return $class = new TranslatedTextTestClass(new ReplacementsOnlyTranslator());
}

public function test_p()
{
$class = $this->_getTester();
$msg = 'You have {fileCount} file';
$msg2 = 'You have {fileCount} files';
$this->assertEquals('You have 0 files', $class->_p($msg, $msg2, 0, ['fileCount' => 0]));
$this->assertEquals('You have 1 file', $class->_p($msg, $msg2, 1, ['fileCount' => 1]));
$this->assertEquals('You have 2 files', $class->_p($msg, $msg2, 2, ['fileCount' => 2]));
}

public function test_sp()
{
$class = $this->_getTester();
$msg = 'You have {fileCount} file(s)';
$this->assertEquals('You have 0 files', $class->_sp($msg, 0, ['fileCount' => 0]));
$this->assertEquals('You have 1 file', $class->_sp($msg, 1, ['fileCount' => 1]));
$this->assertEquals('You have 2 files', $class->_sp($msg, 2, ['fileCount' => 2]));
$this->assertEquals('You have 3 files', $class->_sp($msg, 3, ['fileCount' => 3]));
}

public function test_()
{
$class = $this->_getTester();
$this->assertEquals('Hello John', $class->_('Hello {name}', ['name' => 'John']));
$this->assertEquals('Hello {name}', $class->_('Hello {name}', []));
}
}
41 changes: 41 additions & 0 deletions tests/Translators/ReverseTranslatorTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

namespace Tests\Translators;

use Packaged\I18n\Translators\ReverseTranslator;
use PHPUnit\Framework\TestCase;
use Tests\Supporting\TranslatedTextTestClass;

class ReverseTranslatorTest extends TestCase
{
protected function _getTester()
{
return $class = new TranslatedTextTestClass(new ReverseTranslator());
}

public function test_p()
{
$class = $this->_getTester();
$msg = 'You have {fileCount} file';
$msg2 = 'You have {fileCount} files';
$this->assertEquals('uoY evah 0 selif', $class->_p($msg, $msg2, 0, ['fileCount' => 0]));
$this->assertEquals('uoY evah 1 elif', $class->_p($msg, $msg2, 1, ['fileCount' => 1]));
$this->assertEquals('uoY evah 2 selif', $class->_p($msg, $msg2, 2, ['fileCount' => 2]));
}

public function test_sp()
{
$class = $this->_getTester();
$msg = 'You have {fileCount} file(s)';
$this->assertEquals('uoY evah 0 selif', $class->_sp($msg, 0, ['fileCount' => 0]));
$this->assertEquals('uoY evah 1 elif', $class->_sp($msg, 1, ['fileCount' => 1]));
$this->assertEquals('uoY evah 2 selif', $class->_sp($msg, 2, ['fileCount' => 2]));
$this->assertEquals('uoY evah 3 selif', $class->_sp($msg, 3, ['fileCount' => 3]));
}

public function test_()
{
$class = $this->_getTester();
$this->assertEquals('olleH John', $class->_('Hello {name}', ['name' => 'John']));
}
}
Loading

0 comments on commit c3b8967

Please sign in to comment.