feat: translations

This commit is contained in:
2026-05-20 20:54:41 +02:00
parent 9aaf311e54
commit bcc067ec67
29 changed files with 703 additions and 47 deletions
+19 -14
View File
@@ -40,7 +40,7 @@ class AuthController extends Controller
$token = $user->createToken('api', ['user'])->plainTextToken;
return response()->json([
'message' => 'Compte créé. Consulte tes emails pour le vérifier.',
'message' => __('api.auth.registered_unverified'),
'user' => new UserResource($user),
], 201)->cookie('token', $token, 60 * 24 * 30);
}
@@ -53,13 +53,13 @@ class AuthController extends Controller
if (! $user || ! Hash::check($data['password'], $user->password)) {
return response()->json([
'message' => 'Identifiants invalides',
'message' => __('api.auth.invalid_credentials'),
], 401);
}
if (! $user->hasVerifiedEmail()) {
return response()->json([
'message' => 'Vérifie ton adresse email avant de te connecter.',
'message' => __('api.auth.email_not_verified'),
], 403);
}
@@ -74,10 +74,15 @@ class AuthController extends Controller
{
$user = User::findOrFail($id);
abort_unless(
hash_equals($hash, sha1($user->getEmailForVerification())),
403
);
if (! hash_equals($hash, sha1($user->getEmailForVerification()))) {
if ($request->expectsJson()) {
return response()->json([
'message' => __('api.auth.invalid_verification_link'),
], 403);
}
abort(403, __('api.auth.invalid_verification_link'));
}
$alreadyVerified = $user->hasVerifiedEmail();
@@ -90,8 +95,8 @@ class AuthController extends Controller
if ($request->expectsJson()) {
return response()->json([
'message' => $alreadyVerified
? 'Compte déjà vérifié.'
: 'Compte vérifié avec succès.',
? __('api.auth.already_verified')
: __('api.auth.verified'),
'user' => new UserResource($user->fresh()),
]);
}
@@ -108,14 +113,14 @@ class AuthController extends Controller
if ($user->hasVerifiedEmail()) {
return response()->json([
'message' => 'Compte déjà vérifié.',
'message' => __('api.auth.already_verified'),
]);
}
$user->sendEmailVerificationNotification();
return response()->json([
'message' => 'Email de vérification envoyé.',
'message' => __('api.auth.verification_sent'),
]);
}
@@ -125,7 +130,7 @@ class AuthController extends Controller
$request->user()->currentAccessToken()->delete();
return response()->json([
'message' => 'Déconnecté avec succès',
'message' => __('api.auth.logout'),
])->withoutCookie('token');
}
@@ -134,7 +139,7 @@ class AuthController extends Controller
$user = auth()->user();
if (! $user) {
return response()->json(['message' => 'Non authentifié'], 401);
return response()->json(['message' => __('api.auth.unauthenticated')], 401);
}
return new UserResource($user);
@@ -201,7 +206,7 @@ class AuthController extends Controller
}
return response()->json([
'message' => 'Compte supprimé avec succès',
'message' => __('api.auth.deleted'),
])->withoutCookie('token');
}
@@ -25,8 +25,8 @@ class DeviceTokenController extends Controller
return response()->json([
'message' => $deviceToken->wasRecentlyCreated
? 'Token appareil enregistré.'
: 'Token appareil mis à jour.',
? __('api.device_tokens.created')
: __('api.device_tokens.updated'),
'deviceToken' => [
'id' => $deviceToken->id,
'expoPushToken' => $deviceToken->expo_push_token,
@@ -40,7 +40,7 @@ class DeviceTokenController extends Controller
auth()->user()->notify(new TestNotification);
return response()->json([
'message' => 'Notification envoyée',
'message' => __('api.device_tokens.notification_sent'),
]);
}
@@ -25,7 +25,7 @@ class MealImageAnalysisController extends Controller
report($exception);
return response()->json([
'message' => "Impossible d'analyser l'image pour le moment.",
'message' => __('api.meal_image_analysis.failed'),
], 502);
}
@@ -36,7 +36,7 @@ class PostReviewsController extends Controller
->where('user_id', $userId)
->exists(),
409,
'Vous avez déjà donné un avis pour ce repas.'
__('api.post_reviews.already_exists')
);
$postReview = PostReviews::create([
+4 -4
View File
@@ -50,13 +50,13 @@ class StravaController extends Controller
if (! is_array($state) || $state['user_id'] !== $request->user()->getKey()) {
return response()->json([
'message' => 'La connexion Strava a expiré. Relance la connexion.',
'message' => __('api.strava.state_expired'),
], 422);
}
if (isset($data['error'])) {
return response()->json([
'message' => 'Connexion Strava refusée.',
'message' => __('api.strava.refused'),
], 422);
}
@@ -102,13 +102,13 @@ class StravaController extends Controller
if (! $connection) {
return response()->json([
'message' => 'Connecte Strava avant de synchroniser tes workouts.',
'message' => __('api.strava.missing_connection'),
], 422);
}
if (! $this->canReadActivities($connection->scopes ?? [])) {
return response()->json([
'message' => 'La connexion Strava doit autoriser le scope activity:read ou activity:read_all.',
'message' => __('api.strava.missing_activity_scope'),
], 422);
}
@@ -0,0 +1,31 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\URL;
use Symfony\Component\HttpFoundation\Response;
class EnsureEmailIsVerified
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next, ?string $redirectToRoute = null): Response
{
if (! $request->user() ||
($request->user() instanceof MustVerifyEmail &&
! $request->user()->hasVerifiedEmail())) {
return $request->expectsJson()
? abort(403, __('api.auth.email_not_verified'))
: Redirect::guest(URL::route($redirectToRoute ?: 'verification.notice'));
}
return $next($request);
}
}
@@ -21,9 +21,9 @@ class MealImageAnalysisRequest extends FormRequest
public function messages(): array
{
return [
'image.required' => 'Ajoute une image à analyser.',
'image.image' => 'Le fichier doit être une image.',
'image.max' => "L'image ne doit pas dépasser 4 Mo.",
'image.required' => __('api.validation.image_required'),
'image.image' => __('api.validation.image_file'),
'image.max' => __('api.validation.image_max_4mb'),
];
}
}
@@ -21,7 +21,7 @@ class MealPostCalendarRequest extends FormRequest
public function messages(): array
{
return [
'month.date_format' => 'Choisis un mois valide.',
'month.date_format' => __('api.validation.month_valid'),
];
}
}
+3 -3
View File
@@ -45,9 +45,9 @@ class MealPostsRequest extends FormRequest
public function messages(): array
{
return [
'image.max' => "L'image ne doit pas dépasser 4 Mo.",
'image_url.required_without' => 'Ajoute une image au repas.',
'visibility' => 'Choisis une visibilité valide.',
'image.max' => __('api.validation.image_max_4mb'),
'image_url.required_without' => __('api.validation.meal_image_required'),
'visibility' => __('api.validation.visibility_valid'),
];
}
}
+1 -1
View File
@@ -35,7 +35,7 @@ class RegisterRequest extends FormRequest
public function messages(): array
{
return [
'avatar.max' => "L'image ne doit pas dépasser 2 Mo.",
'avatar.max' => __('api.validation.image_max_2mb'),
];
}
}
+5 -5
View File
@@ -29,11 +29,11 @@ class UpdateUserRequest extends FormRequest
public function messages(): array
{
return [
'avatar.max' => "L'image ne doit pas dépasser 2 Mo.",
'nutritionGoals.calories.integer' => 'Les calories doivent etre un nombre entier.',
'nutritionGoals.*.required_with' => 'Renseigne tous les objectifs nutritionnels.',
'nutritionGoals.*.min' => 'Les objectifs nutritionnels doivent etre positifs.',
'nutritionGoals.*.max' => 'La valeur de cet objectif nutritionnel est trop elevee.',
'avatar.max' => __('api.validation.image_max_2mb'),
'nutritionGoals.calories.integer' => __('api.validation.calories_integer'),
'nutritionGoals.*.required_with' => __('api.validation.nutrition_goals_required'),
'nutritionGoals.*.min' => __('api.validation.nutrition_goals_positive'),
'nutritionGoals.*.max' => __('api.validation.nutrition_goals_max'),
];
}
}
+2 -2
View File
@@ -42,8 +42,8 @@ class TestNotification extends Notification
public function toExpoPush($notifiable)
{
return [
'title' => 'Test',
'body' => 'Notification test depuis Laravel API',
'title' => __('api.notifications.test_title'),
'body' => __('api.notifications.test_body'),
'data' => ['test' => true],
];
}