"use client"; import { useState, useEffect, useRef } from "react"; import { createPortal } from "react-dom"; import { LOCALES, LOCALE_COOKIE, normalizeLocale } from "@/i18n/config"; import { reloadTranslations } from "@/i18n/runtime"; function getLocaleFromCookie() { if (typeof document === "undefined") return "en"; const cookie = document.cookie .split(";") .find((c) => c.trim().startsWith(`${LOCALE_COOKIE}=`)); const value = cookie ? decodeURIComponent(cookie.split("=")[1]) : "en"; return normalizeLocale(value); } // Locale display names and flags - will be translated by runtime i18n const getLocaleInfo = (locale) => { const locales = { "en": { name: "English", flag: "🇺🇸" }, "vi": { name: "Tiếng Việt", flag: "🇻🇳" }, "zh-CN": { name: "简体中文", flag: "🇨🇳" }, "zh-TW": { name: "繁體中文", flag: "🇹🇼" }, "ja": { name: "日本語", flag: "🇯🇵" }, "pt-BR": { name: "Português (Brasil)", flag: "🇧🇷" }, "pt-PT": { name: "Português (Portugal)", flag: "🇵🇹" }, "ko": { name: "한국어", flag: "🇰🇷" }, "es": { name: "Español", flag: "🇪🇸" }, "de": { name: "Deutsch", flag: "🇩🇪" }, "fr": { name: "Français", flag: "🇫🇷" }, "he": { name: "עברית", flag: "🇮🇱" }, "ar": { name: "العربية", flag: "🇸🇦" }, "ru": { name: "Русский", flag: "🇷🇺" }, "pl": { name: "Polski", flag: "🇵🇱" }, "cs": { name: "Čeština", flag: "🇨🇿" }, "nl": { name: "Nederlands", flag: "🇳🇱" }, "tr": { name: "Türkçe", flag: "🇹🇷" }, "uk": { name: "Українська", flag: "🇺🇦" }, "tl": { name: "Tagalog", flag: "🇵🇭" }, "id": { name: "Indonesia", flag: "🇮🇩" }, "th": { name: "ไทย", flag: "🇹🇭" }, "hi": { name: "हिन्दी", flag: "🇮🇳" }, "bn": { name: "বাংলা", flag: "🇧🇩" }, "ur": { name: "اردو", flag: "🇵🇰" }, "ro": { name: "Română", flag: "🇷🇴" }, "sv": { name: "Svenska", flag: "🇸🇪" }, "it": { name: "Italiano", flag: "🇮🇹" }, "el": { name: "Ελληνικά", flag: "🇬🇷" }, "hu": { name: "Magyar", flag: "🇭🇺" }, "fi": { name: "Suomi", flag: "🇫🇮" }, "da": { name: "Dansk", flag: "🇩🇰" }, "no": { name: "Norsk", flag: "🇳🇴" } }; return locales[locale] || { name: locale, flag: "🌐" }; }; export default function LanguageSwitcher({ className = "" }) { const [locale, setLocale] = useState("en"); const [isPending, setIsPending] = useState(false); const [isOpen, setIsOpen] = useState(false); const modalRef = useRef(null); useEffect(() => { setLocale(getLocaleFromCookie()); }, []); // Close modal when clicking outside useEffect(() => { function handleClickOutside(event) { if (modalRef.current && !modalRef.current.contains(event.target)) { setIsOpen(false); } } if (isOpen) { document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); } }, [isOpen]); const handleSetLocale = async (nextLocale) => { if (nextLocale === locale || isPending) return; setIsPending(true); setIsOpen(false); try { await fetch("/api/locale", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ locale: nextLocale }), }); // Reload translations without full page reload await reloadTranslations(); setLocale(nextLocale); } catch (err) { console.error("Failed to set locale:", err); } finally { setIsPending(false); } }; return (