You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.7 KiB
74 lines
2.7 KiB
import { Label } from '@/components/ui/label' |
|
import { |
|
Select, |
|
SelectContent, |
|
SelectItem, |
|
SelectTrigger, |
|
SelectValue |
|
} from '@/components/ui/select' |
|
import { LocalizedLanguageNames } from '@/i18n' |
|
import SecondaryPageLayout from '@/layouts/SecondaryPageLayout' |
|
import { useTranslationService } from '@/providers/TranslationServiceProvider' |
|
import { TLanguage } from '@/types' |
|
import { forwardRef, useState } from 'react' |
|
import { useTranslation } from 'react-i18next' |
|
import JumbleTranslate from './JumbleTranslate' |
|
import LibreTranslate from './LibreTranslate' |
|
|
|
const TranslationPage = forwardRef(({ index }: { index?: number }, ref) => { |
|
const { t, i18n } = useTranslation() |
|
const { config, updateConfig } = useTranslationService() |
|
const [language, setLanguage] = useState<TLanguage>(i18n.language as TLanguage) |
|
|
|
const handleLanguageChange = (value: TLanguage) => { |
|
i18n.changeLanguage(value) |
|
setLanguage(value) |
|
} |
|
|
|
return ( |
|
<SecondaryPageLayout ref={ref} index={index} title={t('Translation')}> |
|
<div className="px-4 pt-2 space-y-4"> |
|
<div className="space-y-2"> |
|
<Label htmlFor="languages" className="text-base font-medium"> |
|
{t('Languages')} |
|
</Label> |
|
<Select defaultValue="en" value={language} onValueChange={handleLanguageChange}> |
|
<SelectTrigger id="languages" className="w-48"> |
|
<SelectValue /> |
|
</SelectTrigger> |
|
<SelectContent> |
|
{Object.entries(LocalizedLanguageNames).map(([key, value]) => ( |
|
<SelectItem key={key} value={key}> |
|
{value} |
|
</SelectItem> |
|
))} |
|
</SelectContent> |
|
</Select> |
|
</div> |
|
<div className="space-y-2"> |
|
<Label htmlFor="translation-service-select" className="text-base font-medium"> |
|
{t('Service')} |
|
</Label> |
|
<Select |
|
defaultValue={config.service} |
|
value={config.service} |
|
onValueChange={(newService) => { |
|
updateConfig({ service: newService as 'jumble' | 'libre_translate' }) |
|
}} |
|
> |
|
<SelectTrigger id="translation-service-select" className="w-[180px]"> |
|
<SelectValue placeholder={t('Select Translation Service')} /> |
|
</SelectTrigger> |
|
<SelectContent> |
|
<SelectItem value="jumble">Jumble</SelectItem> |
|
<SelectItem value="libre_translate">LibreTranslate</SelectItem> |
|
</SelectContent> |
|
</Select> |
|
</div> |
|
{config.service === 'jumble' ? <JumbleTranslate /> : <LibreTranslate />} |
|
</div> |
|
</SecondaryPageLayout> |
|
) |
|
}) |
|
TranslationPage.displayName = 'TranslationPage' |
|
export default TranslationPage
|
|
|