This commit is contained in:
@@ -471,6 +471,10 @@ function PanelUpdates({ updates, checking, updating, needsUpdateCount, installed
|
|||||||
}
|
}
|
||||||
|
|
||||||
function PanelLocale({ language, keyboard, layouts, api, t }) {
|
function PanelLocale({ language, keyboard, layouts, api, t }) {
|
||||||
|
const { setLanguage, setKeyboard } = useI18n()
|
||||||
|
const [editLocale, setEditLocale] = useState(false)
|
||||||
|
const [draftLang, setDraftLang] = useState(language)
|
||||||
|
const [draftKbd, setDraftKbd] = useState(keyboard)
|
||||||
const [saving, setSaving] = useState(false)
|
const [saving, setSaving] = useState(false)
|
||||||
const [toast, setToast] = useState(null)
|
const [toast, setToast] = useState(null)
|
||||||
|
|
||||||
@@ -482,7 +486,10 @@ function PanelLocale({ language, keyboard, layouts, api, t }) {
|
|||||||
const handleSave = async () => {
|
const handleSave = async () => {
|
||||||
setSaving(true)
|
setSaving(true)
|
||||||
try {
|
try {
|
||||||
await api.savePreferences({ language, keyboard_layout: keyboard })
|
await api.savePreferences({ language: draftLang, keyboard_layout: draftKbd })
|
||||||
|
setLanguage(draftLang)
|
||||||
|
setKeyboard(draftKbd)
|
||||||
|
setEditLocale(false)
|
||||||
showToast(t('config.saved'))
|
showToast(t('config.saved'))
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
showToast(`${t('config.error')}: ${err.message}`)
|
showToast(`${t('config.error')}: ${err.message}`)
|
||||||
@@ -490,41 +497,67 @@ function PanelLocale({ language, keyboard, layouts, api, t }) {
|
|||||||
setSaving(false)
|
setSaving(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const currentLang = LANGUAGES.find(l => l.id === language)
|
||||||
|
const currentKbd = layouts.find(l => l.id === keyboard)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="config-card">
|
<div className="config-profile-center">
|
||||||
{toast && <div className="config-toast">{toast}</div>}
|
{toast && <div className="config-toast">{toast}</div>}
|
||||||
<div className="config-card-group">
|
<div className="config-card">
|
||||||
<span className="config-card-group-label">{t('config.language')}</span>
|
<div className="config-card-row">
|
||||||
<div className="chip-row">
|
<span className="config-card-label">{t('config.language')}</span>
|
||||||
{LANGUAGES.map(lang => (
|
<span className="config-card-value">{currentLang?.name || language}</span>
|
||||||
<div
|
</div>
|
||||||
key={lang.id}
|
<div className="config-card-row">
|
||||||
className={`chip ${language === lang.id ? 'active' : ''}`}
|
<span className="config-card-label">{t('config.keyboardLayout')}</span>
|
||||||
onClick={() => setLanguage(lang.id)}
|
<span className="config-card-value">{currentKbd?.name || keyboard}</span>
|
||||||
>
|
|
||||||
{lang.name}
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="config-card-group">
|
{editLocale && (
|
||||||
<span className="config-card-group-label">{t('config.keyboardLayout')}</span>
|
<div className="config-card">
|
||||||
<div className="chip-row">
|
<div className="config-card-group">
|
||||||
{layouts.map(l => (
|
<span className="config-card-group-label">{t('config.language')}</span>
|
||||||
<div
|
<div className="chip-row">
|
||||||
key={l.id}
|
{LANGUAGES.map(lang => (
|
||||||
className={`chip ${keyboard === l.id ? 'active' : ''}`}
|
<div
|
||||||
onClick={() => setKeyboard(l.id)}
|
key={lang.id}
|
||||||
>
|
className={`chip ${draftLang === lang.id ? 'active' : ''}`}
|
||||||
{l.name}
|
onClick={() => setDraftLang(lang.id)}
|
||||||
|
>
|
||||||
|
{lang.name}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
</div>
|
</div>
|
||||||
))}
|
</div>
|
||||||
|
<div className="config-card-group">
|
||||||
|
<span className="config-card-group-label">{t('config.keyboardLayout')}</span>
|
||||||
|
<div className="chip-row">
|
||||||
|
{layouts.map(l => (
|
||||||
|
<div
|
||||||
|
key={l.id}
|
||||||
|
className={`chip ${draftKbd === l.id ? 'active' : ''}`}
|
||||||
|
onClick={() => setDraftKbd(l.id)}
|
||||||
|
>
|
||||||
|
{l.name}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div className="config-card">
|
||||||
|
<div className="config-card-actions" style={{ justifyContent: 'center' }}>
|
||||||
|
{editLocale ? (
|
||||||
|
<>
|
||||||
|
<button className="primary sm" onClick={handleSave} disabled={saving}>
|
||||||
|
{saving ? t('config.saving') : t('config.save')}
|
||||||
|
</button>
|
||||||
|
<button className="ghost sm" onClick={() => setEditLocale(false)}>{t('config.cancel')}</button>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<button className="primary sm" onClick={() => { setDraftLang(language); setDraftKbd(keyboard); setEditLocale(true) }}>{t('config.editProfile')}</button>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div className="config-card-actions">
|
|
||||||
<button className="primary sm" onClick={handleSave} disabled={saving}>
|
|
||||||
{saving ? t('config.saving') : t('config.save')}
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user