Skip to content

Commit 45e32f0

Browse files
committed
Use Localizer package to detect and set locales
1 parent acd8763 commit 45e32f0

File tree

7 files changed

+116
-34
lines changed

7 files changed

+116
-34
lines changed

composer.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222
"require": {
2323
"php": "^7.1",
2424
"0.0.0/composer-include-files": "^1.5",
25+
"codezero/laravel-localizer": "^1.1",
2526
"illuminate/support": ">=5.6"
2627
},
2728
"require-dev": {
29+
"mockery/mockery": "^1.3",
2830
"orchestra/testbench": ">=3.6",
2931
"phpunit/phpunit": "^7.0|^8.0"
3032
},

src/Macros/LocalizedRoutesMacro.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace CodeZero\LocalizedRoutes\Macros;
44

5-
use CodeZero\LocalizedRoutes\Middleware\LocalizedRouteLocaleHandler;
5+
use CodeZero\LocalizedRoutes\Middleware\SetLocale;
66
use Illuminate\Support\Facades\App;
77
use Illuminate\Support\Facades\Config;
88
use Illuminate\Support\Facades\Route;
@@ -63,7 +63,7 @@ public static function register()
6363
}
6464

6565
if ($setMiddleware) {
66-
$attributes['middleware'] = [LocalizedRouteLocaleHandler::class];
66+
$attributes['middleware'] = [SetLocale::class];
6767
}
6868

6969
// Execute the callback inside route group

src/Middleware/LocalizedRouteLocaleHandler.php

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

src/Middleware/SetLocale.php

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
namespace CodeZero\LocalizedRoutes\Middleware;
4+
5+
use Closure;
6+
use CodeZero\Localizer\Localizer;
7+
use Illuminate\Support\Facades\Config;
8+
9+
class SetLocale
10+
{
11+
/**
12+
* Localizer.
13+
*
14+
* @var \CodeZero\Localizer\Localizer
15+
*/
16+
protected $localizer;
17+
18+
/**
19+
* Create a new SetLocale instance.
20+
*
21+
* @param \CodeZero\Localizer\Localizer $localizer
22+
*/
23+
public function __construct(Localizer $localizer)
24+
{
25+
$this->localizer = $localizer;
26+
}
27+
28+
/**
29+
* Handle an incoming request.
30+
*
31+
* @param \Illuminate\Http\Request $request
32+
* @param \Closure $next
33+
*
34+
* @return mixed
35+
*/
36+
public function handle($request, Closure $next)
37+
{
38+
// This package sets a custom route attribute for the locale.
39+
// If it is present, set it as the locale with 'codezero/laravel-localizer'.
40+
// If not, auto-detect the locale with 'codezero/laravel-localizer'
41+
$locale = $request->route()->getAction('localized-routes-locale') ?: $this->detectLocales();
42+
43+
if ($locale) {
44+
$this->localizer->store($locale);
45+
}
46+
47+
return $next($request);
48+
}
49+
50+
/**
51+
* Detect locales.
52+
*
53+
* @return string|false
54+
*/
55+
public function detectLocales()
56+
{
57+
$supportedLocales = Config::get('localized-routes.supported-locales', []);
58+
59+
$this->localizer->setSupportedLocales($supportedLocales);
60+
61+
return $this->localizer->detect();
62+
}
63+
}

tests/Stubs/Kernel.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class Kernel extends HttpKernel
5252
\App\Http\Middleware\Authenticate::class,
5353
\Illuminate\Routing\Middleware\ThrottleRequests::class,
5454
\Illuminate\Session\Middleware\AuthenticateSession::class,
55-
\CodeZero\LocalizedRoutes\Middleware\LocalizedRouteLocaleHandler::class, // <== Added Middleware Here
55+
\CodeZero\LocalizedRoutes\Middleware\SetLocale::class, // <== Added Middleware Here
5656
\Illuminate\Routing\Middleware\SubstituteBindings::class,
5757
\Illuminate\Auth\Middleware\Authorize::class,
5858
];

tests/TestCase.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace CodeZero\LocalizedRoutes\Tests;
44

