feat:修改新概念2

This commit is contained in:
zyronon
2025-08-10 01:15:29 +08:00
parent 41479c6c2e
commit 777440af7d
14 changed files with 672 additions and 726 deletions

View File

@@ -1,112 +0,0 @@
[
{
"title": "A private conversation!",
"titleTranslate": "私人谈话!",
"text": "Last week I went to the theatre. I had a very good seat. The play was very interesting. I did not enjoy it. A young man and a young woman were sitting behind me. They were talking loudly. I got very angry. I could not hear the actors. I turned round. I looked at the man and the woman angrily. They did not pay any attention. In the end, I could not bear it. I turned round again. 'I can't hear a word!' I said angrily.\n 'It's none of your business,' the young man said rudely. 'This is a private conversation!'",
"textCustomTranslate": "上星期我去看戏。\n我的座位很好\n戏很有意思\n但我却无法欣赏。\n一青年男子与一青年女子坐在我的身后\n大声地说着话。\n我非常生气\n因为我听不见演员在说什么。\n我回过头去\n怒视着那一男一女\n他们却毫不理会。\n最后我忍不住了\n又一次回过头去\n生气地说“我一个字也听不见了”\n\n“不关你的事”那男的毫不客气地说\n“这是私人间的谈话”",
"textNetworkTranslate": "",
"newWords": [],
"textCustomTranslateIsFormat": true,
"useTranslateType": "custom",
"id": "erRXPc"
},
{
"title": "Planning a share portfolio",
"titleTranslate": "规划股份投资",
"text": "How does the older investor differ in his approach to investment from the younger investor?\nThere is no shortage of tipsters around offering 'get-rich-quick' opportunities. But if you are a serious private investor, leave the Las Vegas mentality to those with money to fritter. The serious investor needs a proper 'portfolio' -- a well-planned selection of investments, with a definite structure and a clear aim. But exactly how does a newcomer to the stock market go about achieving that?\nWell, if you go to five reputable stock brokers and ask them what you should do with your money, you're likely to get five different answers, -- even if you give all the relevant information about your age age, family, finances and what you want from your investments. Moral? There is no one 'right' way to structure a portfolio. However, there are undoubtedly some wrong ways, and you can be sure that none of our five advisers would have suggested sinking all (or perhaps any) of your money into Periwigs*.\nSo what should you do? We'll assume that you have sorted out the basics -- like mortgages, pensions, insurance and access to sufficient cash reserves. You should then establish your own individual aims. These are partly a matter of personal circumstances, partly a matter of psychology.\nFor instance, if you are older you have less time to recover from any major losses, and you may well wish to boost your pension income. So preserving your capital and generating extra income are your main priorities. In this case, you'd probably construct a portfolio with some shares (but not high risk ones), along with gilts, cash deposits, and perhaps convertibles or the income shares of split capital investment trusts.\nIf you are younger, and in a solid financial position, you may decide to take an aggressive approach -- but only if you're blessed with a sanguine disposition and won't suffer sleepless nights over share prices. If portfolio, alongside your more pedestrian in vestments. Once you have decided on your investment aims, you can then decide where to put your money. The golden rule here is spread your risk -- if you put all of your money into Periwigs International, you're setting yourself up as a hostage to fortune.\n*'Periwigs' is the name of a fictitious company.\nINVESTOR'S CHRONICLE, March 23 1990",
"textCustomTranslate": "年长投资者与年轻投资者的投资方式有何不同?\n\n提供“快速致富”的机会不乏爆料者。\n但如果你是一个认真的私人投资者把拉斯维加斯的心态留给那些有钱挥霍的人。\n认真的投资者需要一个合适的“投资组合”——一个精心规划的投资选择有明确的结构和明确的目标。\n但一个新进入股市的人究竟是如何做到这一点的呢\n\n好吧如果你去找五位声誉良好的股票经纪人问他们你应该如何处理你的钱你很可能会得到五个不同的答案即使你提供了关于你的年龄、家庭、财务状况以及你想从投资中得到什么的所有相关信息。\n道德的\n没有一种“正确”的方式来构建投资组合。\n然而毫无疑问有一些错误的方法你可以肯定的是我们的五位顾问中没有一位会建议你把所有或任何钱都投入Periwigs*。\n\n那么你该怎么办呢\n我们假设你已经解决了基本问题比如抵押贷款、养老金、保险和获得足够的现金储备。\n然后你应该确立自己的个人目标。\n这些部分是个人情况的问题部分是心理的问题。\n\n例如如果你年纪较大你从任何重大损失中恢复的时间都会减少你很可能希望增加养老金收入。\n因此保护你的资本和创造额外收入是你的首要任务。\n在这种情况下你可能会构建一个投资组合其中包括一些股票但不是高风险股票以及金边债券、现金存款也许还有可转换债券或分割资本投资信托的收入份额。\n\n如果你更年轻财务状况稳定你可能会决定采取积极的方法——但前提是你有幸拥有乐观的性格不会因为股价而失眠。\n如果是投资组合与你更普通的投资组合在一起。\n一旦你决定了投资目标你就可以决定把钱放在哪里。\n这里的黄金法则是分散你的风险——如果你把所有的钱都投入到Periwigs International你就把自己当成了命运的人质。\n\n*“Periwigs”是一家虚构公司的名字。\n\n1990年3月23日《投资者纪事》",
"textNetworkTranslate": "",
"newWords": [],
"textCustomTranslateIsFormat": true,
"useTranslateType": "custom",
"id": "vVahuO"
},
{
"title": "Breakfast or lunch?",
"titleTranslate": "早餐还是午餐?",
"text": "It was Sunday. I never get up early on Sundays. I sometimes stay in bed until lunchtime. Last Sunday I got up very late. I looked out of the window. It was dark outside. 'What a day!' I thought. 'It's raining again.' Just then, the telephone rang. It was my aunt Lucy. 'I've just arrived by train,' she said. 'I'm coming to see you.'\n 'But I'm still having breakfast,' I said.\n 'What are you doing?' she asked.\n 'I'm having breakfast,' I repeated.\n 'Dear me,' she said. 'Do you always get up so late? It's one o'clock!'",
"textCustomTranslate": "那是个星期天,\n而在星期天我是从来不早起的\n有时我要一直躺到吃午饭的时候。\n上个星期天我起得很晚。\n我望望窗外外面一片昏暗。\n“鬼天气”\n我想“又下雨了。”\n正在这时电话铃响了。\n是我姑母露西打来的。\n“我刚下火车”她说\n“我这就来看你。”\n\n“但我还在吃早饭”我说。\n\n“你在干什么”她问道。\n\n“我正在吃早饭”我又说了一遍。\n\n“天啊”她说\n“你总是起得这么晚吗",
"textNetworkTranslate": "",
"textCustomTranslateIsFormat": true,
"useTranslateType": "custom",
"newWords": [],
"id": "78C7vw"
},
{
"title": "Please send me a card",
"titleTranslate": "请给我寄一张明信片",
"text": "Postcards always spoil my holidays. Last summer, I went to Italy. I visited museums and sat in public gardens. A friendly waiter taught me a few words of Italian. Then he lent me a book. I read a few lines, but I did not understand a word. Everyday I thought about postcards. My holidays passed quickly, but I did not send cards to my friends. On the last day I made a big decision. I got up early and bought thirty-seven cards. I spent the whole day in my room, but I did not write a single card!",
"textCustomTranslate": "明信片总搅得我假日不得安宁。\n去年夏天我去了意大利。\n我参观了博物馆还去了公园。\n一位好客的服务员教了我几句意大利语\n之后还借给我一本书。\n我读了几行但一个字也不懂。\n我每天都想着明信片的事。\n假期过得真快可我还没有给我的朋友们寄过一张明信片。\n到了最后一天我作出了一项重大决定。\n我早早起了床买来了37张明信片。\n我在房间里关了整整一天。\n然而竟连一张明信片也没写成",
"textNetworkTranslate": "",
"textCustomTranslateIsFormat": true,
"useTranslateType": "custom",
"newWords": [],
"id": "NO0e8L"
},
{
"title": "An exciting trip",
"titleTranslate": "激动人心的旅行",
"text": "I have just received a letter from my brother, Tim. He is in Australia. He has been there for six months. Tim is an engineer. He is working for a big firm and he has already visited a great number of different places in Australia. He has just bought an Australian car and has gone to Alice springs, a small town in the centre of Australia. He will soon visit Darwin. From there, he will fly to Perth. My brother has never been abroad before, so he is fending this trip very exciting.",
"textCustomTranslate": "我刚刚收到弟弟蒂姆的来信,\n他正在澳大利亚。\n他在那儿已经住了6个月了。\n蒂姆是个工程师\n正在一家大公司工作并且已经去过澳大利亚的不少地方了。\n他刚买了一辆澳大利亚小汽车现在去了澳大利亚中部的小镇艾利斯斯普林斯。\n他不久还将到达达尔文去\n从那里他再飞往珀斯。\n我弟弟以前从未出过国因此他觉得这次旅行非常激动人心。",
"textNetworkTranslate": "",
"textCustomTranslateIsFormat": true,
"useTranslateType": "custom",
"newWords": [],
"id": "uK6lGh"
},
{
"title": "No wrong numbers",
"titleTranslate": "无错号之虞",
"text": "Mr.James Scott has a garage in Silbury and now he has just bought another garage in Pinhurst. Pinhurst is only five miles from Silbury, but Mr. Scott cannot get a telephone for his new garage, so he has just bought twelve pigeons. Yesterday, a pigeon carried the first message from Pinhurst to Silbury. The bird covered the distance in three minutes. Up to now, Mr.Scott has sent a great many requests for spare parts and other urgent messages from one garage to the other. In this way, he has begun his own private 'telephone' service.",
"textCustomTranslate": "詹姆斯.斯科特先生在锡尔伯里有一个汽车修理部,现在他刚在平赫斯特买了另一个汽车修理部。\n平赫特离锡尔伯里只有5英里但詹姆斯.斯科特先生未能为他新的汽车修理部搞到一部电话机,所以他买了只鸽子。\n昨天一只鸽子把第一封信从平赫特带到锡尔伯里。\n这只鸟只用了3分钟就飞完了全程。\n到目前为止斯科特先生从一个汽车修理部向另一个发送了大量索取备件的信件和其他紧急函件。\n就这样他开始自己的私人“电话”业务。",
"textNetworkTranslate": "",
"textCustomTranslateIsFormat": true,
"useTranslateType": "custom",
"newWords": [],
"id": "SiAl4g"
},
{
"title": "Percy Buttons",
"titleTranslate": "珀西.巴顿斯",
"text": "I have just moved to a house in Bridge Street. Yesterday a beggar knocked at my door. He asked me for a meal and a glass of beer. In return for this, the beggar stood on his head and sang songs. I gave him a meal. He ate the food and drank the beer. Then he put a piece of cheese in his pocket and went away. Later a neighbour told me about him. Everybody knows him. His name is Percy Buttons. He calls at every house in the street once a month and always asks for a meal and a glass of beer.",
"textCustomTranslate": "我刚刚搬进了大桥街的一所房子。\n昨天一个乞丐来敲我的门\n问我要一顿饭和一杯啤酒。\n作为回报那乞丐头顶地倒立起来嘴里还唱着歌。\n我给了他一顿饭。\n他把食物吃完又喝了酒。\n然后把一块乳酪装进衣袋里走了。\n后来一位邻居告诉了我他的情况。\n大家都认识他\n他叫珀西.巴顿斯。\n他每月对这条街上的每户人家光顾一次总是请求给他一顿饭和一杯啤酒。",
"textNetworkTranslate": "",
"textCustomTranslateIsFormat": true,
"useTranslateType": "custom",
"newWords": [],
"id": "dnZvKy"
},
{
"title": "Too late",
"titleTranslate": "为时太晚",
"text": "The plane was late and detectives were waiting at the airport all morning. They were expecting a valuable parcel of diamonds from South Africa. A few hours earlier, someone had told the police that thieves would try to steal the diamonds. When the plane arrived, some of the detectives were waiting inside the main building while others were waiting on the airfield. Two men took the parcel off the plane and carried it into the Customs House. While two detectives were keeping guard at the door, two others opened the parcel. To their surprise, the precious parcel was full of stones and sand!",
"textCustomTranslate": "飞机误点了,侦探们在机场等了整整一上午。\n他们正期待从南非来的一个装着钻石的贵重包裹。\n数小时以前有人向警方报告说有人企图偷走这些钻石。\n当飞机到达时一些侦探等候在主楼内另一些侦探则守候在停机坪上。\n有两个人把包裹拿下飞机进了海关。\n这时两个侦探把住门口另外两个侦探打开了包裹。\n令他们吃惊的是那珍贵的包裹里面装的全是石头和沙子",
"textNetworkTranslate": "",
"textCustomTranslateIsFormat": true,
"useTranslateType": "custom",
"newWords": [],
"id": "RttTOE"
},
{
"title": "The best and the worst",
"titleTranslate": "最好的和最差的",
"text": "Joe Sanders has the most beautiful garden in our town. Nearly everybody enters for 'The Nicest Garden Competition' each year, but Joe wins every time. Bill Frith's garden is larger than Joe's. Bill works harder than Joe and grows more flowers and vegetables, but Joe's garden is more interesting. He has made neat paths and has built a wooden bridge over a pool. I like gardens too, but I do not like hard work. Every year I enter for the garden competition too, and I always win a little prize for the worst garden in the town!",
"textCustomTranslate": "乔.桑德斯拥有我们镇上最漂亮的花园。\n几乎每个人都参加每年举办的“最佳花园竞赛”而每次都是乔获胜。\n比尔.弗里斯的花园比乔的花园大,\n他比乔也更为勤奋种植的花卉和蔬菜也更多但乔的花园更富有情趣。\n他修筑了一条条整洁的小路并在一个池塘上架了一座小木桥。\n我也喜欢花园但我却不愿意辛勤劳动。\n每年的花园竞赛我也参加但总因是镇上最劣的花园而获得一个小奖",
"textNetworkTranslate": "",
"textCustomTranslateIsFormat": true,
"useTranslateType": "custom",
"newWords": [],
"id": "TdAAqD"
},
{
"title": "A cold welcome",
"titleTranslate": "冷遇",
"text": "On Wednesday evening, we went to the Town Hall. It was the last day of the year and a large crowd of people had gathered under the Town Hall clock. It would strike twelve in twenty minutes' time. Fifteen minutes passed and then, at five to twelve, the clock stopped. The big minute hand did not move. We waited and waited, but nothing happened. Suddenly someone shouted. 'It's two minutes past twelve! The clock has stopped!' I looked at my watch. It was true. The big clock refused to welcome the New Year. At that moment, everybody began to laugh and sing.\n",
"textCustomTranslate": "星期三的晚上,我们去了市政厅。\n 那是一年的最后一天,一大群人聚集在市政厅的大钟下面。\n再过20分钟大钟将敲响12下。\n15分钟过去了而就在11点55分时大钟停了。\n那根巨大的分针不动了。\n 我们等啊等啊,可情况没有变化。\n突然有人喊道“已经12点零2分了\n那钟已经停了”\n我看了一下我的手表\n果真如此。\n那座大钟不愿意迎接新年。\n此时大家已经笑了起来同时唱起了歌。",
"textNetworkTranslate": "",
"textCustomTranslateIsFormat": true,
"useTranslateType": "custom",
"newWords": [],
"id": "UydP2M"
}
]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,6 @@ import {useBaseStore} from "@/stores/base.ts";
import {nanoid} from "nanoid";
import {getDefaultArticle} from "@/types/func.ts";
export function useWordOptions() {
const store = useBaseStore()

View File

@@ -26,6 +26,7 @@ export function useSound(audioSrcList?: string[], audioFileLength?: number) {
}
function play(volume: number = 100) {
console.log('play')
index++
if (audioList.length > 1 && audioList.length !== audioLength) {
audioList[index % audioList.length].volume = volume / 100

View File

@@ -69,6 +69,7 @@ const searchList = computed<any[]>(() => {
v-if="searchList.length "
@selectDict="selectDict"
:list="searchList"
quantifier="篇"
:select-id="'-1'"/>
<Empty v-else text="没有相关书籍"/>
</div>
@@ -77,6 +78,7 @@ const searchList = computed<any[]>(() => {
v-if="enArticle.length "
@selectDict="selectDict"
:list="enArticle"
quantifier="篇"
:select-id="'-1'"/>
</div>
</div>

View File

@@ -11,6 +11,7 @@ import PracticeArticle from "@/pages/pc/article/practice-article/index.vue";
import {ShortcutKey} from "@/types/types.ts";
import {useStartKeyboardEventListener} from "@/hooks/event.ts";
import useTheme from "@/hooks/theme.ts";
import {ElMessage} from "element-plus";
const store = useBaseStore()
const settingStore = useSettingStore()

View File

@@ -13,6 +13,7 @@ import {getTranslateText} from "@/hooks/article.ts";
import BaseButton from "@/components/BaseButton.vue";
import QuestionForm from "@/pages/pc/article/components/QuestionForm.vue";
import {getDefaultArticle} from "@/types/func.ts";
import {ElMessage} from "element-plus";
interface IProps {
article: Article,
@@ -80,6 +81,7 @@ watch([() => sectionIndex, () => sentenceIndex, () => wordIndex, () => stringInd
})
watch(() => props.article, () => {
isEnd = false
sectionIndex = props.sectionIndex
sentenceIndex = props.sentenceIndex
wordIndex = props.wordIndex

View File

@@ -324,7 +324,7 @@ const {playSentenceAudio} = usePlaySentenceAudio()
@save="saveArticle"
/>
</div>
<div class="footer " :class="!settingStore.showToolbar && 'hide'">
<div class="footer" :class="!settingStore.showToolbar && 'hide'">
<div class="bottom">
<ElProgress
class="flex-1"

View File

@@ -5,6 +5,7 @@ import Book from "@/pages/pc/components/Book.vue";
defineProps<{
list?: Partial<Dict>[],
selectId?: string
quantifier?: string
}>()
const emit = defineEmits<{
@@ -21,7 +22,7 @@ const emit = defineEmits<{
<Book v-for="(dict,index) in list"
:is-add="false"
@click="emit('selectDict',{dict,index})"
quantifier="个词"
:quantifier="quantifier"
:item="dict"/>
</div>
</template>

View File

@@ -23,10 +23,10 @@ const {toggleTheme} = useTheme()
<div class="aside anim fixed" :class="{'expand':settingStore.sideExpand}">
<div class="top">
<Logo v-if="settingStore.sideExpand"/>
<div class="row" @click="router.push('/home')">
<Icon icon="iconoir:home"/>
<span v-if="settingStore.sideExpand">主页</span>
</div>
<!-- <div class="row" @click="router.push('/home')">-->
<!-- <Icon icon="iconoir:home"/>-->
<!-- <span v-if="settingStore.sideExpand">主页</span>-->
<!-- </div>-->
<div class="row" @click="router.push('/word')">
<Icon icon="material-symbols-light:dictionary-outline-sharp"/>
<!-- <Icon icon="streamline:dictionary-language-book"/>-->

View File

@@ -96,6 +96,7 @@ const searchList = computed<any[]>(() => {
v-if="searchList.length "
@selectDict="selectDict"
:list="searchList"
quantifier="个词"
:select-id="'-1'"/>
<Empty v-else text="没有相关词典"/>
</div>
@@ -104,6 +105,7 @@ const searchList = computed<any[]>(() => {
v-for="item in groupedByCategoryAndTag"
:select-id="store.currentStudyWordDict.id"
@selectDict="selectDict"
quantifier="个词"
:groupByTag="item[1]"
:category="item[0]"
/>

View File

@@ -5,23 +5,21 @@ import {useRuntimeStore} from "@/stores/runtime.ts";
import WordHomePage from "@/pages/pc/word/WordHomePage.vue";
import PC from "@/pages/pc/index.vue";
import ArticleHomePage from "@/pages/pc/article/ArticleHomePage.vue";
import HomeIndex from "@/pages/pc/home/HomeIndex.vue";
import StudyArticle from "@/pages/pc/article/StudyArticle.vue";
import DictDetail from "@/pages/pc/word/DictDetail.vue";
import StudyWord from "@/pages/pc/word/StudyWord.vue";
import EditArticlePage from "@/pages/pc/article/EditArticlePage.vue";
import BookDetail from "@/pages/pc/article/BookDetail.vue";
import BatchEditArticlePage from "@/pages/pc/article/BatchEditArticlePage.vue";
import DictList from "@/pages/pc/word/DictList.vue";
import Setting from "@/pages/pc/Setting.vue";
import BookList from "@/pages/pc/article/BookList.vue";
export const routes: RouteRecordRaw[] = [
{
path: '/', component: PC,
redirect: '/home',
path: '/',
component: PC,
redirect: '/word',
children: [
{path: 'home', component: HomeIndex},
// {path: 'home', component: HomeIndex},
{path: 'word', component: WordHomePage},
{path: 'dict-list', component: DictList},
{path: 'study-word', component: StudyWord},
@@ -29,15 +27,16 @@ export const routes: RouteRecordRaw[] = [
{path: 'article', component: ArticleHomePage},
{path: 'study-article', component: StudyArticle},
{path: 'edit-article', component: EditArticlePage},
{path: 'batch-edit-article', component: BatchEditArticlePage},
{path: 'edit-article', component: () => import("@/pages/pc/article/EditArticlePage.vue")},
{path: 'batch-edit-article', component: () => import("@/pages/pc/article/BatchEditArticlePage.vue")},
{path: 'book-detail', component: BookDetail},
{path: 'book-list', component: BookList},
{path: 'setting', component: Setting},
]
},
{path: '/test', component: Test},
// {path: '/', redirect: '/pc/practice'},
{path: '/:pathMatch(.*)*', redirect: '/word'},
]
const router = VueRouter.createRouter({

View File

@@ -394,25 +394,16 @@ export function _parseLRC(lrc: string): { start: number, end: number, text: stri
}
export async function _getDictDataByUrl(val: DictResource, type: DictType = DictType.word): Promise<Dict> {
let dictResourceUrl = `./dicts/${val.language}/word/${val.url}`.replace('.json', '_v2.json');
let dictResourceUrl = `./dicts/${val.language}/word/${val.url}`
if (type === DictType.article) {
dictResourceUrl = `./dicts/${val.language}/${val.type}/${val.url}`;
}
let s = await getDictFile(dictResourceUrl)
if (s) {
if (type === DictType.word) {
let words = cloneDeep(s.map(v => {
v.id = nanoid(6)
return v
}))
return getDefaultDict({...val, words})
return getDefaultDict({...val, words: s})
} else {
let articles = cloneDeep(s.map(v => {
v.id = nanoid(6)
return v
}))
console.log('articles', articles)
return getDefaultDict({...val, articles})
return getDefaultDict({...val, articles: s})
}
}
return getDefaultDict()