70 lines
2.1 KiB
TypeScript
70 lines
2.1 KiB
TypeScript
import { useState, useEffect } from 'react'
|
|
import { setLocale, getLocale, type Locale } from '@/lib/i18n'
|
|
import { localeStorage } from '@/lib/localeStorage'
|
|
|
|
interface LocaleButtonProps {
|
|
locale: Locale
|
|
label: string
|
|
currentLocale: Locale
|
|
onClick: (locale: Locale) => void
|
|
}
|
|
|
|
function LocaleButton({ locale, label, currentLocale, onClick }: LocaleButtonProps): React.ReactElement {
|
|
const isActive = currentLocale === locale
|
|
return (
|
|
<button
|
|
onClick={() => onClick(locale)}
|
|
className={`px-2 py-1 text-xs font-medium rounded transition-colors ${
|
|
isActive
|
|
? 'bg-neon-cyan/20 text-neon-cyan border border-neon-cyan/50'
|
|
: 'text-cyber-accent hover:text-neon-cyan border border-transparent hover:border-neon-cyan/30'
|
|
}`}
|
|
>
|
|
{label}
|
|
</button>
|
|
)
|
|
}
|
|
|
|
export function LanguageSelector(): React.ReactElement {
|
|
const [currentLocale, setCurrentLocale] = useState<Locale>(getLocale())
|
|
|
|
useEffect(() => {
|
|
// Load saved locale from IndexedDB
|
|
const loadLocale = async (): Promise<void> => {
|
|
try {
|
|
// Migrate from localStorage if needed
|
|
await localeStorage.migrateFromLocalStorage()
|
|
|
|
// Load from IndexedDB
|
|
const savedLocale = await localeStorage.getLocale()
|
|
if (savedLocale) {
|
|
setLocale(savedLocale)
|
|
setCurrentLocale(savedLocale)
|
|
}
|
|
} catch (e) {
|
|
console.error('Error loading locale:', e)
|
|
}
|
|
}
|
|
void loadLocale()
|
|
}, [])
|
|
|
|
const handleLocaleChange = async (locale: Locale): Promise<void> => {
|
|
setLocale(locale)
|
|
setCurrentLocale(locale)
|
|
try {
|
|
await localeStorage.saveLocale(locale)
|
|
} catch (e) {
|
|
console.error('Error saving locale:', e)
|
|
}
|
|
// Force page reload to update all translations
|
|
window.location.reload()
|
|
}
|
|
|
|
return (
|
|
<div className="flex items-center gap-2">
|
|
<LocaleButton locale="fr" label="FR" currentLocale={currentLocale} onClick={handleLocaleChange} />
|
|
<LocaleButton locale="en" label="EN" currentLocale={currentLocale} onClick={handleLocaleChange} />
|
|
</div>
|
|
)
|
|
}
|