Files
Homarr/src/components/Settings/LanguageSwitch.tsx

106 lines
2.8 KiB
TypeScript
Raw Normal View History

2022-08-18 21:46:46 +02:00
import { Group, Image, Select, Stack, Text } from '@mantine/core';
import { showNotification } from '@mantine/notifications';
import { forwardRef, useState } from 'react';
2022-08-22 09:50:54 +02:00
import { useTranslation } from 'next-i18next';
2022-08-24 17:58:14 +02:00
import { useRouter } from 'next/router';
import { getLanguageByCode, Language } from '../../languages/language';
2022-08-18 21:46:46 +02:00
export default function LanguageSwitch() {
2022-08-22 09:50:54 +02:00
const { t, i18n } = useTranslation('settings/general/internationalization');
2022-08-24 17:58:14 +02:00
const { changeLanguage } = i18n;
2022-08-18 21:46:46 +02:00
2022-08-24 17:58:14 +02:00
const { locale, locales } = useRouter();
2022-08-24 18:00:50 +02:00
const [selectedLanguage, setSelectedLanguage] = useState<string | null | undefined>(locale);
2022-08-18 21:46:46 +02:00
2022-08-24 17:58:14 +02:00
const data = locales
? locales.map((localeItem) => ({
value: localeItem,
label: getLanguageByCode(localeItem).originalName,
image: `imgs/flags/${localeItem}.png`,
language: getLanguageByCode(localeItem),
}))
: [];
2022-08-18 21:46:46 +02:00
const onChangeSelect = (value: string) => {
2022-08-24 17:58:14 +02:00
setSelectedLanguage(value);
2022-08-18 21:46:46 +02:00
2022-08-24 17:58:14 +02:00
const newLanguage = getLanguageByCode(value);
2022-08-18 21:46:46 +02:00
2022-08-24 17:58:14 +02:00
changeLanguage(value)
2022-08-18 21:46:46 +02:00
.then(() => {
showNotification({
title: 'Language changed',
2022-08-24 17:58:14 +02:00
message: `You changed the language to '${newLanguage.originalName}'`,
2022-08-18 21:46:46 +02:00
color: 'green',
autoClose: 5000,
});
})
.catch((err) => {
showNotification({
title: 'Failed to change language',
2022-08-24 17:58:14 +02:00
message: `Failed to change to '${newLanguage.originalName}', Error:'${err}`,
2022-08-18 21:46:46 +02:00
color: 'red',
autoClose: 5000,
});
2022-08-24 17:58:14 +02:00
});
2022-08-18 21:46:46 +02:00
};
return (
<Stack>
<Select
2022-08-24 17:58:14 +02:00
icon={
<Image
width={30}
height={18}
src={`/imgs/flags/${selectedLanguage}.png`}
alt="country flag"
styles={{
root: {
borderRadius: 1.5,
overflow: 'hidden',
},
}}
/>
}
2022-08-22 09:50:54 +02:00
label={t('label')}
2022-08-24 17:58:14 +02:00
data={data}
2022-08-18 21:46:46 +02:00
itemComponent={SelectItem}
nothingFound="Nothing found"
onChange={onChangeSelect}
value={selectedLanguage}
2022-08-24 17:58:14 +02:00
defaultValue={locale}
styles={{
icon: {
width: 42,
},
input: {
paddingLeft: '45px !important',
},
}}
2022-08-18 21:46:46 +02:00
/>
</Stack>
);
}
interface ItemProps extends React.ComponentPropsWithoutRef<'div'> {
image: string;
2022-08-24 17:58:14 +02:00
language: Language;
2022-08-18 21:46:46 +02:00
}
const SelectItem = forwardRef<HTMLDivElement, ItemProps>(
2022-08-24 17:58:14 +02:00
({ language, image, ...others }: ItemProps, ref) => (
2022-08-18 21:46:46 +02:00
<div ref={ref} {...others}>
<Group noWrap>
<Image src={image} width={30} height={20} radius="xs" />
<div>
2022-08-24 17:58:14 +02:00
<Text size="sm">
{language.originalName} ({language.translatedName})
</Text>
2022-08-18 21:46:46 +02:00
</div>
</Group>
</div>
)
);