diff --git a/public/file.svg b/public/file.svg deleted file mode 100644 index 004145c..0000000 --- a/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg deleted file mode 100644 index 567f17b..0000000 --- a/public/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/home/banner_o.png b/public/images/home/banner_o.png deleted file mode 100644 index 4d98414..0000000 Binary files a/public/images/home/banner_o.png and /dev/null differ diff --git a/public/images/leaderboard/1-st.svg b/public/images/leaderboard/1-st.svg deleted file mode 100644 index 8512b7b..0000000 --- a/public/images/leaderboard/1-st.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/public/images/leaderboard/2-st.svg b/public/images/leaderboard/2-st.svg deleted file mode 100644 index 250e1e7..0000000 --- a/public/images/leaderboard/2-st.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/public/images/leaderboard/3-st.svg b/public/images/leaderboard/3-st.svg deleted file mode 100644 index e4a52fb..0000000 --- a/public/images/leaderboard/3-st.svg +++ /dev/null @@ -1,10 +0,0 @@ - -
- - - - - - - -
diff --git a/public/images/leaderboard/bg.png b/public/images/leaderboard/bg.png deleted file mode 100644 index 4a4c4c0..0000000 Binary files a/public/images/leaderboard/bg.png and /dev/null differ diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json deleted file mode 100644 index 1b2bacd..0000000 --- a/public/locales/en/translation.json +++ /dev/null @@ -1,851 +0,0 @@ -{ - "_.notfound.title.empty_title": "Oops, there’s nothing here…", - "common.mockprovider.text.div": "Initializing development environment...", - "common.mockprovider.text.p": "Initializing development environment...", - "common.uselogout.toast.toast_success": "Logged out", - "common.useregister.toast.toast_success": "Successful registration!", - "common.useregister.toast.toast_error": "Registration failed.", - "debug_mock.debugmockpage.text.div": "Waiting for the test results...", - "debug_mock.debugmockpage.text.h1": "🔧 Mock API 调试页面", - "debug_mock.debugmockpage.text.h2": "Test Results", - "debug_mock.debugmockpage.text.button": "Clear result", - "debug_mock.debugmockpage.text.strong": "Service Worker支持:", - "demo.demopage.text.div": "Toggle Loading 4 Toggle Loading 4 Toggle Loading 4", - "demo.demopage.text.h1": "Component demo", - "demo.demopage.text.section": "Toggle Loading 4 Toggle Loading 4 Toggle Loading 4", - "demo.demopage.text.h2": "Manually Control Loading Status Manually Control Loading Status Manually Control Loading Status", - "demo.demopage.text.p": "The left sidebar supports the following functions:", - "demo.demopage.text.ul": "Smooth animation transitions", - "demo.demopage.text.li": "Smooth animation transitions", - "demo.demopage.text.alertdialog": "Continue operation", - "demo.demopage.text.alertdialogtrigger": "No close button", - "demo.demopage.text.button": "Toggle Loading 4 Toggle Loading 4 Toggle Loading 4", - "demo.demopage.text.alertdialogcontent": "Continue operation", - "demo.demopage.text.alertdialogheader": "This is an important reminder that you must choose an option to proceed.", - "demo.demopage.text.alertdialogtitle": "Important Note", - "demo.demopage.text.alertdialogdescription": "This is an important reminder that you must choose an option to proceed.", - "demo.demopage.text.alertdialogfooter": "Continue operation", - "demo.demopage.text.alertdialogcancel": "Oh, I see.", - "demo.demopage.text.alertdialogaction": "Continue operation", - "demo.demopage.text.iconbutton": "🗑️", - "demo.demopage.text.span": "🗑️", - "server_device_test.serverdevicetestpage.text.div": "This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 +", - "server_device_test.serverdevicetestpage.text.h1": "🖥️ 服务端设备ID测试", - "server_device_test.serverdevicetestpage.text.p": "This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 +", - "server_device_test.serverdevicetestpage.text.card": "This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 +", - "server_device_test.serverdevicetestpage.text.cardheader": "📋 服务端设备ID处理流程", - "server_device_test.serverdevicetestpage.text.cardtitle": "📋 服务端设备ID处理流程", - "server_device_test.serverdevicetestpage.text.cardcontent": "This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 + This is an architectural limitation of Next.js 13 +", - "server_device_test.serverdevicetestpage.text.h4": "rendering environment", - "server_device_test.serverdevicetestpage.text.ul": "• Device ID is passed to server level component via header • Device ID is passed to server level component via header", - "server_device_test.serverdevicetestpage.text.li": "• Device ID is passed to server level component via header • Device ID is passed to server level component via header", - "server_device_test.serverdevicetestpage.text.h5": "4. Restrictions 4. Restrictions", - "test_avatar_crop.testavatarcroppage.text.div": "• Smooth interactive animation effects • Smooth interactive animation effects", - "test_avatar_crop.testavatarcroppage.text.h1": "Avatar Crop Component Test", - "test_avatar_crop.testavatarcroppage.text.p": "Avatar clipping pop-up window based on design draft restoration", - "test_avatar_crop.testavatarcroppage.text.card": "• Smooth interactive animation effects • Smooth interactive animation effects", - "test_avatar_crop.testavatarcroppage.text.h2": "Design Restore", - "test_avatar_crop.testavatarcroppage.text.button": "Download avatar", - "test_avatar_crop.testavatarcroppage.text.span": "Selected:", - "test_avatar_crop.testavatarcroppage.alt.image_alt": "Cropped avatar", - "test_avatar_crop.testavatarcroppage.text.h3": "🎨 设计细节", - "test_avatar_setting.testavatarsettingpage.text.div": "Open avatar settings", - "test_avatar_setting.testavatarsettingpage.text.h1": "avatar setup test", - "test_avatar_setting.testavatarsettingpage.alt.img_alt": "Current Avatar", - "test_avatar_setting.testavatarsettingpage.text.button": "Open avatar settings", - "test_discord.testdiscordpage.toast.toast_error": "Mock login failed", - "test_discord.testdiscordpage.toast.toast_warning": "Missing configuration", - "test_discord.testdiscordpage.toast.toast_success": "Exit successfully", - "test_discord.testdiscordpage.text.div": "POST /web/third/login { \"appClient\": \"WEB\", \"deviceCode\": \"设备ID\", \"thirdToken\": \"discord_code\", \"thirdType\": \"DISCORD\" }", - "test_discord.testdiscordpage.text.h1": "Discord login test page", - "test_discord.testdiscordpage.text.p": "Http://localhost:3000/api/auth/discord/callback", - "test_discord.testdiscordpage.text.card": "POST /web/third/login { \"appClient\": \"WEB\", \"deviceCode\": \"设备ID\", \"thirdToken\": \"discord_code\", \"thirdType\": \"DISCORD\" }", - "test_discord.testdiscordpage.text.cardheader": "configuration instructions", - "test_discord.testdiscordpage.text.cardtitle": "configuration instructions", - "test_discord.testdiscordpage.text.cardcontent": "POST /web/third/login { \"appClient\": \"WEB\", \"deviceCode\": \"设备ID\", \"thirdToken\": \"discord_code\", \"thirdType\": \"DISCORD\" }", - "test_discord.testdiscordpage.text.strong": "Need to improve information:", - "test_discord.testdiscordpage.text.button": "clear log", - "test_discord.testdiscordpage.text.h4": "API interface:", - "test_discord.testdiscordpage.text.ol": "The front-end login page detects the code, and calls the back-end API to complete the login.", - "test_discord.testdiscordpage.text.li": "The front-end login page detects the code, and calls the back-end API to complete the login.", - "test_discord.testdiscordpage.text.pre": "POST /web/third/login { \"appClient\": \"WEB\", \"deviceCode\": \"设备ID\", \"thirdToken\": \"discord_code\", \"thirdType\": \"DISCORD\" }", - "test_image_crop.testimagecroppage.text.div": "Original image preview", - "test_image_crop.testimagecroppage.text.h1": "Image cropping test", - "test_image_crop.testimagecroppage.text.p": "Test various image cropping features and preset configurations", - "test_image_crop.testimagecroppage.text.card": "Original image preview", - "test_image_crop.testimagecroppage.text.h2": "Original image preview", - "test_image_crop.testimagecroppage.text.button": "download", - "test_image_crop.testimagecroppage.text.span": "Selected:", - "test_image_crop.testimagecroppage.alt.image_alt": "original image", - "test_image_crop.testimagecroppage.title.imagecropmodal_title": "Advanced image crop", - "test_image_crop.testimagecroppage.title.simpleimagecropmodal_title": "Simple image cropping", - "test_lamejs.testlamejs.text.div": "这个页面用于测试 lamejs 库是否能正确导入和初始化。 请打开浏览器控制台查看详细的日志信息。", - "test_lamejs.testlamejs.text.h1": "lamejs 导入测试", - "test_lamejs.testlamejs.text.button": "测试 lamejs 导入", - "test_lamejs.testlamejs.text.h3": "说明", - "test_lamejs.testlamejs.text.p": "这个页面用于测试 lamejs 库是否能正确导入和初始化。 请打开浏览器控制台查看详细的日志信息。", - "test_middleware.testmiddlewarepage.text.div": "If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing.", - "test_middleware.testmiddlewarepage.text.h1": "🔧 Middleware 测试页面", - "test_middleware.testmiddlewarepage.text.h2": "Navigation test", - "test_middleware.testmiddlewarepage.text.button": "Programmatically navigate to /profile Programmatically navigate to /profile", - "test_middleware.testmiddlewarepage.text.h3": "explain", - "test_middleware.testmiddlewarepage.text.p": "If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing. If you click the above button to navigate to /profile and do not see the middleware log in the console, MSW or something else is preventing middleware from executing.", - "test_mp3_conversion.testmp3conversion.toast.toast_success": "原始文件已下载", - "test_mp3_conversion.testmp3conversion.toast.toast_error": "录音失败", - "test_mp3_conversion.testmp3conversion.text.div": "您的浏览器不支持音频播放。", - "test_mp3_conversion.testmp3conversion.text.h1": "MP3转换测试", - "test_mp3_conversion.testmp3conversion.text.button": "下载MP3文件", - "test_mp3_conversion.testmp3conversion.text.p": "压缩率:", - "test_mp3_conversion.testmp3conversion.text.h3": "音频播放测试", - "test_mp3_conversion.testmp3conversion.text.audio": "您的浏览器不支持音频播放。", - "test_s3_upload.tests3uploadpage.text.div": "import { useS3Upload } from '@/hooks/useS3Upload' import { BizTypeEnum } from '@/services/common/types' const { uploading, progress, error, uploadFile } = useS3Upload({ bizType: BizTypeEnum.Role, maxRetries: 3, retryDelay: 2000, onSuccess: (url) => console.log('上传成功:', url), onError: (error) => console.error('上传失败:', error), onProgress: (progress) => console.log('进度:', progress.percentage + '%') }) // 使用 await uploadFile(file)", - "test_s3_upload.tests3uploadpage.text.h1": "AWS S3 Upload Test AWS S3 Upload Test AWS S3 Upload Test", - "test_s3_upload.tests3uploadpage.text.p": "Testing the file upload feature using the AWS S3 SDK Testing the file upload feature using the AWS S3 SDK Testing the file upload feature using the AWS S3 SDK Testing the file upload feature using the AWS S3 SDK Testing the file upload feature using the AWS S3 SDK", - "test_s3_upload.tests3uploadpage.text.h2": "How to use Hook How to use Hook", - "test_s3_upload.tests3uploadpage.text.pre": "import { useS3Upload } from '@/hooks/useS3Upload' import { BizTypeEnum } from '@/services/common/types' const { uploading, progress, error, uploadFile } = useS3Upload({ bizType: BizTypeEnum.Role, maxRetries: 3, retryDelay: 2000, onSuccess: (url) => console.log('上传成功:', url), onError: (error) => console.error('上传失败:', error), onProgress: (progress) => console.log('进度:', progress.percentage + '%') }) // 使用 await uploadFile(file)", - "common.airelationtag.text.div": "·", - "common.airelationtag.text.span": ">", - "common.airelationtag.text.tag": ">", - "common.s3uploaddemo.text.div": "✅ Presigned URL secure upload ✅ Presigned URL secure upload ✅ Presigned URL secure upload ✅ Presigned URL secure upload", - "common.s3uploaddemo.text.h3": "S3 file upload demo S3 file upload demo", - "common.s3uploaddemo.text.p": "MB)", - "common.s3uploaddemo.text.button": "reset", - "common.s3uploaddemo.text.span": "MB", - "common.s3uploaddemo.text.h4": "Functional features:", - "common.s3uploaddemo.text.ul": "✅ Presigned URL secure upload ✅ Presigned URL secure upload ✅ Presigned URL secure upload ✅ Presigned URL secure upload", - "common.s3uploaddemo.text.li": "✅ Presigned URL secure upload ✅ Presigned URL secure upload ✅ Presigned URL secure upload ✅ Presigned URL secure upload", - "common.abandoncreationdialog.text.alertdialog": "cancel", - "common.abandoncreationdialog.text.alertdialogcontent": "cancel", - "common.abandoncreationdialog.text.alertdialogheader": "Give up creation", - "common.abandoncreationdialog.text.alertdialogtitle": "Give up creation", - "common.abandoncreationdialog.text.alertdialogdescription": "If you choose to exit or regenerate the image, the already created image will disappear, and the number of creations will be consumed once.", - "common.abandoncreationdialog.text.alertdialogfooter": "cancel", - "common.abandoncreationdialog.text.alertdialogcancel": "cancel", - "common.handleconfirm.toast.toast_error": "Please enter nickname", - "common.aigeneratebutton.text.div": "AI Generate", - "common.aigeneratebutton.text.span": "AI Generate", - "common.aigeneratebutton.text.alertdialog": "Continue", - "common.aigeneratebutton.text.alertdialogcontent": "Continue", - "common.aigeneratebutton.text.alertdialogheader": "Warning", - "common.aigeneratebutton.text.alertdialogtitle": "Warning", - "common.aigeneratebutton.text.alertdialogdescription": "Using AI generation will overwrite the content you have already entered. Do you want to continue?", - "common.aigeneratebutton.text.alertdialogfooter": "Continue", - "common.aigeneratebutton.text.alertdialogcancel": "Cancel", - "common.aigeneratebutton.text.alertdialogaction": "Continue", - "common.albumdeletealert.text.alertdialog": "Delete", - "common.albumdeletealert.text.alertdialogcontent": "Delete", - "common.albumdeletealert.text.alertdialogheader": "Delete Album", - "common.albumdeletealert.text.alertdialogtitle": "Delete Album", - "common.albumdeletealert.text.alertdialogfooter": "Delete", - "common.albumdeletealert.text.alertdialogaction": "Got it", - "common.albumdeletealert.text.button": "Delete", - "common.schema.validation.message": "At least 20 diamonds", - "common.albumpricesetting.text.alertdialog": "Confirm", - "common.albumpricesetting.text.alertdialogcontent": "Confirm", - "common.albumpricesetting.text.alertdialogheader": "Unlock Method", - "common.albumpricesetting.text.alertdialogtitle": "Unlock Method", - "common.albumpricesetting.text.form": "Confirm", - "common.albumpricesetting.text.alertdialogdescription": "Price", - "common.albumpricesetting.text.div": "Price", - "common.albumpricesetting.text.formitem": "Price", - "common.albumpricesetting.text.formlabel": "Price", - "common.albumpricesetting.text.tooltip": "Set up several free images to attract interlocutors to interact with your avatar", - "common.albumpricesetting.text.tooltipcontent": "Set up several free images to attract interlocutors to interact with your avatar", - "common.albumpricesetting.text.p": "Set up several free images to attract interlocutors to interact with your avatar", - "common.albumpricesetting.text.formcontrol": "Free", - "common.albumpricesetting.text.select": "Free", - "common.albumpricesetting.text.selectcontent": "Free", - "common.albumpricesetting.text.selectitem": "Free", - "common.albumpricesetting.placeholder.input_placeholder": "Price", - "common.albumpricesetting.alt.image_alt": "Diamond", - "common.albumpricesetting.text.alertdialogfooter": "Confirm", - "common.albumpricesetting.text.button": "Confirm", - "common.handlepayment.toast.toast_error": "Payment failure, please try again", - "common.renderlist.text.div": "$", - "common.renderlist.alt.image_alt": "diamond", - "common.chargedrawer.text.drawer": "Cancel", - "common.chargedrawer.text.drawercontent": "Cancel", - "common.chargedrawer.text.drawerheader": "Charge", - "common.chargedrawer.text.drawertitle": "Charge", - "common.chargedrawer.text.drawerdescription": "The Crush coin is insufficient and cannot continue, please recharge", - "common.chargedrawer.text.div": "Cancel", - "common.chargedrawer.text.span": "Agreement", - "common.chargedrawer.text.link": "Agreement", - "common.chargedrawer.text.drawerfooter": "Cancel", - "common.questionicon.text.tooltip": "Voice call message price refers to the price of a voice call conversation with the character, calculated by item", - "common.questionicon.text.tooltipcontent": "Voice call message price refers to the price of a voice call conversation with the character, calculated by item", - "common.questionicon.text.div": "Voice call message price refers to the price of a voice call conversation with the character, calculated by item", - "common.questionicon.text.p": "Voice call message price refers to the price of a voice call conversation with the character, calculated by item", - "common.coininsufficientdialog.text.alertdialog": "Recharge", - "common.coininsufficientdialog.text.alertdialogcontent": "Recharge", - "common.coininsufficientdialog.text.alertdialogheader": "Crush Coin insufficient", - "common.coininsufficientdialog.text.alertdialogtitle": "Crush Coin insufficient", - "common.coininsufficientdialog.text.p": "Have a role-playing conversation with AI", - "common.coininsufficientdialog.text.div": "Recharge", - "common.coininsufficientdialog.text.h3": "Role-playing model", - "common.coininsufficientdialog.text.span": "Your Balance", - "common.coininsufficientdialog.text.button": "Recharge", - "common.createreachedlimitdialog.text.alertdialog": "you have reached the maximum number of AI creations.", - "common.createreachedlimitdialog.text.alertdialogcontent": "you have reached the maximum number of AI creations.", - "common.createreachedlimitdialog.text.alertdialogheader": "you have reached the maximum number of AI creations.", - "common.createreachedlimitdialog.text.alertdialogdescription": "you have reached the maximum number of AI creations.", - "common.deviceinfo.text.card": "• Will not be cleared when logging out (only clearAll will be cleared) • Will not be cleared when logging out (only clearAll will be cleared)", - "common.deviceinfo.text.cardheader": "📱 设备信息", - "common.deviceinfo.text.cardtitle": "📱 设备信息", - "common.deviceinfo.text.cardcontent": "• Will not be cleared when logging out (only clearAll will be cleared) • Will not be cleared when logging out (only clearAll will be cleared)", - "common.deviceinfo.text.div": "• Will not be cleared when logging out (only clearAll will be cleared) • Will not be cleared when logging out (only clearAll will be cleared)", - "common.deviceinfo.text.h4": "Authentication token (st) Authentication token (st)", - "common.deviceinfo.text.p": "Stored in a cookie, field named'st ', sent as AUTH_TK in the request header", - "common.deviceinfo.text.button": "Clear all data", - "common.deviceinfo.text.h5": "💡 设备ID说明", - "common.deviceinfo.text.ul": "• Will not be cleared when logging out (only clearAll will be cleared) • Will not be cleared when logging out (only clearAll will be cleared)", - "common.deviceinfo.text.li": "• Will not be cleared when logging out (only clearAll will be cleared) • Will not be cleared when logging out (only clearAll will be cleared)", - "common.items.aria.i_aria_hidden": "true", - "common.genderinput.aria.div_aria_label": "Gender", - "common.sidebar.alt.image_alt": "Expand", - "common.topbarwithoutlogin.alt.image_alt": "Logo", - "common.topbar.text.header": "Login in or Sign up", - "common.topbar.text.div": "Login in or Sign up", - "common.topbar.alt.image_alt": "logo", - "common.topbar.text.link": "Login in or Sign up", - "common.topbar.text.button": "Login in or Sign up", - "common.avatarcropmodal.text.div": "Confirm", - "common.empty.alt.image_alt": "Empty", - "common.imagecrop.text.div": "Rotate:", - "common.imagecrop.text.label": "Rotate:", - "common.imageviewer.text.imageviewerpaginationcontent": "/", - "common.imageviewer.text.div": "Choose", - "common.imageviewer.text.button": "Choose", - "common.defaultloadingmore.text.span": "Loading...", - "common.input.text.div": "/", - "common.input.text.span": "/", - "common.selectitem.alt.image_alt": "Check", - "_auth__about.aboutpage.text.div": "and the risky emotional gambles you feared to take.", - "_auth__about.aboutpage.alt.img_alt": "Banner", - "_auth__login.loginpage.text.div": "From \"Hello\" to \"I do\", every conversation is full of heart", - "_auth__login.loginpage.alt.image_alt": "Anime character", - "_main__chat.chatpage.title.empty_title": "Oops, there’s nothing here…", - "_main__contact.contactcard.text.div": "°", - "_main__contact.contactcard.alt.img_alt": "Heart", - "_main__contact.contactcard.text.span": "°", - "_main__contact.emptystate.text.div": "Start chatting with AI characters to build your contacts", - "_main__contact.emptystate.alt.img_alt": "Empty", - "_main__contact.emptystate.text.h3": "No contacts found", - "_main__contact.emptystate.text.p": "Start chatting with AI characters to build your contacts", - "_main__contact.contactspage.text.div": "Contacts", - "_main__contact.contactspage.text.h1": "Contacts", - "_main__creator.creatorpage.text.div": "Stay tuned", - "_main__creator.creatorpage.text.h1": "Creator", - "_main__creator.creatorpage.alt.image_alt": "gift", - "_main__crushcoin.crushcoinpage.text.div": "If you miss a check-in, the check-in count will reset and start again from day one.", - "_main__crushcoin.crushcoinpage.text.h1": "Daily free Crush Coin", - "_main__crushcoin.crushcoinpage.text.p": "If you miss a check-in, the check-in count will reset and start again from day one.", - "_main__explore.explorepage.text.div": "The third phase function is being polished, * & *... *...%...%... &% &...% &%... &% &... The third phase function is being polished, * & *... *...%...%... &% &...% &%... &% &...", - "_main__explore.explorepage.alt.image_alt": "Logo", - "_main__explore.explorepage.text.p": "The third phase function is being polished, * & *... *...%...%... &% &...% &%... &% &... The third phase function is being polished, * & *... *...%...%... &% &...% &%... &% &...", - "_main__leaderboard.leaderboardpage.text.div": "The gift list is ranked by the sum of the gift value received by the AI character.", - "_main__leaderboard.leaderboardpage.alt.image_alt": "Bg", - "_main__leaderboard.leaderboardpage.text.h1": "Leaderboard", - "_main__leaderboard.leaderboardpage.text.tooltip": "The gift list is ranked by the sum of the gift value received by the AI character.", - "_main__leaderboard.leaderboardpage.text.tooltipcontent": "The gift list is ranked by the sum of the gift value received by the AI character.", - "_main__leaderboard.leaderboardpage.text.p": "The gift list is ranked by the sum of the gift value received by the AI character.", - "_main__profile.profilepage.text.div": "ID:", - "_main__profile.profilepage.alt.image_alt": "Gender", - "_main__profile.profilepage.text.span": "ID:", - "_main__profile.profilepage.toast.toast_success": "Copied to clipboard", - "_main__test_voice_wave.testvoicewavepage.text.div": "import { VoiceWaveAnimation } from \"@/components/ui/voice-wave-animation\"; // 基础使用 // 自定义声波条数量 // 停止动画时的效果 ", - "_main__test_voice_wave.testvoicewavepage.text.h1": "Voice ripple animation effect display", - "_main__test_voice_wave.testvoicewavepage.text.h2": "How to use", - "_main__test_voice_wave.testvoicewavepage.text.p": "Features:", - "_main__test_voice_wave.testvoicewavepage.text.strong": "Features:", - "_main__test_voice_wave.testvoicewavepage.text.h3": "Article)", - "_main__test_voice_wave.testvoicewavepage.text.pre": "import { VoiceWaveAnimation } from \"@/components/ui/voice-wave-animation\"; // 基础使用 // 自定义声波条数量 // 停止动画时的效果 ", - "_main__test_voice_wave.testvoicewavepage.text.code": "import { VoiceWaveAnimation } from \"@/components/ui/voice-wave-animation\"; // 基础使用 // 自定义声波条数量 // 停止动画时的效果 ", - "_main__test_voice_wave.testvoicewavepage.text.ul": "Pure CSS implementation, excellent performance", - "_main__test_voice_wave.testvoicewavepage.text.li": "Pure CSS implementation, excellent performance", - "_main__vip.vippage.text.div": "Subscribe Now", - "_main__vip.vippage.text.h1": "Crush Level VIP", - "_main__vip.vippage.text.h2": "Crush Level VIP", - "_main__vip.vippage.text.button": "Subscribe Now", - "_main__wallet.walletpage.text.div": "Transaction Details >", - "_main__wallet.walletpage.text.h1": "Wallet", - "_main__wallet.walletpage.text.tabs": "Transaction Details >", - "_main__wallet.walletpage.text.tabslist": "Income", - "_main__wallet.walletpage.text.tabstrigger": "Income", - "_main__wallet.walletpage.text.link": "Transaction Details >", - "common.chatconversationsdeletedialog.text.alertdialog": "After deleting all messages, all message records will be cleared", - "common.chatconversationsdeletedialog.text.alertdialogcontent": "After deleting all messages, all message records will be cleared", - "common.chatconversationsdeletedialog.text.alertdialogheader": "Delete message", - "common.chatconversationsdeletedialog.text.alertdialogtitle": "Delete message", - "common.chatconversationsdeletedialog.text.alertdialogdescription": "After deleting all messages, all message records will be cleared", - "common.chatconversationsdeletedialog.text.alertdialogaction": "Delete", - "common.personitem.alt.image_alt": "Heart", - "common.personemptystate.title.empty_title": "We find nothing here", - "common.chatsearchresults.text.div": "Person", - "common.chatsearchresults.text.tabs": "Person", - "common.chatsearchresults.text.tabslist": "Person", - "common.chatsearchresults.text.tabstrigger": "Person", - "common.chatsearchresults.text.span": "Person", - "common.chatsidebar.text.div": "Chats", - "common.chatsidebar.text.span": "Chats", - "common.chatsidebar.placeholder.input_placeholder": "Search", - "common.chatsidebaraction.text.dropdownmenu": "Iconfont icon-Search", - "common.chatsidebaraction.text.dropdownmenucontent": "Iconfont icon-Search", - "common.chatsidebaraction.text.dropdownmenuitem": "Delete All", - "common.chatsidebaraction.text.span": "Delete All", - "common.chatsidebaritem.alt.image_alt": "heart", - "common.notice.text.div": "Notice", - "common.notice.alt.image_alt": "Notice", - "common.notice.text.span": "Notice", - "common.rendercheckbutton.text.button": "Check", - "common.noticedrawer.text.drawer": "Notice", - "common.noticedrawer.text.drawercontent": "Notice", - "common.noticedrawer.text.drawerheader": "Notice", - "_auth__login.discordbutton.toast.toast_error": "Discord登录失败", - "_auth__login.discordbutton.toast.toast_success": "Login successful", - "_auth__login.discordbutton.text.socialbutton": "Continue with Discord", - "_auth__login.imagecarousel.text.div": "No picture.", - "_auth__login.loginform.toast.toast_info": "Apple Sign In", - "_auth__login.loginform.text.div": "Privacy Policy", - "_auth__login.loginform.text.h2": "Log in/Sign up", - "_auth__login.loginform.text.p": "Privacy Policy", - "_auth__login.loginform.text.socialbutton": "Continue with Apple", - "_auth__login.loginform.text.link": "Privacy Policy", - "_auth__login_fields.schema.validation.message": "Please select your gender", - "_auth__login_fields.onsubmit.error.form_seterror": "Nickname already exists", - "_auth__login_fields.onsubmit.validation.message": "Nickname already exists", - "_auth__login_fields.fieldspage.text.div": "Submit", - "_auth__login_fields.fieldspage.alt.image_alt": "Anime character", - "_auth__login_fields.fieldspage.text.h2": "🎉🎉🎉 Welcome Join Us! 🎉🎉🎉", - "_auth__login_fields.fieldspage.text.form": "Submit", - "_auth__login_fields.fieldspage.text.formitem": "Can not edit after setting up", - "_auth__login_fields.fieldspage.text.formlabel": "Gender", - "_auth__login_fields.fieldspage.placeholder.input_placeholder": "Enter your nickname", - "_auth__login_fields.fieldspage.text.label": "Birthday", - "_auth__login_fields.fieldspage.placeholder.selectvalue_placeholder": "Day", - "_auth__login_fields.fieldspage.text.button": "Submit", - "_auth__policy_privacy.privacypolicypage.text.div": "Thank you for trusting Crushlevel. We strive to protect your information security!", - "_auth__policy_privacy.privacypolicypage.text.p": "Thank you for trusting Crushlevel. We strive to protect your information security!", - "_auth__policy_privacy.privacypolicypage.text.strong": "Account Deactivation:", - "_auth__policy_privacy.privacypolicypage.text.ul": "Troubleshoot issues, maintain service integrity, and protect your rights.", - "_auth__policy_privacy.privacypolicypage.text.li": "Troubleshoot issues, maintain service integrity, and protect your rights.", - "_auth__policy_recharge.rechargeagreementpage.text.div": "If you violate any provisions of this Agreement (including but not limited to purchasing Virtual Currency through unauthorized channels, using funds from illegal sources, etc.), the Platform has the right to take appropriate measures in accordance with the severity of the violation, including but not limited to warning, restricting account functions, temporarily or permanently banning your account, and requiring you to bear corresponding legal liability. If your violation causes losses to the Platform or third parties, you shall be liable for full compensation.", - "_auth__policy_recharge.rechargeagreementpage.text.p": "If you violate any provisions of this Agreement (including but not limited to purchasing Virtual Currency through unauthorized channels, using funds from illegal sources, etc.), the Platform has the right to take appropriate measures in accordance with the severity of the violation, including but not limited to warning, restricting account functions, temporarily or permanently banning your account, and requiring you to bear corresponding legal liability. If your violation causes losses to the Platform or third parties, you shall be liable for full compensation.", - "_auth__policy_recharge.rechargeagreementpage.text.strong": "the Platform does not provide refund services for this part of the Virtual Currency", - "_auth__policy_recharge.rechargeagreementpage.text.ul": "Other circumstances where you have intent or gross negligence (such as failure to update account security settings in a timely manner, ignoring account abnormal login reminders, etc.).", - "_auth__policy_recharge.rechargeagreementpage.text.li": "Other circumstances where you have intent or gross negligence (such as failure to update account security settings in a timely manner, ignoring account abnormal login reminders, etc.).", - "_auth__policy_tos.termsofservicepage.text.div": "Users are required to carefully read and strictly comply with the above agreement. Thank you for your support and trust in Crushlevel. We hope you enjoy using it!", - "_auth__policy_tos.termsofservicepage.text.p": "Users are required to carefully read and strictly comply with the above agreement. Thank you for your support and trust in Crushlevel. We hope you enjoy using it!", - "_auth__policy_tos.termsofservicepage.text.ul": "Other content that violates public order, good morals, or the provisions of this Agreement.", - "_auth__policy_tos.termsofservicepage.text.li": "Other content that violates public order, good morals, or the provisions of this Agreement.", - "_auth__share__userid_.notfound.alt.image_alt": "Anime character", - "_auth__share__userid_.notfound.title.empty_title": "Oops, there’s nothing here…", - "_auth__share__userid_.sharepage.text.div": "Chat. Crush. AI Date", - "_auth__share__userid_.sharepage.alt.image_alt": "Crushlevel", - "_auth__share__userid_.sharepage.text.button": "Chat", - "_auth__share__userid_.sharepage.text.p": "Intro:", - "_auth__share__userid_.sharepage.text.span": "Are you?", - "_main__chat__aiid_.notfound.title.empty_title": "Oops, there’s nothing here…", - "_main__contact.rendercontactstatustext.text.div": "Rank according to the total heart value of these characters", - "_main__contact.rendercontactstatustext.alt.image_alt": "Question-border", - "_main__contact.rendercontactstatustext.text.tooltip": "Rank according to the total heart value of these characters", - "_main__contact.rendercontactstatustext.text.tooltipcontent": "Rank according to the total heart value of these characters", - "_main__contact.rendercontactstatustext.text.p": "Rank according to the total heart value of these characters", - "_main__create.characterformschema.validation.message": "Please select gender", - "_main__create.onsubmit.error.form_seterror": "Nickname already exists", - "_main__create.onsubmit.validation.message": "Nickname already exists", - "_main__create.characterform.text.div": "Next", - "_main__create.characterform.text.h1": "Create Character", - "_main__create.characterform.text.form": "Next", - "_main__create.characterform.text.h2": "Character", - "_main__create.characterform.text.formitem": "Preferences", - "_main__create.characterform.text.formlabel": "Preferences", - "_main__create.characterform.placeholder.input_placeholder": "Enter character name", - "_main__create.characterform.text.label": "Birthday", - "_main__create.characterform.placeholder.selectvalue_placeholder": "Day", - "_main__create.characterform.placeholder.textarea_placeholder": "Describe the character's background, personality, and identity", - "_main__create.characterform.text.button": "Next", - "_main__create.closeiconbutton.text.alertdialog": "Quit", - "_main__create.closeiconbutton.text.alertdialogcontent": "Quit", - "_main__create.closeiconbutton.text.alertdialogheader": "The content has not been saved, Continue to quit?", - "_main__create.closeiconbutton.text.alertdialogtitle": "Unsaved changes", - "_main__create.closeiconbutton.text.alertdialogdescription": "The content has not been saved, Continue to quit?", - "_main__create.closeiconbutton.text.alertdialogfooter": "Quit", - "_main__create.closeiconbutton.text.alertdialogcancel": "Cancel", - "_main__create.closeiconbutton.text.alertdialogaction": "Quit", - "_main__create.copyrightrulemodal.text.alertdialog": "Confirm", - "_main__create.copyrightrulemodal.text.alertdialogcontent": "Confirm", - "_main__create.copyrightrulemodal.alt.image_alt": "Copyright Rule", - "_main__create.copyrightrulemodal.text.alertdialogdescription": "By clicking \"Confirm\", you represent and warrant that you are the original creator of this virtual character and that it does not infringe upon any third party's intellectual property rights or other legal rights.", - "_main__create.copyrightrulemodal.text.p": "By clicking \"Confirm\", you represent and warrant that you are the original creator of this virtual character and that it does not infringe upon any third party's intellectual property rights or other legal rights.", - "_main__create.copyrightrulemodal.text.alertdialogfooter": "Confirm", - "_main__create.copyrightrulemodal.text.alertdialogaction": "Confirm", - "_main__create.dialogueformschema.validation.message": "Please select voice", - "_main__create.dialogueform.text.div": "Female", - "_main__create.dialogueform.text.form": "Female", - "_main__create.dialogueform.text.h2": "Dialogue", - "_main__create.dialogueform.text.formitem": "Voice Tone", - "_main__create.dialogueform.text.formlabel": "Voice Tone", - "_main__create.dialogueform.placeholder.textarea_placeholder": "Please describe the way the characters chat, the tone of the dialogue", - "_main__create.dialogueform.text.span": "(Optional)", - "_main__create.dialogueform.text.label": "Suggestions", - "_main__create.dialogueform.text.tabs": "Female", - "_main__create.dialogueform.text.tabslist": "Female", - "_main__create.dialogueform.text.tabstrigger": "Female", - "_main__create.imageformschema.validation.message": "请上传或生成一张图片", - "_main__create.imageform.toast.toast_success": "Character created successfully!", - "_main__create.imageform.text.div": "Submit", - "_main__create.imageform.text.form": "Submit", - "_main__create.imageform.text.h2": "Image", - "_main__create.imageform.text.formitem": "Public", - "_main__create.imageform.text.formlabel": "Privacy", - "_main__create.imageform.alt.image_alt": "Avatar", - "_main__create.imageform.placeholder.textarea_placeholder": "Introduce the virtual character to the user", - "_main__create.imageform.text.chip": "Privacy", - "_main__create.imageform.text.button": "Submit", - "_main__create.imagegeneration.text.div": "Generating image...", - "_main__create.imagegeneration.text.h4": "Description", - "_main__create.imagegeneration.text.button": "Using Character Information", - "_main__create.imagegeneration.placeholder.textarea_placeholder": "Describe the character image you want to generate, for example: beautiful anime girl with long blue hair, wearing school uniform...", - "_main__create.imagegeneration.text.p": "Generating image...", - "_main__create.imagepreview.text.div": "Main image selected", - "_main__create.imagepreview.alt.image_alt": "Character image", - "_main__create.imagepreview.text.p": "Main image selected", - "_main__create.imageselector.text.div": "Click to Generate an Image", - "_main__create.imageupload.text.div": "files", - "_main__create.imageupload.text.p": "files", - "_main__create.typeform.text.div": "Tags", - "_main__create.typeform.text.form": "Tags", - "_main__create.typeform.text.h2": "Type", - "_main__create.typeform.text.formitem": "Tags", - "_main__create.typeform.text.formlabel": "Tags", - "_main__crushcoin.checkincard.text.div": "Not Started", - "_main__crushcoin.checkincard.alt.image_alt": "Star", - "_main__crushcoin.checkingrid.toast.toast_success": "Signed in today", - "_.genaralimagecard.text.div": "%...", - "_.genaralimagecard.alt.image_alt": "image", - "_.genaralimagecard.text.p": "%...", - "_.generalbuytimesdialog.text.alertdialog": "Continue", - "_.generalbuytimesdialog.text.alertdialogcontent": "Continue", - "_.generalbuytimesdialog.alt.image_alt": "diamond", - "_.generalbuytimesdialog.text.div": "Continue", - "_.generalbuytimesdialog.text.h2": "Buy Times", - "_.generalbuytimesdialog.text.span": "/time", - "_.generalbuytimesdialog.text.button": "Continue", - "_.renderunlocktext.text.div": "Unlock: Free", - "_.genaralimagecardmultiple.text.div": "Generating...", - "_.genaralimagecardmultiple.text.p": "Generating...", - "_.generalimagelist.text.div": "Your image will show here", - "_.generalimagelist.text.p": "Your image will show here", - "_.generalimagewithcountbutton.text.button": "Buy Times", - "_.generalimagewithcountbutton.alt.image_alt": "vip", - "_.renderpayaction.text.div": "Unlock Method: Free", - "_.multiplevieweraction.text.div": "Select", - "_.validatefile.toast.toast_error": "Image files cannot exceed 10MB.", - "_.referenceupload.alt.img_alt": "Reference", - "_.referenceupload.text.div": "Click or drag image here to Upload", - "_.referenceupload.text.p": "Click or drag image here to Upload", - "_main__generate_image.generateimageformschema.validation.message": "Please enter", - "_main__generate_image.generateimagepage.text.div": "Confirm", - "_main__generate_image.generateimagepage.text.form": "Generate", - "_main__generate_image.generateimagepage.text.h1": "Generate an Image", - "_main__generate_image.generateimagepage.text.formitem": "Prompt", - "_main__generate_image.generateimagepage.text.formlabel": "Prompt", - "_main__generate_image.generateimagepage.placeholder.textarea_placeholder": "Please describe the character's skin color, clothing, hairstyle, facial features, movements, background, etc.", - "_main__generate_image.generateimagepage.text.button": "Confirm", - "_main__generate_image_2_background.generateimageformschema.validation.message": "Please enter", - "_main__generate_image_2_background.image2backgroundpage.text.div": "Confirm", - "_main__generate_image_2_background.image2backgroundpage.text.form": "AI will create based on the basic image of the character", - "_main__generate_image_2_background.image2backgroundpage.text.h1": "Generate an Image", - "_main__generate_image_2_background.image2backgroundpage.text.formitem": "Prompt", - "_main__generate_image_2_background.image2backgroundpage.text.formlabel": "Prompt", - "_main__generate_image_2_background.image2backgroundpage.placeholder.textarea_placeholder": "Please describe the character's skin color, clothing, hairstyle, facial features, movements, background, etc.", - "_main__generate_image_2_background.image2backgroundpage.alt.image_alt": "Diamond", - "_main__generate_image_2_background.image2backgroundpage.text.button": "Confirm", - "_main__generate_image_2_image.generateimageformschema.validation.message": "Please enter", - "_main__generate_image_2_image.imagepage.text.div": "Confirm", - "_main__generate_image_2_image.imagepage.text.form": "AI will create based on the basic image of the character", - "_main__generate_image_2_image.imagepage.text.h1": "Generate an Image", - "_main__generate_image_2_image.imagepage.text.formitem": "Prompt", - "_main__generate_image_2_image.imagepage.text.formlabel": "Prompt", - "_main__generate_image_2_image.imagepage.placeholder.textarea_placeholder": "Please describe the character's skin color, clothing, hairstyle, facial features, movements, background, etc.", - "_main__generate_image_2_image.imagepage.text.button": "Confirm", - "_main__generate_image_edit.generateimageformschema.validation.message": "Please enter", - "_main__generate_image_edit.imageeditpage.text.div": "Confirm", - "_main__generate_image_edit.imageeditpage.text.form": "AI will create based on the basic image of the character.", - "_main__generate_image_edit.imageeditpage.text.h1": "Generate an Image", - "_main__generate_image_edit.imageeditpage.text.formitem": "Prompt", - "_main__generate_image_edit.imageeditpage.text.formlabel": "Prompt", - "_main__generate_image_edit.imageeditpage.placeholder.textarea_placeholder": "Please describe the character's skin color, clothing, hairstyle, facial features, movements, background, etc.", - "_main__generate_image_edit.imageeditpage.text.button": "Confirm", - "_.homeheader.text.div": "Daily Free Crush Coin", - "_.homeheader.text.link": "Daily Free Crush Coin", - "_.homeheader.alt.image_alt": "Banner", - "_.leaderboardbanner.text.div": "Gifts", - "_.leaderboardbanner.text.chip": "Gifts", - "_main__leaderboard.largerankcard.text.link": "1st", - "_main__leaderboard.largerankcard.text.div": "1st", - "_main__leaderboard.topheader.text.div": "No leaderboard data yet", - "_main__profile_account.handledisableaccount.toast.toast_success": "Account disabled successfully", - "_main__profile_account.accountpage.text.div": "Disable", - "_main__profile_account.accountpage.text.h1": "Account", - "_main__profile_account.accountpage.text.alertdialog": "Disable", - "_main__profile_account.accountpage.text.alertdialogtrigger": "Disable the Account", - "_main__profile_account.accountpage.text.button": "Disable the Account", - "_main__profile_account.accountpage.text.alertdialogcontent": "Disable", - "_main__profile_account.accountpage.text.alertdialogheader": "Disable the Account", - "_main__profile_account.accountpage.text.alertdialogtitle": "Disable the Account", - "_main__profile_account.accountpage.text.alertdialogdescription": "Are you sure you want to disable your account?", - "_main__profile_account.accountpage.text.alertdialogfooter": "Disable", - "_main__profile_account.accountpage.text.alertdialogcancel": "Cancel", - "_main__profile_account.accountpage.text.alertdialogaction": "Disable", - "_main__profile.handlefileupload.toast.toast_error": "Image files cannot exceed 10MB.", - "_main__profile.avatarsetting.text.div": "Upload", - "_main__profile.avatarsetting.text.p": "The avatar must be in JPG, JPEG, or PNG format, and the file size cannot exceed 10MB.", - "_main__profile.avatarsetting.text.button": "Upload", - "_main__profile.charactercardadd.text.div": "Add a Character", - "_main__profile.charactercardadd.alt.image_alt": "VIP", - "_main__profile.charactercardadd.text.span": "Add a Character", - "_main__profile.charactercardvipadd.text.div": "Add More Character", - "_main__profile.charactercardvipadd.text.span": "Add More Character", - "_main__profile.characterlist.text.div": "Unlock more", - "_main__profile.characterlist.text.h2": "Characters", - "_main__profile.characterlist.text.span": "Unlock more", - "_main__profile.characterlist.alt.img_alt": "VIP", - "_main__profile.profiledropdown.text.div": "Cancel", - "_main__profile.profiledropdown.text.dropdownmenu": "Log out", - "_main__profile.profiledropdown.text.dropdownmenucontent": "Log out", - "_main__profile.profiledropdown.text.link": "Privacy Policy", - "_main__profile.profiledropdown.text.profiledropdownitem": "Log out", - "_main__profile.profiledropdown.text.alertdialog": "Cancel", - "_main__profile.profiledropdown.text.alertdialogcontent": "Cancel", - "_main__profile.profiledropdown.text.alertdialogheader": "Log out", - "_main__profile.profiledropdown.text.alertdialogtitle": "Log out", - "_main__profile.profiledropdown.text.alertdialogdescription": "Are you sure you want to log out?", - "_main__profile.profiledropdown.text.alertdialogfooter": "Log out", - "_main__profile.profiledropdown.text.alertdialogcancel": "Cancel", - "_main__profile.profiledropdown.text.alertdialogaction": "Log out", - "_main__profile.profilefeaturelist.text.div": "Creator", - "_main__profile.profilefeaturelist.text.link": "Creator", - "_main__profile.profilefeaturelist.alt.image_alt": "Creator", - "_main__profile.profilefeaturelist.text.span": "Creator", - "_main__profile_edit.schema.validation.message": "Please select a gender", - "_main__profile_edit.onsubmit.error.form_seterror": "Nickname already exists", - "_main__profile_edit.onsubmit.validation.message": "Nickname already exists", - "_main__profile_edit.editpage.text.div": "Save", - "_main__profile_edit.editpage.text.h1": "Edit Profile", - "_main__profile_edit.editpage.text.form": "Save", - "_main__profile_edit.editpage.text.formitem": "Age", - "_main__profile_edit.editpage.text.formlabel": "Age", - "_main__profile_edit.editpage.placeholder.input_placeholder": "Placeholder", - "_main__profile_edit.editpage.text.p": "Can not edit after setting up", - "_main__profile_edit.editpage.placeholder.selectvalue_placeholder": "Day", - "_main__profile_edit.editpage.text.button": "Save", - "_main__user__userid_.notfound.title.empty_title": "Oops, there’s nothing here…", - "_main__wallet.incomeitem.text.div": "+", - "_main__wallet.incomeitem.alt.image_alt": "Diamond", - "_main__wallet.incomeemptystate.title.empty_title": "No income record", - "_main__wallet.incomelist.text.div": "Income Details", - "_main__wallet.incomelist.text.h2": "Income Details", - "_main__wallet.handlepayment.toast.toast_error": "Payment failure, please try again", - "_main__wallet.rechargelist.text.div": "Agreement", - "_main__wallet.rechargelist.text.h2": "Recharge", - "_main__wallet.rechargelist.alt.image_alt": "diamond", - "_main__wallet.rechargelist.text.span": "Agreement", - "_main__wallet.rechargelist.text.link": "Agreement", - "_main__wallet_transactions.transactionspage.text.div": "Transaction Details", - "_main__chat__aiid_.chatbackground.alt.image_alt": "Background", - "_main__chat__aiid_.chatmessageuserheader.text.div": "All responses are AI-Generated and fictional.", - "_main__chat__aiid_.crushlevelaction.alt.image_alt": "Heart", - "_main__create.voiceselector.text.div": "Tap to Listen", - "_main__create.voiceselector.label.voicetoneslider_label": "Speed", - "_main__create.voiceselector.text.span": "Tap to Listen", - "_main__edit__aiid__character.characterformschema.validation.message": "Please select gender", - "_main__edit__aiid__character.onsubmit.error.form_seterror": "Nickname already exists", - "_main__edit__aiid__character.onsubmit.validation.message": "Nickname already exists", - "_main__edit__aiid__character.characterform.text.div": "Next", - "_main__edit__aiid__character.characterform.text.h1": "Edit Character", - "_main__edit__aiid__character.characterform.text.form": "Next", - "_main__edit__aiid__character.characterform.text.h2": "Character", - "_main__edit__aiid__character.characterform.text.formitem": "Preferences", - "_main__edit__aiid__character.characterform.text.formlabel": "Preferences", - "_main__edit__aiid__character.characterform.placeholder.input_placeholder": "Enter character name", - "_main__edit__aiid__character.characterform.placeholder.selectvalue_placeholder": "Day", - "_main__edit__aiid__character.characterform.placeholder.textarea_placeholder": "Describe the character's background, personality, and identity", - "_main__edit__aiid__character.characterform.text.button": "Next", - "_main__edit__aiid_.closeiconbutton.text.alertdialog": "Quit", - "_main__edit__aiid_.closeiconbutton.text.alertdialogcontent": "Quit", - "_main__edit__aiid_.closeiconbutton.text.alertdialogheader": "The content has not been saved, Continue to quit?", - "_main__edit__aiid_.closeiconbutton.text.alertdialogtitle": "Unsaved changes", - "_main__edit__aiid_.closeiconbutton.text.alertdialogdescription": "The content has not been saved, Continue to quit?", - "_main__edit__aiid_.closeiconbutton.text.alertdialogfooter": "Quit", - "_main__edit__aiid_.closeiconbutton.text.alertdialogcancel": "Cancel", - "_main__edit__aiid_.closeiconbutton.text.alertdialogaction": "Quit", - "_main__edit__aiid__dialogue.dialogueformschema.validation.message": "Please select voice", - "_main__edit__aiid__dialogue.dialogueform.text.div": "Next", - "_main__edit__aiid__dialogue.dialogueform.text.h1": "Edit Character", - "_main__edit__aiid__dialogue.dialogueform.text.form": "Next", - "_main__edit__aiid__dialogue.dialogueform.text.h2": "Dialogue", - "_main__edit__aiid__dialogue.dialogueform.text.formitem": "Voice Tone", - "_main__edit__aiid__dialogue.dialogueform.text.formlabel": "Voice Tone", - "_main__edit__aiid__dialogue.dialogueform.placeholder.textarea_placeholder": "Please describe the way the characters chat, the tone of the dialogue", - "_main__edit__aiid__dialogue.dialogueform.text.span": "(Optional)", - "_main__edit__aiid__dialogue.dialogueform.text.label": "Suggestions", - "_main__edit__aiid__dialogue.dialogueform.text.tabs": "Female", - "_main__edit__aiid__dialogue.dialogueform.text.tabslist": "Female", - "_main__edit__aiid__dialogue.dialogueform.text.tabstrigger": "Female", - "_main__edit__aiid__dialogue.dialogueform.text.button": "Next", - "_main__edit__aiid__image.imageformschema.validation.message": "请上传或生成一张图片", - "_main__edit__aiid__image.imageform.text.div": "Submit", - "_main__edit__aiid__image.imageform.text.h1": "Edit Character", - "_main__edit__aiid__image.imageform.text.form": "Submit", - "_main__edit__aiid__image.imageform.text.h2": "Image", - "_main__edit__aiid__image.imageform.text.formitem": "Public", - "_main__edit__aiid__image.imageform.text.formlabel": "Privacy", - "_main__edit__aiid__image.imageform.alt.image_alt": "Avatar", - "_main__edit__aiid__image.imageform.placeholder.textarea_placeholder": "Introduce the virtual character to the user", - "_main__edit__aiid__image.imageform.text.chip": "Privacy", - "_main__edit__aiid__image.imageform.text.button": "Submit", - "_main__edit__aiid__type.typeform.text.div": "Next", - "_main__edit__aiid__type.typeform.text.h1": "Edit Character", - "_main__edit__aiid__type.typeform.text.form": "Next", - "_main__edit__aiid__type.typeform.text.h2": "Type", - "_main__edit__aiid__type.typeform.text.formitem": "Tags", - "_main__edit__aiid__type.typeform.text.formlabel": "Tags", - "_main__edit__aiid__type.typeform.text.button": "Next", - "_.filterdrawer.text.drawer": "Confirm", - "_.filterdrawer.text.drawercontent": "Confirm", - "_.filterdrawer.text.drawerheader": "Filter", - "_.filterdrawer.text.div": "Confirm", - "_.filterdrawer.text.drawertitle": "Filter", - "_.filterdrawer.text.h3": "Type", - "_.filterdrawer.text.button": "Confirm", - "_.meetcard.aria.div_aria_hidden": "true", - "_.meetheader.text.div": "#", - "_.meetheader.text.h1": "Meet", - "_.meetheader.text.tabs": "All", - "_.meetheader.text.tabslist": "All", - "_.meetheader.text.tabstrigger": "All", - "_.meetheader.text.span": "All", - "_.meetheader.text.chip": "#", - "_.errorstate.text.div": "Reload", - "_.errorstate.text.h3": "Load failed", - "_.errorstate.text.p": "The network connection is abnormal. Please try again later", - "_.errorstate.text.button": "Reload", - "_main__user__userid_.aboutsection.text.div": "Introduce", - "_main__user__userid_.aboutsection.text.h3": "Introduce", - "_main__user__userid_.renderpayaction.text.div": "Unlock Method: Free", - "_main__user__userid_.renderpayaction.alt.image_alt": "diamond", - "_main__user__userid_.renderdefaultaction.text.div": "Default", - "_main__user__userid_.renderdefaultaction.text.alertdialog": "Confirm", - "_main__user__userid_.renderdefaultaction.text.alertdialogcontent": "Confirm", - "_main__user__userid_.renderdefaultaction.text.alertdialogheader": "Default image", - "_main__user__userid_.renderdefaultaction.text.alertdialogtitle": "Default image", - "_main__user__userid_.renderdefaultaction.text.alertdialogdescription": "After setting as the default picture, the unlock method of the picture can only be \"free\".", - "_main__user__userid_.renderdefaultaction.text.alertdialogfooter": "Confirm", - "_main__user__userid_.renderdefaultaction.text.alertdialogcancel": "Cancel", - "_main__user__userid_.renderdefaultaction.text.button": "Confirm", - "_main__user__userid_.albumimagevieweraction.text.button": "Unlock", - "_main__user__userid_.albumimagevieweraction.text.div": "Like", - "_main__user__userid_.renderoverlay.text.div": "Unlock", - "_main__user__userid_.renderdefaulttag.text.tag": "Default", - "_main__user__userid_.albumitem.alt.image_alt": "Album image", - "_main__user__userid_.albumitemaction.text.dropdownmenu": "Delete", - "_main__user__userid_.albumitemaction.text.dropdownmenucontent": "Delete", - "_main__user__userid_.albumitemaction.text.albumdeletealert": "Delete", - "_main__user__userid_.albumitemaction.text.dropdownmenuitem": "Delete", - "_main__user__userid_.albumitemaction.text.span": "Delete", - "_main__user__userid_.handleunlock.toast.toast_success": "Unlocked successfully!", - "_main__user__userid_.albumlist.title.empty_title": "No photos yet", - "_main__user__userid_.giftgrid.text.div": "X", - "_main__user__userid_.giftgrid.text.h3": "Gift", - "_main__user__userid_.giftgrid.title.empty_title": "No gifts yet", - "_main__user__userid_.tabnavigation.text.div": "Album", - "_main__user__userid_.tabnavigation.text.button": "Album", - "_main__user__userid_.useractiondropdown.text.div": "Delete Character", - "_main__user__userid_.useractiondropdown.text.dropdownmenu": "Delete Character", - "_main__user__userid_.useractiondropdown.text.dropdownmenucontent": "Delete Character", - "_main__user__userid_.useractiondropdown.text.dropdownmenuitem": "Delete Character", - "_main__user__userid_.useractiondropdown.text.span": "Delete Character", - "_main__user__userid_.useractiondropdown.text.alertdialog": "Delete", - "_main__user__userid_.useractiondropdown.text.alertdialogcontent": "Delete", - "_main__user__userid_.useractiondropdown.text.alertdialogheader": "Delete Character", - "_main__user__userid_.useractiondropdown.text.alertdialogtitle": "Delete Character", - "_main__user__userid_.useractiondropdown.text.alertdialogdescription": "Are you sure you want to delete this character?", - "_main__user__userid_.useractiondropdown.text.alertdialogfooter": "Delete", - "_main__user__userid_.useractiondropdown.text.alertdialogaction": "Delete", - "_main__user__userid_.usercard.text.button": "Chat", - "_main__user__userid_.usercard.alt.image_alt": "Gender", - "_main__user__userid_.userprofiletabs.text.div": "Create a Photo", - "_main__user__userid_.userprofiletabs.text.tabslist": "Album", - "_main__user__userid_.userprofiletabs.text.tabstrigger": "Album", - "_main__user__userid_.userprofiletabs.text.span": "Album", - "_main__user__userid_.userprofiletabs.text.button": "Create a Photo", - "_main__user__userid_.usershare.text.dropdownmenu": "Share to X", - "_main__user__userid_.usershare.text.dropdownmenucontent": "Share to X", - "_main__user__userid_.usershare.text.dropdownmenuitem": "Share to X", - "_main__user__userid_.usershare.text.span": "Share to X", - "_main__vip.subscribetext.text.div": "$5.99/month", - "_main__vip.subscribetext.text.span": "$5.99/month", - "_main__vip.subscribeproductitem.text.div": ".", - "_main__vip.subscribevipdrawer.text.drawer": "Subscribe Now", - "_main__vip.subscribevipdrawer.text.drawercontent": "Subscribe Now", - "_main__vip.subscribevipdrawer.text.div": "CrushLevel Vip", - "_main__vip.subscribevipdrawer.text.drawerheader": "CrushLevel Vip", - "_main__vip.subscribevipdrawer.text.drawertitle": "CrushLevel Vip", - "_main__wallet_charge_result.resultpage.text.div": "Payment in progress, please do not leave the current page", - "_main__wallet_charge_result.resultpage.alt.image_alt": "pending", - "_main__wallet_charge_result.resultpage.text.button": ")", - "_main__wallet.handlewithdraw.dialog.alert": "No amount available for withdrawal", - "_main__wallet.incomecard.text.div": "Withdraw", - "_main__wallet.incomecard.alt.image_alt": "diamond-icon", - "_main__wallet.incomecard.text.tooltip": "Earnings can be withdrawn after 30 days", - "_main__wallet.incomecard.text.tooltipcontent": "Earnings can be withdrawn after 30 days", - "_main__wallet.incomecard.text.p": "Earnings can be withdrawn after 30 days", - "_main__wallet.incomecard.text.button": "Withdraw", - "_main__wallet.incomecard.text.span": "Withdraw", - "_main__wallet.rechargecard.text.div": "Crush Coin Balance", - "_main__wallet_transactions.diamondicon.alt.image_alt": "Diamond", - "_main__wallet_transactions.transactionemptystate.title.empty_title": "No transaction records", - "_main__chat__aiid_.renderaction.text.button": "Click to interrupt", - "_main__chat__aiid_.renderaction.text.div": "Listening...", - "_main__chat__aiid_.chatcallstatus.text.div": "Waiting to be connected", - "_main__chat__aiid_.backgroundimagevieweraction.text.div": "Select", - "_main__chat__aiid_.backgrounditem.text.div": "Default", - "_main__chat__aiid_.backgrounditem.text.tag": "Default", - "_main__chat__aiid_.chatbackgrounddrawer.text.inlinedrawer": "Confirm", - "_main__chat__aiid_.chatbackgrounddrawer.text.inlinedrawercontent": "Confirm", - "_main__chat__aiid_.chatbackgrounddrawer.text.inlinedrawerheader": "Chat Background", - "_main__chat__aiid_.chatbackgrounddrawer.text.inlinedrawerdescription": "Create Image", - "_main__chat__aiid_.chatbackgrounddrawer.text.div": "Create Image", - "_main__chat__aiid_.chatbackgrounddrawer.text.inlinedrawerfooter": "Confirm", - "_main__chat__aiid_.chatbackgrounddrawer.text.button": "Confirm", - "_main__chat__aiid_.chatbuttleitem.text.div": "Hi", - "_main__chat__aiid_.chatbuttleitem.text.chatbubble": "Hi", - "_main__chat__aiid_.renderconfirmbutton.text.button": "Unlock", - "_main__chat__aiid_.renderconfirmbutton.text.div": "Unlock", - "_main__chat__aiid_.renderconfirmbutton.alt.image_alt": "vip", - "_main__chat__aiid_.renderconfirmbutton.text.span": "Unlock", - "_main__chat__aiid_.chatbuttledrawer.text.inlinedrawer": "Chat Buttle", - "_main__chat__aiid_.chatbuttledrawer.text.inlinedrawercontent": "Chat Buttle", - "_main__chat__aiid_.chatbuttledrawer.text.inlinedrawerheader": "Chat Buttle", - "_main__chat__aiid_.chatmodeldrawer.text.inlinedrawer": "Save", - "_main__chat__aiid_.chatmodeldrawer.text.inlinedrawercontent": "Save", - "_main__chat__aiid_.chatmodeldrawer.text.inlinedrawerheader": "Chat Model", - "_main__chat__aiid_.chatmodeldrawer.text.inlinedrawerdescription": "/Voice call message", - "_main__chat__aiid_.chatmodeldrawer.text.div": "/Voice call message", - "_main__chat__aiid_.chatmodeldrawer.text.tooltip": "Voice Call Message price refers to the cost of having a voice call conversation with a character. It is charged per message.", - "_main__chat__aiid_.chatmodeldrawer.text.tooltipcontent": "Voice Call Message price refers to the cost of having a voice call conversation with a character. It is charged per message.", - "_main__chat__aiid_.chatmodeldrawer.text.p": "Voice Call Message price refers to the cost of having a voice call conversation with a character. It is charged per message.", - "_main__chat__aiid_.chatmodeldrawer.alt.image_alt": "diamond", - "_main__chat__aiid_.chatmodeldrawer.text.span": "/Voice call message", - "_main__chat__aiid_.chatmodeldrawer.text.inlinedrawerfooter": "Save", - "_main__chat__aiid_.chatmodeldrawer.text.button": "Save", - "_main__chat__aiid_.characterformschema.validation.message": "Please select gender", - "_main__chat__aiid_.onsubmit.error.form_seterror": "Nickname already exists", - "_main__chat__aiid_.onsubmit.validation.message": "Nickname already exists", - "_main__chat__aiid_.chatprofileeditdrawer.text.inlinedrawer": "(Optional)", - "_main__chat__aiid_.chatprofileeditdrawer.text.inlinedrawercontent": "(Optional)", - "_main__chat__aiid_.chatprofileeditdrawer.text.inlinedrawerheader": "My Chat Personal", - "_main__chat__aiid_.chatprofileeditdrawer.text.inlinedrawerdescription": "(Optional)", - "_main__chat__aiid_.chatprofileeditdrawer.text.form": "(Optional)", - "_main__chat__aiid_.chatprofileeditdrawer.text.formitem": "(Optional)", - "_main__chat__aiid_.chatprofileeditdrawer.text.formlabel": "(Optional)", - "_main__chat__aiid_.chatprofileeditdrawer.placeholder.input_placeholder": "Enter nickname", - "_main__chat__aiid_.chatprofileeditdrawer.text.div": "Birthday", - "_main__chat__aiid_.chatprofileeditdrawer.text.label": "Birthday", - "_main__chat__aiid_.chatprofileeditdrawer.placeholder.selectvalue_placeholder": "Day", - "_main__chat__aiid_.chatprofileeditdrawer.text.span": "(Optional)", - "_main__chat__aiid_.chatprofileeditdrawer.placeholder.textarea_placeholder": "Describe the character's background and personality traits.", - "_main__chat__aiid_.chatprofileeditdrawer.text.alertdialog": "Exit", - "_main__chat__aiid_.chatprofileeditdrawer.text.alertdialogcontent": "Exit", - "_main__chat__aiid_.chatprofileeditdrawer.text.alertdialogheader": "The edited content will not be saved after exiting. Please confirm whether to continue exiting?", - "_main__chat__aiid_.chatprofileeditdrawer.text.alertdialogtitle": "Unsaved Edits", - "_main__chat__aiid_.chatprofileeditdrawer.text.alertdialogdescription": "The edited content will not be saved after exiting. Please confirm whether to continue exiting?", - "_main__chat__aiid_.chatprofileeditdrawer.text.alertdialogfooter": "Exit", - "_main__chat__aiid_.chatprofileeditdrawer.text.alertdialogcancel": "Cancel", - "_main__chat__aiid_.chatprofileeditdrawer.text.alertdialogaction": "Exit", - "_main__chat__aiid_.crushlevelretrievedrawer.text.inlinedrawer": "Purchase", - "_main__chat__aiid_.crushlevelretrievedrawer.text.inlinedrawercontent": "Purchase", - "_main__chat__aiid_.crushlevelretrievedrawer.alt.image_alt": "Crush Level", - "_main__chat__aiid_.crushlevelretrievedrawer.text.div": "Purchase", - "_main__chat__aiid_.crushlevelretrievedrawer.text.inlinedrawerheader": "Retrieve", - "_main__chat__aiid_.crushlevelretrievedrawer.text.inlinedrawerdescription": "Total", - "_main__chat__aiid_.crushlevelretrievedrawer.text.inlinedrawerfooter": "Purchase", - "_main__chat__aiid_.crushlevelretrievedrawer.text.button": "Purchase", - "_main__chat__aiid_.handlesendgift.toast.toast_error": "Gift sending failed. Please try again.", - "_main__chat__aiid_.getbutton.text.button": "Gift", - "_main__chat__aiid_.sendgiftsdrawer.text.inlinedrawer": "Balance:", - "_main__chat__aiid_.sendgiftsdrawer.text.inlinedrawercontent": "Balance:", - "_main__chat__aiid_.sendgiftsdrawer.text.inlinedrawerheader": "Send Gifts", - "_main__chat__aiid_.sendgiftsdrawer.text.inlinedrawerfooter": "Balance:", - "_main__chat__aiid_.sendgiftsdrawer.text.div": "Balance:", - "_main__chat__aiid_.sendgiftsdrawer.text.span": "Balance:", - "_main__chat__aiid_.chatfirstguidedialog.text.alertdialog": "Go", - "_main__chat__aiid_.chatfirstguidedialog.text.alertdialogcontent": "Go", - "_main__chat__aiid_.chatfirstguidedialog.text.alertdialogheader": "Create Album", - "_main__chat__aiid_.chatfirstguidedialog.text.alertdialogtitle": "Create Album", - "_main__chat__aiid_.chatfirstguidedialog.text.alertdialogdescription": "Generate images for your character's album to attract fans and earn revenue.", - "_main__chat__aiid_.chatfirstguidedialog.text.p": "Generate images for your character's album to attract fans and earn revenue.", - "_main__chat__aiid_.chatfirstguidedialog.text.alertdialogfooter": "Go", - "_main__chat__aiid_.chatfirstguidedialog.text.alertdialogcancel": "Not now", - "_main__chat__aiid_.chatfirstguidedialog.text.alertdialogaction": "Go", - "_main__chat__aiid_.aireplysuggestions.text.div": "/", - "_main__chat__aiid_.aireplysuggestions.text.p": "Choose one or edit", - "_main__chat__aiid_.aireplysuggestions.text.span": "/", - "_main__chat__aiid_.chatactionplus.text.dropdownmenu": "Share to X", - "_main__chat__aiid_.chatactionplus.text.dropdownmenucontent": "Share to X", - "_main__chat__aiid_.chatactionplus.text.dropdownmenuitem": "Share to X", - "_main__chat__aiid_.chatactionplus.text.span": "Share to X", - "_main__chat__aiid_.chatactionplus.text.div": "Share to", - "_main__chat__aiid_._______uploading__imageuploading_______uploadfile_______cancelupload______error__uploaderror______progress__uploadprogress_____.validation.message": "图片上传失败,请重试", - "_main__chat__aiid_.handleimageselect.validation.message": "图片处理失败,请重试", - "_main__chat__aiid_.handlevoicerecord.toast.toast_error": "Voice too short", - "_main__chat__aiid_.chatmessageaction.placeholder.chatinput_placeholder": "Enter some thing here", - "_main__chat__aiid_.debouncedfeedback.toast.toast_error": "Operation failed, please try again", - "_main__chat__aiid_.handlecopy.toast.toast_success": "Copied to clipboard", - "_main__chat__aiid_.chatothertextcontainer.text.div": "Bad", - "_main__chat__aiid_.chatothertextcontainer.text.span": "|", - "_main__chat__aiid_.chatothertextcontainer.text.tooltip": "Bad", - "_main__chat__aiid_.chatothertextcontainer.text.tooltipcontent": "Bad", - "_main__chat__aiid_.chatothertextcontainer.text.p": "Bad", - "_main__chat__aiid_.chatusertextcontainer.alt.image_alt": "Sending-failed", - "_main__chat__aiid_.crushlevelavatar.text.div": "/profile", - "_main__chat__aiid_.crushlevelavatar.alt.image_alt": "heart", - "_main__chat__aiid_.crushlevelavatar.text.link": "/profile", - "_main__chat__aiid_.chatprofileaction.text.div": "Delete", - "_main__chat__aiid_.chatprofileaction.text.dropdownmenu": "Delete", - "_main__chat__aiid_.chatprofileaction.text.dropdownmenucontent": "Delete", - "_main__chat__aiid_.chatprofileaction.text.dropdownmenuitem": "Delete", - "_main__chat__aiid_.chatprofileaction.text.span": "Delete", - "_main__chat__aiid_.chatprofilepersona.text.div": "Who i am", - "_main__chat__aiid_.deletemessagedialog.text.alertdialog": "Deletion is permanent. Your accumulated Affection points and the character's memories will not be affected. Please confirm deletion.", - "_main__chat__aiid_.deletemessagedialog.text.alertdialogcontent": "Deletion is permanent. Your accumulated Affection points and the character's memories will not be affected. Please confirm deletion.", - "_main__chat__aiid_.deletemessagedialog.text.alertdialogheader": "Delete", - "_main__chat__aiid_.deletemessagedialog.text.alertdialogtitle": "Delete", - "_main__chat__aiid_.deletemessagedialog.text.alertdialogdescription": "Deletion is permanent. Your accumulated Affection points and the character's memories will not be affected. Please confirm deletion.", - "_main__chat__aiid_.deletemessagedialog.text.alertdialogfooter": "Delete", - "_main__chat__aiid_.deletemessagedialog.text.alertdialogaction": "Delete", - "_main__chat__aiid_.chatprofiledrawer.text.inlinedrawer": "Auto play voice", - "_main__chat__aiid_.chatprofiledrawer.text.inlinedrawercontent": "Auto play voice", - "_main__chat__aiid_.chatprofiledrawer.text.div": "Auto play voice", - "_main__chat__aiid_.chatprofiledrawer.alt.image_alt": "Gender", - "_main__chat__aiid_.renderlinetext.text.div": "·", - "_main__chat__aiid_.renderlinetext.text.span": "·", - "_main__chat__aiid_.crushleveldrawer.text.inlinedrawer": "Hide Relationship", - "_main__chat__aiid_.crushleveldrawer.text.inlinedrawercontent": "Hide Relationship", - "_main__chat__aiid_.crushleveldrawer.text.div": "Hide Relationship", - "_main__chat__aiid_.crushleveldrawer.text.inlinedrawerheader": "Hide Relationship", - "_main__chat__aiid_.crushleveldrawer.text.tooltip": "* The crush value will increase the crush level, and unlock titles, functions, and different character dialogue stages through upgrades", - "_main__chat__aiid_.crushleveldrawer.text.tooltipcontent": "* The crush value will increase the crush level, and unlock titles, functions, and different character dialogue stages through upgrades", - "_main__chat__aiid_.crushleveldrawer.text.p": "* The crush value will increase the crush level, and unlock titles, functions, and different character dialogue stages through upgrades", - "_main__chat__aiid_.crushleveldrawer.text.dropdownmenu": "Hide Relationship", - "_main__chat__aiid_.crushleveldrawer.text.dropdownmenucontent": "Hide Relationship", - "_main__chat__aiid_.crushleveldrawer.text.dropdownmenuitem": "Hide Relationship", - "_main__chat__aiid_.crushleveldrawer.text.span": "℃", - "_main__chat__aiid_.crushleveldrawer.text.button": "Retrieve", - "_main__chat__aiid_.callcancelitem.text.div": "Call Canceled", - "_main__chat__aiid_.chatimagecontainer.text.div": "×", - "_main__chat__aiid_.handleunlock.toast.toast_success": "Unlock success", - "_main__chat__aiid_.handleunlock.toast.toast_error": "Unlock failed" -} diff --git a/public/login-image.png b/public/login-image.png deleted file mode 100644 index eec8944..0000000 Binary files a/public/login-image.png and /dev/null differ diff --git a/public/login-logo.svg b/public/login-logo.svg deleted file mode 100644 index 57c0a3b..0000000 --- a/public/login-logo.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/window.svg b/public/window.svg deleted file mode 100644 index b2b2a44..0000000 --- a/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/app/(auth)/share/[userId]/not-found.tsx b/src/app/(auth)/share/[userId]/not-found.tsx index dcca401..87e4558 100644 --- a/src/app/(auth)/share/[userId]/not-found.tsx +++ b/src/app/(auth)/share/[userId]/not-found.tsx @@ -1,6 +1,6 @@ -import Empty from '@/components/ui/empty' -import Image from 'next/image' -import Link from 'next/link' +import Empty from '@/components/ui/empty'; +import Link from 'next/link'; +import IconFont from '@/components/ui/iconFont'; export default async function NotFound() { return ( @@ -8,17 +8,11 @@ export default async function NotFound() {
- Anime character +
- ) + ); } diff --git a/src/app/(main)/chat/[id]/CharacterHeader.tsx b/src/app/(main)/chat/[id]/CharacterHeader.tsx index 57788a2..0c89b06 100644 --- a/src/app/(main)/chat/[id]/CharacterHeader.tsx +++ b/src/app/(main)/chat/[id]/CharacterHeader.tsx @@ -41,20 +41,20 @@ const ChatMessageUserHeader = React.memo(() => { // 检测文本是否超过三行 useEffect(() => { - if (textRef.current && character.description) { + if (textRef.current && character?.description) { // 直接比较滚动高度和可见高度 // 如果内容的实际高度大于容器的可见高度,说明内容被截断了 const isOverflowing = textRef.current.scrollHeight > textRef.current.clientHeight; setShouldShowExpandButton(isOverflowing); } - }, [character.description]); + }, [character?.description]); return (
{ wordBreak: 'break-word', }} > - {character.description} + {character?.description}
diff --git a/src/app/(main)/chat/[id]/Drawer/Background.tsx b/src/app/(main)/chat/[id]/Drawer/Background.tsx index fd6be2e..cec138c 100644 --- a/src/app/(main)/chat/[id]/Drawer/Background.tsx +++ b/src/app/(main)/chat/[id]/Drawer/Background.tsx @@ -7,6 +7,7 @@ import React, { useState } from 'react'; import { Tag } from '@/components/ui/tag'; import { ImageViewer } from '@/components/ui/image-viewer'; import { useImageViewer } from '@/hooks/useImageViewer'; +import { useTranslations } from 'next-intl'; type BackgroundItem = { backgroundId: number; @@ -26,6 +27,7 @@ const BackgroundImageViewerAction = ({ isSelected: boolean; onChange: (backgroundId: number) => void; }) => { + const tCommon = useTranslations('common'); const handleSelect = () => { // 如果只有一张背景且当前已选中,不允许取消选中 if (datas.length === 1 && isSelected) { @@ -42,7 +44,7 @@ const BackgroundImageViewerAction = ({ onClick={() => handleSelect()} > -
Select
+
{tCommon('select')}
); @@ -63,6 +65,7 @@ const BackgroundItemCard = ({ onImagePreview: () => void; totalCount: number; }) => { + const tCommon = useTranslations('common'); const handleClick = () => { // 如果只有一张背景且当前已选中,不允许取消选中 if (totalCount === 1 && selected) { @@ -83,7 +86,7 @@ const BackgroundItemCard = ({
{item.isDefault && ( - Default + {tCommon('default')} )} {inUse && } diff --git a/src/app/(main)/chat/[id]/Drawer/ChatModel.tsx b/src/app/(main)/chat/[id]/Drawer/ChatModel.tsx index d5bf240..b01b36e 100644 --- a/src/app/(main)/chat/[id]/Drawer/ChatModel.tsx +++ b/src/app/(main)/chat/[id]/Drawer/ChatModel.tsx @@ -5,8 +5,10 @@ import { Checkbox } from '@/components/ui/checkbox'; import Image from 'next/image'; import { useModels } from '@/hooks/services/chat'; import { useStreamChatStore } from '../stream-chat'; +import { useTranslations } from 'next-intl'; export default function ChatModel() { + const t = useTranslations('chat.drawer.chatModel'); const { data: models = [] } = useModels(); const chatSetting = useStreamChatStore((store) => store.chatSetting); const setChatSetting = useStreamChatStore((store) => store.setChatSetting); @@ -30,17 +32,13 @@ export default function ChatModel() {

- Text Message Price: Refers to the cost of chatting with the character via - text messages, including sending text, images, or gifts. Charged per - message. + {t('textMessagePrice')}: {t('textMessagePriceDesc')}

- Voice Message Price: Refers to the cost of sending a voice message to the - character or playing the character’s voice. Charged per use. + {t('voiceMessagePrice')}: {t('voiceMessagePriceDesc')}

- Voice Call Price: Refers to the cost of having a voice call with the - character. Charged per minute. + {t('voiceCallPrice')}: {t('voiceCallPriceDesc')}

@@ -48,33 +46,35 @@ export default function ChatModel() {
-
- Role-play a conversation with AI -
+
{t('rolePlayDesc')}
diamond - 1/Text Message + 1/{t('textMessage')}
diamond - 10/Send or play voice + + 10/{t('sendOrPlayVoice')} +
diamond - 20/min Voice call + + 20/{t('voiceCallPerMin')} +
))} -
Stay tuned for more models
+
{t('stayTuned')}
); diff --git a/src/app/(main)/chat/[id]/Drawer/Font.tsx b/src/app/(main)/chat/[id]/Drawer/Font.tsx index 87bf773..17960cd 100644 --- a/src/app/(main)/chat/[id]/Drawer/Font.tsx +++ b/src/app/(main)/chat/[id]/Drawer/Font.tsx @@ -2,6 +2,7 @@ import { Checkbox } from '@/components/ui/checkbox'; import { cn } from '@/lib/utils'; import { useStreamChatStore } from '@/app/(main)/chat/[id]/stream-chat'; +import { useTranslations } from 'next-intl'; type FontOption = { value: number; @@ -10,6 +11,7 @@ type FontOption = { }; export default function Font() { + const t = useTranslations('chat.drawer.font'); const chatSetting = useStreamChatStore((store) => store.chatSetting); const setChatSetting = useStreamChatStore((store) => store.setChatSetting); @@ -37,7 +39,7 @@ export default function Font() {
{option.label} {option.isStandard && ( - (standard) + ({t('standard')}) )}
diff --git a/src/app/(main)/chat/[id]/Drawer/Profile.tsx b/src/app/(main)/chat/[id]/Drawer/Profile.tsx index 47b2a59..98bcd5d 100644 --- a/src/app/(main)/chat/[id]/Drawer/Profile.tsx +++ b/src/app/(main)/chat/[id]/Drawer/Profile.tsx @@ -16,6 +16,7 @@ import { useAsyncFn } from '@/hooks/tools'; import { useRouter } from 'next/navigation'; import { useModels } from '@/hooks/services/chat'; import { toast } from 'sonner'; +import { useTranslations } from 'next-intl'; const genderMap = { 0: '/icons/male.svg', @@ -24,44 +25,46 @@ const genderMap = { }; const ChatProfilePersona = React.memo(({ onActiveTab }: ProfileProps) => { + const t = useTranslations('chat.drawer'); + const tCommon = useTranslations('common'); const whoAmI = 'whoAmI'; return (
-
Masked Identity Mode
+
{t('maskedIdentityMode')}
onActiveTab('mask')} > - Edit + {tCommon('edit')}
-
Nickname
+
{t('profile.nickname')}
{''}
-
Gender
+
{t('profile.gender')}
{genderMap[0 as keyof typeof genderMap]}
-
Age
+
{t('profile.age')}
{getAge(Number(23))}
-
Who am I
+
{t('profile.whoAmI')}
- {whoAmI || 'Unfilled'} + {whoAmI || t('profile.unfilled')}
@@ -80,6 +83,8 @@ type ProfileProps = { }; export default function Profile({ onActiveTab }: ProfileProps) { + const t = useTranslations('chat.drawer.profile'); + const tCommon = useTranslations('common'); const { id } = useParams<{ id: string }>(); const characterId = id.split('-')[2]; const {} = useModels(); @@ -114,12 +119,12 @@ export default function Profile({ onActiveTab }: ProfileProps) { [ { onClick: () => onActiveTab('model'), - label: 'Chat Model', + label: t('chatModel'), value: chatSetting?.chatModel, }, { onClick: () => null, - label: 'Long text', + label: t('longText'), value: ( setChatSetting({ longText: chatSetting.longText ? 0 : 1 })} @@ -131,19 +136,19 @@ export default function Profile({ onActiveTab }: ProfileProps) { [ { onClick: () => onActiveTab('max_token'), - label: 'Maximum Replies', + label: t('maximumReplies'), value: String(chatSetting?.maximumReplies), }, ], [ { onClick: () => onActiveTab('font'), - label: 'Font', + label: t('font'), value: String(chatSetting?.font), }, { onClick: () => onActiveTab('background'), - label: 'Chat Background', + label: t('chatBackground'), value: String(chatSetting?.background), }, ], @@ -153,8 +158,8 @@ export default function Profile({ onActiveTab }: ProfileProps) { [ { onClick: () => onActiveTab('voice_actor'), - label: 'Voice Artist', - value: 'Default', + label: t('voiceArtist'), + value: tCommon('default'), }, ], ]; @@ -200,14 +205,14 @@ export default function Profile({ onActiveTab }: ProfileProps) {
{/* Tags */}
- {character.tags?.map((tag: any) => ( + {character?.tags?.map((tag: any) => ( {tag.name} ))}
@@ -215,9 +220,9 @@ export default function Profile({ onActiveTab }: ProfileProps) { - {bundleRender('Chat Setting', chatSettingItems)} + {bundleRender(t('chatSetting'), chatSettingItems)} - {bundleRender('Voice Setting', voiceSettingItems)} + {bundleRender(t('voiceSetting'), voiceSettingItems)}
diff --git a/src/app/(main)/chat/[id]/Drawer/VoiceActor.tsx b/src/app/(main)/chat/[id]/Drawer/VoiceActor.tsx index 2ceff87..6618f6c 100644 --- a/src/app/(main)/chat/[id]/Drawer/VoiceActor.tsx +++ b/src/app/(main)/chat/[id]/Drawer/VoiceActor.tsx @@ -5,6 +5,7 @@ import { Button } from '@/components/ui/button'; import { cn } from '@/lib/utils'; import { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar'; import { useStreamChatStore } from '@/app/(main)/chat/[id]/stream-chat'; +import { useTranslations } from 'next-intl'; type VoiceGender = 'all' | 'male' | 'female'; @@ -17,6 +18,7 @@ type VoiceActorItem = { }; export default function VoiceActor() { + const t = useTranslations('chat.drawer.voiceActor'); const chatSetting = useStreamChatStore((store) => store.chatSetting); const setChatSetting = useStreamChatStore((store) => store.setChatSetting); // 语音演员列表(静态数据) @@ -24,49 +26,49 @@ export default function VoiceActor() { { id: 1, name: 'Voice Actor 1', - description: 'Have a role-playing conversation with AI', + description: t('description'), avatarUrl: 'https://i.pravatar.cc/150?img=1', gender: 'female', }, { id: 2, name: 'Voice Actor 2', - description: 'Have a role-playing conversation with AI', + description: t('description'), avatarUrl: 'https://i.pravatar.cc/150?img=2', gender: 'female', }, { id: 3, name: 'Voice Actor 3', - description: 'Have a role-playing conversation with AI', + description: t('description'), avatarUrl: 'https://i.pravatar.cc/150?img=3', gender: 'male', }, { id: 4, name: 'Voice Actor 4', - description: 'Have a role-playing conversation with AI', + description: t('description'), avatarUrl: 'https://i.pravatar.cc/150?img=4', gender: 'female', }, { id: 5, name: 'Voice Actor 5', - description: 'Have a role-playing conversation with AI', + description: t('description'), avatarUrl: 'https://i.pravatar.cc/150?img=5', gender: 'male', }, { id: 6, name: 'Voice Actor 6', - description: 'Have a role-playing conversation with AI', + description: t('description'), avatarUrl: 'https://i.pravatar.cc/150?img=6', gender: 'female', }, { id: 7, name: 'Voice Actor 7', - description: 'Have a role-playing conversation with AI', + description: t('description'), avatarUrl: 'https://i.pravatar.cc/150?img=7', gender: 'male', }, @@ -86,9 +88,9 @@ export default function VoiceActor() { {/* Gender Tabs */}
{[ - { value: 'all' as const, label: 'All' }, - { value: 'male' as const, label: 'Male' }, - { value: 'female' as const, label: 'Female' }, + { value: 'all' as const, label: t('all') }, + { value: 'male' as const, label: t('male') }, + { value: 'female' as const, label: t('female') }, ].map((tab) => ( - Disable the Account + {t('disableAccount')} - - Are you sure you want to disable your account? - + {t('disableAccountConfirm')} - Cancel + {t('cancel')} - Disable + {t('disable')} diff --git a/src/app/(main)/profile/components/AvatarSetting.tsx b/src/app/(main)/profile/components/AvatarSetting.tsx index 81a94fa..b26a450 100644 --- a/src/app/(main)/profile/components/AvatarSetting.tsx +++ b/src/app/(main)/profile/components/AvatarSetting.tsx @@ -1,91 +1,96 @@ -'use client' +'use client'; -import { useState, useCallback } from 'react' -import { Button, IconButton } from '@/components/ui/button' -import { AvatarCropModal } from '@/components/ui/avatar-crop-modal' -import Image from 'next/image' -import { cn } from '@/lib/utils' -import { toast } from 'sonner' +import { useState, useCallback } from 'react'; +import { Button, IconButton } from '@/components/ui/button'; +import { AvatarCropModal } from '@/components/ui/avatar-crop-modal'; +import Image from 'next/image'; +import { cn } from '@/lib/utils'; +import { toast } from 'sonner'; +import { useTranslations } from 'next-intl'; interface AvatarSettingProps { - isOpen: boolean - onClose: () => void - currentAvatar?: string - className?: string + isOpen: boolean; + onClose: () => void; + currentAvatar?: string; + className?: string; } const AvatarSetting = ({ isOpen, onClose, currentAvatar, className }: AvatarSettingProps) => { - const [showCropModal, setShowCropModal] = useState(false) - const [tempImageUrl, setTempImageUrl] = useState('') + const t = useTranslations('profile.avatarSetting'); + const [showCropModal, setShowCropModal] = useState(false); + const [tempImageUrl, setTempImageUrl] = useState(''); // 处理文件上传 - const handleFileUpload = useCallback((files: File[]) => { - if (files.length > 0) { - const file = files[0] + const handleFileUpload = useCallback( + (files: File[]) => { + if (files.length > 0) { + const file = files[0]; - // 验证文件类型 - if (!file.type.startsWith('image/')) { - toast.error('Please select an image file') - return + // 验证文件类型 + if (!file.type.startsWith('image/')) { + toast.error(t('selectImageFile')); + return; + } + + // 排除 GIF 格式 + if (file.type === 'image/gif') { + toast.error(t('gifNotSupported')); + return; + } + + // 验证文件大小 (5MB) + if (file.size > 10 * 1024 * 1024) { + toast.error(t('imageSizeLimit')); + return; + } + + // 创建预览URL + const url = URL.createObjectURL(file); + setTempImageUrl(url); + setShowCropModal(true); } - - // 排除 GIF 格式 - if (file.type === 'image/gif') { - toast.error('GIF format is not supported, please select JPG, JPEG or PNG format images') - return - } - - // 验证文件大小 (5MB) - if (file.size > 10 * 1024 * 1024) { - toast.error('Image files cannot exceed 10MB.') - return - } - - // 创建预览URL - const url = URL.createObjectURL(file) - setTempImageUrl(url) - setShowCropModal(true) - } - }, []) + }, + [t] + ); // 处理文件选择 const handleFileSelect = useCallback(() => { - const input = document.createElement('input') - input.type = 'file' - input.accept = 'image/jpeg,image/jpg,image/png' + const input = document.createElement('input'); + input.type = 'file'; + input.accept = 'image/jpeg,image/jpg,image/png'; input.onchange = (e) => { - const target = e.target as HTMLInputElement + const target = e.target as HTMLInputElement; if (target.files && target.files.length > 0) { - handleFileUpload(Array.from(target.files)) + handleFileUpload(Array.from(target.files)); } - } + }; - input.click() - }, [handleFileUpload]) + input.click(); + }, [handleFileUpload]); // 处理裁剪确认 const handleCropConfirm = useCallback(() => { - setShowCropModal(false) - setTempImageUrl('') - onClose() - }, [onClose]) + setShowCropModal(false); + setTempImageUrl(''); + onClose(); + }, [onClose]); // 处理裁剪取消 const handleCropCancel = useCallback(() => { - setShowCropModal(false) + setShowCropModal(false); if (tempImageUrl && tempImageUrl !== currentAvatar) { - URL.revokeObjectURL(tempImageUrl) + URL.revokeObjectURL(tempImageUrl); } - setTempImageUrl('') - }, [tempImageUrl, currentAvatar]) + setTempImageUrl(''); + }, [tempImageUrl, currentAvatar]); // 处理关闭按钮点击 const handleClose = useCallback(() => { - onClose() - }, [onClose]) + onClose(); + }, [onClose]); - if (!isOpen) return null + if (!isOpen) return null; return (
@@ -121,13 +126,13 @@ const AvatarSetting = ({ isOpen, onClose, currentAvatar, className }: AvatarSett {/* 文件格式提示 */}
-

Please upload a JPG, JPEG, or PNG image under 10MB.

+

{t('uploadPrompt')}

{/* 底部操作按钮 */}
{/* 上传按钮 */} - +
@@ -145,7 +150,7 @@ const AvatarSetting = ({ isOpen, onClose, currentAvatar, className }: AvatarSett /> )}
- ) -} + ); +}; -export default AvatarSetting +export default AvatarSetting; diff --git a/src/app/(main)/profile/components/ProfileDropdown.tsx b/src/app/(main)/profile/components/ProfileDropdown.tsx index 6e3da29..a956451 100644 --- a/src/app/(main)/profile/components/ProfileDropdown.tsx +++ b/src/app/(main)/profile/components/ProfileDropdown.tsx @@ -15,6 +15,7 @@ import { useLayoutStore } from '@/stores'; import { useStreamChatStore } from '../../chat/[id]/stream-chat'; import { useAsyncFn } from '@/hooks/tools'; import IconFont from '@/components/ui/iconFont'; +import { useTranslations } from 'next-intl'; const ProfileDropdownItem = ({ icon, @@ -40,6 +41,8 @@ const ProfileDropdownItem = ({ }; const ProfileDropdown = () => { + const t = useTranslations('profile'); + const tCommon = useTranslations('common'); const { mutateAsync: logout } = useLogout(); const [isLogoutDialogOpen, setIsLogoutDialogOpen] = useState(false); const setSidebarExpanded = useLayoutStore((s) => s.setSidebarExpanded); @@ -70,45 +73,45 @@ const ProfileDropdown = () => { > = [ { type: 'item', - label: 'Edit Profile', + label: t('editProfile'), icon: 'icon-icon_order_remark', href: '/profile/edit', }, { type: 'item', - label: 'Masked Identity Mode', + label: t('maskedIdentityMode'), icon: , href: '/profile/mask', }, { type: 'item', - label: 'Account', + label: t('account'), icon: 'icon-card', href: '/profile/account', }, { type: 'separator' }, { type: 'item', - label: 'About Us', + label: t('aboutUs'), icon: 'icon-info', href: '/about', }, { type: 'item', - label: 'Terms of Services', + label: t('termsOfServices'), icon: 'icon-audits', href: '/policy/tos', }, { type: 'item', - label: 'Privacy Policy', + label: t('privacyPolicy'), icon: 'icon-shield', href: '/policy/privacy', }, { type: 'separator' }, { type: 'item', - label: 'Log out', + label: t('logOut'), icon: 'icon-icon_exit', onClick: () => setIsLogoutDialogOpen(true), }, @@ -147,13 +150,13 @@ const ProfileDropdown = () => { - Log Out + {t('logOut')} - Are you sure you want to log out? + {t('logOutConfirm')} - Cancel + {tCommon('cancel')} - Log out + {t('logOut')} diff --git a/src/app/(main)/profile/components/ProfileFeatureList.tsx b/src/app/(main)/profile/components/ProfileFeatureList.tsx index 9ab9149..b9d6fb7 100644 --- a/src/app/(main)/profile/components/ProfileFeatureList.tsx +++ b/src/app/(main)/profile/components/ProfileFeatureList.tsx @@ -1,17 +1,19 @@ import Image from 'next/image'; import Link from 'next/link'; +import { useTranslations } from 'next-intl'; const ProfileFeatureList = () => { + const t = useTranslations('profile'); const items = [ { icon: '/images/profile/membership.png', - label: 'VIP', - desc: Not Unlocked, + label: t('vip'), + desc: {t('notUnlocked')}, href: '/vip', }, { icon: '/images/profile/wallet.png', - label: 'Wallet', + label: t('wallet'), desc: (
Diamond diff --git a/src/app/(main)/profile/edit/page.tsx b/src/app/(main)/profile/edit/page.tsx index 5062144..a376a1e 100644 --- a/src/app/(main)/profile/edit/page.tsx +++ b/src/app/(main)/profile/edit/page.tsx @@ -28,36 +28,35 @@ import * as z from 'zod'; import { calculateAge } from '@/lib/utils'; import dayjs from 'dayjs'; import ProfileLayout from '@/layout/ProfileLayout'; - -const schema = z - .object({ - nickname: z - .string() - .trim() - .min(1, 'Nickname is required') - .min(2, 'Nickname must be between 2 and 20 characters'), - gender: z.enum(Gender, { message: 'Please select a gender' }), - year: z.string().min(1, 'Please select birth year'), - month: z.string().min(1, 'Please select birth month'), - day: z.string().min(1, 'Please select birth day'), - }) - .refine( - (data) => { - const age = calculateAge(data.year, data.month, data.day); - return age >= 18; - }, - { - message: 'Character age must be at least 18 years old', - path: ['year'], - } - ); - -type EditProfileFormData = z.infer; +import { useTranslations } from 'next-intl'; const EditPage = () => { + const t = useTranslations('profile.edit'); const router = useRouter(); const { data: user, isLoading } = useCurrentUser(); const { mutateAsync: updateUser } = useUpdateUser(); + + const schema = z + .object({ + nickname: z.string().trim().min(1, t('nicknameRequired')).min(2, t('nicknameLength')), + gender: z.enum(Gender, { message: t('selectGender') }), + year: z.string().min(1, t('selectBirthYear')), + month: z.string().min(1, t('selectBirthMonth')), + day: z.string().min(1, t('selectBirthDay')), + }) + .refine( + (data) => { + const age = calculateAge(data.year, data.month, data.day); + return age >= 18; + }, + { + message: t('ageLimit'), + path: ['year'], + } + ); + + type EditProfileFormData = z.infer; + const { mutateAsync: checkNickname } = useCheckNickname({ onError: (error) => { form.setError('nickname', { @@ -119,7 +118,7 @@ const EditPage = () => { }); if (isExist) { form.setError('nickname', { - message: 'This nickname is already taken', + message: t('nicknameTaken'), }); return; } @@ -197,7 +196,7 @@ const EditPage = () => { }, [selectedYear, selectedMonth, selectedDay, form]); return ( - + {/* 表单容器 */}
@@ -208,10 +207,12 @@ const EditPage = () => { name="nickname" render={({ field }) => ( - Nickname + + {t('nickname')} + { disabled={true} render={({ field }) => ( - Gender + + {t('gender')} + { disabled={true} /> -

- Please note: gender cannot be changed after setting -

+

{t('genderNote')}

)} @@ -248,7 +249,7 @@ const EditPage = () => { {/* 年龄字段 */} - Age + {t('age')}
{ - + {months.map((month) => ( @@ -299,7 +300,7 @@ const EditPage = () => { { name="gender" render={({ field }) => ( - Gender + {t('gender')} -

- Please note: gender cannot be changed after setting -

+

{t('genderNote')}

)} @@ -102,11 +101,11 @@ export const MaskForm = ({ onSubmitSuccess }: MaskFormProps) => { name="age" render={({ field }) => ( - Age + {t('age')} @@ -122,12 +121,10 @@ export const MaskForm = ({ onSubmitSuccess }: MaskFormProps) => { name="whoAmI" render={({ field }) => ( - - Who am I(optional) - + {t('whoAmI')}