mirror of
https://github.com/umami-software/umami.git
synced 2026-02-07 22:27:16 +01:00
48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
import { useState } from 'react';
|
|
import { Button, Select, ListItem, Row } from '@umami/react-zen';
|
|
import { useLocale, useMessages } from '@/components/hooks';
|
|
import { DEFAULT_LOCALE } from '@/lib/constants';
|
|
import { languages } from '@/lib/lang';
|
|
|
|
export function LanguageSetting() {
|
|
const [search, setSearch] = useState('');
|
|
const { formatMessage, labels } = useMessages();
|
|
const { locale, saveLocale } = useLocale();
|
|
const items = search
|
|
? Object.keys(languages).filter(n => {
|
|
return (
|
|
n.toLowerCase().includes(search.toLowerCase()) ||
|
|
languages[n].label.toLowerCase().includes(search.toLowerCase())
|
|
);
|
|
})
|
|
: Object.keys(languages);
|
|
|
|
const handleReset = () => saveLocale(DEFAULT_LOCALE);
|
|
|
|
const handleOpen = (isOpen: boolean) => {
|
|
if (isOpen) {
|
|
setSearch('');
|
|
}
|
|
};
|
|
|
|
return (
|
|
<Row gap="3">
|
|
<Select
|
|
value={locale}
|
|
onChange={val => saveLocale(val as string)}
|
|
allowSearch
|
|
onSearch={setSearch}
|
|
onOpenChange={handleOpen}
|
|
listProps={{ style: { maxHeight: '300px' } }}
|
|
>
|
|
{items.map(item => (
|
|
<ListItem key={item} id={item}>
|
|
{languages[item].label}
|
|
</ListItem>
|
|
))}
|
|
{!items.length && <ListItem></ListItem>}
|
|
</Select>
|
|
<Button onPress={handleReset}>{formatMessage(labels.reset)}</Button>
|
|
</Row>
|
|
);
|
|
}
|