/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { useCallback } from 'react' import { INTERFACE_LANGUAGE_OPTIONS, normalizeInterfaceLanguage, } from '@/i18n/languages' import { Languages, Check } from 'lucide-react' import { useTranslation } from 'react-i18next' import { useAuthStore } from '@/stores/auth-store' import { api } from '@/lib/api' import { cn } from '@/lib/utils' import { Button } from '@/components/ui/button' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' export function LanguageSwitcher() { const { i18n, t } = useTranslation() const user = useAuthStore((s) => s.auth.user) const currentLanguage = normalizeInterfaceLanguage(i18n.language) const handleChangeLanguage = useCallback( async (code: string) => { await i18n.changeLanguage(code) if (user) { try { await api.put('/api/user/self', { language: code }) } catch { // Best-effort persistence; don't block the UI on failure } } }, [i18n, user] ) return ( } > {t('Change language')} {INTERFACE_LANGUAGE_OPTIONS.map((lang) => ( handleChangeLanguage(lang.code)} > {lang.label} ))} ) }