import { TranslationObject, langEn } from 'ontime-types'; import { useEffect, useMemo } from 'react'; import { useForm } from 'react-hook-form'; import { maybeAxiosError } from '../../../../../common/api/utils'; import Button from '../../../../../common/components/buttons/Button'; import Info from '../../../../../common/components/info/Info'; import Input from '../../../../../common/components/input/input/Input'; import Modal from '../../../../../common/components/modal/Modal'; import { useTranslation } from '../../../../../translation/TranslationProvider'; import * as Panel from '../../../panel-utils/PanelUtils'; import style from './CustomTranslationModal.module.scss'; interface CustomTranslationModalProps { isOpen: boolean; onClose: () => void; } export default function CustomTranslationModal({ isOpen, onClose }: CustomTranslationModalProps) { const { userTranslation, postUserTranslation } = useTranslation(); const customTranslationFormValues = useMemo(() => toFormValues(userTranslation), [userTranslation]); const { handleSubmit, register, reset, formState: { isSubmitting, isDirty, errors, isValid }, setError, } = useForm({ defaultValues: customTranslationFormValues, mode: 'onChange', }); // keep data up to date useEffect(() => { if (isOpen) { reset(customTranslationFormValues); } }, [customTranslationFormValues, isOpen, reset]); const onSubmit = async (formData: Record) => { try { const translationData: Record = {}; Object.keys(formData).forEach((key) => { translationData[toApiKey(key)] = formData[key]; }); await postUserTranslation(translationData as TranslationObject); reset(formData); } catch (error) { setError('root', { message: maybeAxiosError(error) }); } }; const resetToEnglish = () => { reset(toFormValues(langEn), { keepDefaultValues: true }); }; return ( Provide custom translations for the public views of Ontime.
You will need to activate this in the settings by selecting "Custom" as the views language.
{Object.entries(langEn).map(([key, value]) => ( ))} } footerElements={
{errors?.root && {errors.root.message}}
} /> ); } function toFormValues(translation: Partial) { const values: Record = {}; Object.keys(langEn).forEach((key) => { values[toFormKey(key)] = translation[key as keyof TranslationObject] || ''; }); return values; } function toFormKey(key: string) { return key.replace('.', '_'); } function toApiKey(key: string) { return key.replace('_', '.'); }