diff --git a/public/messages/en-US/folders-folder_id.json b/public/messages/en-US/folders-folder_id.json new file mode 100644 index 0000000..627df71 --- /dev/null +++ b/public/messages/en-US/folders-folder_id.json @@ -0,0 +1,30 @@ +{ + "unauthorized": "You are not the owner of this folder", + "back": "Back", + "backToFolders": "Back to folders", + "folderName": "Folder: {name}", + "textPairs": "Text Pairs", + "itemsCount": "{count} items", + "memorize": "Memorize", + "loadingTextPairs": "Loading text pairs...", + "noTextPairs": "No text pairs in this folder", + "addTextPair": "Add Text Pair", + "addNewTextPair": "Add New Text Pair", + "text1": "Text 1", + "text2": "Text 2", + "locale1": "Locale 1", + "locale2": "Locale 2", + "save": "Save", + "cancel": "Cancel", + "edit": "Edit", + "delete": "Delete", + "confirmDelete": "Are you sure you want to delete this text pair?", + "updateTextPair": "Update Text Pair", + "update": "Update", + "textPairSaved": "Text pair saved successfully", + "textPairUpdated": "Text pair updated successfully", + "textPairDeleted": "Text pair deleted successfully", + "errorSavingTextPair": "Failed to save text pair", + "errorUpdatingTextPair": "Failed to update text pair", + "errorDeletingTextPair": "Failed to delete text pair" +} diff --git a/public/messages/en-US/folders.json b/public/messages/en-US/folders.json new file mode 100644 index 0000000..700cbb6 --- /dev/null +++ b/public/messages/en-US/folders.json @@ -0,0 +1,14 @@ +{ + "title": "Folders", + "subtitle": "Manage your collections", + "newFolder": "New Folder", + "creating": "Creating...", + "noFoldersYet": "No folders yet", + "folderInfo": "{id}. {name} ({totalPairs})", + "enterFolderName": "Enter folder name:", + "confirmDelete": "Type \"{name}\" to delete:", + "createFolderError": "Failed to create folder", + "deleteFolderError": "Failed to delete folder", + "createFolderSuccess": "Folder created successfully", + "deleteFolderSuccess": "Folder deleted successfully" +} diff --git a/public/messages/en-US/login.json b/public/messages/en-US/login.json new file mode 100644 index 0000000..bfd5016 --- /dev/null +++ b/public/messages/en-US/login.json @@ -0,0 +1,4 @@ +{ + "loading": "Loading...", + "githubLogin": "GitHub Login" +} diff --git a/public/messages/en-US/memorize/folder-selector.json b/public/messages/en-US/memorize/folder-selector.json new file mode 100644 index 0000000..ebb3e89 --- /dev/null +++ b/public/messages/en-US/memorize/folder-selector.json @@ -0,0 +1,5 @@ +{ + "title": "Select a folder", + "noFolders": "No folders found", + "folderInfo": "{id}. {name} ({count})" +} diff --git a/public/messages/en-US/memorize/memorize.json b/public/messages/en-US/memorize/memorize.json new file mode 100644 index 0000000..e4818ec --- /dev/null +++ b/public/messages/en-US/memorize/memorize.json @@ -0,0 +1,8 @@ +{ + "showAnswer": "Show Answer", + "next": "Next", + "reverse": "Reverse", + "dictation": "Dictation", + "noTextPairs": "No text pairs available", + "progress": "{index}/{total}" +} diff --git a/public/messages/en-US/memorize/page.json b/public/messages/en-US/memorize/page.json new file mode 100644 index 0000000..ca80a10 --- /dev/null +++ b/public/messages/en-US/memorize/page.json @@ -0,0 +1,3 @@ +{ + "unauthorized": "Unauthorized access to this folder" +} diff --git a/public/messages/en-US/profile.json b/public/messages/en-US/profile.json new file mode 100644 index 0000000..6ed7275 --- /dev/null +++ b/public/messages/en-US/profile.json @@ -0,0 +1,5 @@ +{ + "myProfile": "My Profile", + "email": "Email: {email}", + "logout": "Logout" +} diff --git a/public/messages/en-US/translator.json b/public/messages/en-US/translator.json index 07d45ef..6d3a533 100644 --- a/public/messages/en-US/translator.json +++ b/public/messages/en-US/translator.json @@ -8,5 +8,7 @@ "other": "Other", "translating": "translating...", "translate": "translate", - "inputLanguage": "Input a language." + "inputLanguage": "Input a language.", + "history": "History", + "enterLanguage": "Enter language" } diff --git a/public/messages/en-US/translator/add-to-folder.json b/public/messages/en-US/translator/add-to-folder.json new file mode 100644 index 0000000..7f73b8d --- /dev/null +++ b/public/messages/en-US/translator/add-to-folder.json @@ -0,0 +1,8 @@ +{ + "chooseFolder": "Choose a Folder to Add to", + "notAuthenticated": "You are not authenticated", + "noFoldersFound": "No folders found", + "close": "Close", + "addToFolderSuccess": "Text pair added to folder", + "addToFolderError": "Failed to add text pair to folder" +} diff --git a/public/messages/zh-CN/folders-folder_id.json b/public/messages/zh-CN/folders-folder_id.json new file mode 100644 index 0000000..68e7bac --- /dev/null +++ b/public/messages/zh-CN/folders-folder_id.json @@ -0,0 +1,31 @@ +{ + "unauthorized": "您不是此文件夹的所有者", + "back": "返回", + "backToFolders": "返回文件夹", + "folderName": "文件夹:{name}", + "textPairs": "文本对", + "itemsCount": "{count} 项", + "memorize": "记忆", + "loadingTextPairs": "正在加载文本对...", + "noTextPairs": "此文件夹中没有文本对", + "addTextPair": "添加文本对", + "addNewTextPair": "添加新文本对", + "text1": "文本1", + "text2": "文本2", + "locale1": "语言1", + "locale2": "语言2", + "save": "保存", + "cancel": "取消", + "add": "添加", + "edit": "编辑", + "delete": "删除", + "confirmDelete": "确定要删除这个文本对吗?", + "updateTextPair": "更新文本对", + "update": "更新", + "textPairSaved": "文本对保存成功", + "textPairUpdated": "文本对更新成功", + "textPairDeleted": "文本对删除成功", + "errorSavingTextPair": "保存文本对失败", + "errorUpdatingTextPair": "更新文本对失败", + "errorDeletingTextPair": "删除文本对失败" +} diff --git a/public/messages/zh-CN/folders.json b/public/messages/zh-CN/folders.json new file mode 100644 index 0000000..769917e --- /dev/null +++ b/public/messages/zh-CN/folders.json @@ -0,0 +1,14 @@ +{ + "title": "文件夹", + "subtitle": "管理您的集合", + "newFolder": "新建文件夹", + "creating": "创建中...", + "noFoldersYet": "还没有文件夹", + "folderInfo": "{id}. {name} ({totalPairs})", + "enterFolderName": "输入文件夹名称:", + "confirmDelete": "输入 \"{name}\" 以删除:", + "createFolderError": "创建文件夹失败", + "deleteFolderError": "删除文件夹失败", + "createFolderSuccess": "文件夹创建成功", + "deleteFolderSuccess": "文件夹删除成功" +} diff --git a/public/messages/zh-CN/login.json b/public/messages/zh-CN/login.json new file mode 100644 index 0000000..02d2961 --- /dev/null +++ b/public/messages/zh-CN/login.json @@ -0,0 +1,4 @@ +{ + "loading": "加载中...", + "githubLogin": "GitHub 登录" +} diff --git a/public/messages/zh-CN/memorize/folder-selector.json b/public/messages/zh-CN/memorize/folder-selector.json new file mode 100644 index 0000000..6a5229f --- /dev/null +++ b/public/messages/zh-CN/memorize/folder-selector.json @@ -0,0 +1,5 @@ +{ + "title": "选择文件夹", + "noFolders": "未找到文件夹", + "folderInfo": "{id}. {name} ({count})" +} diff --git a/public/messages/zh-CN/memorize/memorize.json b/public/messages/zh-CN/memorize/memorize.json new file mode 100644 index 0000000..d7a50ef --- /dev/null +++ b/public/messages/zh-CN/memorize/memorize.json @@ -0,0 +1,8 @@ +{ + "showAnswer": "显示答案", + "next": "下一个", + "reverse": "反向", + "dictation": "听写", + "noTextPairs": "没有可用的文本对", + "progress": "{index}/{total}" +} diff --git a/public/messages/zh-CN/memorize/page.json b/public/messages/zh-CN/memorize/page.json new file mode 100644 index 0000000..4532440 --- /dev/null +++ b/public/messages/zh-CN/memorize/page.json @@ -0,0 +1,3 @@ +{ + "unauthorized": "您无权访问该文件夹" +} diff --git a/public/messages/zh-CN/profile.json b/public/messages/zh-CN/profile.json new file mode 100644 index 0000000..e1a7730 --- /dev/null +++ b/public/messages/zh-CN/profile.json @@ -0,0 +1,5 @@ +{ + "myProfile": "我的个人资料", + "email": "邮箱:{email}", + "logout": "退出登录" +} diff --git a/public/messages/zh-CN/translator.json b/public/messages/zh-CN/translator.json index 642bb71..671dabd 100644 --- a/public/messages/zh-CN/translator.json +++ b/public/messages/zh-CN/translator.json @@ -8,5 +8,7 @@ "other": "其他", "translating": "翻译中...", "translate": "翻译", - "inputLanguage": "请输入语言。" + "inputLanguage": "请输入语言。", + "history": "历史记录", + "enterLanguage": "输入语言" } diff --git a/public/messages/zh-CN/translator/add-to-folder.json b/public/messages/zh-CN/translator/add-to-folder.json new file mode 100644 index 0000000..098a7e6 --- /dev/null +++ b/public/messages/zh-CN/translator/add-to-folder.json @@ -0,0 +1,8 @@ +{ + "chooseFolder": "选择要添加到的文件夹", + "notAuthenticated": "您未登录", + "noFoldersFound": "未找到文件夹", + "close": "关闭", + "addToFolderSuccess": "文本对已添加到文件夹", + "addToFolderError": "添加文本对到文件夹失败" +} diff --git a/src/app/(features)/memorize/FolderSelector.tsx b/src/app/(features)/memorize/FolderSelector.tsx index ee93daf..62a971b 100644 --- a/src/app/(features)/memorize/FolderSelector.tsx +++ b/src/app/(features)/memorize/FolderSelector.tsx @@ -5,24 +5,26 @@ import { folder } from "../../../../generated/prisma/client"; import { Folder } from "lucide-react"; import { useRouter } from "next/navigation"; import { Center } from "@/components/Center"; +import { useTranslations } from "next-intl"; interface FolderSelectorProps { folders: (folder & { total_pairs: number })[]; } const FolderSelector: React.FC = ({ folders }) => { + const t = useTranslations("memorize/folder-selector"); const router = useRouter(); return (
{(folders.length === 0 && (

- No folders found. + {t("noFolders")}

)) || ( <>

- Select a folder: + {t("selectFolder")}

{folders.map((folder) => ( @@ -36,9 +38,12 @@ const FolderSelector: React.FC = ({ folders }) => {
- {folder.id}. {folder.name} + {t("folderInfo", { + id: folder.id, + name: folder.name, + count: folder.total_pairs, + })} - ({folder.total_pairs})
))} diff --git a/src/app/(features)/memorize/Memorize.tsx b/src/app/(features)/memorize/Memorize.tsx index 72aafbe..8957cbd 100644 --- a/src/app/(features)/memorize/Memorize.tsx +++ b/src/app/(features)/memorize/Memorize.tsx @@ -8,12 +8,14 @@ import LightButton from "@/components/buttons/LightButton"; import { useAudioPlayer } from "@/hooks/useAudioPlayer"; import { getTTSAudioUrl } from "@/lib/tts"; import { VOICES } from "@/config/locales"; +import { useTranslations } from "next-intl"; interface MemorizeProps { textPairs: text_pair[]; } const Memorize: React.FC = ({ textPairs }) => { + const t = useTranslations("memorize.memorize"); const [reverse, setReverse] = useState(false); const [dictation, setDictation] = useState(false); const [index, setIndex] = useState(0); @@ -27,7 +29,7 @@ const Memorize: React.FC = ({ textPairs }) => { <>
- {index + 1}/{textPairs.length} + {t("progress", { current: index + 1, total: textPairs.length })}
{dictation ? ( show === "question" ? ( @@ -86,7 +88,7 @@ const Memorize: React.FC = ({ textPairs }) => { setShow(show === "question" ? "answer" : "question"); }} > - {show === "question" ? "Show Answer" : "Next"} + {show === "question" ? t("showAnswer") : t("next")} { @@ -94,7 +96,7 @@ const Memorize: React.FC = ({ textPairs }) => { }} selected={reverse} > - Reverse + {t("reverse")} { @@ -102,11 +104,11 @@ const Memorize: React.FC = ({ textPairs }) => { }} selected={dictation} > - Dictation + {t("dictation")}
- )) ||

No text pairs available

} + )) ||

{t("noTextPairs")}

}
); diff --git a/src/app/(features)/memorize/page.tsx b/src/app/(features)/memorize/page.tsx index 5e5d124..dd92bab 100644 --- a/src/app/(features)/memorize/page.tsx +++ b/src/app/(features)/memorize/page.tsx @@ -2,6 +2,7 @@ import { redirect } from "next/navigation"; import { getServerSession } from "next-auth"; +import { getTranslations } from "next-intl/server"; import { getFoldersWithTotalPairsByOwner, getOwnerByFolderId, @@ -18,9 +19,14 @@ export default async function MemorizePage({ }) { const session = await getServerSession(); const username = session?.user?.name; + const t = await getTranslations("memorize.page"); - const t = (await searchParams).folder_id; - const folder_id = t ? (isNonNegativeInteger(t) ? parseInt(t) : null) : null; + const tParam = (await searchParams).folder_id; + const folder_id = tParam + ? isNonNegativeInteger(tParam) + ? parseInt(tParam) + : null + : null; if (!username) redirect( @@ -37,7 +43,7 @@ export default async function MemorizePage({ const owner = await getOwnerByFolderId(folder_id); if (owner !== username) { - return

无权访问该文件夹

; + return

{t("unauthorized")}

; } return ; diff --git a/src/app/(features)/translator/AddToFolder.tsx b/src/app/(features)/translator/AddToFolder.tsx index be085e5..a2bebfd 100644 --- a/src/app/(features)/translator/AddToFolder.tsx +++ b/src/app/(features)/translator/AddToFolder.tsx @@ -9,6 +9,7 @@ import { getFoldersByOwner } from "@/lib/services/folderService"; import { Folder } from "lucide-react"; import { createTextPair } from "@/lib/services/textPairService"; import { toast } from "sonner"; +import { useTranslations } from "next-intl"; interface AddToFolderProps { item: z.infer; @@ -18,6 +19,7 @@ interface AddToFolderProps { const AddToFolder: React.FC = ({ item, setShow }) => { const session = useSession(); const [folders, setFolders] = useState([]); + const t = useTranslations("translator.add-to-folder"); useEffect(() => { const username = session.data!.user!.name as string; @@ -28,7 +30,7 @@ const AddToFolder: React.FC = ({ item, setShow }) => { return (
-
You are not authenticated
; +
{t("notAuthenticated")}
); @@ -36,7 +38,7 @@ const AddToFolder: React.FC = ({ item, setShow }) => { return (
-

Choose a Folder to Add to

+

{t("chooseFolder")}

{(folders.length > 0 && folders.map((folder) => ( @@ -56,20 +58,20 @@ const AddToFolder: React.FC = ({ item, setShow }) => { }, }) .then(() => { - toast.success("Text pair added to folder"); + toast.success(t("success")); setShow(false); }) .catch(() => { - toast.error("Failed to add text pair to folder"); + toast.error(t("error")); }); }} > - {folder.id}. {folder.name} + {t("folderInfo", { id: folder.id, name: folder.name })} - ))) ||
No folders found
} + ))) ||
{t("noFolders")}
}
- setShow(false)}>Close + setShow(false)}>{t("close")}
); diff --git a/src/app/(features)/translator/page.tsx b/src/app/(features)/translator/page.tsx index 069eee4..0baad89 100644 --- a/src/app/(features)/translator/page.tsx +++ b/src/app/(features)/translator/page.tsx @@ -238,7 +238,7 @@ export default function TranslatorPage() { { - const newLang = prompt("Enter language"); + const newLang = prompt(t("enterLanguage")); if (newLang) { setLang(newLang); } @@ -261,7 +261,7 @@ export default function TranslatorPage() { {history.length > 0 && (
-

History

+

{t("history")}

{history.map((item, index) => (
diff --git a/src/app/folders/FoldersClient.tsx b/src/app/folders/FoldersClient.tsx index 301af7d..c0a31ff 100644 --- a/src/app/folders/FoldersClient.tsx +++ b/src/app/folders/FoldersClient.tsx @@ -10,6 +10,7 @@ import { deleteFolderById, getFoldersWithTotalPairsByOwner, } from "@/lib/services/folderService"; +import { useTranslations } from "next-intl"; interface FolderProps { folder: folder & { total_pairs: number }; @@ -18,6 +19,7 @@ interface FolderProps { } const FolderCard = ({ folder, deleteCallback, openCallback }: FolderProps) => { + const t = useTranslations("folders"); return (
{

- {folder.id}. {folder.name} ({folder.total_pairs}) + {t("folderInfo", { + id: folder.id, + name: folder.name, + totalPairs: folder.total_pairs, + })}

{/*

{} items

*/}
@@ -55,6 +61,7 @@ const FolderCard = ({ folder, deleteCallback, openCallback }: FolderProps) => { }; export default function FoldersClient({ username }: { username: string }) { + const t = useTranslations("folders"); const [folders, setFolders] = useState<(folder & { total_pairs: number })[]>( [], ); @@ -80,13 +87,13 @@ export default function FoldersClient({ username }: { username: string }) {
-

Folders

-

Manage your collections

+

{t("title")}

+

{t("subtitle")}

@@ -112,7 +119,7 @@ export default function FoldersClient({ username }: { username: string }) {
-

No folders yet

+

{t("noFoldersYet")}

) : (
@@ -121,7 +128,9 @@ export default function FoldersClient({ username }: { username: string }) { key={folder.id} folder={folder} deleteCallback={() => { - const confirm = prompt(`Type "${folder.name}" to delete:`); + const confirm = prompt( + t("confirmDelete", { name: folder.name }), + ); if (confirm === folder.name) { deleteFolderById(folder.id).then(updateFolders); } diff --git a/src/app/folders/[folder_id]/AddTextPairModal.tsx b/src/app/folders/[folder_id]/AddTextPairModal.tsx index 36549d3..1cbad2d 100644 --- a/src/app/folders/[folder_id]/AddTextPairModal.tsx +++ b/src/app/folders/[folder_id]/AddTextPairModal.tsx @@ -2,6 +2,7 @@ import LightButton from "@/components/buttons/LightButton"; import Input from "@/components/Input"; import { X } from "lucide-react"; import { useRef } from "react"; +import { useTranslations } from "next-intl"; interface AddTextPairModalProps { isOpen: boolean; @@ -19,6 +20,7 @@ export default function AddTextPairModal({ onClose, onAdd, }: AddTextPairModalProps) { + const t = useTranslations("folders.folder_id"); const input1Ref = useRef(null); const input2Ref = useRef(null); const input3Ref = useRef(null); @@ -66,25 +68,29 @@ export default function AddTextPairModal({

- Add New Text Pair + {t("addNewTextPair")}

- text1 + {t("text1")} +
- text2 + {t("text2")} +
- locale1 + {t("locale1")} +
- locale2 + {t("locale2")} +
- Add + {t("add")}
); diff --git a/src/app/folders/[folder_id]/InFolder.tsx b/src/app/folders/[folder_id]/InFolder.tsx index 2ba2462..77d435e 100644 --- a/src/app/folders/[folder_id]/InFolder.tsx +++ b/src/app/folders/[folder_id]/InFolder.tsx @@ -13,6 +13,8 @@ import { import AddTextPairModal from "./AddTextPairModal"; import TextPairCard from "./TextPairCard"; import LightButton from "@/components/buttons/LightButton"; +import { useTranslations } from "next-intl"; +import { toast } from "sonner"; export interface TextPair { id: number; @@ -27,6 +29,7 @@ export default function InFolder({ folderId }: { folderId: number }) { const [loading, setLoading] = useState(true); const [openAddModal, setAddModal] = useState(false); const router = useRouter(); + const t = useTranslations("folders.folder_id"); useEffect(() => { const fetchTextPairs = async () => { @@ -64,14 +67,16 @@ export default function InFolder({ folderId }: { folderId: number }) { className="flex items-center gap-2 text-gray-500 hover:text-gray-700 transition-colors mb-4" > - Back to folders + {t("back")}
-

Text Pairs

+

+ {t("textPairs")} +

- {textPairs.length} items + {t("itemsCount", { count: textPairs.length })}

@@ -81,7 +86,7 @@ export default function InFolder({ folderId }: { folderId: number }) { redirect(`/memorize?folder_id=${folderId}`); }} > - Memorize + {t("memorize")}
) : textPairs.length === 0 ? (
-

No text pair items

+

{t("noTextPairs")}

) : (
diff --git a/src/app/folders/[folder_id]/TextPairCard.tsx b/src/app/folders/[folder_id]/TextPairCard.tsx index 848fec8..348f492 100644 --- a/src/app/folders/[folder_id]/TextPairCard.tsx +++ b/src/app/folders/[folder_id]/TextPairCard.tsx @@ -4,6 +4,7 @@ import { updateTextPairById } from "@/lib/services/textPairService"; import { useState } from "react"; import { text_pairUpdateInput } from "../../../../generated/prisma/models"; import UpdateTextPairModal from "./UpdateTextPairModal"; +import { useTranslations } from "next-intl"; interface TextPairCardProps { textPair: TextPair; @@ -16,6 +17,7 @@ export default function TextPairCard({ onDel, refreshTextPairs, }: TextPairCardProps) { + const t = useTranslations("folders.folder_id"); const [openUpdateModal, setOpenUpdateModal] = useState(false); return (
diff --git a/src/app/folders/[folder_id]/UpdateTextPairModal.tsx b/src/app/folders/[folder_id]/UpdateTextPairModal.tsx index bd6636b..f805435 100644 --- a/src/app/folders/[folder_id]/UpdateTextPairModal.tsx +++ b/src/app/folders/[folder_id]/UpdateTextPairModal.tsx @@ -4,6 +4,7 @@ import { X } from "lucide-react"; import { useRef } from "react"; import { text_pairUpdateInput } from "../../../../generated/prisma/models"; import { TextPair } from "./InFolder"; +import { useTranslations } from "next-intl"; interface UpdateTextPairModalProps { isOpen: boolean; @@ -18,6 +19,7 @@ export default function UpdateTextPairModal({ onUpdate, textPair, }: UpdateTextPairModalProps) { + const t = useTranslations("folders.folder_id"); const input1Ref = useRef(null); const input2Ref = useRef(null); const input3Ref = useRef(null); @@ -65,25 +67,45 @@ export default function UpdateTextPairModal({

- Update Text Pair + {t("updateTextPair")}

- text1 + {t("text1")} +
- text2 + {t("text2")} +
- locale1 + {t("locale1")} +
- locale2 + {t("locale2")} +
- Update + {t("update")}
); diff --git a/src/app/folders/[folder_id]/page.tsx b/src/app/folders/[folder_id]/page.tsx index f5581c0..817e472 100644 --- a/src/app/folders/[folder_id]/page.tsx +++ b/src/app/folders/[folder_id]/page.tsx @@ -1,5 +1,6 @@ import { redirect } from "next/navigation"; import { getServerSession } from "next-auth"; +import { getTranslations } from "next-intl/server"; import InFolder from "./InFolder"; import { getOwnerByFolderId } from "@/lib/services/folderService"; export default async function FoldersPage({ @@ -10,12 +11,14 @@ export default async function FoldersPage({ const session = await getServerSession(); const { folder_id } = await params; const id = Number(folder_id); + const t = await getTranslations("folders.folder_id"); + if (!id) { redirect("/folders"); } if (!session?.user?.name) redirect(`/login?redirect=/folders/${id}`); if ((await getOwnerByFolderId(id)) !== session.user.name) { - return "you are not the owner of this folder"; + return

{t("unauthorized")}

; } return ; } diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index f924a31..49f6526 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -7,11 +7,13 @@ import { signIn, useSession } from "next-auth/react"; import Image from "next/image"; import { useRouter, useSearchParams } from "next/navigation"; import { useEffect } from "react"; +import { useTranslations } from "next-intl"; export default function LoginPage() { const session = useSession(); const router = useRouter(); const searchParams = useSearchParams(); + const t = useTranslations("login"); useEffect(() => { if (session.status === "authenticated") { @@ -22,7 +24,7 @@ export default function LoginPage() { return (
{session.status === "loading" ? ( -
Loading...
+
{t("loading")}
) : ( - GitHub Login + {t("githubLogin")} )}
diff --git a/src/app/profile/page.tsx b/src/app/profile/page.tsx index 894f232..fd8c17f 100644 --- a/src/app/profile/page.tsx +++ b/src/app/profile/page.tsx @@ -7,11 +7,13 @@ import { useEffect } from "react"; import { Center } from "@/components/Center"; import Container from "@/components/cards/Container"; import LightButton from "@/components/buttons/LightButton"; +import { useTranslations } from "next-intl"; export default function MePage() { const session = useSession(); const router = useRouter(); const pathname = usePathname(); + const t = useTranslations("profile"); useEffect(() => { if (session.status !== "authenticated") { @@ -22,7 +24,7 @@ export default function MePage() { return (
-

My Profile

+

{t("myProfile")}

{(session.data?.user?.image as string) && ( )}

{session.data?.user?.name}

-

Email: {session.data?.user?.email}

- Logout +

{t("email", { email: session.data?.user?.email })}

+ {t("logout")}
);