From 19bdb846dd5ef20e071d0e9975db084816ddd152 Mon Sep 17 00:00:00 2001 From: QuickWrite Date: Fri, 2 Oct 2026 18:36:22 +0200 Subject: [PATCH 1/4] Add a barebones translation system Adding the basis for a very simple translation system --- src/Manager/TranslationManager.php | 37 ++++++++++++++++++++++++++++ src/Translations/Language.php | 8 ++++++ src/Translations/TranslationKeys.php | 7 ++++++ src/Translations/en.php | 4 +++ 4 files changed, 56 insertions(+) create mode 100644 src/Manager/TranslationManager.php create mode 100644 src/Translations/Language.php create mode 100644 src/Translations/TranslationKeys.php create mode 100644 src/Translations/en.php diff --git a/src/Manager/TranslationManager.php b/src/Manager/TranslationManager.php new file mode 100644 index 0000000..76e5022 --- /dev/null +++ b/src/Manager/TranslationManager.php @@ -0,0 +1,37 @@ + The key-value store for the translations + */ + private readonly array $translations; + + public function __construct(Language $language) + { + /** @var array $translations */ + $translations = require __DIR__ . '/../Translations/' . $language->value . '.php'; + + $this->translations = $translations; + } + + public function get(TranslationKeys $key, string ...$values): string + { + // If the key does not exist, something went wrong... badly. + $translation = $this->translations[$key->value]; + + if (is_string($translation)) { + return $translation; + } + + return $translation(...$values); + } +} diff --git a/src/Translations/Language.php b/src/Translations/Language.php new file mode 100644 index 0000000..7d179d0 --- /dev/null +++ b/src/Translations/Language.php @@ -0,0 +1,8 @@ + Date: Fri, 9 Oct 2026 20:23:12 +0200 Subject: [PATCH 2/4] Add English translations for 404 page --- src/Http/Router.php | 3 +++ src/Template/error/404.php | 15 ++++++++++----- src/Translations/TranslationKeys.php | 4 ++++ src/Translations/en.php | 6 ++++++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/Http/Router.php b/src/Http/Router.php index 28f3301..6dba088 100644 --- a/src/Http/Router.php +++ b/src/Http/Router.php @@ -4,6 +4,8 @@ use KittyShare\Model\Dependencies; use KittyShare\Manager\ConfigManager; +use KittyShare\Manager\TranslationManager; +use KittyShare\Translations\Language; /** * The router is responsible for dispatching requests to the correct handler @@ -95,6 +97,7 @@ public function dispatch(Method $method, string $path): Response parameters: [ 'path' => $path, 'baseUrl' => ConfigManager::get()->baseUrl, + 'translationManager' => new TranslationManager(Language::EN), // TODO: Do not hardcode ], statusCode: 404, ); diff --git a/src/Template/error/404.php b/src/Template/error/404.php index 0c15ada..b7131f5 100644 --- a/src/Template/error/404.php +++ b/src/Template/error/404.php @@ -1,18 +1,23 @@ get(TranslationKeys::PAGE_404_TITLE)); ?>
-

404 Page not found

-

Hey! It seems like the site that you've tried to access does not exist.

+

get(TranslationKeys::PAGE_404_TITLE) ?>

+

get(TranslationKeys::PAGE_404_SUBTITLE) ?>

-

Your requested path was "".

+

get(TranslationKeys::PAGE_404_PATHDESC, $path)) ?>

value => 'KittyShare Logo', + TranslationKeys::PAGE_404_TITLE->value => '404 Page not found', + TranslationKeys::PAGE_404_SUBTITLE->value => 'Hey! It seems like the site that you\'ve tried to access does not exist.', + TranslationKeys::PAGE_404_PATHDESC->value => fn(string $path) => "Your requested path was \"$path\".", ]; From bbe2fd83b8bd60b03a0cac118c6a5926fde49509 Mon Sep 17 00:00:00 2001 From: QuickWrite Date: Mon, 12 Oct 2026 16:49:22 +0200 Subject: [PATCH 3/4] Fix broken tests --- tests/Http/TemplateResponseTest.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/Http/TemplateResponseTest.php b/tests/Http/TemplateResponseTest.php index 05b3c4d..7b2cd88 100644 --- a/tests/Http/TemplateResponseTest.php +++ b/tests/Http/TemplateResponseTest.php @@ -2,6 +2,8 @@ use KittyShare\Http\Response; use KittyShare\Http\TemplateResponse; +use KittyShare\Manager\TranslationManager; +use KittyShare\Translations\Language; use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\TestCase; @@ -51,7 +53,7 @@ public function rendersTemplateWithStatusCode(): void { $response = new TemplateResponse( 'error/404', - ['path' => '/missing', 'baseUrl' => ''], + ['path' => '/missing', 'baseUrl' => '', 'translationManager' => new TranslationManager(Language::EN)], 404, ); @@ -72,7 +74,7 @@ public function escapesTemplateParameters(): void { $response = new TemplateResponse( 'error/404', - ['path' => '/a&"c"', 'baseUrl' => ''], + ['path' => '/a&"c"', 'baseUrl' => '', 'translationManager' => new TranslationManager(Language::EN)], 404, ); From 9d89250f55b9fc45815b609bb44a5408e96e050d Mon Sep 17 00:00:00 2001 From: QuickWrite Date: Thu, 15 Oct 2026 20:13:55 +0200 Subject: [PATCH 4/4] Add explicit out of bounds check. Even though the array should NEVER be out of bounds, it could theoretically happen. As such a check to harden the application is being added. --- src/Manager/TranslationManager.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Manager/TranslationManager.php b/src/Manager/TranslationManager.php index 76e5022..1cfc326 100644 --- a/src/Manager/TranslationManager.php +++ b/src/Manager/TranslationManager.php @@ -4,6 +4,7 @@ use KittyShare\Translations\Language; use KittyShare\Translations\TranslationKeys; +use OutOfBoundsException; /** * Manages the translation values the application uses @@ -26,6 +27,12 @@ public function __construct(Language $language) public function get(TranslationKeys $key, string ...$values): string { // If the key does not exist, something went wrong... badly. + if (!array_key_exists($key->value, $this->translations)) { + throw new OutOfBoundsException( + sprintf('Translation key "%s" does not exist.', $key->value), + ); + } + $translation = $this->translations[$key->value]; if (is_string($translation)) {