55
use CodeZero\LocalizedRoutes\LocalizedRoutesServiceProvider;
6+
use CodeZero\Localizer\LocalizerServiceProvider;
67
use Illuminate\Support\Collection;
78
use Illuminate\Support\Facades\Config;
89
use Illuminate\Support\Facades\Route;
@@ -87,6 +88,7 @@ protected function resolveApplicationHttpKernel($app)
8788
protected function getPackageProviders($app)
8889
{
8990
return [
91+
LocalizerServiceProvider::class,
9092
LocalizedRoutesServiceProvider::class,
9193
];
9294
}

tests/Unit/Middleware/LocalizedRouteLocaleHandlerTest.php renamed to tests/Unit/Middleware/SetLocaleTest.php

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
namespace CodeZero\LocalizedRoutes\Tests\Unit\Macros;
44

5-
use CodeZero\LocalizedRoutes\Middleware\LocalizedRouteLocaleHandler;
5+
use CodeZero\LocalizedRoutes\Middleware\SetLocale;
66
use CodeZero\LocalizedRoutes\Tests\Stubs\Model;
77
use CodeZero\LocalizedRoutes\Tests\TestCase;
8+
use CodeZero\Localizer\Localizer;
89
use Illuminate\Support\Facades\App;
910
use Illuminate\Support\Facades\Route;
11+
use Mockery;
1012

11-
class LocalizedRouteLocaleHandlerTest extends TestCase
13+
class SetLocaleTest extends TestCase
1214
{
1315
/** @test */
1416
public function it_sets_the_right_locale_when_accessing_localized_routes()
@@ -65,7 +67,7 @@ public function it_sets_the_locale_for_localized_routes_within_route_groups()
6567
Route::localized(function () {
6668
Route::get('route', function () {
6769
return App::getLocale();
68-
})->name('route.name')->middleware(['web', LocalizedRouteLocaleHandler::class]);
70+
})->name('route.name')->middleware(['web', SetLocale::class]);
6971
});
7072
});
7173

@@ -86,12 +88,52 @@ public function it_allows_for_localized_route_model_binding()
8688
Route::localized(function () {
8789
Route::get('route/{model}', function (Model $model) {
8890
return App::getLocale();
89-
})->name('route.name')->middleware(['web', LocalizedRouteLocaleHandler::class]);
91+
})->name('route.name')->middleware(['web', SetLocale::class]);
9092
});
9193

9294
$this->call('GET', '/en/route/en-slug')->assertOk();
9395
$this->call('GET', '/nl/route/nl-slug')->assertOk();
9496
$this->call('GET', '/en/route/nl-slug')->assertNotFound();
9597
$this->call('GET', '/nl/route/en-slug')->assertNotFound();
9698
}
99+
100+
/** @test */
101+
public function it_does_not_auto_detect_the_preferred_locale_with_localizer_for_localized_routes()
102+
{
103+
$this->setSupportedLocales(['en', 'nl']);
104+
105+
$localizer = Mockery::mock(Localizer::class);
106+
$localizer->shouldReceive('setSupportedLocales')->with(['en', 'nl']);
107+
$localizer->shouldNotReceive('detect');
108+
$localizer->shouldReceive('store')->with('en');
109+
110+
App::instance(Localizer::class, $localizer);
111+
112+
Route::localized(function () {
113+
Route::get('localized-route', function () {})
114+
->name('localized.route')
115+
->middleware(['web', SetLocale::class]);
116+
});
117+
118+
$this->call('GET', '/en/localized-route')->assertOk();
119+
}
120+
121+
/** @test */
122+
public function it_auto_detects_the_preferred_locale_with_localizer_for_non_localized_routes()
123+
{
124+
$this->setSupportedLocales(['en', 'nl']);
125+
126+
$localizer = Mockery::mock(Localizer::class);
127+
$localizer->shouldReceive('setSupportedLocales')->with(['en', 'nl']);
128+
$localizer->shouldReceive('detect')->andReturn('en');
129+
$localizer->shouldReceive('store')->with('en');
130+
131+
App::instance(Localizer::class, $localizer);
132+
133+
Route::get('non-localized-route', function () {})
134+
->name('non-localized.route')
135+
->middleware(['web', SetLocale::class]);
136+
137+
$this->call('GET', '/non-localized-route')->assertOk();
138+
}
97139
}

0 commit comments

Comments
 (0)