Traduit l'UI en français et corrige les bugs de recherche/abonnement

- Traduit toutes les pages et composants en français (Dashboard, Login, Discover, Navigation, Header, EpisodeCard, AudioPlayer)
- Corrige l'erreur 500 sur /api/podcasts/discover : z.coerce.number() au lieu de z.number() pour limit/offset (paramètres query string)
- Corrige l'abonnement manuel via URL RSS : crée le podcast depuis le flux RSS au lieu de renvoyer 400

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Sonnet 4.6 committed 2026-04-16 11:15:42 +02:00
1 parent 00d92fc668
commit c7a5c171d1
8 files changed
+68 -51

No files matched your search

+5 -5
View File
@@ -133,7 +133,7 @@ export default function AudioPlayer({ episode, onClose, userId }: AudioPlayerPro
{/* Header */}
<div className="sticky top-0 bg-white/80 backdrop-blur-xl border-b border-light-200">
<div className="max-w-4xl mx-auto px-4 py-4 flex items-center justify-between">
<h2 className="text-xl font-bold text-light-900">Now Playing</h2>
<h2 className="text-xl font-bold text-light-900">En cours de lecture</h2>
<button
onClick={onClose}
className="p-2 hover:bg-light-100 rounded-lg transition-colors"
@@ -163,7 +163,7 @@ export default function AudioPlayer({ episode, onClose, userId }: AudioPlayerPro
{/* Info */}
<div className="text-center mb-8">
<p className="text-sm font-semibold text-light-500 uppercase mb-2">
{podcast?.author || 'Unknown Podcast'}
{podcast?.author || 'Podcast inconnu'}
</p>
<h1 className="text-4xl font-bold text-light-900 mb-3">{episode.title}</h1>
<p className="text-light-600 line-clamp-3">{episode.description}</p>
@@ -195,7 +195,7 @@ export default function AudioPlayer({ episode, onClose, userId }: AudioPlayerPro
}
}}
className="p-3 hover:bg-light-100 rounded-full transition-colors"
title="Rewind 15s"
title="Reculer de 15s"
>
<SkipBack className="w-6 h-6" />
</button>
@@ -220,7 +220,7 @@ export default function AudioPlayer({ episode, onClose, userId }: AudioPlayerPro
}
}}
className="p-3 hover:bg-light-100 rounded-full transition-colors"
title="Skip 30s"
title="Avancer de 30s"
>
<SkipForward className="w-6 h-6" />
</button>
@@ -230,7 +230,7 @@ export default function AudioPlayer({ episode, onClose, userId }: AudioPlayerPro
<div className="grid grid-cols-2 gap-6">
{/* Playback Speed */}
<div className="card">
<h3 className="text-sm font-semibold text-light-900 mb-3">Speed</h3>
<h3 className="text-sm font-semibold text-light-900 mb-3">Vitesse</h3>
<div className="flex gap-2">
{[0.75, 1, 1.25, 1.5, 1.75, 2].map((speed) => (
<button
+2 -2
View File
@@ -8,7 +8,7 @@ interface EpisodeCardProps {
export default function EpisodeCard({ episode, onPlay }: EpisodeCardProps) {
const podcast = typeof episode.podcastId === 'object' ? episode.podcastId : null;
const pubDate = new Date(episode.pubDate).toLocaleDateString('en-US', {
const pubDate = new Date(episode.pubDate).toLocaleDateString('fr-FR', {
month: 'short',
day: 'numeric',
});
@@ -45,7 +45,7 @@ export default function EpisodeCard({ episode, onPlay }: EpisodeCardProps) {
{/* Podcast Title */}
<p className="text-xs font-semibold text-light-500 uppercase tracking-wider mb-1">
{podcast?.author || 'Unknown'}
{podcast?.author || 'Inconnu'}
</p>
{/* Episode Title */}
+1 -1
View File
@@ -47,7 +47,7 @@ export default function Header({ title, subtitle, user, onLogout }: HeaderProps)
onClick={onLogout}
className="px-4 py-2 text-sm text-light-600 hover:text-light-900 transition-colors"
>
Logout
Déconnexion
</button>
)}
</div>
+2 -2
View File
@@ -28,7 +28,7 @@ export default function Navigation() {
}`}
>
<Home className="w-5 h-5" />
<span className="font-medium">Dashboard</span>
<span className="font-medium">Tableau de bord</span>
</Link>
<Link
@@ -40,7 +40,7 @@ export default function Navigation() {
}`}
>
<Compass className="w-5 h-5" />
<span className="font-medium">Discover</span>
<span className="font-medium">Découvrir</span>
</Link>
</div>
</div>