diff --git a/composer.json b/composer.json index 0883745..0be9dc6 100644 --- a/composer.json +++ b/composer.json @@ -11,10 +11,12 @@ ], "require": { "php": ">=7.1", + "nette/di": "^3.0", "nette/utils": "^3.0" }, "require-dev": { "nette/tester": "^2.3", + "nette/bootstrap": "^3.0", "tracy/tracy": "^2.7" }, "replace": { diff --git a/src/Drago/Localization/DI/TranslatorExtension.php b/src/Drago/Localization/DI/TranslatorExtension.php new file mode 100644 index 0000000..3065dc7 --- /dev/null +++ b/src/Drago/Localization/DI/TranslatorExtension.php @@ -0,0 +1,37 @@ +translateDir = $translateDir; + } + + + public function loadConfiguration(): void + { + $builder = $this->getContainerBuilder(); + $builder->addDefinition($this->prefix('translator')) + ->setFactory(Translator::class, [$this->translateDir]); + } +} diff --git a/src/Drago/Localization/Translator.php b/src/Drago/Localization/Translator.php index 1678f74..75bb07f 100644 --- a/src/Drago/Localization/Translator.php +++ b/src/Drago/Localization/Translator.php @@ -23,18 +23,22 @@ class Translator implements ITranslator /** @var array */ private $message; + /** @var string */ + private $translateDir; + + + public function __construct(string $translateDir) + { + $this->translateDir = $translateDir; + } + /** - * Path to the translation file. * @throws \Exception */ - public function setFile(string $file): array + public function setTranslate(string $translate): array { - $file = $file . '.ini'; - if (!is_file($file)) { - throw new \Exception('The translation file was not found.'); - } - + $file = $this->translateDir . '/' . $translate . '.ini'; $this->message = parse_ini_file($file); return $this->message; } diff --git a/src/Drago/Localization/Locale.php b/src/Drago/Localization/TranslatorAdapter.php similarity index 50% rename from src/Drago/Localization/Locale.php rename to src/Drago/Localization/TranslatorAdapter.php index bc68a8b..f88e163 100644 --- a/src/Drago/Localization/Locale.php +++ b/src/Drago/Localization/TranslatorAdapter.php @@ -13,7 +13,7 @@ /** * Simple translator. */ -trait Locale +trait TranslatorAdapter { /** * @var string @@ -21,21 +21,22 @@ trait Locale */ public $lang; - /** - * @var Translator - * @inject - */ + /** @var Translator */ public $translator; + public function injectTranslator(Translator $translator): void + { + $this->translator = $translator; + } + + /** - * Create a translation. * @throws \Exception */ - public function createTranslator(string $file): Translator + public function getTranslator(): Translator { - $translator = $this->translator; - $translator->setFile($file); - return $translator; + $this->translator->setTranslate($this->lang); + return $this->translator; } } diff --git a/src/Drago/Localization/TranslateControl.php b/src/Drago/Localization/TranslatorControl.php similarity index 79% rename from src/Drago/Localization/TranslateControl.php rename to src/Drago/Localization/TranslatorControl.php index 0045ba6..93e953b 100644 --- a/src/Drago/Localization/TranslateControl.php +++ b/src/Drago/Localization/TranslatorControl.php @@ -13,13 +13,13 @@ /** * Simple translator. */ -trait TranslateControl +trait TranslatorControl { /** @var Translator */ private $translator; - public function setTranslator(Translator $translator) + public function setTranslator(Translator $translator): void { $this->translator = $translator; } diff --git a/tests/TestContainer.php b/tests/TestContainer.php new file mode 100644 index 0000000..a7010a3 --- /dev/null +++ b/tests/TestContainer.php @@ -0,0 +1,21 @@ +container = $container; + } +} diff --git a/tests/Translator/Control.php b/tests/Translator/Control.php new file mode 100644 index 0000000..ab9893c --- /dev/null +++ b/tests/Translator/Control.php @@ -0,0 +1,10 @@ +container->getParameters(); + $loader = new DI\ContainerLoader($params['tempDir'], true); + + $class = $loader->load(function (DI\Compiler $compiler) use ($params): void { + $compiler->addExtension('translator', new Localization\DI\TranslatorExtension( + $params['appDir'] . '/locale' + )); + }); + return new $class; + } + + + private function getTranslatorByType(): Localization\Translator + { + $translator = $this->createContainer(); + return $translator->getByType(Localization\Translator::class); + } + + + public function test01(): void + { + Assert::type(Localization\Translator::class, $this->getTranslatorByType()); + } + + + public function test02(): void + { + $class = $this->getTranslatorByType(); + + Assert::type('array', $class->setTranslate('en')); + Assert::type('string', $class->translate('hello.world')); + Assert::same('Hello, world!', $class->translate('hello.world')); + } + + + public function test03(): void + { + $class = $this->getTranslatorByType(); + $presenter = new \Presenter; + $presenter->lang = 'en'; + $presenter->translator = $class; + + Assert::type($presenter->getTranslator(), $class); + + } + + + public function test04(): void + { + $class = $this->getTranslatorByType(); + $control = new \Control; + $control->setTranslator($class); + + Assert::type($control->getTranslator(), $class); + } +} + +$extension = new TranslatorExtension($container); +$extension->run(); diff --git a/tests/Translator/Locale.phpt b/tests/Translator/Locale.phpt deleted file mode 100644 index 8ae7251..0000000 --- a/tests/Translator/Locale.phpt +++ /dev/null @@ -1,20 +0,0 @@ -translator = new Translator; -$locale->lang = 'en'; - -Assert::type(Translator::class, $locale->createTranslator(__DIR__ . '/' . $locale->lang)); diff --git a/tests/Translator/Presenter.php b/tests/Translator/Presenter.php new file mode 100644 index 0000000..991831c --- /dev/null +++ b/tests/Translator/Presenter.php @@ -0,0 +1,10 @@ +setFile(__DIR__ . '/en'); - -$control = new Control; -$control->setTranslator($translator); - -Assert::type(Translator::class, $control->getTranslator()); diff --git a/tests/Translator/Translator.phpt b/tests/Translator/Translator.phpt deleted file mode 100644 index 3df4ac8..0000000 --- a/tests/Translator/Translator.phpt +++ /dev/null @@ -1,17 +0,0 @@ -setFile(__DIR__ . '/en'); - -Assert::type('string', $translator->translate('hello.world')); -Assert::same('Hello, world!', $translator->translate('hello.world')); -Assert::exception(function () use ($translator) { - $translator->setFile(''); -}, Exception::class, 'The translation file was not found.'); diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 642b2b1..cd5b194 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -6,3 +6,13 @@ Tester\Environment::setup(); date_default_timezone_set('Europe/Prague'); +define('TEMP_DIR', __DIR__ . '/tmp'); + +$boot = new Nette\Configurator; +$boot->setTempDirectory(TEMP_DIR); +$boot->createRobotLoader() + ->addDirectory(__DIR__) + ->addDirectory(__DIR__ . '/../src') + ->register(); + +return $boot->createContainer(); diff --git a/tests/Translator/en.ini b/tests/locale/en.ini similarity index 100% rename from tests/Translator/en.ini rename to tests/locale/en.ini