From 138f3f8b076137604ccec76da16b37ccf3e886d3 Mon Sep 17 00:00:00 2001 From: Baptiste Arnaud Date: Sat, 11 Mar 2023 11:05:07 +0100 Subject: [PATCH] :globe_with_meridians: Introduce i18n Only translate dashboard page for now Closes #322 --- apps/builder/next.config.js | 4 ++ apps/builder/package.json | 15 ++-- apps/builder/src/components/ConfirmModal.tsx | 4 +- .../components/AnnoucementBanner.tsx | 37 ---------- .../dashboard/components/AnnoucementModal.tsx | 70 ------------------- .../dashboard/components/DashboardHeader.tsx | 4 +- .../dashboard/components/DashboardPage.tsx | 6 +- .../src/features/dashboard/dashboard.spec.ts | 2 +- .../folders/components/BackButton.tsx | 4 +- .../folders/components/CreateBotButton.tsx | 4 +- .../folders/components/CreateFolderButton.tsx | 4 +- .../folders/components/FolderButton.tsx | 13 ++-- .../folders/components/FolderContent.tsx | 9 ++- .../folders/components/FolderPage.tsx | 5 +- .../folders/components/TypebotButton.tsx | 38 ++++++---- apps/builder/src/lib/theme.ts | 5 ++ apps/builder/src/locales/en.ts | 22 ++++++ apps/builder/src/locales/fr.ts | 24 +++++++ apps/builder/src/locales/index.ts | 14 ++++ apps/builder/src/locales/pt.ts | 24 +++++++ apps/builder/src/pages/_app.tsx | 35 +++++----- apps/builder/src/pages/index.tsx | 33 ++++++--- apps/builder/src/pages/typebots.tsx | 27 +++---- pnpm-lock.yaml | 17 +++++ 24 files changed, 237 insertions(+), 183 deletions(-) delete mode 100644 apps/builder/src/features/dashboard/components/AnnoucementBanner.tsx delete mode 100644 apps/builder/src/features/dashboard/components/AnnoucementModal.tsx create mode 100644 apps/builder/src/locales/en.ts create mode 100644 apps/builder/src/locales/fr.ts create mode 100644 apps/builder/src/locales/index.ts create mode 100644 apps/builder/src/locales/pt.ts diff --git a/apps/builder/next.config.js b/apps/builder/next.config.js index 6a7f2fe6c..6085ecb71 100644 --- a/apps/builder/next.config.js +++ b/apps/builder/next.config.js @@ -7,6 +7,10 @@ const withTM = require('next-transpile-modules')(['utils', 'models', 'emails']) const nextConfig = withTM({ reactStrictMode: true, output: 'standalone', + i18n: { + defaultLocale: 'en', + locales: ['en', 'fr', 'pr'], + }, experimental: { outputFileTracingRoot: path.join(__dirname, '../../'), }, diff --git a/apps/builder/package.json b/apps/builder/package.json index 8072bd4a5..fa06ae2c9 100644 --- a/apps/builder/package.json +++ b/apps/builder/package.json @@ -28,6 +28,7 @@ "@giphy/react-components": "6.5.2", "@googleapis/drive": "4.0.2", "@lezer/css": "^1.1.1", + "@paralleldrive/cuid2": "2.2.0", "@sentry/nextjs": "7.38.0", "@stripe/stripe-js": "1.47.0", "@tanstack/react-query": "^4.24.10", @@ -36,6 +37,8 @@ "@trpc/next": "10.12.0", "@trpc/react-query": "10.12.0", "@trpc/server": "10.12.0", + "@typebot.io/js": "workspace:*", + "@typebot.io/react": "workspace:*", "@udecode/plate-basic-marks": "19.2.0", "@udecode/plate-common": "^7.0.2", "@udecode/plate-core": "19.2.0", @@ -43,18 +46,15 @@ "@udecode/plate-serializer-html": "19.2.0", "@udecode/plate-ui-link": "19.2.0", "@udecode/plate-ui-toolbar": "19.2.0", + "@uiw/codemirror-extensions-langs": "^4.19.9", + "@uiw/codemirror-theme-github": "^4.19.9", + "@uiw/codemirror-theme-tokyo-night": "^4.19.9", + "@uiw/react-codemirror": "^4.19.9", "@use-gesture/react": "^10.2.24", "aws-sdk": "2.1321.0", "browser-image-compression": "2.0.0", "canvas-confetti": "1.6.0", "codemirror": "6.0.1", - "@paralleldrive/cuid2": "2.2.0", - "@typebot.io/js": "workspace:*", - "@typebot.io/react": "workspace:*", - "@uiw/codemirror-extensions-langs": "^4.19.9", - "@uiw/codemirror-theme-github": "^4.19.9", - "@uiw/codemirror-theme-tokyo-night": "^4.19.9", - "@uiw/react-codemirror": "^4.19.9", "deep-object-diff": "1.1.9", "dequal": "2.0.3", "emails": "workspace:*", @@ -73,6 +73,7 @@ "minio": "7.0.32", "next": "13.1.6", "next-auth": "4.19.2", + "@typebot.io/next-international": "^0.3.8", "nextjs-cors": "^2.1.2", "nodemailer": "6.9.1", "nprogress": "0.2.0", diff --git a/apps/builder/src/components/ConfirmModal.tsx b/apps/builder/src/components/ConfirmModal.tsx index bcfed137f..f7c425095 100644 --- a/apps/builder/src/components/ConfirmModal.tsx +++ b/apps/builder/src/components/ConfirmModal.tsx @@ -8,6 +8,7 @@ import { AlertDialogOverlay, Button, } from '@chakra-ui/react' +import { useScopedI18n } from '@/locales' type ConfirmDeleteModalProps = { isOpen: boolean @@ -28,6 +29,7 @@ export const ConfirmModal = ({ onConfirm, confirmButtonColor = 'red', }: ConfirmDeleteModalProps) => { + const scopedT = useScopedI18n('confirmModal') const [confirmLoading, setConfirmLoading] = useState(false) const cancelRef = useRef(null) @@ -52,7 +54,7 @@ export const ConfirmModal = ({ - {title ?? 'Are you sure?'} + {title ?? scopedT('defaultTitle')} {message} diff --git a/apps/builder/src/features/dashboard/components/AnnoucementBanner.tsx b/apps/builder/src/features/dashboard/components/AnnoucementBanner.tsx deleted file mode 100644 index 9bf128a50..000000000 --- a/apps/builder/src/features/dashboard/components/AnnoucementBanner.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { CloseButton, Flex, HStack, StackProps } from '@chakra-ui/react' -import React, { useEffect, useState } from 'react' - -type VerifyEmailBannerProps = { id: string } & StackProps - -export const Banner = ({ id, ...props }: VerifyEmailBannerProps) => { - const [show, setShow] = useState(false) - const localStorageKey = `banner-${id}` - - useEffect(() => { - if (!localStorage.getItem(localStorageKey)) setShow(true) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) - - const handleCloseClick = () => { - localStorage.setItem(localStorageKey, 'hide') - setShow(false) - } - - if (!show) return <> - return ( - - - {props.children} - - - - ) -} diff --git a/apps/builder/src/features/dashboard/components/AnnoucementModal.tsx b/apps/builder/src/features/dashboard/components/AnnoucementModal.tsx deleted file mode 100644 index b2fecfe7a..000000000 --- a/apps/builder/src/features/dashboard/components/AnnoucementModal.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalCloseButton, - ModalBody, - Text, - Stack, - Link, -} from '@chakra-ui/react' -import React, { useEffect, useState } from 'react' - -type Props = { - isOpen: boolean - onClose: () => void -} - -const localStorageKey = 'typebot-20-modal' -export const AnnoucementModal = ({ isOpen, onClose }: Props) => { - const [show, setShow] = useState(false) - - useEffect(() => { - if (!localStorage.getItem(localStorageKey)) setShow(true) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) - - const handleCloseClick = () => { - localStorage.setItem(localStorageKey, 'hide') - setShow(false) - onClose() - } - - if (!show) return <> - return ( - - - - What's new in Typebot 2.0? - - - Typebo 2.0 has been launched February the 15th 🎉. -