Skip to content

Commit 8bf308a

Browse files
committed
Translate user facing messages
1 parent 5a83f03 commit 8bf308a

File tree

9 files changed

+98
-93
lines changed

9 files changed

+98
-93
lines changed
Lines changed: 68 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,71 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
3-
<file source-language="en" target-language="en" datatype="plaintext" original="messages">
4-
<body>
5-
6-
<!-- Authentication -->
7-
<trans-unit id="auth.not_authorized">
8-
<source>Not authorized</source>
9-
<target>Not authorized</target>
10-
</trans-unit>
11-
12-
<trans-unit id="auth.login_failed">
13-
<source>Failed admin login attempt for '%login%'</source>
14-
<target>Failed admin login attempt for '%login%'</target>
15-
</trans-unit>
16-
17-
<trans-unit id="auth.login_disabled">
18-
<source>Login attempt for disabled admin '%login%'</source>
19-
<target>Login attempt for disabled admin '%login%'</target>
20-
</trans-unit>
21-
22-
<!-- Identity -->
23-
<trans-unit id="identity.admin_not_found">
24-
<source>Administrator not found</source>
25-
<target>Administrator not found</target>
26-
</trans-unit>
27-
28-
<!-- Subscription -->
29-
<trans-unit id="subscription.list_not_found">
30-
<source>Subscriber list not found.</source>
31-
<target>Subscriber list not found.</target>
32-
</trans-unit>
33-
<trans-unit id="subscription.subscriber_not_found">
34-
<source>Subscriber does not exists.</source>
35-
<target>Subscriber does not exists.</target>
36-
</trans-unit>
37-
<trans-unit id="subscription.not_found_for_list_and_subscriber">
38-
<source>Subscription not found for this subscriber and list.</source>
39-
<target>Subscription not found for this subscriber and list.</target>
40-
</trans-unit>
41-
42-
</body>
43-
</file>
3+
<file source-language="en" target-language="en" datatype="plaintext" original="messages">
4+
<body>
5+
<!-- Authentication -->
6+
<trans-unit id="auth.not_authorized">
7+
<source>Not authorized</source>
8+
<target>Not authorized</target>
9+
</trans-unit>
10+
11+
<trans-unit id="auth.login_failed">
12+
<source>Failed admin login attempt for '%login%'</source>
13+
<target>Failed admin login attempt for '%login%'</target>
14+
</trans-unit>
15+
16+
<trans-unit id="auth.login_disabled">
17+
<source>Login attempt for disabled admin '%login%'</source>
18+
<target>Login attempt for disabled admin '%login%'</target>
19+
</trans-unit>
20+
21+
<!-- Identity -->
22+
<trans-unit id="identity.admin_not_found">
23+
<source>Administrator not found</source>
24+
<target>Administrator not found</target>
25+
</trans-unit>
26+
27+
<trans-unit id="identity.attribute_definition_exists">
28+
<source>Attribute definition already exists.</source>
29+
<target>Attribute definition already exists.</target>
30+
</trans-unit>
31+
32+
<!-- Messaging -->
33+
<trans-unit id="messaging.imap_not_available">
34+
<source>PHP IMAP extension not available. Falling back to Webklex IMAP.</source>
35+
<target>PHP IMAP extension not available. Falling back to Webklex IMAP.</target>
36+
</trans-unit>
37+
38+
<trans-unit id="messaging.force_lock_failed">
39+
<source>Could not apply force lock. Aborting.</source>
40+
<target>Could not apply force lock. Aborting.</target>
41+
</trans-unit>
42+
43+
<trans-unit id="messaging.already_locked">
44+
<source>Another bounce processing is already running. Aborting.</source>
45+
<target>Another bounce processing is already running. Aborting.</target>
46+
</trans-unit>
47+
48+
<trans-unit id="messaging.bounce_processing_completed">
49+
<source>Bounce processing completed.</source>
50+
<target>Bounce processing completed.</target>
51+
</trans-unit>
52+
53+
<!-- Subscription -->
54+
<trans-unit id="subscription.list_not_found">
55+
<source>Subscriber list not found.</source>
56+
<target>Subscriber list not found.</target>
57+
</trans-unit>
58+
59+
<trans-unit id="subscription.subscriber_not_found">
60+
<source>Subscriber does not exists.</source>
61+
<target>Subscriber does not exists.</target>
62+
</trans-unit>
63+
64+
<trans-unit id="subscription.not_found_for_list_and_subscriber">
65+
<source>Subscription not found for this subscriber and list.</source>
66+
<target>Subscription not found for this subscriber and list.</target>
67+
</trans-unit>
68+
69+
</body>
70+
</file>
4471
</xliff>

