diff --git a/components/Languages.tsx b/components/Languages.tsx new file mode 100644 index 0000000..5b614fa --- /dev/null +++ b/components/Languages.tsx @@ -0,0 +1,15 @@ +import { FC } from "react"; + +type Props = { + langs: [string, string][] +}; + +const Languages: FC = ({ langs }) => ( + <> + {langs.map(([code, name]) => ( + + ))} + +); + +export default Languages; diff --git a/pages/[[...slug]].tsx b/pages/[[...slug]].tsx index 6d3169a..beae4af 100644 --- a/pages/[[...slug]].tsx +++ b/pages/[[...slug]].tsx @@ -3,6 +3,8 @@ import { GetStaticPaths, GetStaticProps, InferGetStaticPropsType } from "next"; import { useRouter } from "next/router"; import Error from "next/error"; import { googleScrape, extractSlug } from "../utils/translate"; +import Languages from "../components/Languages"; +import { languages, exceptions } from "../utils/languages.json"; const Page: FC> = ({ translation, error, initial }) => { if (error) @@ -10,9 +12,17 @@ const Page: FC> = ({ translation, const router = useRouter(); + const [source, setSource] = useState("auto"); + const [target, setTarget] = useState("en"); const [query, setQuery] = useState(""); + const updateTranslation = () => { + query && router.push(`/${source}/${target}/${query}`); + }; + useEffect(() => { + initial?.source && setSource(initial.source); + initial?.target && setTarget(initial.target); initial?.query && setQuery(initial.query); }, [initial]); @@ -20,12 +30,34 @@ const Page: FC> = ({ translation, if (!query || query === initial?.query) return; - const timeout = setTimeout(() => router.push(`/auto/en/${query}`), 2000); + const timeout = setTimeout(updateTranslation, 1500); return () => clearTimeout(timeout); }, [query]); + useEffect(updateTranslation, [source, target]); + + const langs = Object.entries(languages); + const sourceLangs = langs.filter(([code]) => !exceptions.source.includes(code)); + const targetLangs = langs.filter(([code]) => !exceptions.target.includes(code)); + return (
+
+ + +
+
+ + +