Skip to content

Commit 5c1ddbe

Browse files
committed
fix: add event support to translator
1 parent c37f193 commit 5c1ddbe

File tree

5 files changed

+52
-7
lines changed

5 files changed

+52
-7
lines changed

packages/intl/src/Catalog/CatalogInitializer.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Tempest\Container\Container;
66
use Tempest\Container\Initializer;
7+
use Tempest\Container\Singleton;
78
use Tempest\Intl\IntlConfig;
89
use Tempest\Intl\Locale;
910
use Tempest\Support\Arr;
@@ -12,6 +13,7 @@
1213

1314
final class CatalogInitializer implements Initializer
1415
{
16+
#[Singleton]
1517
public function initialize(Container $container): Catalog
1618
{
1719
$config = $container->get(IntlConfig::class);

packages/intl/src/GenericTranslator.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
{
1313
public function __construct(
1414
private IntlConfig $config,
15-
private Catalog $catalog,
15+
private(set) Catalog $catalog,
1616
private MessageFormatter $formatter,
1717
private ?EventBus $eventBus = null,
1818
) {}

packages/intl/src/MessageFormatterInitializer.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44

55
use Tempest\Container\Container;
66
use Tempest\Container\Initializer;
7+
use Tempest\Container\Singleton;
78
use Tempest\Intl\MessageFormat\Formatter\MessageFormatter;
89
use Tempest\Intl\PluralRules\PluralRulesMatcher;
910

1011
final class MessageFormatterInitializer implements Initializer
1112
{
13+
#[Singleton]
1214
public function initialize(Container $container): mixed
1315
{
1416
$config = $container->get(IntlConfig::class);

packages/intl/src/TranslatorInitializer.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,22 @@
44

55
use Tempest\Container\Container;
66
use Tempest\Container\Initializer;
7+
use Tempest\Container\Singleton;
8+
use Tempest\EventBus\EventBus;
79
use Tempest\Intl\Catalog\Catalog;
810
use Tempest\Intl\IntlConfig;
911
use Tempest\Intl\MessageFormat\Formatter\MessageFormatter;
1012

1113
final class TranslatorInitializer implements Initializer
1214
{
15+
#[Singleton]
1316
public function initialize(Container $container): Translator
1417
{
1518
return new GenericTranslator(
1619
config: $container->get(IntlConfig::class),
1720
catalog: $container->get(Catalog::class),
1821
formatter: $container->get(MessageFormatter::class),
22+
eventBus: $container->get(EventBus::class),
1923
);
2024
}
2125
}

tests/Integration/Intl/TranslatorTest.php

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,17 @@
22

33
namespace Tests\Tempest\Integration\Intl;
44

5-
use Tempest\Core\Commands\DiscoveryClearCommand;
6-
use Tempest\Core\DiscoveryCache;
7-
use Tempest\Core\FrameworkKernel;
8-
use Tempest\Core\Kernel\LoadDiscoveryClasses;
9-
use Tempest\Discovery\DiscoveryLocation;
5+
use Tempest\EventBus\EventBus;
106
use Tempest\Intl\Catalog\Catalog;
117
use Tempest\Intl\IntlConfig;
128
use Tempest\Intl\Locale;
9+
use Tempest\Intl\TranslationFailure;
10+
use Tempest\Intl\TranslationMiss;
1311
use Tempest\Intl\Translator;
1412
use Tests\Tempest\Integration\FrameworkIntegrationTestCase;
1513

1614
use function Tempest\Intl\translate;
1715
use function Tempest\Intl\translate_locale;
18-
use function Tempest\Support\Path\normalize;
1916

2017
final class TranslatorTest extends FrameworkIntegrationTestCase
2118
{
@@ -50,4 +47,44 @@ public function test_default_locale(): void
5047

5148
$this->assertSame(Locale::default(), $config->currentLocale);
5249
}
50+
51+
public function test_event_miss(): void
52+
{
53+
/** @var TranslationMiss|null $received */
54+
$received = null;
55+
56+
$eventbus = $this->container->get(EventBus::class);
57+
$eventbus->listen(TranslationMiss::class, function (TranslationMiss $event) use (&$received): void {
58+
$received = $event;
59+
});
60+
61+
$translator = $this->container->get(Translator::class);
62+
$translator->translate('unknown');
63+
64+
$this->assertInstanceOf(TranslationMiss::class, $received);
65+
$this->assertSame(Locale::ENGLISH_UNITED_STATES, $received->locale);
66+
$this->assertSame('unknown', $received->key);
67+
}
68+
69+
public function test_event_fail(): void
70+
{
71+
/** @var TranslationFailure|null $received */
72+
$received = null;
73+
74+
$eventbus = $this->container->get(EventBus::class);
75+
$eventbus->listen(TranslationFailure::class, function (TranslationFailure $event) use (&$received): void {
76+
$received = $event;
77+
});
78+
79+
$catalog = $this->container->get(Catalog::class);
80+
$catalog->add(Locale::ENGLISH_UNITED_STATES, 'failure', '{$foo');
81+
82+
$translator = $this->container->get(Translator::class);
83+
$translator->translate('failure');
84+
85+
$this->assertInstanceOf(TranslationFailure::class, $received);
86+
$this->assertSame(Locale::ENGLISH_UNITED_STATES, $received->locale);
87+
$this->assertSame('failure', $received->key);
88+
$this->assertSame('Failed to parse message.', $received->exception->getMessage());
89+
}
5390
}

0 commit comments

Comments
 (0)