From a88dd2b91a4c0861ac62adbb318ad1863639a66f Mon Sep 17 00:00:00 2001 From: goddonebianu Date: Tue, 2 Dec 2025 17:39:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E7=BB=86=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- messages/en-US.json | 4 +- messages/zh-CN.json | 6 +- src/app/(features)/memorize/Memorize.tsx | 242 ++++++++++--------- src/app/(features)/translator/page.tsx | 59 ++--- src/app/folders/[folder_id]/TextPairCard.tsx | 12 +- src/app/page.tsx | 7 +- 6 files changed, 171 insertions(+), 159 deletions(-) diff --git a/messages/en-US.json b/messages/en-US.json index f1b629d..194bfb6 100644 --- a/messages/en-US.json +++ b/messages/en-US.json @@ -66,11 +66,11 @@ "description": "Play videos sentence by sentence based on SRT subtitle files to mimic native speaker pronunciation" }, "alphabet": { - "name": "Memorize Alphabet", + "name": "Alphabet", "description": "Start learning a new language from the alphabet" }, "memorize": { - "name": "Memorize Words", + "name": "Memorize", "description": "Language A to Language B, Language B to Language A, supports dictation" }, "moreFeatures": { diff --git a/messages/zh-CN.json b/messages/zh-CN.json index bdaa5fb..a0390ee 100644 --- a/messages/zh-CN.json +++ b/messages/zh-CN.json @@ -62,15 +62,15 @@ "description": "识别并朗读文本,支持循环朗读、朗读速度调节" }, "srtPlayer": { - "name": "逐句视频播放器", + "name": "逐句放视频", "description": "基于SRT字幕文件,逐句播放视频以模仿母语者的发音" }, "alphabet": { - "name": "背字母", + "name": "字母表", "description": "从字母表开始新语言的学习" }, "memorize": { - "name": "背单词", + "name": "记忆", "description": "语言A到语言B,语言B到语言A,支持听写" }, "moreFeatures": { diff --git a/src/app/(features)/memorize/Memorize.tsx b/src/app/(features)/memorize/Memorize.tsx index c100718..8c1f7ac 100644 --- a/src/app/(features)/memorize/Memorize.tsx +++ b/src/app/(features)/memorize/Memorize.tsx @@ -45,130 +45,134 @@ const Memorize: React.FC = ({ textPairs }) => { }; return ( -
- - {(getTextPairs().length > 0 && ( - <> + <> + {(getTextPairs().length > 0 && ( + <> +
{ + const newIndex = prompt("Input a index number.")?.trim(); + if ( + newIndex && + isNonNegativeInteger(newIndex) && + parseInt(newIndex) <= textPairs.length && + parseInt(newIndex) > 0 + ) { + setIndex(parseInt(newIndex) - 1); + } + }} > -
{ - const newIndex = prompt("Input a index number.")?.trim(); - if ( - newIndex && - isNonNegativeInteger(newIndex) && - parseInt(newIndex) <= textPairs.length && - parseInt(newIndex) > 0 - ) { - setIndex(parseInt(newIndex) - 1); - } - }} - > - {index + 1} - {"/" + getTextPairs().length} -
- {dictation ? ( - show === "question" ? ( - "" - ) : ( - <> -
- {reverse - ? getTextPairs()[index].text2 - : getTextPairs()[index].text1} -
-
- {reverse - ? getTextPairs()[index].text1 - : getTextPairs()[index].text2} -
- - ) - ) : ( - <> -
- {reverse - ? getTextPairs()[index].text2 - : getTextPairs()[index].text1} -
-
- {show === "answer" - ? reverse - ? getTextPairs()[index].text1 - : getTextPairs()[index].text2 - : ""} -
- - )} + {index + 1} + {"/" + getTextPairs().length}
-
- { - if (show === "answer") { - const newIndex = (index + 1) % getTextPairs().length; - setIndex(newIndex); - if (dictation) - getTTSAudioUrl( - getTextPairs()[newIndex][reverse ? "text2" : "text1"], - VOICES.find( - (v) => - v.locale === - getTextPairs()[newIndex][ - reverse ? "locale2" : "locale1" - ], - )!.short_name, - ).then((url) => { - load(url); - play(); - }); - } - setShow(show === "question" ? "answer" : "question"); - }} - > - {show === "question" ? t("answer") : t("next")} - - { - setIndex( - (index - 1 + getTextPairs().length) % getTextPairs().length, +
+ {(() => { + const createText = (text: string) => { + return ( +
+ {text} +
); - setShow("question"); - }} - > - {t("previous")} - - { - setReverse(!reverse); - }} - selected={reverse} - > - {t("reverse")} - - { - setDictation(!dictation); - }} - selected={dictation} - > - {t("dictation")} - - { - setDisorder(!disorder); - }} - selected={disorder} - > - {t("disorder")} - + }; + + const [text1, text2] = reverse + ? [getTextPairs()[index].text2, getTextPairs()[index].text1] + : [getTextPairs()[index].text1, getTextPairs()[index].text2]; + + if (dictation) { + // dictation + if (show === "question") { + return createText(""); + } else { + return ( + <> + {createText(text1)} + {createText(text2)} + + ); + } + } else { + // non-dictation + if (show === "question") { + return createText(text1); + } else { + return ( + <> + {createText(text1)} + {createText(text2)} + + ); + } + } + })()}
- - )) ||

{t("noTextPairs")}

} - -
+ +
+ { + if (show === "answer") { + const newIndex = (index + 1) % getTextPairs().length; + setIndex(newIndex); + if (dictation) + getTTSAudioUrl( + getTextPairs()[newIndex][reverse ? "text2" : "text1"], + VOICES.find( + (v) => + v.locale === + getTextPairs()[newIndex][ + reverse ? "locale2" : "locale1" + ], + )!.short_name, + ).then((url) => { + load(url); + play(); + }); + } + setShow(show === "question" ? "answer" : "question"); + }} + > + {show === "question" ? t("answer") : t("next")} + + { + setIndex( + (index - 1 + getTextPairs().length) % getTextPairs().length, + ); + setShow("question"); + }} + > + {t("previous")} + + { + setReverse(!reverse); + }} + selected={reverse} + > + {t("reverse")} + + { + setDictation(!dictation); + }} + selected={dictation} + > + {t("dictation")} + + { + setDisorder(!disorder); + }} + selected={disorder} + > + {t("disorder")} + +
+ + )) ||

