umami/src/app/(main)/profile/LanguageSetting.tsx

45 lines
1.4 KiB
TypeScript
Raw Normal View History

2024-02-04 16:44:20 +08:00
'use client';
import { useState } from 'react';
import { Button, Dropdown, Item, Flexbox } from 'react-basics';
import { useLocale, useMessages } from 'components/hooks';
2022-03-01 12:54:32 +08:00
import { DEFAULT_LOCALE } from 'lib/constants';
import { languages } from 'lib/lang';
import styles from './LanguageSetting.module.css';
2023-04-21 23:00:42 +08:00
export function LanguageSetting() {
const [search, setSearch] = useState('');
2023-03-23 05:05:55 +08:00
const { formatMessage, labels } = useMessages();
2022-03-01 12:54:32 +08:00
const { locale, saveLocale } = useLocale();
const options = search
? Object.keys(languages).filter(n => {
return (
n.toLowerCase().includes(search.toLowerCase()) ||
languages[n].label.toLowerCase().includes(search.toLowerCase())
);
})
: Object.keys(languages);
2022-03-01 12:54:32 +08:00
const handleReset = () => saveLocale(DEFAULT_LOCALE);
const renderValue = (value: string | number) => languages[value].label;
2022-03-01 12:54:32 +08:00
return (
2023-04-13 08:43:08 +08:00
<Flexbox gap={10}>
<Dropdown
items={options}
value={locale}
renderValue={renderValue}
2024-01-30 16:10:25 +08:00
onChange={val => saveLocale(val as string)}
allowSearch={true}
onSearch={setSearch}
menuProps={{ className: styles.menu }}
>
{item => <Item key={item}>{languages[item].label}</Item>}
</Dropdown>
2023-01-25 23:42:46 +08:00
<Button onClick={handleReset}>{formatMessage(labels.reset)}</Button>
</Flexbox>
2022-03-01 12:54:32 +08:00
);
}
2023-04-21 23:00:42 +08:00
export default LanguageSetting;