'use client'; import { useState, useRef, useEffect } from 'react'; import { ChevronDownIcon, GlobeIcon } from 'lucide-react'; import { useRouter, usePathname } from 'next/navigation'; interface Language { code: string; name: string; flag: string; } interface LanguageSwitcherProps { currentLang: string; onLanguageChange: (lang: string) => void; } export default function LanguageSwitcher({ currentLang, onLanguageChange }: LanguageSwitcherProps) { const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); const router = useRouter(); const pathname = usePathname(); const languages: Language[] = [ { code: 'zh-CN', name: '简体中文', flag: '🇨🇳' }, { code: 'zh-TW', name: '繁體中文', flag: '🇹🇼' }, { code: 'en', name: 'English', flag: '🇺🇸' }, { code: 'ko', name: '한국어', flag: '🇰🇷' }, { code: 'ja', name: '日本語', flag: '🇯🇵' }, ]; const currentLanguage = languages.find((lang) => lang.code === currentLang) || languages[0]; useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); const handleLanguageSelect = (langCode: string) => { // Extract the current path without the locale const pathWithoutLocale = pathname.replace(/^\/[a-z]{2}(-[A-Z]{2})?/, '') || '/'; // Navigate to the new locale path router.push(`/${langCode}${pathWithoutLocale}`); // Call the callback if provided if (onLanguageChange) { onLanguageChange(langCode); } setIsOpen(false); }; return (
{/* Trigger Button */} {/* Dropdown Menu */} {isOpen && (
{languages.map((language) => ( ))}
{/* Decorative gradient border */}
)}
); }