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 (
{/* Header */}

🎮 Game Language Manager

Manage text and voice language settings for your game

{/* Main Content */}
{/* Folder Selection Section */}

Game Directory

{gameDir && (

{gameDir}

)}
{folderCheckResult && (
{folderCheckResult === 'success' ? ( <> Valid game directory found! ) : ( <> Game directory not found. Please select the correct folder. )}
)}
{/* Current Language Display */} {(textLang && voiceLang) && (

Current Languages

Text Language

{getLanguageLabel(textLang)}

Voice Language

{getLanguageLabel(voiceLang)}

)} {/* Language Selection */}

Language Settings

{/* Text Language */}
{/* Voice Language */}
{/* Apply Button */}
{/* Instructions */}

📋 Instructions:

  1. 1. Click "Select Game Folder" and choose your game's root directory
  2. 2. Wait for the system to validate the game directory
  3. 3. Select your preferred text and voice languages
  4. 4. Click "Apply Language Settings" to save your changes
) }