diff --git a/website/public/locales/en/common.json b/website/public/locales/en/common.json index 0b2df79c..e18eb8ec 100644 --- a/website/public/locales/en/common.json +++ b/website/public/locales/en/common.json @@ -1,4 +1,17 @@ { + "about": "About", + "account_settings": "Account Settings", + "connect": "Connect", + "conversational": "Conversational AI for everyone.", + "dashboard": "Dashboard", "discord": "Discord", - "github": "GitHub" + "docs": "Docs", + "github": "GitHub", + "legal": "Legal", + "privacy_policy": "Privacy Policy", + "report_a_bug": "Report a Bug", + "sign_in": "Sign In", + "sign_out": "Sign Out", + "terms_of_service": "Terms of Service", + "title": "Open Assistant" } diff --git a/website/src/components/Footer.tsx b/website/src/components/Footer.tsx index b239708a..68cd7c01 100644 --- a/website/src/components/Footer.tsx +++ b/website/src/components/Footer.tsx @@ -1,9 +1,11 @@ import { Box, Divider, Flex, Text, useColorMode } from "@chakra-ui/react"; import Image from "next/image"; import Link from "next/link"; +import { useTranslation } from "next-i18next"; import { useMemo } from "react"; export function Footer() { + const { t } = useTranslation(); const { colorMode } = useColorMode(); const backgroundColor = colorMode === "light" ? "white" : "gray.800"; const textColor = colorMode === "light" ? "black" : "gray.300"; @@ -33,10 +35,10 @@ export function Footer() { - Open Assistant + {t("title")} - Conversational AI for everyone. + {t("conversational")} @@ -45,23 +47,23 @@ export function Footer() { - Legal + {t("legal")} - - + + - Connect + {t("connect")} - - + + - About + {t("about")} - + diff --git a/website/src/components/Header/Header.tsx b/website/src/components/Header/Header.tsx index de5abec2..a1b36123 100644 --- a/website/src/components/Header/Header.tsx +++ b/website/src/components/Header/Header.tsx @@ -1,7 +1,8 @@ -import { Box, Button, Text, Flex } from "@chakra-ui/react"; +import { Box, Button, Flex, Text } from "@chakra-ui/react"; import Image from "next/image"; import Link from "next/link"; import { useSession } from "next-auth/react"; +import { useTranslation } from "next-i18next"; import { Flags } from "react-feature-flags"; import { FaUser } from "react-icons/fa"; @@ -23,7 +24,8 @@ function AccountButton() { ); } -export function Header(props) { +export function Header() { + const { t } = useTranslation(); const { data: session } = useSession(); const homeURL = session ? "/dashboard" : "/"; @@ -34,7 +36,7 @@ export function Header(props) { logo - Open Assistant + {t("title")} diff --git a/website/src/components/Header/UserMenu.tsx b/website/src/components/Header/UserMenu.tsx index 99ec01f1..6fdde69e 100644 --- a/website/src/components/Header/UserMenu.tsx +++ b/website/src/components/Header/UserMenu.tsx @@ -13,6 +13,7 @@ import { } from "@chakra-ui/react"; import NextLink from "next/link"; import { signOut, useSession } from "next-auth/react"; +import { useTranslation } from "next-i18next"; import React, { ElementType, useCallback } from "react"; import { FiAlertTriangle, FiLayout, FiLogOut, FiSettings, FiShield } from "react-icons/fi"; @@ -25,6 +26,7 @@ interface MenuOption { } export function UserMenu() { + const { t } = useTranslation(); const borderColor = useColorModeValue("gray.300", "gray.600"); const handleSignOut = useCallback(() => { signOut({ callbackUrl: "/" }); @@ -36,23 +38,23 @@ export function UserMenu() { } const options: MenuOption[] = [ { - name: "Dashboard", + name: t("dashboard"), href: "/dashboard", - desc: "Dashboard", + desc: t("dashboard"), icon: FiLayout, isExternal: false, }, { - name: "Account Settings", + name: t("account_settings"), href: "/account", - desc: "Account Settings", + desc: t("account_settings"), icon: FiSettings, isExternal: false, }, { - name: "Report a Bug", + name: t("report_a_bug"), href: "https://github.com/LAION-AI/Open-Assistant/issues/new/choose", - desc: "Report a Bug", + desc: t("report_a_bug"), icon: FiAlertTriangle, isExternal: true, }, @@ -60,9 +62,9 @@ export function UserMenu() { if (session.user.role === "admin") { options.unshift({ - name: "Admin Dashboard", + name: t("admin_dashboard"), href: "/admin", - desc: "Admin Dashboard", + desc: t("admin_dashboard"), icon: FiShield, isExternal: false, }); @@ -105,7 +107,7 @@ export function UserMenu() { diff --git a/website/src/components/Hero.tsx b/website/src/components/Hero.tsx index 4605e9e2..d401e47e 100644 --- a/website/src/components/Hero.tsx +++ b/website/src/components/Hero.tsx @@ -2,8 +2,8 @@ import { Box, Text, useColorMode } from "@chakra-ui/react"; import Image from "next/image"; import { useTranslation } from "next-i18next"; -import { Container } from "./Container"; import { AnimatedCircles } from "./AnimatedCircles"; +import { Container } from "./Container"; export function Hero() { const { t } = useTranslation("index"); diff --git a/website/src/components/Layout.tsx b/website/src/components/Layout.tsx index 70a2ce2c..484d16ec 100644 --- a/website/src/components/Layout.tsx +++ b/website/src/components/Layout.tsx @@ -23,7 +23,7 @@ export const getDefaultLayout = (page: React.ReactElement) => ( export const getTransparentHeaderLayout = (page: React.ReactElement) => (
-
+
{page}
@@ -31,7 +31,7 @@ export const getTransparentHeaderLayout = (page: React.ReactElement) => ( export const getDashboardLayout = (page: React.ReactElement) => ( -
+
( export const getAdminLayout = (page: React.ReactElement) => (
-
+
({ + props: { + ...(await serverSideTranslations(locale)), + }, +}); diff --git a/website/src/pages/404.tsx b/website/src/pages/404.tsx index afe1d080..d4c58b54 100644 --- a/website/src/pages/404.tsx +++ b/website/src/pages/404.tsx @@ -3,6 +3,7 @@ import Head from "next/head"; import { FiAlertTriangle } from "react-icons/fi"; import { EmptyState } from "src/components/EmptyState"; import { getTransparentHeaderLayout } from "src/components/Layout"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; function Error() { return ( diff --git a/website/src/pages/500.tsx b/website/src/pages/500.tsx index 49eb2950..378bdfff 100644 --- a/website/src/pages/500.tsx +++ b/website/src/pages/500.tsx @@ -3,6 +3,7 @@ import Head from "next/head"; import { FiAlertTriangle } from "react-icons/fi"; import { EmptyState } from "src/components/EmptyState"; import { getTransparentHeaderLayout } from "src/components/Layout"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; function ServerError() { return ( diff --git a/website/src/pages/about.tsx b/website/src/pages/about.tsx index 490a6095..01182be0 100644 --- a/website/src/pages/about.tsx +++ b/website/src/pages/about.tsx @@ -4,6 +4,7 @@ import { Container } from "src/components/Container"; import Roadmap from "src/components/Roadmap"; import Services from "src/components/Services"; import Vision from "src/components/Vision"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; const AboutPage = () => { return ( diff --git a/website/src/pages/account/edit.tsx b/website/src/pages/account/edit.tsx index fe8e8981..52af7e5e 100644 --- a/website/src/pages/account/edit.tsx +++ b/website/src/pages/account/edit.tsx @@ -4,6 +4,7 @@ import Router from "next/router"; import { useSession } from "next-auth/react"; import React from "react"; import { Control, useForm, useWatch } from "react-hook-form"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; export default function Account() { const { data: session } = useSession(); diff --git a/website/src/pages/account/index.tsx b/website/src/pages/account/index.tsx index d26fc842..813ce8ea 100644 --- a/website/src/pages/account/index.tsx +++ b/website/src/pages/account/index.tsx @@ -3,6 +3,7 @@ import Head from "next/head"; import Link from "next/link"; import { useSession } from "next-auth/react"; import React from "react"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; export default function Account() { const { data: session } = useSession(); diff --git a/website/src/pages/admin/index.tsx b/website/src/pages/admin/index.tsx index 9cbea222..f8827049 100644 --- a/website/src/pages/admin/index.tsx +++ b/website/src/pages/admin/index.tsx @@ -4,6 +4,7 @@ import { useSession } from "next-auth/react"; import { useEffect } from "react"; import { getAdminLayout } from "src/components/Layout"; import UsersCell from "src/components/UsersCell"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; /** * Provides the admin index page that will display a list of users and give diff --git a/website/src/pages/admin/manage_user/[id].tsx b/website/src/pages/admin/manage_user/[id].tsx index 88bfced4..b53bb7c0 100644 --- a/website/src/pages/admin/manage_user/[id].tsx +++ b/website/src/pages/admin/manage_user/[id].tsx @@ -3,6 +3,7 @@ import { InferGetServerSidePropsType } from "next"; import Head from "next/head"; import { useRouter } from "next/router"; import { useSession } from "next-auth/react"; +import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { getAdminLayout } from "src/components/Layout"; @@ -111,7 +112,7 @@ const ManageUser = ({ user }: InferGetServerSidePropsType { @@ -151,7 +151,7 @@ function Signin({ providers }: SigninProps) { Signin.getLayout = (page) => (
-
+
{page}
@@ -209,11 +209,12 @@ const DebugSigninForm = ({ credentials, bgColorClass }: { credentials: ClientSaf ); }; -export const getServerSideProps: GetServerSideProps = async () => { +export const getServerSideProps: GetServerSideProps = async ({ locale }) => { const providers = await getProviders(); return { props: { providers, + ...(await serverSideTranslations(locale, ["common"])), }, }; }; diff --git a/website/src/pages/create/assistant_reply.tsx b/website/src/pages/create/assistant_reply.tsx index cceeaf4e..1c83eb23 100644 --- a/website/src/pages/create/assistant_reply.tsx +++ b/website/src/pages/create/assistant_reply.tsx @@ -4,6 +4,7 @@ import { getDashboardLayout } from "src/components/Layout"; import { LoadingScreen } from "src/components/Loading/LoadingScreen"; import { Task } from "src/components/Tasks/Task"; import { useCreateAssistantReply } from "src/hooks/tasks/useCreateReply"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; const AssistantReply = () => { const { tasks, isLoading, reset, trigger } = useCreateAssistantReply(); diff --git a/website/src/pages/create/initial_prompt.tsx b/website/src/pages/create/initial_prompt.tsx index 6a51ca25..639df68f 100644 --- a/website/src/pages/create/initial_prompt.tsx +++ b/website/src/pages/create/initial_prompt.tsx @@ -4,6 +4,7 @@ import { getDashboardLayout } from "src/components/Layout"; import { LoadingScreen } from "src/components/Loading/LoadingScreen"; import { Task } from "src/components/Tasks/Task"; import { useCreateInitialPrompt } from "src/hooks/tasks/useCreateReply"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; const InitialPrompt = () => { const { tasks, isLoading, reset, trigger } = useCreateInitialPrompt(); diff --git a/website/src/pages/create/user_reply.tsx b/website/src/pages/create/user_reply.tsx index 8d2981e5..5898439c 100644 --- a/website/src/pages/create/user_reply.tsx +++ b/website/src/pages/create/user_reply.tsx @@ -4,6 +4,7 @@ import { getDashboardLayout } from "src/components/Layout"; import { LoadingScreen } from "src/components/Loading/LoadingScreen"; import { Task } from "src/components/Tasks/Task"; import { useCreatePrompterReply } from "src/hooks/tasks/useCreateReply"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; const UserReply = () => { const { tasks, isLoading, reset, trigger } = useCreatePrompterReply(); diff --git a/website/src/pages/dashboard.tsx b/website/src/pages/dashboard.tsx index 78a47fd4..3d6beb8b 100644 --- a/website/src/pages/dashboard.tsx +++ b/website/src/pages/dashboard.tsx @@ -3,6 +3,7 @@ import Head from "next/head"; import { LeaderboardTable, TaskOption, WelcomeCard } from "src/components/Dashboard"; import { getDashboardLayout } from "src/components/Layout"; import { TaskCategory } from "src/components/Tasks/TaskTypes"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; const Dashboard = () => { return ( diff --git a/website/src/pages/evaluate/rank_assistant_replies.tsx b/website/src/pages/evaluate/rank_assistant_replies.tsx index 695fbfdc..da79d92f 100644 --- a/website/src/pages/evaluate/rank_assistant_replies.tsx +++ b/website/src/pages/evaluate/rank_assistant_replies.tsx @@ -4,6 +4,7 @@ import { getDashboardLayout } from "src/components/Layout"; import { LoadingScreen } from "src/components/Loading/LoadingScreen"; import { Task } from "src/components/Tasks/Task"; import { useRankAssistantRepliesTask } from "src/hooks/tasks/useRankReplies"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; const RankAssistantReplies = () => { const { tasks, isLoading, reset, trigger } = useRankAssistantRepliesTask(); diff --git a/website/src/pages/evaluate/rank_initial_prompts.tsx b/website/src/pages/evaluate/rank_initial_prompts.tsx index 4eaaa110..f23fc0ed 100644 --- a/website/src/pages/evaluate/rank_initial_prompts.tsx +++ b/website/src/pages/evaluate/rank_initial_prompts.tsx @@ -4,6 +4,7 @@ import { getDashboardLayout } from "src/components/Layout"; import { LoadingScreen } from "src/components/Loading/LoadingScreen"; import { Task } from "src/components/Tasks/Task"; import { useRankInitialPromptsTask } from "src/hooks/tasks/useRankReplies"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; const RankInitialPrompts = () => { const { tasks, isLoading, reset, trigger } = useRankInitialPromptsTask(); diff --git a/website/src/pages/evaluate/rank_user_replies.tsx b/website/src/pages/evaluate/rank_user_replies.tsx index dd23030e..cee82b87 100644 --- a/website/src/pages/evaluate/rank_user_replies.tsx +++ b/website/src/pages/evaluate/rank_user_replies.tsx @@ -4,6 +4,7 @@ import { getDashboardLayout } from "src/components/Layout"; import { LoadingScreen } from "src/components/Loading/LoadingScreen"; import { Task } from "src/components/Tasks/Task"; import { useRankPrompterRepliesTask } from "src/hooks/tasks/useRankReplies"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; const RankUserReplies = () => { const { tasks, isLoading, reset, trigger } = useRankPrompterRepliesTask(); diff --git a/website/src/pages/label/label_assistant_reply.tsx b/website/src/pages/label/label_assistant_reply.tsx index 5cb45278..07a6cb1c 100644 --- a/website/src/pages/label/label_assistant_reply.tsx +++ b/website/src/pages/label/label_assistant_reply.tsx @@ -4,6 +4,7 @@ import { getDashboardLayout } from "src/components/Layout"; import { LoadingScreen } from "src/components/Loading/LoadingScreen"; import { Task } from "src/components/Tasks/Task"; import { useLabelAssistantReplyTask } from "src/hooks/tasks/useLabelingTask"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; const LabelAssistantReply = () => { const { tasks, isLoading, trigger, reset } = useLabelAssistantReplyTask(); diff --git a/website/src/pages/label/label_initial_prompt.tsx b/website/src/pages/label/label_initial_prompt.tsx index d7c1d4b2..8735044f 100644 --- a/website/src/pages/label/label_initial_prompt.tsx +++ b/website/src/pages/label/label_initial_prompt.tsx @@ -4,6 +4,7 @@ import { getDashboardLayout } from "src/components/Layout"; import { LoadingScreen } from "src/components/Loading/LoadingScreen"; import { Task } from "src/components/Tasks/Task"; import { useLabelInitialPromptTask } from "src/hooks/tasks/useLabelingTask"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; const LabelInitialPrompt = () => { const { tasks, isLoading, trigger, reset } = useLabelInitialPromptTask(); diff --git a/website/src/pages/label/label_prompter_reply.tsx b/website/src/pages/label/label_prompter_reply.tsx index b48e6aab..17164e11 100644 --- a/website/src/pages/label/label_prompter_reply.tsx +++ b/website/src/pages/label/label_prompter_reply.tsx @@ -4,6 +4,7 @@ import { getDashboardLayout } from "src/components/Layout"; import { LoadingScreen } from "src/components/Loading/LoadingScreen"; import { Task } from "src/components/Tasks/Task"; import { useLabelPrompterReplyTask } from "src/hooks/tasks/useLabelingTask"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; const LabelPrompterReply = () => { const { tasks, isLoading, trigger, reset } = useLabelPrompterReplyTask(); diff --git a/website/src/pages/leaderboard.tsx b/website/src/pages/leaderboard.tsx index e53b0c52..f79dac52 100644 --- a/website/src/pages/leaderboard.tsx +++ b/website/src/pages/leaderboard.tsx @@ -2,6 +2,7 @@ import { Box, Heading, Tab, TabList, TabPanel, TabPanels, Tabs } from "@chakra-u import Head from "next/head"; import { getDashboardLayout } from "src/components/Layout"; import { LeaderboardGridCell } from "src/components/LeaderboardGridCell"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; import { LeaderboardTimeFrame } from "src/types/Leaderboard"; const Leaderboard = () => { diff --git a/website/src/pages/messages/[id]/index.tsx b/website/src/pages/messages/[id]/index.tsx index f55c03cc..51c28c42 100644 --- a/website/src/pages/messages/[id]/index.tsx +++ b/website/src/pages/messages/[id]/index.tsx @@ -1,5 +1,6 @@ import { Box, Text, useColorModeValue } from "@chakra-ui/react"; import Head from "next/head"; +import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import { getDashboardLayout } from "src/components/Layout"; import { MessageLoading } from "src/components/Loading/MessageLoading"; import { MessageTableEntry } from "src/components/Messages/MessageTableEntry"; @@ -48,10 +49,13 @@ const MessageDetail = ({ id }: { id: string }) => { ); }; -MessageDetail.getInitialProps = async ({ query }) => { - const { id } = query; - return { id }; -}; - MessageDetail.getLayout = (page) => getDashboardLayout(page); + +export const getServerSideProps = async ({ locale, query }) => ({ + props: { + id: query.id, + ...(await serverSideTranslations(locale, ["common"])), + }, +}); + export default MessageDetail; diff --git a/website/src/pages/messages/index.tsx b/website/src/pages/messages/index.tsx index 627a8b18..3b6e342e 100644 --- a/website/src/pages/messages/index.tsx +++ b/website/src/pages/messages/index.tsx @@ -4,6 +4,7 @@ import { getDashboardLayout } from "src/components/Layout"; import { MessageTable } from "src/components/Messages/MessageTable"; import { get } from "src/lib/api"; import useSWRImmutable from "swr/immutable"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; const MessagesDashboard = () => { const boxBgColor = useColorModeValue("white", "gray.800"); diff --git a/website/src/pages/privacy-policy.tsx b/website/src/pages/privacy-policy.tsx index 1c94b669..f84dc1e8 100644 --- a/website/src/pages/privacy-policy.tsx +++ b/website/src/pages/privacy-policy.tsx @@ -3,6 +3,7 @@ import Head from "next/head"; import { getTransparentHeaderLayout } from "src/components/Layout"; import { PolicyChapterCard } from "src/components/PolicyCards/PolicyChapterCard"; import { PolicySectionCard } from "src/components/PolicyCards/PolicySectionCard"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; const PrivacyPolicy = () => { const backgroundColor = useColorModeValue("gray.100", "gray.800"); diff --git a/website/src/pages/terms-of-service.tsx b/website/src/pages/terms-of-service.tsx index b0e298ba..41269bdf 100644 --- a/website/src/pages/terms-of-service.tsx +++ b/website/src/pages/terms-of-service.tsx @@ -3,6 +3,7 @@ import Head from "next/head"; import { getTransparentHeaderLayout } from "src/components/Layout"; import { PolicyChapterCard } from "src/components/PolicyCards/PolicyChapterCard"; import { PolicySectionCard } from "src/components/PolicyCards/PolicySectionCard"; +export { getDefaultStaticProps as getStaticProps } from "src/lib/default_static_props"; const TermsOfService = () => { const TermsData = [