Multi Language
1. Add content
// ----------------------------------------------------
// File: src/utils/languages/ar.json
// ----------------------------------------------------
{
"Modern": "عصري",
"Contacts":"جهات الاتصال",
"Chats":"الدردشات"
}
// ----------------------------------------------------
// File: src/utils/languages/en.json
// ----------------------------------------------------
{
"Modern": "Modern",
"Contacts":"Contacts",
"Chats":"Chats"
}
// ----------------------------------------------------
// File: src/utils/languages/ch.json
// ----------------------------------------------------
{
"Modern": "現代的",
"Contacts":"聯繫人",
"Chats":"聊天記錄"
}
// ----------------------------------------------------
// File: src/utils/languages/fr.json
// ----------------------------------------------------
{
"Modern": "Moderne",
"Contacts":"Les contacts",
"Chats":"Chattes"
}
2. Usage
// --------------------------------------------------------------------
// File: package/main/src/layouts/vertical/header/Language.tsx
// --------------------------------------------------------------------
import { useContext, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { Dropdown, DropdownItem } from 'flowbite-react';
import { CustomizerContext } from 'src/context/CustomizerContext';
import englishFlag from '/src/assets/images/flag/icon-flag-en.svg';
import chineseFlag from '/src/assets/images/flag/icon-flag-cn.svg';
import frenchFlag from '/src/assets/images/flag/icon-flag-fr.svg';
import southAfricaFlag from '/src/assets/images/flag/icon-flag-sa.svg';
const Languages = [
{
flagname: 'English (UK)',
icon: englishFlag,
value: 'en',
},
{
flagname: '中国人 (Chinese)',
icon: chineseFlag,
value: 'ch',
},
{
flagname: 'français (French)',
icon: frenchFlag,
value: 'fr',
},
{
flagname: 'عربي (Arabic)',
icon: southAfricaFlag,
value: 'ar',
},
];
export const Language = () => {
const { i18n } = useTranslation();
const { isLanguage, setIsLanguage } = useContext(CustomizerContext);
const currentLang = Languages.find((_lang) => _lang.value === isLanguage) || Languages[1];
useEffect(() => {
i18n.changeLanguage(isLanguage);
}, [isLanguage, i18n]);
return (
<div className="relative group/menu px-4">
<Dropdown
label=""
className="w-56 rounded-sm"
dismissOnClick=false
renderTrigger=() => (
<span className="relative after:absolute after:w-10 after:-top-1/2 after:h-10 after:rounded-full hover:after:bg-lightprimary rounded-full flex justify-center items-center cursor-pointer group-hover/menu:after:bg-lightprimary">
<img
src={currentLang.icon}
alt="language"
className="rounded-full h-5 w-5 shrink-0 object-cover cursor-pointer"
/>
</span>
)}
>
{Languages.map((item, index) => (
<DropdownItem
className="flex gap-3 items-center py-3 px-6 bg-hover group w-full"
key={index}
onClick=() => setIsLanguage(item.value)
>
<img
src={item.icon}
alt="flag"
className="rounded-full object-cover h-5 w-5"
/>
<span
className="text-sm text-muted dark:text-darklink group-hover:!text-primary dark:group-hover:!text-primary font-medium leading-[25px]"
>
{item.flagname}
</span>
</DropdownItem>
))}
</Dropdown>
</div>
);
};
1. Add content
// ----------------------------------------------------
// File: src/utils/languages/ar.json
// ----------------------------------------------------
{
"Modern": "عصري",
"Contacts":"جهات الاتصال",
"Chats":"الدردشات"
}
// ----------------------------------------------------
// File: src/utils/languages/en.json
// ----------------------------------------------------
{
"Modern": "Modern",
"Contacts":"Contacts",
"Chats":"Chats"
}
// ----------------------------------------------------
// File: src/utils/languages/ch.json
// ----------------------------------------------------
{
"Modern": "現代的",
"Contacts":"聯繫人",
"Chats":"聊天記錄"
}
// ----------------------------------------------------
// File: src/utils/languages/fr.json
// ----------------------------------------------------
{
"Modern": "Moderne",
"Contacts":"Les contacts",
"Chats":"Chattes"
}
2. Usage
// --------------------------------------------------------------------
// File: package/main/src/layouts/vertical/header/Language.tsx
// --------------------------------------------------------------------
import { useContext, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { Dropdown, DropdownItem } from 'flowbite-react';
import { CustomizerContext } from 'src/context/CustomizerContext';
import englishFlag from '/src/assets/images/flag/icon-flag-en.svg';
import chineseFlag from '/src/assets/images/flag/icon-flag-cn.svg';
import frenchFlag from '/src/assets/images/flag/icon-flag-fr.svg';
import southAfricaFlag from '/src/assets/images/flag/icon-flag-sa.svg';
const Languages = [
{
flagname: 'English (UK)',
icon: englishFlag,
value: 'en',
},
{
flagname: '中国人 (Chinese)',
icon: chineseFlag,
value: 'ch',
},
{
flagname: 'français (French)',
icon: frenchFlag,
value: 'fr',
},
{
flagname: 'عربي (Arabic)',
icon: southAfricaFlag,
value: 'ar',
},
];
export const Language = () => {
const { i18n } = useTranslation();
const { isLanguage, setIsLanguage } = useContext(CustomizerContext);
const currentLang = Languages.find((_lang) => _lang.value === isLanguage) || Languages[1];
useEffect(() => {
i18n.changeLanguage(isLanguage);
}, [isLanguage, i18n]);
return (
<div className="relative group/menu px-4">
<Dropdown
label=""
className="w-56 rounded-sm"
dismissOnClick=false
renderTrigger=() => (
<span className="relative after:absolute after:w-10 after:-top-1/2 after:h-10 after:rounded-full hover:after:bg-lightprimary rounded-full flex justify-center items-center cursor-pointer group-hover/menu:after:bg-lightprimary">
<img
src={currentLang.icon}
alt="language"
className="rounded-full h-5 w-5 shrink-0 object-cover cursor-pointer"
/>
</span>
)}
>
{Languages.map((item, index) => (
<DropdownItem
className="flex gap-3 items-center py-3 px-6 bg-hover group w-full"
key={index}
onClick=() => setIsLanguage(item.value)
>
<img
src={item.icon}
alt="flag"
className="rounded-full object-cover h-5 w-5"
/>
<span
className="text-sm text-muted dark:text-darklink group-hover:!text-primary dark:group-hover:!text-primary font-medium leading-[25px]"
>
{item.flagname}
</span>
</DropdownItem>
))}
</Dropdown>
</div>
);
};