/* Copyright (C) 2025 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 React, { useState, useEffect, useContext } from 'react'; import { Card, Select, Typography, Avatar } from '@douyinfe/semi-ui'; import { Languages } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { API, showSuccess, showError } from '../../../../helpers'; import { UserContext } from '../../../../context/User'; // Language options with native names and flags const languageOptions = [ { value: 'zh', label: '中文', flag: '🇨🇳' }, { value: 'en', label: 'English', flag: '🇺🇸' }, { value: 'fr', label: 'Français', flag: '🇫🇷' }, { value: 'ru', label: 'Русский', flag: '🇷🇺' }, { value: 'ja', label: '日本語', flag: '🇯🇵' }, { value: 'vi', label: 'Tiếng Việt', flag: '🇻🇳' }, ]; const PreferencesSettings = ({ t }) => { const { i18n } = useTranslation(); const [userState, userDispatch] = useContext(UserContext); const [currentLanguage, setCurrentLanguage] = useState(i18n.language || 'zh'); const [loading, setLoading] = useState(false); // Load saved language preference from user settings useEffect(() => { if (userState?.user?.setting) { try { const settings = JSON.parse(userState.user.setting); if (settings.language) { setCurrentLanguage(settings.language); // Sync i18n with saved preference if (i18n.language !== settings.language) { i18n.changeLanguage(settings.language); } } } catch (e) { // Ignore parse errors } } }, [userState?.user?.setting, i18n]); const handleLanguagePreferenceChange = async (lang) => { if (lang === currentLanguage) return; setLoading(true); const previousLang = currentLanguage; try { // Update language immediately for responsive UX setCurrentLanguage(lang); i18n.changeLanguage(lang); // Save to backend const res = await API.put('/api/user/self', { language: lang, }); if (res.data.success) { showSuccess(t('语言偏好已保存')); // Update user context with new setting if (userState?.user?.setting) { try { const settings = JSON.parse(userState.user.setting); settings.language = lang; userDispatch({ type: 'login', payload: { ...userState.user, setting: JSON.stringify(settings), }, }); } catch (e) { // Ignore } } } else { showError(res.data.message || t('保存失败')); // Revert on error setCurrentLanguage(previousLang); i18n.changeLanguage(previousLang); } } catch (error) { showError(t('保存失败,请重试')); // Revert on error setCurrentLanguage(previousLang); i18n.changeLanguage(previousLang); } finally { setLoading(false); } }; return ( {/* Card Header */}
{t('偏好设置')}
{t('界面语言和其他个人偏好')}
{/* Language Setting Card */}
{t('语言偏好')} {t('选择您的首选界面语言,设置将自动保存并同步到所有设备')}