{t("noTextPairs")}

} + ); }; diff --git a/src/app/(features)/translator/page.tsx b/src/app/(features)/translator/page.tsx index 1c59f89..64c0995 100644 --- a/src/app/(features)/translator/page.tsx +++ b/src/app/(features)/translator/page.tsx @@ -325,35 +325,36 @@ export default function TranslatorPage() {

{t("history")}

{history.toReversed().map((item, index) => ( -
-
-
-

{item.text1}

-

{item.text2}

-
-
- - -
+
+
+

{item.text1}

+

{item.text2}

+
+
+ +
))} diff --git a/src/app/folders/[folder_id]/TextPairCard.tsx b/src/app/folders/[folder_id]/TextPairCard.tsx index 0c9fe2c..db8546e 100644 --- a/src/app/folders/[folder_id]/TextPairCard.tsx +++ b/src/app/folders/[folder_id]/TextPairCard.tsx @@ -51,8 +51,16 @@ export default function TextPairCard({
-
{textPair.text1}
-
{textPair.text2}
+
+ {textPair.text1.length > 30 + ? textPair.text1.substring(0, 30) + "..." + : textPair.text1} +
+
+ {textPair.text2.length > 30 + ? textPair.text2.substring(0, 30) + "..." + : textPair.text2} +
-

{name}

-

{description}

+

{name}

+

{description}

); @@ -87,8 +87,7 @@ export default function HomePage() { } function Explore() { return ( -
- {t("explore")} +
);