diff --git a/app/Domains/Translation/Models/Translation.php b/app/Domains/Translation/Models/Translation.php new file mode 100644 index 0000000..a9eac02 --- /dev/null +++ b/app/Domains/Translation/Models/Translation.php @@ -0,0 +1,10 @@ +where('group', $group) + ->pluck('value', 'key') + ->toArray(); + + if (! empty($translations)) { + Redis::hMSet($cacheKey, $translations); + Redis::expire($cacheKey, 3600); + } + + return $translations; + } + + public function addNamespace($namespace, $hint): void {} + public function addPath($path): void {} + public function addJsonPath($path): void {} + + public function namespaces(): array + { + return []; + } +} diff --git a/app/Domains/Translation/Services/TranslationService.php b/app/Domains/Translation/Services/TranslationService.php new file mode 100644 index 0000000..89413ba --- /dev/null +++ b/app/Domains/Translation/Services/TranslationService.php @@ -0,0 +1,26 @@ + $locale, 'group' => $group, 'key' => $key], + ['value' => $value, 'namespace' => '*'], + ); + + Redis::del("lang:{$locale}:{$group}"); + + return $translation; + } + + public function flushCache(string $locale, string $group): void + { + Redis::del("lang:{$locale}:{$group}"); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 3951a1c..fe8fc04 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use App\Domains\Translation\Providers\DatabaseTranslationLoader; use App\Domains\Workspace\Models\Workspace; use App\Domains\Workspace\Policies\WorkspacePolicy; use Illuminate\Support\Facades\Gate; @@ -14,7 +15,21 @@ class AppServiceProvider extends ServiceProvider */ public function register(): void { - // + $this->app->singleton('translation.loader', function ($app) { + return new DatabaseTranslationLoader; + }); + + // TranslationServiceProvider is deferred and re-binds translation.loader + // when it resolves. We extend 'translator' to swap in our DB loader after + // the translator instance is created. + $this->app->extend('translator', function ($translator, $app) { + $loader = new DatabaseTranslationLoader; + $reflection = new \ReflectionProperty($translator, 'loader'); + $reflection->setAccessible(true); + $reflection->setValue($translator, $loader); + + return $translator; + }); } /** diff --git a/tests/Feature/Translation/TranslationServiceTest.php b/tests/Feature/Translation/TranslationServiceTest.php new file mode 100644 index 0000000..a853b90 --- /dev/null +++ b/tests/Feature/Translation/TranslationServiceTest.php @@ -0,0 +1,29 @@ + 'de', + 'namespace' => '*', + 'group' => 'auth', + 'key' => 'login', + 'value' => 'Anmelden', + ]); + + App::setLocale('de'); + // Force reload + app('translator')->setLoaded([]); + + expect(__('auth.login'))->toBe('Anmelden'); +});