Skip to content

Commit 3fe7c89

Browse files
authored
feat: Add ability to pick preferred locale for a user (#187)
1 parent 371e372 commit 3fe7c89

File tree

7 files changed

+85
-1
lines changed

7 files changed

+85
-1
lines changed

config/cachet.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,17 @@
126126
'prune_logs_after_days' => 30,
127127
],
128128
],
129+
130+
/*
131+
|--------------------------------------------------------------------------
132+
| Cachet Supported Locales
133+
|--------------------------------------------------------------------------
134+
|
135+
| Configure which locales are supported by Cachet.
136+
|
137+
*/
138+
'supported_locales' => [
139+
'en' => 'English',
140+
'en_GB' => 'English (UK)',
141+
],
129142
];
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*/
12+
public function up(): void
13+
{
14+
Schema::table('users', function (Blueprint $table) {
15+
$table->string('preferred_locale')->nullable();
16+
});
17+
}
18+
19+
/**
20+
* Reverse the migrations.
21+
*/
22+
public function down(): void
23+
{
24+
Schema::table('users', function (Blueprint $table) {
25+
$table->dropColumn('preferred_locale');
26+
});
27+
}
28+
};

resources/lang/en/user.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
'email_label' => 'Email Address',
2323
'password_label' => 'Password',
2424
'password_confirmation_label' => 'Confirm Password',
25+
'preferred_locale' => 'Preferred Locale',
26+
'preferred_locale_system_default' => 'System Default',
2527
'is_admin_label' => 'Admin',
2628
],
2729
];

src/CachetDashboardServiceProvider.php

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

33
namespace Cachet;
44

5+
use Cachet\Http\Middleware\SetAppLocale;
56
use Filament\Http\Middleware\Authenticate;
67
use Filament\Http\Middleware\DisableBladeIconComponents;
78
use Filament\Http\Middleware\DispatchServingFilamentEvent;
@@ -86,6 +87,7 @@ public function panel(Panel $panel): Panel
8687
SubstituteBindings::class,
8788
DisableBladeIconComponents::class,
8889
DispatchServingFilamentEvent::class,
90+
SetAppLocale::class,
8991
])
9092
->authMiddleware([
9193
Authenticate::class,

src/Filament/Resources/UserResource.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@ public static function form(Form $form): Form
5656
->same('password')
5757
->label(__('cachet::user.form.password_confirmation_label')),
5858

59+
Forms\Components\Select::make('preferred_locale')
60+
->selectablePlaceholder(false)
61+
->options([
62+
null => __('cachet::user.form.preferred_locale_system_default'),
63+
...config('cachet.supported_locales')
64+
])
65+
->label(__('cachet::user.form.preferred_locale')),
66+
5967
Forms\Components\Toggle::make('is_admin')
6068
->label(__('cachet::user.form.is_admin_label'))
6169
->disabled(fn (?User $record) => $record?->is(auth()->user())),
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Cachet\Http\Middleware;
4+
5+
use Closure;
6+
use Illuminate\Http\Request;
7+
8+
class SetAppLocale
9+
{
10+
public function handle(Request $request, Closure $next)
11+
{
12+
/** @var ?\Cachet\Models\User */
13+
$user = $request->user();
14+
15+
if ($user) {
16+
app()->setLocale($user->preferredLocale() ?? $request->getPreferredLanguage(
17+
array_keys(config('cachet.supported_locales'))
18+
));
19+
}
20+
21+
return $next($request);
22+
}
23+
}

src/Models/User.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Cachet\Concerns\CachetUser;
66
use Cachet\Database\Factories\UserFactory;
77
use Illuminate\Contracts\Auth\MustVerifyEmail;
8+
use Illuminate\Contracts\Translation\HasLocalePreference;
89
use Illuminate\Database\Eloquent\Factories\Factory;
910
use Illuminate\Database\Eloquent\Factories\HasFactory;
1011
use Illuminate\Foundation\Auth\User as Authenticatable;
@@ -17,8 +18,9 @@
1718
* @property string $email
1819
* @property string $password
1920
* @property bool $is_admin
21+
* @property string $preferred_locale
2022
*/
21-
class User extends Authenticatable implements CachetUser, MustVerifyEmail
23+
class User extends Authenticatable implements CachetUser, MustVerifyEmail, HasLocalePreference
2224
{
2325
/** @use HasFactory<\Cachet\Database\Factories\UserFactory> */
2426
use HasApiTokens, HasFactory, Notifiable;
@@ -33,6 +35,7 @@ class User extends Authenticatable implements CachetUser, MustVerifyEmail
3335
'email',
3436
'password',
3537
'is_admin',
38+
'preferred_locale',
3639
];
3740

3841
/**
@@ -74,4 +77,9 @@ protected static function newFactory(): Factory
7477
{
7578
return UserFactory::new();
7679
}
80+
81+
public function preferredLocale()
82+
{
83+
return $this->preferred_locale;
84+
}
7785
}

0 commit comments

Comments
 (0)