Skip to content

Commit 8e33403

Browse files
Add local columns in tables and add middleware to check and set app l… (#235)
2 parents 03da141 + 4e91554 commit 8e33403

File tree

19 files changed

+205
-31
lines changed

19 files changed

+205
-31
lines changed

.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ APP_ENV=local
33
APP_KEY=
44
APP_DEBUG=true
55
APP_URL=http://laravel.cm.test
6+
APP_LOCALE=fr
67
FILAMENT_PATH=cp
78

89
LOG_CHANNEL=stack
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Http\Middleware;
6+
7+
use Closure;
8+
use Illuminate\Http\Request;
9+
use Illuminate\Support\Facades\Auth;
10+
use Symfony\Component\HttpFoundation\Response;
11+
12+
final class LocaleMiddleware
13+
{
14+
public function handle(Request $request, Closure $next): Response
15+
{
16+
$browserLocale = explode('_', (string) $request->getPreferredLanguage())[0];
17+
$currentLocale = app()->getLocale();
18+
$activeLocale = session()->get('locale');
19+
$supportedLocales = config('lcm.supported_locales');
20+
21+
if (Auth::check()) {
22+
$userLocale = Auth::user()?->setting('locale', $currentLocale);
23+
24+
if ($userLocale && $userLocale !== $currentLocale) {
25+
app()->setLocale($userLocale);
26+
}
27+
} else {
28+
if (! $activeLocale && in_array($browserLocale, $supportedLocales)) {
29+
app()->setLocale($browserLocale);
30+
} else {
31+
app()->setLocale($activeLocale);
32+
}
33+
}
34+
35+
return $next($request);
36+
}
37+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Livewire\Components;
6+
7+
use Illuminate\Contracts\View\View;
8+
use Illuminate\Support\Facades\Auth;
9+
use Illuminate\Support\Pluralizer;
10+
use Livewire\Attributes\Computed;
11+
use Livewire\Component;
12+
13+
final class ChangeLocale extends Component
14+
{
15+
public string $currentLocale;
16+
17+
public function mount(): void
18+
{
19+
$this->currentLocale = app()->getLocale();
20+
}
21+
22+
public function changeLocale(): void
23+
{
24+
$locale = $this->currentLocale === 'fr' ? 'en' : 'fr';
25+
26+
if (Auth::check()) {
27+
Auth::user()?->settings(['locale' => $locale]);
28+
}
29+
30+
$this->currentLocale = $locale;
31+
app()->setLocale($locale);
32+
session()->put('locale', $locale);
33+
34+
Pluralizer::useLanguage($this->currentLocale === 'fr' ? 'french' : 'english');
35+
36+
$this->redirectRoute('home', navigate: true);
37+
}
38+
39+
#[Computed]
40+
public function locale(): string
41+
{
42+
return $this->currentLocale === 'fr' ? 'English' : 'Français';
43+
}
44+
45+
public function render(): View
46+
{
47+
return view('livewire.components.change-locale');
48+
}
49+
}

app/Models/Article.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66

77
use App\Contracts\ReactableInterface;
88
use App\Models\Builders\ArticleQueryBuilder;
9+
use App\Models\Scopes\LocaleScope;
910
use App\Traits\HasAuthor;
1011
use App\Traits\HasSlug;
1112
use App\Traits\HasTags;
1213
use App\Traits\Reactable;
1314
use App\Traits\RecordsActivity;
1415
use CyrildeWit\EloquentViewable\Contracts\Viewable;
1516
use CyrildeWit\EloquentViewable\InteractsWithViews;
17+
use Illuminate\Database\Eloquent\Attributes\ScopedBy;
1618
use Illuminate\Database\Eloquent\Factories\HasFactory;
1719
use Illuminate\Database\Eloquent\Model;
1820
use Illuminate\Support\Str;
@@ -40,6 +42,7 @@
4042
* @property \Illuminate\Support\Carbon $created_at
4143
* @property \Illuminate\Support\Carbon $updated_at
4244
*/
45+
#[ScopedBy([LocaleScope::class])]
4346
final class Article extends Model implements HasMedia, ReactableInterface, Viewable
4447
{
4548
use HasAuthor;

app/Models/Discussion.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use App\Contracts\SpamReportableContract;
1010
use App\Contracts\SubscribeInterface;
1111
use App\Models\Builders\DiscussionQueryBuilder;
12+
use App\Models\Scopes\LocaleScope;
1213
use App\Traits\HasAuthor;
1314
use App\Traits\HasReplies;
1415
use App\Traits\HasSlug;
@@ -20,6 +21,7 @@
2021
use Carbon\Carbon;
2122
use CyrildeWit\EloquentViewable\Contracts\Viewable;
2223
use CyrildeWit\EloquentViewable\InteractsWithViews;
24+
use Illuminate\Database\Eloquent\Attributes\ScopedBy;
2325
use Illuminate\Database\Eloquent\Casts\Attribute;
2426
use Illuminate\Database\Eloquent\Factories\HasFactory;
2527
use Illuminate\Database\Eloquent\Model;
@@ -40,6 +42,7 @@
4042
* @property User $user
4143
* @property Collection | SpamReport[] $spamReports
4244
*/
45+
#[ScopedBy([LocaleScope::class])]
4346
final class Discussion extends Model implements ReactableInterface, ReplyInterface, SpamReportableContract, SubscribeInterface, Viewable
4447
{
4548
use HasAuthor;

app/Models/Scopes/LocaleScope.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Models\Scopes;
6+
7+
use Illuminate\Database\Eloquent\Builder;
8+
use Illuminate\Database\Eloquent\Model;
9+
use Illuminate\Database\Eloquent\Scope;
10+
11+
final class LocaleScope implements Scope
12+
{
13+
public function apply(Builder $builder, Model $model): void
14+
{
15+
$builder->where('locale', app()->getLocale());
16+
}
17+
}

app/Models/Thread.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use App\Contracts\SubscribeInterface;
1111
use App\Exceptions\CouldNotMarkReplyAsSolution;
1212
use App\Filters\Thread\ThreadFilters;
13+
use App\Models\Scopes\LocaleScope;
1314
use App\Traits\HasAuthor;
1415
use App\Traits\HasReplies;
1516
use App\Traits\HasSlug;
@@ -21,6 +22,7 @@
2122
use CyrildeWit\EloquentViewable\Contracts\Viewable;
2223
use CyrildeWit\EloquentViewable\InteractsWithViews;
2324
use Exception;
25+
use Illuminate\Database\Eloquent\Attributes\ScopedBy;
2426
use Illuminate\Database\Eloquent\Builder;
2527
use Illuminate\Database\Eloquent\Factories\HasFactory;
2628
use Illuminate\Database\Eloquent\Model;
@@ -51,6 +53,7 @@
5153
* @property Reply | null $solutionReply
5254
* @property \Illuminate\Database\Eloquent\Collection | Channel[] $channels
5355
*/
56+
#[ScopedBy([LocaleScope::class])]
5457
final class Thread extends Model implements Feedable, ReactableInterface, ReplyInterface, SpamReportableContract, SubscribeInterface, Viewable
5558
{
5659
use HasAuthor;

app/Models/User.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,12 @@
4646
* @property string | null $bio
4747
* @property string | null $website
4848
* @property string | null $banned_reason
49+
* @property array $settings
4950
* @property Carbon | null $email_verified_at
5051
* @property Carbon | null $last_login_at
5152
* @property Carbon | null $banned_at
5253
* @property Collection | Activity[] $activities
54+
* @property-read Collection | SocialAccount[] $providers
5355
*/
5456
final class User extends Authenticatable implements FilamentUser, HasAvatar, HasMedia, HasName, MustVerifyEmail
5557
{

app/Traits/HasSettings.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
trait HasSettings
88
{
9-
public function setting(string $name, string $default): string
9+
public function setting(string $name, string $default): mixed
1010
{
1111
if ($this->settings && array_key_exists($name, $this->settings)) {
1212
return $this->settings[$name];

bootstrap/app.php

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

33
declare(strict_types=1);
44

5+
use App\Http\Middleware\LocaleMiddleware;
56
use Illuminate\Foundation\Application;
67
use Illuminate\Foundation\Configuration\Exceptions;
78
use Illuminate\Foundation\Configuration\Middleware;
@@ -17,6 +18,9 @@
1718
'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
1819
'checkIfBanned' => \App\Http\Middleware\CheckIfBanned::class,
1920
]);
21+
$middleware->web(append: [
22+
LocaleMiddleware::class,
23+
]);
2024
})
2125
->withExceptions(function (Exceptions $exceptions): void {
2226
//

0 commit comments

Comments
 (0)