From 21931fcf4262f4656f16849735b4ed421516a86c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ale=C5=A1?= Date: Sun, 30 Nov 2025 12:00:49 +0100 Subject: [PATCH 1/2] remove latte 2.0 support --- composer.json | 2 +- phpstan.neon | 74 ---------- src/DI/TranslationExtension.php | 32 ++--- src/Latte/Filters.php | 34 ----- src/Latte/Macros.php | 136 ------------------- src/Latte/TranslatorExtension.php | 6 +- src/PrefixedTranslator.php | 4 +- src/Translator.php | 4 +- tests/Tests/DI/TranslationExtensionTest.phpt | 22 +-- tests/Tests/Latte/FiltersTest.phpt | 32 ----- 10 files changed, 27 insertions(+), 319 deletions(-) delete mode 100644 src/Latte/Filters.php delete mode 100644 src/Latte/Macros.php delete mode 100644 tests/Tests/Latte/FiltersTest.phpt diff --git a/composer.json b/composer.json index d675cc54..a75a5f36 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ ], "require": { "php": "^8.0.2", - "latte/latte": "^2.6|^3.0.25", + "latte/latte": "^3.0.25", "nette/di": "^3.0.6", "nette/finder": "^2.5.2|^3.0.0", "nette/http": "^3.0.7", diff --git a/phpstan.neon b/phpstan.neon index 0402587f..6417d483 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -17,77 +17,3 @@ parameters: count: 2 message: '#^Variable property access on object\.$#' path: 'src/Loaders/Doctrine.php' - - - - count: 2 - message: '#^Comparison operation "\<" between \d+ and \d+ is always false\.$#' - path: 'src/Latte/Macros.php' - - - - count: 1 - message: '#^Comparison operation "\>=" between \d+ and \d+ is always true\.$#' - path: 'src/Latte/Macros.php' - - - - count: 1 - message: '#^Result of && is always false\.$#' - path: 'src/Latte/Macros.php' - - # ------------------------------------------------------------------- - # for back compatibility with old packages - will be remove in future - # ------------------------------------------------------------------- - - - message: """ - #^Fetching class constant class of deprecated interface Nette\\\\Bridges\\\\ApplicationLatte\\\\ILatteFactory\\: - use Nette\\\\Bridges\\\\ApplicationLatte\\\\LatteFactory$# - """ - count: 1 - path: src/DI/TranslationExtension.php - - - - message: """ - #^Fetching class constant class of deprecated interface Nette\\\\Localization\\\\ITranslator\\: - use Nette\\\\Localization\\\\Translator$# - """ - count: 2 - path: src/DI/TranslationExtension.php - - - - count: 1 - message: """ - #^Parameter \\$translator of method Contributte\\\\Translation\\\\Latte\\\\Filters\\:\\:__construct\\(\\) has typehint with deprecated interface Nette\\\\Localization\\\\ITranslator\\: - use Nette\\\\Localization\\\\Translator$# - """ - path: src/Latte/Filters.php - - - - count: 1 - message: """ - #^Parameter \\$translator of method Contributte\\\\Translation\\\\Latte\\\\TranslatorExtension\\:\\:__construct\\(\\) has typehint with deprecated interface Nette\\\\Localization\\\\ITranslator\\: - use Nette\\\\Localization\\\\Translator$# - """ - path: src/Latte/TranslatorExtension.php - - - - count: 1 - message: """ - #^Class Contributte\\\\Translation\\\\PrefixedTranslator implements deprecated interface Nette\\\\Localization\\\\ITranslator\\: - use Nette\\\\Localization\\\\Translator$# - """ - path: src/PrefixedTranslator.php - - - - count: 1 - message: """ - #^Class Contributte\\\\Translation\\\\Translator implements deprecated interface Nette\\\\Localization\\\\ITranslator\\: - use Nette\\\\Localization\\\\Translator$# - """ - path: src/Translator.php - - - - message: """ - #^Instantiation of deprecated class Nette\\\\PhpGenerator\\\\PhpLiteral\\: - use Nette\\\\PhpGenerator\\\\Literal$# - """ - count: 1 - path: src/DI/TranslationExtension.php diff --git a/src/DI/TranslationExtension.php b/src/DI/TranslationExtension.php index 4ad0568a..224be225 100644 --- a/src/DI/TranslationExtension.php +++ b/src/DI/TranslationExtension.php @@ -6,8 +6,6 @@ use Contributte\Translation\Exceptions\InvalidArgument; use Contributte\Translation\FallbackResolver; use Contributte\Translation\Helpers; -use Contributte\Translation\Latte\Filters; -use Contributte\Translation\Latte\Macros; use Contributte\Translation\Latte\TranslatorExtension; use Contributte\Translation\Loaders\Neon; use Contributte\Translation\LocaleResolver; @@ -18,12 +16,11 @@ use Contributte\Translation\LocalesResolvers\Session; use Contributte\Translation\Tracy\Panel; use Contributte\Translation\Translator; -use Nette\Bridges\ApplicationLatte\ILatteFactory; +use Nette\Bridges\ApplicationLatte\LatteFactory; use Nette\DI\CompilerExtension; use Nette\DI\MissingServiceException; -use Nette\Localization\ITranslator; +use Nette\Localization\Translator as NetteTranslator; use Nette\PhpGenerator\ClassType; -use Nette\PhpGenerator\PhpLiteral; use Nette\Schema\Expect; use Nette\Schema\Schema; use Nette\Utils\Finder; @@ -82,7 +79,7 @@ public function getConfigSchema(): Schema 'translatorFactory' => Expect::string()->default(null), 'returnOriginalMessage' => Expect::bool()->default(true), 'autowired' => Expect::type('bool|array')->default(true), - 'latteFactory' => Expect::string(ILatteFactory::class)->nullable(), + 'latteFactory' => Expect::string(LatteFactory::class)->nullable(), ]); } @@ -144,7 +141,7 @@ public function loadConfiguration(): void if ($this->config->autowired === true) { $autowired = [ - ITranslator::class, + NetteTranslator::class, TranslatorInterface::class, Translator::class, ]; @@ -233,26 +230,13 @@ public function beforeCompile(): void $latteFactoryName = $this->config->latteFactory ? $builder->getByType($this->config->latteFactory) : null; if ($latteFactoryName !== null) { - $iTranslator = $builder->getDefinitionByType(ITranslator::class); - - $latteFilters = $builder->addDefinition($this->prefix('latte.filters')) - ->setFactory(Filters::class); - /** @var \Nette\DI\Definitions\FactoryDefinition $latteFactory */ $latteFactory = $builder->getDefinition($latteFactoryName); - /** @phpstan-ignore-next-line */ - if (version_compare(\Latte\Engine::VERSION, '3', '<')) { - $latteFactory->getResultDefinition() - ->addSetup('?->onCompile[] = function (Latte\\Engine $engine): void { ?::install($engine->getCompiler()); }', ['@self', new PhpLiteral(Macros::class)]) - ->addSetup('addProvider', ['translator', $iTranslator]) - ->addSetup('addFilter', ['translate', [$latteFilters, 'translate']]); - } else { - $latteExtension = $builder->addDefinition($this->prefix('latte.extension')) - ->setFactory(TranslatorExtension::class); - $latteFactory->getResultDefinition() - ->addSetup('addExtension', [$latteExtension]); - } + $latteExtension = $builder->addDefinition($this->prefix('latte.extension')) + ->setFactory(TranslatorExtension::class); + $latteFactory->getResultDefinition() + ->addSetup('addExtension', [$latteExtension]); } /** @var \Contributte\Translation\DI\TranslationProviderInterface $v1 */ diff --git a/src/Latte/Filters.php b/src/Latte/Filters.php deleted file mode 100644 index 3c077a11..00000000 --- a/src/Latte/Filters.php +++ /dev/null @@ -1,34 +0,0 @@ -translator = $translator; - } - - /** - * @param \Latte\Runtime\FilterInfo $filterInfo - * @param mixed $message - * @param mixed ...$parameters - */ - public function translate( - FilterInfo $filterInfo, - $message, - ...$parameters - ): string - { - return $this->translator->translate($message, ...$parameters); - } - -} diff --git a/src/Latte/Macros.php b/src/Latte/Macros.php deleted file mode 100644 index 87c3c2c9..00000000 --- a/src/Latte/Macros.php +++ /dev/null @@ -1,136 +0,0 @@ -addMacro('_', [$me, 'macroTranslate'], [$me, 'macroTranslate']); - $me->addMacro('translator', [$me, 'macroPrefix'], [$me, 'macroPrefix']); - } - - /** - * {_ ...} - * - * @throws \Latte\CompileException - */ - public function macroTranslate( - MacroNode $node, - PhpWriter $writer - ): string - { - if ($node->closing) { - if (strpos($node->content, 'content, true); - $node->content = ''; - - } else { - $node->openingCode = '' . $node->openingCode; - $value = 'ob_get_clean()'; - } - - /** @phpstan-ignore-next-line */ - if (!defined(Engine::class . '::VERSION_ID') || Engine::VERSION_ID < 20900) { - $latteProp = '$_fi'; - /** @phpstan-ignore-next-line */ - } elseif (Engine::VERSION_ID >= 20900 && Engine::VERSION_ID < 20902) { - $latteProp = '$__fi'; - } else { - $latteProp = '$ʟ_fi'; - } - - return $writer->write(sprintf('%s = new LR\FilterInfo(%%var); echo %%modifyContent($this->filters->filterContent("translate", %s, %%raw))', $latteProp, $latteProp), $node->context[0], $value); - } - - if ($node->empty = ($node->args !== '')) { - $messageProp = Helpers::createLatteProperty('Message'); - $prefixProp = Helpers::createLatteProperty('Prefix'); - - $macroCodeEcho = self::macroWithoutParameters($node) - ? sprintf('echo %%modify(call_user_func($this->filters->translate, %s))', $messageProp) - : sprintf('echo %%modify(call_user_func($this->filters->translate, %s, %%node.args))', $messageProp); - - return $writer->write(sprintf(' - %s = %%node.word; - - if (is_string(%s)) { - %s = isset(%s) && !\Contributte\Translation\Helpers::isAbsoluteMessage(%%node.word) ? implode(".", %s) . "." . %%node.word : %%node.word; - } - - %s; - ', $messageProp, $messageProp, $messageProp, $prefixProp, $prefixProp, $macroCodeEcho)); - } - - return ''; - } - - /** - * {translate ...} - * - * @throws \Latte\CompileException - */ - public function macroPrefix( - MacroNode $node, - PhpWriter $writer - ): string - { - $prefixProp = Helpers::createLatteProperty('Prefix'); - $tempPrefixProp = Helpers::createLatteProperty('TempPrefix'); - - if ($node->closing) { - if ($node->content !== null && $node->content !== '') { - return $writer->write(sprintf('%s = array_pop(%s);', $prefixProp, $tempPrefixProp)); - } - - return ''; - } - - if ($node->args === '') { - throw new CompileException('Expected message prefix, none given.'); - } - - return $writer->write(sprintf(' - if (!isset(%s)) { - %s = []; - } - - if (isset(%s)) { - %s[] = %s; - } - - %s = [%%node.word]; - ', $tempPrefixProp, $tempPrefixProp, $prefixProp, $tempPrefixProp, $prefixProp, $prefixProp)); - } - - public static function macroWithoutParameters( - MacroNode $node - ): bool - { - $result = Strings::trim($node->tokenizer->joinUntil(',')) === Strings::trim($node->args); - $node->tokenizer->reset(); - return $result; - } - -} diff --git a/src/Latte/TranslatorExtension.php b/src/Latte/TranslatorExtension.php index 5ea29dd3..f58b9f64 100644 --- a/src/Latte/TranslatorExtension.php +++ b/src/Latte/TranslatorExtension.php @@ -19,15 +19,15 @@ use Latte\Compiler\Tag; use Latte\Extension; use Latte\Runtime\FilterInfo; -use Nette\Localization\ITranslator; +use Nette\Localization\Translator; class TranslatorExtension extends Extension { - private ITranslator $translator; + private Translator $translator; public function __construct( - ITranslator $translator + Translator $translator ) { $this->translator = $translator; diff --git a/src/PrefixedTranslator.php b/src/PrefixedTranslator.php index bddb7545..d40ed73e 100644 --- a/src/PrefixedTranslator.php +++ b/src/PrefixedTranslator.php @@ -2,9 +2,9 @@ namespace Contributte\Translation; -use Nette\Localization\ITranslator; +use Nette\Localization\Translator as NetteTranslator; -class PrefixedTranslator implements ITranslator +class PrefixedTranslator implements NetteTranslator { private Translator $translator; diff --git a/src/Translator.php b/src/Translator.php index e8658650..8335d96f 100644 --- a/src/Translator.php +++ b/src/Translator.php @@ -7,13 +7,13 @@ use Contributte\Translation\Wrappers\Message; use Contributte\Translation\Wrappers\NotTranslate; use Generator; -use Nette\Localization\ITranslator; +use Nette\Localization\Translator as NetteTranslator; use Nette\Utils\Strings; use Nette\Utils\Validators; use Psr\Log\LoggerInterface; use Symfony\Component\Translation\Translator as SymfonyTranslator; -class Translator extends SymfonyTranslator implements ITranslator +class Translator extends SymfonyTranslator implements NetteTranslator { private LocaleResolver $localeResolver; diff --git a/tests/Tests/DI/TranslationExtensionTest.phpt b/tests/Tests/DI/TranslationExtensionTest.phpt index cf771b18..a2137fb6 100644 --- a/tests/Tests/DI/TranslationExtensionTest.phpt +++ b/tests/Tests/DI/TranslationExtensionTest.phpt @@ -12,9 +12,9 @@ use Nette\DI\Compiler; use Nette\DI\CompilerExtension; use Nette\DI\ContainerLoader; use Nette\DI\MissingServiceException; +use Nette\DI\ServiceCreationException; use Nette\InvalidStateException; -use Nette\Localization\ITranslator; -use Nette\Utils\Strings; +use Nette\Localization\Translator as NetteTranslator; use Psr\Log\LoggerInterface; use stdClass; use Symfony\Component\Config\ConfigCacheFactoryInterface; @@ -140,7 +140,7 @@ final class TranslationExtensionTest extends TestAbstract $compiler->addConfig(['parameters' => $this->container->getParameters(), 'translation' => ['dirs' => [__DIR__ . '__config_dir__']]]); }); }, $this->isNewNetteUtils ? InvalidStateException::class : UnexpectedValueException::class); - Assert::true(Strings::contains($e->getMessage(), __DIR__ . '/__translation_provider_dir__'));// translation provider dirs first !! + Assert::true(str_contains($e->getMessage(), __DIR__ . '/__translation_provider_dir__'));// translation provider dirs first !! } public function test03(): void @@ -154,8 +154,8 @@ final class TranslationExtensionTest extends TestAbstract /** @var Panel $panel */ $panel = $container->getByType(Panel::class); - /** @var Translator $translator */ - $translator = $container->getByType(ITranslator::class); + /** @var \Contributte\Translation\Translator $translator */ + $translator = $container->getByType(NetteTranslator::class); $tracyPanel = $translator->getTracyPanel(); @@ -194,8 +194,8 @@ final class TranslationExtensionTest extends TestAbstract ], ]); - /** @var Translator $translator */ - $translator = $container->getByType(ITranslator::class); + /** @var \Contributte\Translation\Translator $translator */ + $translator = $container->getByType(NetteTranslator::class); Assert::same($translator->getFallbackLocales(), ['cs_CZ']); } @@ -210,7 +210,7 @@ final class TranslationExtensionTest extends TestAbstract ]); /** @var \Contributte\Translation\Translator $translator */ - $translator = $container->getByType(ITranslator::class); + $translator = $container->getByType(NetteTranslator::class); Assert::type(CustomTranslatorMock::class, $translator); @@ -227,7 +227,7 @@ final class TranslationExtensionTest extends TestAbstract ]); /** @var \Contributte\Translation\Translator $translator */ - $translator = $container->getByType(ITranslator::class); + $translator = $container->getByType(NetteTranslator::class); Assert::false($translator->returnOriginalMessage); } @@ -241,7 +241,7 @@ final class TranslationExtensionTest extends TestAbstract ]); /** @var \Contributte\Translation\Translator $translator */ - $translator = $container->getByType(ITranslator::class); + $translator = $container->getByType(NetteTranslator::class); Assert::false($translator->returnOriginalMessage); } @@ -256,7 +256,7 @@ final class TranslationExtensionTest extends TestAbstract ], ]); }, - MissingServiceException::class + ServiceCreationException::class ); } diff --git a/tests/Tests/Latte/FiltersTest.phpt b/tests/Tests/Latte/FiltersTest.phpt deleted file mode 100644 index c92d4139..00000000 --- a/tests/Tests/Latte/FiltersTest.phpt +++ /dev/null @@ -1,32 +0,0 @@ -shouldReceive('translate') - ->once() - ->withArgs(['message', 'parameters']) - ->andReturn(''); - - $filters = new Filters($translatorMock); - Assert::same('', $filters->translate(new FilterInfo(), 'message', 'parameters')); - } - -} - -(new FiltersTest($container))->run(); From 53632fdd69f62cbf2bd2ec0a2668554a4f2ee9b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ale=C5=A1?= Date: Sun, 30 Nov 2025 12:04:27 +0100 Subject: [PATCH 2/2] Update phpstan.lowest.neon --- phpstan.lowest.neon | 52 --------------------------------------------- 1 file changed, 52 deletions(-) diff --git a/phpstan.lowest.neon b/phpstan.lowest.neon index c13d1345..8e5cf1b7 100644 --- a/phpstan.lowest.neon +++ b/phpstan.lowest.neon @@ -17,55 +17,3 @@ parameters: count: 2 message: '#^Variable property access on object\.$#' path: 'src/Loaders/Doctrine.php' - - # ------------------------------------------------------------------- - # for back compatibility with old packages - will be remove in future - # ------------------------------------------------------------------- - - - - message: """ - #^Fetching class constant class of deprecated class Nette\\\\Localization\\\\ITranslator\\: - use Nette\\\\Localization\\\\Translator$# - """ - count: 2 - path: src/DI/TranslationExtension.php - - - - count: 1 - message: """ - #^Parameter \\$translator of method Contributte\\\\Translation\\\\Latte\\\\Filters\\:\\:__construct\\(\\) has typehint with deprecated interface Nette\\\\Localization\\\\ITranslator\\: - use Nette\\\\Localization\\\\Translator$# - """ - path: src/Latte/Filters.php - - - - count: 1 - message: """ - #^Parameter \\$translator of method Contributte\\\\Translation\\\\Latte\\\\TranslatorExtension\\:\\:__construct\\(\\) has typehint with deprecated interface Nette\\\\Localization\\\\ITranslator\\: - use Nette\\\\Localization\\\\Translator$# - """ - path: src/Latte/TranslatorExtension.php - - - - count: 1 - message: """ - #^Class Contributte\\\\Translation\\\\PrefixedTranslator implements deprecated interface Nette\\\\Localization\\\\ITranslator\\: - use Nette\\\\Localization\\\\Translator$# - """ - path: src/PrefixedTranslator.php - - - - count: 1 - message: """ - #^Class Contributte\\\\Translation\\\\Translator implements deprecated interface Nette\\\\Localization\\\\ITranslator\\: - use Nette\\\\Localization\\\\Translator$# - """ - path: src/Translator.php - - - - message: """ - #^Fetching class constant class of deprecated class Nette\\\\Bridges\\\\ApplicationLatte\\\\ILatteFactory\\: - use Nette\\\\Bridges\\\\ApplicationLatte\\\\LatteFactory$# - """ - count: 1 - path: src/DI/TranslationExtension.php