src/Domain/Common/I18n/Messages.php

Lines changed: 0 additions & 29 deletions
This file was deleted.

src/Domain/Identity/Command/CleanUpOldSessionTokens.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
3535
$output->writeln(sprintf('Successfully removed %d expired session token(s).', $deletedCount));
3636
} catch (Throwable $throwable) {
3737
$output->writeln(sprintf('Error removing expired session tokens: %s', $throwable->getMessage()));
38+
3839
return Command::FAILURE;
3940
}
4041

src/Domain/Identity/Service/AdminAttributeDefinitionManager.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,32 @@
99
use PhpList\Core\Domain\Identity\Repository\AdminAttributeDefinitionRepository;
1010
use PhpList\Core\Domain\Identity\Exception\AttributeDefinitionCreationException;
1111
use PhpList\Core\Domain\Subscription\Validator\AttributeTypeValidator;
12+
use Symfony\Contracts\Translation\TranslatorInterface;
1213

1314
class AdminAttributeDefinitionManager
1415
{
1516
private AdminAttributeDefinitionRepository $definitionRepository;
1617
private AttributeTypeValidator $attributeTypeValidator;
18+
private TranslatorInterface $translator;
1719

1820
public function __construct(
1921
AdminAttributeDefinitionRepository $definitionRepository,
20-
AttributeTypeValidator $attributeTypeValidator
22+
AttributeTypeValidator $attributeTypeValidator,
23+
TranslatorInterface $translator
2124
) {
2225
$this->definitionRepository = $definitionRepository;
2326
$this->attributeTypeValidator = $attributeTypeValidator;
27+
$this->translator = $translator;
2428
}
2529

2630
public function create(AdminAttributeDefinitionDto $attributeDefinitionDto): AdminAttributeDefinition
2731
{
2832
$existingAttribute = $this->definitionRepository->findOneByName($attributeDefinitionDto->name);
2933
if ($existingAttribute) {
30-
throw new AttributeDefinitionCreationException('Attribute definition already exists', 409);
34+
throw new AttributeDefinitionCreationException(
35+
$this->translator->trans('Attribute definition already exists.'),
36+
409
37+
);
3138
}
3239
$this->attributeTypeValidator->validate($attributeDefinitionDto->type);
3340

src/Domain/Identity/Service/PasswordManager.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace PhpList\Core\Domain\Identity\Service;
66

77
use DateTime;
8-
use PhpList\Core\Domain\Common\I18n\Messages;
98
use PhpList\Core\Domain\Identity\Model\AdminPasswordRequest;
109
use PhpList\Core\Domain\Identity\Model\Administrator;
1110
use PhpList\Core\Domain\Identity\Repository\AdminPasswordRequestRepository;
@@ -52,7 +51,7 @@ public function generatePasswordResetToken(string $email): string
5251
{
5352
$administrator = $this->administratorRepository->findOneBy(['email' => $email]);
5453
if ($administrator === null) {
55-
$message = $this->translator->trans(Messages::IDENTITY_ADMIN_NOT_FOUND);
54+
$message = $this->translator->trans('Administrator not found');
5655
throw new NotFoundHttpException($message, null, 1500567100);
5756
}
5857

src/Domain/Identity/Service/SessionManager.php

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

55
namespace PhpList\Core\Domain\Identity\Service;
66

7-
use PhpList\Core\Domain\Common\I18n\Messages;
87
use Symfony\Contracts\Translation\TranslatorInterface;
98
use PhpList\Core\Domain\Configuration\Service\Manager\EventLogManager;
109
use PhpList\Core\Domain\Identity\Model\AdministratorToken;
@@ -35,16 +34,16 @@ public function createSession(string $loginName, string $password): Administrato
3534
{
3635
$administrator = $this->administratorRepository->findOneByLoginCredentials($loginName, $password);
3736
if ($administrator === null) {
38-
$entry = $this->translator->trans(Messages::AUTH_LOGIN_FAILED, ['login' => $loginName]);
37+
$entry = $this->translator->trans("Failed admin login attempt for '%login%'", ['login' => $loginName]);
3938
$this->eventLogManager->log('login', $entry);
40-
$message = $this->translator->trans(Messages::AUTH_NOT_AUTHORIZED);
39+
$message = $this->translator->trans('Not authorized');
4140
throw new UnauthorizedHttpException('', $message, null, 1500567098);
4241
}
4342

4443
if ($administrator->isDisabled()) {
45-
$entry = $this->translator->trans(Messages::AUTH_LOGIN_DISABLED, ['login' => $loginName]);
44+
$entry = $this->translator->trans("Login attempt for disabled admin '%login%'", ['login' => $loginName]);
4645
$this->eventLogManager->log('login', $entry);
47-
$message = $this->translator->trans(Messages::AUTH_NOT_AUTHORIZED);
46+
$message = $this->translator->trans('Not authorized');
4847
throw new UnauthorizedHttpException('', $message, null, 1500567099);
4948
}
5049

src/Domain/Messaging/Command/ProcessBouncesCommand.php

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,11 @@
1717
use Symfony\Component\Console\Input\InputOption;
1818
use Symfony\Component\Console\Output\OutputInterface;
1919
use Symfony\Component\Console\Style\SymfonyStyle;
20+
use Symfony\Contracts\Translation\TranslatorInterface;
2021

2122
#[AsCommand(name: 'phplist:bounces:process', description: 'Process bounce mailbox')]
2223
class ProcessBouncesCommand extends Command
2324
{
24-
private const IMAP_NOT_AVAILABLE = 'PHP IMAP extension not available. Falling back to Webklex IMAP.';
25-
private const FORCE_LOCK_FAILED = 'Could not apply force lock. Aborting.';
26-
private const ALREADY_LOCKED = 'Another bounce processing is already running. Aborting.';
27-
2825
protected function configure(): void
2926
{
3027
$this
@@ -48,6 +45,7 @@ public function __construct(
4845
private readonly AdvancedBounceRulesProcessor $advancedRulesProcessor,
4946
private readonly UnidentifiedBounceReprocessor $unidentifiedReprocessor,
5047
private readonly ConsecutiveBounceHandler $consecutiveBounceHandler,
48+
private readonly TranslatorInterface $translator,
5149
) {
5250
parent::__construct();
5351
}
@@ -57,14 +55,19 @@ protected function execute(InputInterface $input, OutputInterface $output): int
5755
$inputOutput = new SymfonyStyle($input, $output);
5856

5957
if (!function_exists('imap_open')) {
60-
$inputOutput->note(self::IMAP_NOT_AVAILABLE);
58+
$inputOutput->note($this->translator->trans(
59+
'PHP IMAP extension not available. Falling back to Webklex IMAP.'
60+
));
6161
}
6262

6363
$force = (bool)$input->getOption('force');
6464
$lock = $this->lockService->acquirePageLock('bounce_processor', $force);
6565

6666
if (($lock ?? 0) === 0) {
67-
$inputOutput->warning($force ? self::FORCE_LOCK_FAILED : self::ALREADY_LOCKED);
67+
$forceLockFailed = $this->translator->trans('Could not apply force lock. Aborting.');
68+
$lockFailed = $this->translator->trans('Another bounce processing is already running. Aborting.');
69+
70+
$inputOutput->warning($force ? $forceLockFailed : $lockFailed);
6871

6972
return $force ? Command::FAILURE : Command::SUCCESS;
7073
}
@@ -88,7 +91,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
8891
$this->consecutiveBounceHandler->handle($inputOutput);
8992

9093
$this->logger->info('Bounce processing completed', ['downloadReport' => $downloadReport]);
91-
$inputOutput->success('Bounce processing completed.');
94+
$inputOutput->success($this->translator->trans('Bounce processing completed.'));
9295

9396
return Command::SUCCESS;
9497
} catch (Exception $e) {

src/Domain/Subscription/Service/Manager/SubscriptionManager.php

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

55
namespace PhpList\Core\Domain\Subscription\Service\Manager;
66

7-
use PhpList\Core\Domain\Common\I18n\Messages;
87
use PhpList\Core\Domain\Subscription\Exception\SubscriptionCreationException;
98
use PhpList\Core\Domain\Subscription\Model\Subscriber;
109
use PhpList\Core\Domain\Subscription\Model\SubscriberList;
@@ -42,7 +41,7 @@ public function addSubscriberToAList(Subscriber $subscriber, int $listId): Subsc
4241
}
4342
$subscriberList = $this->subscriberListRepository->find($listId);
4443
if (!$subscriberList) {
45-
$message = $this->translator->trans(Messages::SUBSCRIPTION_LIST_NOT_FOUND);
44+
$message = $this->translator->trans('Subscriber list not found.');
4645
throw new SubscriptionCreationException($message, 404);
4746
}
4847

@@ -70,7 +69,7 @@ private function createSubscription(SubscriberList $subscriberList, string $emai
7069
{
7170
$subscriber = $this->subscriberRepository->findOneBy(['email' => $email]);
7271
if (!$subscriber) {
73-
$message = $this->translator->trans(Messages::SUBSCRIPTION_SUBSCRIBER_NOT_FOUND);
72+
$message = $this->translator->trans('Subscriber does not exists.');
7473
throw new SubscriptionCreationException($message, 404);
7574
}
7675

@@ -108,7 +107,7 @@ private function deleteSubscription(SubscriberList $subscriberList, string $emai
108107
->findOneBySubscriberEmailAndListId($subscriberList->getId(), $email);
109108

110109
if (!$subscription) {
111-
$message = $this->translator->trans(Messages::SUBSCRIPTION_NOT_FOUND_FOR_LIST_AND_SUBSCRIBER);
110+
$message = $this->translator->trans('Subscription not found for this subscriber and list.');
112111
throw new SubscriptionCreationException($message, 404);
113112
}
114113

tests/Unit/Domain/Identity/Service/SessionManagerTest.php

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

55
namespace PhpList\Core\Tests\Unit\Domain\Identity\Service;
66

7-
use PhpList\Core\Domain\Common\I18n\Messages;
87
use PhpList\Core\Domain\Configuration\Service\Manager\EventLogManager;
98
use PhpList\Core\Domain\Identity\Model\AdministratorToken;
109
use PhpList\Core\Domain\Identity\Repository\AdministratorRepository;
@@ -36,8 +35,8 @@ public function testCreateSessionWithInvalidCredentialsThrowsExceptionAndLogs():
3635
$translator->expects(self::exactly(2))
3736
->method('trans')
3837
->withConsecutive(
39-
[Messages::AUTH_LOGIN_FAILED, ['login' => 'admin']],
40-
[Messages::AUTH_NOT_AUTHORIZED, []]
38+
["Failed admin login attempt for '%login%'", ['login' => 'admin']],
39+
['Not authorized', []]
4140
)
4241
->willReturnOnConsecutiveCalls(
4342
"Failed admin login attempt for 'admin'",

0 commit comments

Comments
 (0)