import { useEffect, useState } from 'react' import { Folder, Settings, Check, X, Globe, Mic } from 'lucide-react' import { FSService } from '@bindings/firefly-launcher/internal/fs-service' import { LanguageService } from '@bindings/firefly-launcher/internal/language-service' import { toast } from 'react-toastify' import useSettingStore from '@/stores/settingStore' export default function LanguagePage() { const { gameDir, setGameDir } = useSettingStore() const [folderCheckResult, setFolderCheckResult] = useState<'success' | 'error' | null>(null) const [textLang, setTextLang] = useState('') const [voiceLang, setVoiceLang] = useState('') const [selectedTextLang, setSelectedTextLang] = useState('') const [selectedVoiceLang, setSelectedVoiceLang] = useState('') const [isLoading, setIsLoading] = useState(false) const [isSettingLanguage, setIsSettingLanguage] = useState(false) const languageOptions = [ { value: 'en', label: 'English', flag: '🇺🇸' }, { value: 'cn', label: 'Chinese', flag: '🇨🇳' }, { value: 'jp', label: 'Japanese', flag: '🇯🇵' }, { value: 'kr', label: 'Korean', flag: '🇰🇷' } ] useEffect(() => { const getLanguage = async () => { if (!gameDir) return const subPath = "StarRail_Data/StreamingAssets" const fullPath = `${gameDir}/${subPath}` const exists = await FSService.DirExists(fullPath) if (!exists) { setTextLang("") setVoiceLang("") setSelectedTextLang("") setSelectedVoiceLang("") setFolderCheckResult("error") setGameDir("") return } const [ok, textLang, voiceLang, err] = await LanguageService.GetLanguage(fullPath) if (!ok) { setTextLang("") setVoiceLang("") setSelectedTextLang("") setSelectedVoiceLang("") setFolderCheckResult("error") setGameDir("") toast.error(err) return } // success setTextLang(textLang) setVoiceLang(voiceLang) setFolderCheckResult("success") setSelectedTextLang(textLang) setSelectedVoiceLang(voiceLang) } getLanguage() }, [gameDir]) const handlePickFolder = async () => { try { setIsLoading(true) const basePath = await FSService.PickFolder() if (basePath) { setGameDir(basePath) const subPath = 'StarRail_Data/StreamingAssets/DesignData/Windows' const fullPath = `${basePath}/${subPath}` const exists = await FSService.DirExists(fullPath) setFolderCheckResult(exists ? 'success' : 'error') setGameDir(exists ? basePath : "") if (!exists) { toast.error('Game directory not found. Please select the correct folder.') } } else { toast.error('No folder path selected') setFolderCheckResult('error') setGameDir('') } } catch (err: any) { toast.error('PickFolder error:', err) setFolderCheckResult('error') } finally { setIsLoading(false) } } const handleSetLanguage = async () => { if (!gameDir) { toast.error('No folder path selected') return } try { setIsSettingLanguage(true) const [ok, err] = await LanguageService.SetLanguage( `${gameDir}/StarRail_Data/StreamingAssets/DesignData/Windows`, selectedTextLang, selectedVoiceLang ) if (ok) { toast.success('Language set successfully') setTextLang(selectedTextLang) setVoiceLang(selectedVoiceLang) } else { toast.error(err) } } catch (err: any) { toast.error('SetLanguage error:', err) } finally { setIsSettingLanguage(false) } } const getLanguageLabel = (code: string) => { const lang = languageOptions.find(l => l.value === code) return lang ? `${lang.flag} ${lang.label}` : code } return (
Manage text and voice language settings for your game
{gameDir}
{getLanguageLabel(textLang)}
{getLanguageLabel(voiceLang)}