├── src ├── env.d.ts ├── styles │ └── global.css ├── data │ └── submissions.json ├── pages │ ├── quiz.astro │ ├── blog │ │ ├── [...slug].astro │ │ └── index.astro │ ├── quiz │ │ └── [id].astro │ ├── resources.astro │ └── index.astro ├── content │ ├── resources │ │ ├── _template.json │ │ ├── forvo.json │ │ ├── daily-dictation.json │ │ ├── we-speak-nyc.json │ │ ├── esol-courses.json │ │ ├── duolingo.json │ │ ├── essential-english.json │ │ ├── quill.json │ │ ├── voa-english.json │ │ ├── fun-english-games.json │ │ ├── oxford-owl.json │ │ ├── memrise.json │ │ ├── bbc-learning-english.json │ │ ├── english-media-lab.json │ │ ├── reading-rocket.json │ │ ├── listen-in-english.json │ │ ├── national-geo-kid.json │ │ ├── talkenglish.json │ │ ├── british-council.json │ │ ├── spotlight-english.json │ │ ├── youglish.json │ │ ├── rachelsenglish.json │ │ ├── ted-talks.json │ │ ├── funeasyenglish.json │ │ ├── starfall-abcs.json │ │ ├── studycat.json │ │ ├── cambridge-english.json │ │ ├── balloon-phonics.json │ │ └── starfall-phonics.json │ ├── blog │ │ ├── _template.md │ │ ├── getting-started-with-english.md │ │ ├── ielts-speaking-tips.md │ │ ├── common-grammar-mistakes.md │ │ ├── common-english-mistakes.md │ │ └── phonics-starting.md │ ├── config.ts │ └── quiz │ │ ├── history-trivia.json │ │ ├── vietname-war.json │ │ ├── dien-bien-phu-war.json │ │ └── general-knowledge.json ├── assets │ ├── icons │ │ └── quiz-icon.svg │ ├── background.svg │ └── astro.svg ├── components │ ├── CategoryFilter.astro │ ├── SearchBar.astro │ ├── DarkModeToggle.astro │ ├── ResourceCard.astro │ ├── QuizGame.astro │ └── Navbar.astro └── layouts │ ├── Layout.astro │ └── MarkdownLayout.astro ├── .vscode ├── extensions.json └── launch.json ├── public ├── images │ ├── resources │ │ ├── forvo.png │ │ ├── quill.png │ │ ├── duolingo.png │ │ ├── memrise.png │ │ ├── studycat.png │ │ ├── youglish.png │ │ ├── natgeokid.png │ │ ├── oxford-owl.png │ │ ├── talkenglish.png │ │ ├── ted-talks.png │ │ ├── voa-english.png │ │ ├── esol-courses.png │ │ ├── starfall-abcs.png │ │ ├── we-speak-nyc.png │ │ ├── balloon-phonics.webp │ │ ├── british-council.png │ │ ├── daily-dictation.png │ │ ├── funeasyenglish.png │ │ ├── rachels-english.png │ │ ├── starfall-phonics.png │ │ ├── cambridge-english.png │ │ ├── english-media-lab.png │ │ ├── essential-english.png │ │ ├── fun-english-games.png │ │ ├── listen-in-english.jpg │ │ ├── spotlight-english.png │ │ ├── bbc-learning-english.png │ │ └── reading-rockets-phonics.png │ ├── blog │ │ └── english-learning.png │ └── quiz │ │ └── quiz-icon.svg └── favicon.svg ├── Dockerfile ├── .github ├── FUNDING.yml └── workflows │ └── static.yml ├── tsconfig.json ├── docker-compose.yaml ├── astro.config.mjs ├── tailwind.config.mjs ├── .gitignore ├── package.json ├── LICENSE ├── CONTRIBUTING.md ├── .all-contributorsrc └── README.md /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// -------------------------------------------------------------------------------- /src/styles/global.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /src/data/submissions.json: -------------------------------------------------------------------------------- 1 | { 2 | "pending": [], 3 | "approved": [], 4 | "rejected": [] 5 | } -------------------------------------------------------------------------------- /src/pages/quiz.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import QuizGame from "../components/QuizGame.astro"; 3 | --- 4 | 5 | 6 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["astro-build.astro-vscode"], 3 | "unwantedRecommendations": [] 4 | } 5 | -------------------------------------------------------------------------------- /public/images/resources/forvo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/forvo.png -------------------------------------------------------------------------------- /public/images/resources/quill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/quill.png -------------------------------------------------------------------------------- /public/images/resources/duolingo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/duolingo.png -------------------------------------------------------------------------------- /public/images/resources/memrise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/memrise.png -------------------------------------------------------------------------------- /public/images/resources/studycat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/studycat.png -------------------------------------------------------------------------------- /public/images/resources/youglish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/youglish.png -------------------------------------------------------------------------------- /public/images/blog/english-learning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/blog/english-learning.png -------------------------------------------------------------------------------- /public/images/resources/natgeokid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/natgeokid.png -------------------------------------------------------------------------------- /public/images/resources/oxford-owl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/oxford-owl.png -------------------------------------------------------------------------------- /public/images/resources/talkenglish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/talkenglish.png -------------------------------------------------------------------------------- /public/images/resources/ted-talks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/ted-talks.png -------------------------------------------------------------------------------- /public/images/resources/voa-english.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/voa-english.png -------------------------------------------------------------------------------- /public/images/resources/esol-courses.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/esol-courses.png -------------------------------------------------------------------------------- /public/images/resources/starfall-abcs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/starfall-abcs.png -------------------------------------------------------------------------------- /public/images/resources/we-speak-nyc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/we-speak-nyc.png -------------------------------------------------------------------------------- /public/images/resources/balloon-phonics.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/balloon-phonics.webp -------------------------------------------------------------------------------- /public/images/resources/british-council.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/british-council.png -------------------------------------------------------------------------------- /public/images/resources/daily-dictation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/daily-dictation.png -------------------------------------------------------------------------------- /public/images/resources/funeasyenglish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/funeasyenglish.png -------------------------------------------------------------------------------- /public/images/resources/rachels-english.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/rachels-english.png -------------------------------------------------------------------------------- /public/images/resources/starfall-phonics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/starfall-phonics.png -------------------------------------------------------------------------------- /public/images/resources/cambridge-english.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/cambridge-english.png -------------------------------------------------------------------------------- /public/images/resources/english-media-lab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/english-media-lab.png -------------------------------------------------------------------------------- /public/images/resources/essential-english.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/essential-english.png -------------------------------------------------------------------------------- /public/images/resources/fun-english-games.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/fun-english-games.png -------------------------------------------------------------------------------- /public/images/resources/listen-in-english.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/listen-in-english.jpg -------------------------------------------------------------------------------- /public/images/resources/spotlight-english.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/spotlight-english.png -------------------------------------------------------------------------------- /public/images/resources/bbc-learning-english.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/bbc-learning-english.png -------------------------------------------------------------------------------- /public/images/resources/reading-rockets-phonics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gianguyen1234/open-english-vn/HEAD/public/images/resources/reading-rockets-phonics.png -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:18 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json package-lock.json ./ 6 | RUN npm install 7 | 8 | EXPOSE 4321 9 | 10 | CMD ["npm", "run", "dev"] 11 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [Gianguyen1234] 4 | 5 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 6 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "astro/tsconfigs/strict", 3 | "include": [".astro/types.d.ts", "**/*"], 4 | "exclude": ["dist"], 5 | "compilerOptions": { 6 | "baseUrl": ".", 7 | "paths": { 8 | "@/*": ["src/*"] 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "command": "./node_modules/.bin/astro dev", 6 | "name": "Development server", 7 | "request": "launch", 8 | "type": "node-terminal" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | services: 3 | app: 4 | build: 5 | context: ./ 6 | dockerfile: Dockerfile 7 | working_dir: /app 8 | volumes: 9 | - ./:/app 10 | - /app/node_modules 11 | ports: 12 | - 4321:4321 13 | command: ["npm", "run", "dev", "--", "--host"] -------------------------------------------------------------------------------- /src/content/resources/_template.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Resource Name", 3 | "description": "A brief description of your resource", 4 | "url": "https://your-website.com", 5 | "image": "/open-english-vn/images/resources/resource-name.png", 6 | "category": "Grammar", 7 | "tags": ["tag1", "tag2"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /src/content/resources/forvo.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Forvo", 3 | "description": "Pronunciation dictionary. How to pronounce words.", 4 | "url": "https://forvo.com/", 5 | "image": "/open-english-vn/images/resources/forvo.png", 6 | "category": "Words and Spelling", 7 | "tags": ["vocabulary", "pronunciation"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /astro.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'astro/config'; 2 | import tailwind from '@astrojs/tailwind'; 3 | 4 | export default defineConfig({ 5 | site: 'https://gianguyen1234.github.io/open-english-vn', 6 | base: '/open-english-vn', // ✅ Fixes asset paths for GitHub Pages 7 | output: 'static', 8 | outDir: 'dist', 9 | integrations: [tailwind()], 10 | }); 11 | -------------------------------------------------------------------------------- /src/content/resources/daily-dictation.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Daily Dictation", 3 | "description": "Practice English with dictation exercises", 4 | "url": "https://dailydictation.com/", 5 | "image": "/open-english-vn/images/resources/daily-dictation.png", 6 | "category": "Listening", 7 | "tags": ["listening", "ielts", "toeic", "toefl"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /src/content/resources/we-speak-nyc.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "WeSpeak NYC", 3 | "description": "Civic-focused learning tools for English language learners and teachers.", 4 | "url": "https://wespeaknyc.cityofnewyork.us/", 5 | "image": "/open-english-vn/images/resources/we-speak-nyc.png", 6 | "category": "General", 7 | "tags": ["videos", "courses"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /src/content/resources/esol-courses.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "ESOL Courses", 3 | "description": "Free English lessons online for teaching and learning", 4 | "url": "https://www.esolcourses.com/", 5 | "image": "/open-english-vn/images/resources/esol-courses.png", 6 | "category": "General", 7 | "tags": ["reading", "listening", "videos", "songs", "writing", "vocabulary", "grammar"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /src/content/resources/duolingo.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Duolingo", 3 | "description": "Ứng dụng học ngôn ngữ miễn phí với phương pháp học gamified, giúp người học cải thiện từ vựng và ngữ pháp qua các bài tập tương tác.", 4 | "url": "https://www.duolingo.com/", 5 | "image": "/open-english-vn/images/resources/duolingo.png", 6 | "category": "General", 7 | "tags": ["vocabulary", "grammar", "games", "interactive"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /src/content/resources/essential-english.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Essential English", 3 | "description": "Just relax and enjoy your time.", 4 | "url": "https://www.essentialenglish.review/category/vocabulary/", 5 | "image": "/open-english-vn/images/resources/essential-english.png", 6 | "category": "General", 7 | "tags": ["listening", "grammar", "vocabulary", "pronunciation", "apps", "ielts"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /src/content/resources/quill.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Quill.org", 3 | "description": "A non-profit offering free literacy activities that build reading comprehension, writing, and language skills for students.", 4 | "url": "https://www.quill.org/", 5 | "image": "/open-english-vn/images/resources/quill.png", 6 | "category": "Words and Spelling", 7 | "tags": ["literacy", "reading comprehension", "writing", "language skills"], 8 | "free": true 9 | } -------------------------------------------------------------------------------- /src/content/resources/voa-english.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "VOA English", 3 | "description": "Multimedia source of news and information for millions of English learners worldwide.", 4 | "url": "https://learningenglish.voanews.com/", 5 | "image": "/open-english-vn/images/resources/voa-english.png", 6 | "category": "General", 7 | "tags": ["reading", "listening", "videos", "news", "pronunciation", "literacy"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /src/content/resources/fun-english-games.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Fun English Games", 3 | "description": "A collection of interactive games to help learners improve their English skills, including grammar, vocabulary, and reading.", 4 | "url": "https://www.funenglishgames.com", 5 | "image": "/open-english-vn/images/resources/fun-english-games.png", 6 | "category": "General", 7 | "tags": ["games", "vocabulary", "grammar", "interactive"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /src/content/resources/oxford-owl.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Oxford Owl: English Age 5–6", 3 | "description": "Covers spelling, grammar, and punctuation rules for Year 1 students, aiding in clear writing.", 4 | "url": "https://home.oxfordowl.co.uk/english/primary-english-year-1-age-5-6/", 5 | "image": "/open-english-vn/images/resources/oxford-owl.png", 6 | "category": "Punctuation", 7 | "tags": ["spelling", "grammar", "punctuation", "Year 1"], 8 | "free": true 9 | } -------------------------------------------------------------------------------- /src/content/resources/memrise.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Memrise the only app with native speaker videos", 3 | "description": "Learn a language as it's used now. Immerse yourself in lessons that feature videos of native speakers, so you start speaking real life language, fast.", 4 | "url": "https://www.memrise.com/", 5 | "image": "/open-english-vn/images/resources/memrise.png", 6 | "category": "General", 7 | "tags": ["grammar", "vocabulary", "business english", "ielts", "skills"], 8 | "free": true 9 | } -------------------------------------------------------------------------------- /src/content/resources/bbc-learning-english.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "BBC Learning English", 3 | "description": "Free English learning resources from the BBC, including lessons, grammar explanations, videos, and interactive exercises suitable for all levels.", 4 | "url": "https://www.bbc.co.uk/learningenglish", 5 | "image": "/open-english-vn/images/resources/bbc-learning-english.png", 6 | "category": "General", 7 | "tags": ["listening", "grammar", "vocabulary", "pronunciation", "news"], 8 | "free": true 9 | } -------------------------------------------------------------------------------- /src/content/resources/english-media-lab.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "English Media Lab", 3 | "description": "An interactive learning website created for beginner, intermediate, and advanced English as a Second Language (ESL) and English as a Foreign Language (EFL) learners.", 4 | "url": "https://www.englishmedialab.com/", 5 | "image": "/open-english-vn/images/resources/english-media-lab.png", 6 | "category": "General", 7 | "tags": ["pronunciation", "grammar", "vocabulary"], 8 | "free": true 9 | } -------------------------------------------------------------------------------- /src/content/resources/reading-rocket.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Reading Rockets: Phonics in Practice", 3 | "description": "Provides effective phonics instruction and decoding skills through articles, tips, and videos.", 4 | "url": "https://www.readingrockets.org/teaching/reading-basics/phonics", 5 | "image": "/open-english-vn/images/resources/reading-rockets-phonics.png", 6 | "category": "Letters and Sounds", 7 | "tags": ["phonics", "instruction", "decoding", "videos"], 8 | "free": true 9 | } -------------------------------------------------------------------------------- /src/content/resources/listen-in-english.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Listen In English", 3 | "description": "Boost your English listening skills with graded ESL lessons from TV, movies, academic sources, and more. Suitable for learners at all levels.", 4 | "url": "https://listeninenglish.com/", 5 | "image": "/open-english-vn/images/resources/listen-in-english.jpg", 6 | "category": "General", 7 | "tags": ["listening", "grammar", "vocabulary", "pronunciation"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /src/content/resources/national-geo-kid.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "National Geographic Kids: English Primary Resources", 3 | "description": "Promotes English learning, focusing on language and literacy areas such as reading, writing, and comprehension.", 4 | "url": "https://www.natgeokids.com/uk/teacher-category/english/", 5 | "image": "/open-english-vn/images/resources/natgeokid.png", 6 | "category": "Words and Spelling", 7 | "tags": ["reading", "writing", "comprehension", "literacy"], 8 | "free": true 9 | } -------------------------------------------------------------------------------- /src/content/resources/talkenglish.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "TalkEnglish.com", 3 | "description": "Learn English speaking FREE with TalkEnglish.com Our goal is to help you Learn English speaking so you can speak English fluently. Improve your spoken English Free!", 4 | "url": "https://www.talkenglish.com/", 5 | "image": "/open-english-vn/images/resources/talkenglish.png", 6 | "category": "Speaking", 7 | "tags": ["pronunciation", "accent", "speaking", "fluency", "listening"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /src/content/resources/british-council.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "British Council Learn English", 3 | "description": "Comprehensive English learning platform with courses, games, and activities for all levels. Features IELTS preparation materials and business English resources.", 4 | "url": "https://learnenglish.britishcouncil.org/", 5 | "image": "/open-english-vn/images/resources/british-council.png", 6 | "category": "General", 7 | "tags": ["grammar", "vocabulary", "business english", "ielts", "skills"], 8 | "free": true 9 | } -------------------------------------------------------------------------------- /src/content/resources/spotlight-english.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Spotlight English", 3 | "description": "A non-profit website designed to help users improve their English skills—reading, listening, and speaking—through daily vocabulary and audio lessons on current global topics.", 4 | "url": "https://spotlightenglish.com/", 5 | "image": "/open-english-vn/images/resources/spotlight-english.png", 6 | "category": "General", 7 | "tags": ["listening", "grammar", "vocabulary", "pronunciation", "news"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /src/content/resources/youglish.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "YouGlish", 3 | "description": "Master English pronunciation naturally with YouGlish! Learn how to pronounce tricky words and sounds like a native using real-world video clips from YouTube. No more confusion, just real English in context.", 4 | "url": "https://youglish.com/", 5 | "image": "/open-english-vn/images/resources/youglish.png", 6 | "category": "Listening", 7 | "tags": ["pronunciation", "speaking", "listening", "fluency"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /src/content/blog/_template.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Your Blog Title" 3 | description: "A brief description of your blog post" 4 | pubDate: 2024-03-19 5 | author: "Your Name" 6 | image: "/open-english-vn/images/blog/default.jpg" 7 | tags: ["tag1", "tag2"] 8 | --- 9 | 10 | ## Introduction 11 | 12 | Your introduction text here. 13 | 14 | ## Main Content 15 | 16 | Your main content here. 17 | 18 | ### Subsection 19 | 20 | More content... 21 | 22 | ## Images 23 | 24 | ![Alt text](/open-english-vn/images/blog/example.jpg) 25 | 26 | ## Conclusion 27 | 28 | Your conclusion here. -------------------------------------------------------------------------------- /src/content/resources/rachelsenglish.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Rachel's English", 3 | "description": "Master American English pronunciation with Rachel's English. Access a wide range of resources, lessons, and tips designed to help you speak English like a native. Improve your accent, fluency, and confidence with expert guidance.", 4 | "url": "https://rachelsenglish.com/", 5 | "image": "/open-english-vn/images/resources/rachels-english.png", 6 | "category": "Speaking", 7 | "tags": ["pronunciation", "accent", "speaking", "fluency", "listening"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /src/content/resources/ted-talks.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "TED Talks", 3 | "description": "TED Talks are inspiring presentations by the non-profit TED, featuring powerful, innovative ideas from engaging speakers. Delivered clearly with subtitles in multiple languages, especially English, they aim to stir emotions, shift viewpoints, and ignite global action.", 4 | "url": "https://www.ted.com/", 5 | "image": "/open-english-vn/images/resources/ted-talks.png", 6 | "category": "General", 7 | "tags": ["videos", "listening", "vocabulary", "inspiration", "education"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /src/content/resources/funeasyenglish.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Fun Easy English", 3 | "description": "Fun Easy English mainly focuses on the basic English knowledge and teaching tips, its courses include pronunciation, grammar, idioms, slang, writing, tests and much more. Most of those courses are launched in Video format, in addition with text scripts and pictures.", 4 | "url": "https://funeasyenglish.com/", 5 | "image": "/open-english-vn/images/resources/funeasyenglish.png", 6 | "category": "General", 7 | "tags": ["listening", "grammar", "vocabulary", "pronunciation", "news"], 8 | "free": true 9 | } -------------------------------------------------------------------------------- /src/content/resources/starfall-abcs.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Starfall's ABCs", 3 | "description": "A perfect starting place for Pre-K and Kindergarten students to learn the alphabet. This interactive program features engaging animations, sounds, and activities for each letter of the alphabet, making it an excellent tool for early literacy development.", 4 | "url": "https://www.starfall.com/h/abcs/", 5 | "image": "/open-english-vn/images/resources/starfall-abcs.png", 6 | "category": "Letters and Sounds", 7 | "tags": ["alphabet", "phonics", "early learning", "interactive", "pre-k", "kindergarten", "games"], 8 | "free": true 9 | } -------------------------------------------------------------------------------- /src/content/resources/studycat.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "English resources for kids", 3 | "description": "Hundreds of fun resources for your child to boost their English language learning journey. From printable worksheets and activity ideas to animated stories and songs to vocabulary lessons and English idioms we’ve got your learning journey covered.", 4 | "url": "https://studycat.com/english-for-kids/", 5 | "image": "/open-english-vn/images/resources/studycat.png", 6 | "category": "Letters and Sounds", 7 | "tags": ["grammar", "vocabulary", "early learning", "games", "CVC words", "ages 4-6", "sound blending"], 8 | "free": true 9 | } -------------------------------------------------------------------------------- /tailwind.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'], 4 | darkMode: 'class', 5 | theme: { 6 | extend: { 7 | colors: { 8 | primary: { 9 | 50: '#f0f9ff', 10 | 100: '#e0f2fe', 11 | 200: '#bae6fd', 12 | 300: '#7dd3fc', 13 | 400: '#38bdf8', 14 | 500: '#0ea5e9', 15 | 600: '#0284c7', 16 | 700: '#0369a1', 17 | 800: '#075985', 18 | 900: '#0c4a6e', 19 | }, 20 | }, 21 | }, 22 | }, 23 | plugins: [], 24 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | .output/ 4 | 5 | # dependencies 6 | node_modules/ 7 | .pnp 8 | .pnp.js 9 | 10 | # testing 11 | coverage 12 | 13 | # production 14 | build 15 | 16 | # misc 17 | .DS_Store 18 | *.pem 19 | 20 | # debug 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | pnpm-debug.log* 25 | 26 | # local env files 27 | .env 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # generated types 34 | .astro/ 35 | 36 | # environment variables 37 | .env.production 38 | 39 | # macOS-specific files 40 | .DS_Store 41 | 42 | # IDE 43 | .vscode/ 44 | .idea/ 45 | -------------------------------------------------------------------------------- /public/images/quiz/quiz-icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/icons/quiz-icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/content/resources/cambridge-english.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Cambridge English", 3 | "description": "The Cambridge English website provides free resources and exercises to help learners of all levels improve their English skills. Created by University of Cambridge experts, it offers engaging content for vocabulary, grammar, and communication practice.", 4 | "url": "https://www.cambridgeenglish.org/learning-english/", 5 | "image": "/open-english-vn/images/resources/cambridge-english.png", 6 | "category": "General", 7 | "tags": ["grammar", "listening", "pronunciation", "reading", "speaking", "vocabulary", "writing"], 8 | "free": true 9 | } 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-astro-resources", 3 | "type": "module", 4 | "version": "0.0.1", 5 | "scripts": { 6 | "dev": "astro dev", 7 | "start": "astro dev", 8 | "build": "astro build", 9 | "preview": "astro preview", 10 | "astro": "astro" 11 | }, 12 | "dependencies": { 13 | "@astrojs/tailwind": "^5.1.0", 14 | "@astrojs/vercel": "^7.3.3", 15 | "@heroicons/react": "^2.2.0", 16 | "astro": "^4.4.0", 17 | "astro-icon": "^0.8.1", 18 | "tailwindcss": "^3.4.1" 19 | }, 20 | "devDependencies": { 21 | "@astrojs/check": "^0.9.4", 22 | "@types/node": "^20.11.19", 23 | "typescript": "^5.8.2" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /public/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | -------------------------------------------------------------------------------- /src/content/resources/balloon-phonics.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Balloon Phonics CVC Game", 3 | "description": "Balloon Phonics is a phonics reading game for young children which focuses on three letter words (consonant-vowel-consonant or CVC). It is aimed at children working on Stage 2 phonemes of the Letters and Sounds programme. The game features sound buttons for letter sounds practice, oral blending exercises, and word segmentation activities. It offers three different games: Initial sounds, Middle sounds, and End sounds, helping children progress through different stages of blending.", 4 | "url": "https://www.topmarks.co.uk/phonics/balloon-phonics-cvc-game", 5 | "image": "/open-english-vn/images/resources/balloon-phonics.webp", 6 | "category": "Letters and Sounds", 7 | "tags": ["phonics", "reading", "early learning", "games", "CVC words", "ages 4-6", "sound blending"], 8 | "free": true 9 | } -------------------------------------------------------------------------------- /src/content/resources/starfall-phonics.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "PHONICS: Learn to Read", 3 | "description": "Starfall's comprehensive phonics series features 15 delightful interactive books with lovable characters like Zac the Rat, Peg the Hen, and more. Each book builds reading skills progressively, starting from basic letter sounds to word families and short vowels. Perfect for beginners learning to read English, with colorful animations, clear audio pronunciation, and interactive exercises that make learning fun and engaging. Students can click on words and pictures to hear sounds, practice pronunciation, and build confidence in reading.", 4 | "url": "https://www.starfall.com/h/ltr-classic/", 5 | "image": "/open-english-vn/images/resources/starfall-phonics.png", 6 | "category": "Letters and Sounds", 7 | "tags": ["phonics", "reading", "beginner", "interactive", "children"], 8 | "free": true 9 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Open English VN Resources 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/static.yml: -------------------------------------------------------------------------------- 1 | name: Deploy static content to Pages 2 | 3 | on: 4 | push: 5 | branches: ["master"] 6 | workflow_dispatch: 7 | 8 | permissions: 9 | contents: read 10 | pages: write 11 | id-token: write 12 | 13 | concurrency: 14 | group: "pages" 15 | cancel-in-progress: false 16 | 17 | jobs: 18 | deploy: 19 | environment: 20 | name: github-pages 21 | url: ${{ steps.deployment.outputs.page_url }} 22 | runs-on: ubuntu-latest 23 | steps: 24 | - name: Checkout Repository 25 | uses: actions/checkout@v4 26 | 27 | - name: Setup Node.js 28 | uses: actions/setup-node@v4 29 | with: 30 | node-version: "20" 31 | cache: "npm" 32 | 33 | - name: Install Dependencies 34 | run: npm ci 35 | 36 | - name: Build Astro Site 37 | run: npm run build # ✅ Generates `dist/` folder 38 | 39 | - name: Verify Build Output 40 | run: ls -la dist || echo "❌ dist/ folder is missing!" # ✅ Debugging step 41 | 42 | - name: Setup Pages 43 | uses: actions/configure-pages@v5 44 | 45 | - name: Upload Artifact 46 | uses: actions/upload-pages-artifact@v3 47 | with: 48 | path: 'dist' # ✅ Upload only the built `dist/` folder 49 | 50 | - name: Deploy to GitHub Pages 51 | id: deployment 52 | uses: actions/deploy-pages@v4 53 | -------------------------------------------------------------------------------- /src/assets/background.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/content/config.ts: -------------------------------------------------------------------------------- 1 | import { defineCollection, z } from 'astro:content'; 2 | 3 | const blog = defineCollection({ 4 | type: 'content', 5 | schema: z.object({ 6 | title: z.string(), 7 | description: z.string(), 8 | pubDate: z.date(), 9 | author: z.string(), 10 | image: z.string().optional(), 11 | tags: z.array(z.string()).optional(), 12 | }), 13 | }); 14 | 15 | const resources = defineCollection({ 16 | type: 'data', 17 | schema: z.object({ 18 | title: z.string(), 19 | description: z.string(), 20 | url: z.string().url(), 21 | image: z.string().optional().default('/open-english-vn/images/resources/default-resource.png'), 22 | category: z.enum([ 23 | 'Letters and Sounds', 24 | 'Punctuation', 25 | 'Words and Spelling', 26 | 'Learning to Read', 27 | 'Writing', 28 | 'Stories', 29 | 'Grammar', 30 | 'Speaking', 31 | 'Listening', 32 | 'Reading', 33 | 'Vocabulary', 34 | 'IELTS', 35 | 'TOEFL', 36 | 'General', 37 | ]), 38 | tags: z.array(z.string()), 39 | free: z.boolean().default(false), 40 | }), 41 | }); 42 | 43 | 44 | const quiz = defineCollection({ 45 | type: 'data', 46 | schema: z.object({ 47 | slug: z.string(), // Add this line 48 | title: z.string(), 49 | description: z.string().optional(), 50 | questions: z.array( 51 | z.object({ 52 | question: z.string(), 53 | options: z.array(z.string()), 54 | answer: z.string(), 55 | }) 56 | ), 57 | }), 58 | }); 59 | 60 | 61 | export const collections = { 62 | blog, 63 | resources, 64 | quiz, // Include quiz collection 65 | }; -------------------------------------------------------------------------------- /src/content/quiz/history-trivia.json: -------------------------------------------------------------------------------- 1 | { 2 | "slug": "history-quiz", 3 | "title": "World History Trivia", 4 | "description": "Test your knowledge of world history!", 5 | "questions": [ 6 | { 7 | "question": "In what year did World War I begin?", 8 | "options": [ 9 | "1914", 10 | "1939", 11 | "1905", 12 | "1918" 13 | ], 14 | "answer": "1914", 15 | "explanation": "World War I started in 1914 after the assassination of Archduke Franz Ferdinand of Austria, leading to a global conflict involving major world powers." 16 | }, 17 | { 18 | "question": "Who was the first president of the United States?", 19 | "options": [ 20 | "Thomas Jefferson", 21 | "George Washington", 22 | "John Adams", 23 | "Benjamin Franklin" 24 | ], 25 | "answer": "George Washington", 26 | "explanation": "George Washington became the first president of the United States in 1789 and served two terms, setting many precedents for the office." 27 | }, 28 | { 29 | "question": "Which ancient civilization built the pyramids of Giza?", 30 | "options": [ 31 | "Roman", 32 | "Greek", 33 | "Egyptian", 34 | "Persian" 35 | ], 36 | "answer": "Egyptian", 37 | "explanation": "The ancient Egyptians built the pyramids of Giza around 2600 BC as tombs for their pharaohs, demonstrating advanced engineering skills." 38 | } 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to My Astro Resources 2 | 3 | Thank you for your interest in contributing to My Astro Resources! This guide will help you submit your English learning resources. 4 | 5 | ## How to Contribute 6 | 7 | 1. **Fork the Repository** 8 | - Click the "Fork" button in the top right of this repository 9 | - Clone your fork locally 10 | 11 | 2. **Add Your Resource** 12 | - Navigate to the `src/content/resources` directory 13 | - Create a new markdown file with your resource details 14 | - Follow this template: 15 | 16 | ```markdown 17 | { 18 | "title": "Resource Name", 19 | "description": "A brief description of your resource", 20 | "url": "https://your-website.com", 21 | "image": "/open-english-vn/images/resources/resource-name.png", 22 | "category": "Grammar", 23 | "tags": ["tag1", "tag2"], 24 | "free": true 25 | } 26 | 27 | ``` 28 | 29 | 3. **Submit a Pull Request** 30 | - Commit your changes 31 | - Push to your fork 32 | - Create a Pull Request 33 | 34 | ## Guidelines 35 | 36 | - Ensure your resource is high-quality and helpful for Vietnamese learners 37 | - Include clear descriptions and usage instructions 38 | - Add appropriate tags and categories 39 | - Keep descriptions concise but informative 40 | - Make sure all links are working 41 | 42 | ## 📖 Categories 43 | 44 | - Letters and Sounds 45 | - Punctuation 46 | - Words and Spelling 47 | - Learning to Read 48 | - Writing 49 | - Stories 50 | - Grammar 51 | - Speaking 52 | - Listening 53 | - Reading 54 | - Vocabulary 55 | - IELTS 56 | - TOEFL 57 | - General 58 | 59 | ## Questions? 60 | 61 | Feel free to open an issue if you have any questions about contributing! 62 | -------------------------------------------------------------------------------- /src/components/CategoryFilter.astro: -------------------------------------------------------------------------------- 1 | --- 2 | interface Props { 3 | categories: string[]; 4 | } 5 | 6 | const { categories } = Astro.props; 7 | --- 8 | 9 |
10 | {categories.map((category) => ( 11 | 17 | ))} 18 |
19 | 20 | -------------------------------------------------------------------------------- /src/components/SearchBar.astro: -------------------------------------------------------------------------------- 1 | --- 2 | interface Props { 3 | placeholder?: string; 4 | } 5 | 6 | const { placeholder = "Search resources..." } = Astro.props; 7 | --- 8 | 9 |
10 | 16 | 17 | 18 | 19 |
20 | 21 | -------------------------------------------------------------------------------- /src/pages/blog/[...slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { getCollection } from 'astro:content'; 3 | import MarkdownLayout from '../../layouts/MarkdownLayout.astro'; 4 | 5 | export const prerender = true; 6 | 7 | export async function getStaticPaths() { 8 | const posts = await getCollection('blog'); 9 | return posts.map((post) => ({ 10 | params: { slug: post.slug }, 11 | props: { post }, 12 | })); 13 | } 14 | 15 | const { post } = Astro.props; 16 | const { Content } = await post.render(); 17 | --- 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/pages/blog/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from '../../layouts/Layout.astro'; 3 | import { getCollection } from 'astro:content'; 4 | 5 | export const prerender = true; 6 | 7 | const base = import.meta.env.BASE_URL; 8 | 9 | // Fetch and sort blog posts 10 | const posts = await getCollection('blog'); 11 | posts.sort((a, b) => new Date(b.data.pubDate) - new Date(a.data.pubDate)); 12 | --- 13 | 14 | 15 |
16 |

Blog Posts

17 | 18 |
19 | {posts.map((post) => ( 20 |
21 | {post.data.image && ( 22 | {post.data.title} 27 | )} 28 |
29 |

30 | 31 | {post.data.title} 32 | 33 |

34 |
35 | {post.data.author} 36 | 37 | 44 |
45 |

46 | {post.data.description} 47 |

48 | {post.data.tags && ( 49 |
50 | {post.data.tags.map((tag: string) => ( 51 | 52 | {tag} 53 | 54 | ))} 55 |
56 | )} 57 |
58 |
59 | ))} 60 |
61 |
62 |
63 | -------------------------------------------------------------------------------- /src/components/DarkModeToggle.astro: -------------------------------------------------------------------------------- 1 | 28 | 29 | -------------------------------------------------------------------------------- /src/content/blog/getting-started-with-english.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Getting Started with English: A Beginner's Guide" 3 | description: "Learn the essential steps to start your English learning journey effectively" 4 | pubDate: 2024-03-20 5 | author: "English Learning Expert" 6 | image: "/open-english-vn/images/blog/english-learning.jpg" 7 | tags: ["beginner", "english", "learning", "tips"] 8 | --- 9 | 10 | # Getting Started with English: A Beginner's Guide 11 | 12 | Learning English can be an exciting and rewarding journey. In this guide, we'll explore the essential steps to help you get started effectively. 13 | 14 | ## Why Learn English? 15 | 16 | English is the most widely spoken language in the world, serving as a bridge for: 17 | - International communication 18 | - Business opportunities 19 | - Academic advancement 20 | - Cultural exchange 21 | 22 | ## Essential Steps to Begin 23 | 24 | ### 1. Set Clear Goals 25 | 26 | Before starting, ask yourself: 27 | - Why do I want to learn English? 28 | - What level do I want to achieve? 29 | - How much time can I dedicate daily? 30 | 31 | ### 2. Build Your Foundation 32 | 33 | Start with these fundamental elements: 34 | - Basic vocabulary (1000 most common words) 35 | - Simple grammar structures 36 | - Pronunciation basics 37 | 38 | ### 3. Practice Daily 39 | 40 | Consistency is key. Here's a simple daily routine: 41 | 1. 15 minutes of vocabulary practice 42 | 2. 20 minutes of listening exercises 43 | 3. 15 minutes of speaking practice 44 | 4. 10 minutes of reading 45 | 46 | ## Useful Resources 47 | 48 | Here are some recommended resources to get started: 49 | 50 | - **Apps**: Duolingo, Memrise, BBC Learning English 51 | - **Websites**: 52 | - [BBC Learning English](https://www.bbc.co.uk/learningenglish) 53 | - [British Council](https://learnenglish.britishcouncil.org) 54 | - **YouTube Channels**: EnglishClass101, Rachel's English 55 | 56 | ## Common Challenges and Solutions 57 | 58 | ### Challenge 1: Pronunciation 59 | **Solution**: Practice with native speakers or use pronunciation apps 60 | 61 | ### Challenge 2: Grammar 62 | **Solution**: Start with basic structures and gradually increase complexity 63 | 64 | ### Challenge 3: Speaking Confidence 65 | **Solution**: Join language exchange groups or online conversation clubs 66 | 67 | ## Next Steps 68 | 69 | Remember that learning a language is a marathon, not a sprint. Stay consistent, practice regularly, and don't be afraid to make mistakes. Every error is an opportunity to learn and improve. 70 | 71 | Good luck on your English learning journey! -------------------------------------------------------------------------------- /src/content/blog/ielts-speaking-tips.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "10 Essential Tips for IELTS Speaking Success" 3 | description: "Learn proven strategies to improve your IELTS speaking score with these expert tips specifically designed for Vietnamese learners." 4 | pubDate: 2024-03-20 5 | author: "IELTS Expert" 6 | image: "/open-english-vn/images/blog/ielts-speaking.jpg" 7 | tags: ["ielts", "speaking", "tips", "english"] 8 | --- 9 | 10 | ## Introduction 11 | 12 | Are you preparing for the IELTS Speaking test? As a Vietnamese learner, you might face specific challenges in the speaking section. This guide will provide you with practical tips to improve your speaking skills and boost your confidence. 13 | 14 | ## Key Tips for Success 15 | 16 | ### 1. Practice with Native Speakers 17 | Regular practice with native speakers helps you: 18 | - Improve pronunciation 19 | - Learn natural expressions 20 | - Build confidence 21 | - Get real-time feedback 22 | 23 | ### 2. Record Yourself Speaking 24 | Recording your practice sessions helps you: 25 | - Identify pronunciation issues 26 | - Monitor your speaking pace 27 | - Track your progress 28 | - Build self-awareness 29 | 30 | ### 3. Use Vietnamese-English Parallel Structures 31 | When learning new phrases: 32 | - Write them in both languages 33 | - Practice switching between them 34 | - Use them in context 35 | - Create your own examples 36 | 37 | ### 4. Focus on Common IELTS Topics 38 | Key areas to prepare: 39 | - Family and relationships 40 | - Education and work 41 | - Hobbies and interests 42 | - Technology and modern life 43 | - Environment and society 44 | 45 | ### 5. Master Time Management 46 | During the test: 47 | - Part 1: 4-5 minutes 48 | - Part 2: 3-4 minutes 49 | - Part 3: 4-5 minutes 50 | 51 | ### 6. Use Transition Words 52 | Common transitions to practice: 53 | - However 54 | - Moreover 55 | - In addition 56 | - On the other hand 57 | - For example 58 | 59 | ### 7. Expand Your Vocabulary 60 | Focus on: 61 | - Academic words 62 | - Collocations 63 | - Idioms 64 | - Phrasal verbs 65 | 66 | ### 8. Practice with Time Pressure 67 | Set timers for: 68 | - 2-minute speaking tasks 69 | - 1-minute preparation time 70 | - Quick responses 71 | 72 | ### 9. Record Common Mistakes 73 | Keep a journal of: 74 | - Pronunciation errors 75 | - Grammar mistakes 76 | - Vocabulary gaps 77 | - Fluency issues 78 | 79 | ### 10. Stay Calm and Confident 80 | During the test: 81 | - Take deep breaths 82 | - Speak clearly 83 | - Maintain eye contact 84 | - Show enthusiasm 85 | 86 | ## Conclusion 87 | 88 | Remember, consistent practice is key to success. Start implementing these tips today, and you'll see improvement in your speaking skills. Don't forget to practice regularly and record your progress. 89 | 90 | Good luck with your IELTS preparation! -------------------------------------------------------------------------------- /src/assets/astro.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/layouts/Layout.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Navbar from "../components/Navbar.astro"; 3 | import "../styles/global.css"; 4 | 5 | interface Props { 6 | title: string; 7 | description?: string; 8 | } 9 | 10 | const { 11 | title, 12 | description = "A curated collection of English learning resources created by Vietnamese developers", 13 | } = Astro.props; 14 | --- 15 | 16 | 17 | 18 | 19 | 20 | 21 | 26 | 27 | {title} 28 | 29 | 38 | 51 | 52 | 55 | 56 |
57 | 58 |
59 | 60 |
61 |
62 |

63 | Built with ❤️ using Astro and TailwindCSS 64 |

65 |
66 |
67 | 68 | 69 | 70 | 100 | -------------------------------------------------------------------------------- /src/content/blog/common-grammar-mistakes.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Common Grammar Mistakes Vietnamese Learners Make" 3 | description: "Learn about the most common English grammar mistakes made by Vietnamese learners and how to avoid them." 4 | pubDate: 2024-03-19 5 | author: "Grammar Expert" 6 | image: "/open-english-vn/images/blog/grammar-mistakes.jpg" 7 | tags: ["grammar", "mistakes", "english", "tips"] 8 | --- 9 | 10 | ## Introduction 11 | 12 | As a Vietnamese learner of English, you might find certain grammar patterns challenging. This guide highlights common mistakes and provides clear explanations to help you improve your English grammar. 13 | 14 | ## Common Mistakes and Solutions 15 | 16 | ### 1. Subject-Verb Agreement 17 | **Mistake**: "The book are on the table" 18 | **Correct**: "The book is on the table" 19 | 20 | **Mistake**: "My friends is coming" 21 | **Correct**: "My friends are coming" 22 | 23 | ### 2. Articles (a, an, the) 24 | **Mistake**: "I want to buy car" 25 | **Correct**: "I want to buy a car" 26 | 27 | **Mistake**: "I am student" 28 | **Correct**: "I am a student" 29 | 30 | ### 3. Prepositions 31 | **Mistake**: "I am good in English" 32 | **Correct**: "I am good at English" 33 | 34 | **Mistake**: "I will meet you on Monday at 3pm" 35 | **Correct**: "I will meet you on Monday at 3pm" 36 | 37 | ### 4. Tense Usage 38 | **Mistake**: "I am study English" 39 | **Correct**: "I am studying English" or "I study English" 40 | 41 | **Mistake**: "I have been to Paris last year" 42 | **Correct**: "I went to Paris last year" 43 | 44 | ### 5. Countable vs Uncountable Nouns 45 | **Mistake**: "I need some advices" 46 | **Correct**: "I need some advice" 47 | 48 | **Mistake**: "I have many informations" 49 | **Correct**: "I have much information" 50 | 51 | ### 6. Word Order 52 | **Mistake**: "I yesterday went to school" 53 | **Correct**: "I went to school yesterday" 54 | 55 | **Mistake**: "She speaks well English" 56 | **Correct**: "She speaks English well" 57 | 58 | ### 7. Modal Verbs 59 | **Mistake**: "I must to go now" 60 | **Correct**: "I must go now" 61 | 62 | **Mistake**: "You should to study more" 63 | **Correct**: "You should study more" 64 | 65 | ### 8. Comparatives and Superlatives 66 | **Mistake**: "This is more better" 67 | **Correct**: "This is better" 68 | 69 | **Mistake**: "She is the most tallest" 70 | **Correct**: "She is the tallest" 71 | 72 | ## Tips for Improvement 73 | 74 | 1. **Practice Regularly** 75 | - Write daily journal entries 76 | - Speak with native speakers 77 | - Read English materials 78 | 79 | 2. **Use Grammar Apps** 80 | - Grammarly 81 | - Duolingo 82 | - BBC Learning English 83 | 84 | 3. **Create Flashcards** 85 | - Write correct and incorrect examples 86 | - Review them regularly 87 | - Use them in sentences 88 | 89 | 4. **Record Yourself** 90 | - Speak about different topics 91 | - Listen for mistakes 92 | - Correct them 93 | 94 | ## Conclusion 95 | 96 | Remember, making mistakes is part of learning. Focus on understanding the patterns and practicing regularly. With time and effort, you'll see significant improvement in your grammar skills. 97 | 98 | Keep practicing and don't be afraid to make mistakes! -------------------------------------------------------------------------------- /src/components/ResourceCard.astro: -------------------------------------------------------------------------------- 1 | --- 2 | interface Props { 3 | title: string; 4 | description: string; 5 | url: string; 6 | thumbnail: string; 7 | categories: string[]; 8 | } 9 | 10 | const { title, description, url, thumbnail, categories } = Astro.props; 11 | --- 12 | 13 |
14 |
15 | {title} 20 |
21 |
22 |

23 | {title} 24 |

25 |

26 | {description} 27 |

28 |
29 | {categories.map((category) => ( 30 | 31 | {category} 32 | 33 | ))} 34 |
35 | 41 | Visit Resource 42 | 43 |
44 |
45 | 46 | -------------------------------------------------------------------------------- /src/components/QuizGame.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from '../layouts/Layout.astro'; 3 | import { getCollection } from 'astro:content'; 4 | 5 | interface Quiz { 6 | id: string; 7 | data: { 8 | title: string; 9 | description?: string; 10 | questions: { 11 | question: string; 12 | options: string[]; 13 | answer: string; 14 | }[]; 15 | }; 16 | } 17 | export const prerender = true; 18 | 19 | const base = import.meta.env.BASE_URL; 20 | 21 | export const getStaticPaths = async () => { 22 | const quizzes = await getCollection('quiz'); 23 | return quizzes.map((quiz) => ({ 24 | params: { id: quiz.id }, 25 | })); 26 | }; 27 | 28 | const quizzes = await getCollection('quiz'); 29 | --- 30 | 31 | 32 |
33 |
34 |
35 |

Quiz Challenge

36 |

37 | Test your knowledge with our interactive quizzes. Select one below to get started! 38 |

39 |
40 | 41 |
42 | {quizzes.map((quiz) => ( 43 |
44 |
45 |
46 |
47 | 48 | 49 | 50 |
51 |

{quiz.data.title}

52 |
53 | 54 |

55 | {quiz.data.description || "A fun quiz to test your knowledge!"} 56 |

57 | 58 |
59 | 60 | {quiz.data.questions.length} questions 61 | 62 | 67 | Start Quiz 68 | 69 | 70 | 71 | 72 |
73 |
74 |
75 | ))} 76 |
77 |
78 |
79 |
-------------------------------------------------------------------------------- /src/content/quiz/vietname-war.json: -------------------------------------------------------------------------------- 1 | { 2 | "slug": "vietnam-war", 3 | "title": "Vietnam War Quiz", 4 | "description": "Test your knowledge about the Vietnam War with these challenging questions!", 5 | "questions": [ 6 | { 7 | "question": "When did the Vietnam War officially start?", 8 | "options": ["1955", "1960", "1965", "1970"], 9 | "answer": "1955", 10 | "explanation": "The Vietnam War officially began in 1955, following the establishment of the Republic of Vietnam (South Vietnam) and the start of hostilities between North and South Vietnam." 11 | }, 12 | { 13 | "question": "What was the main reason for U.S. involvement in the Vietnam War?", 14 | "options": ["Oil resources", "Containment of communism", "Territorial expansion", "Economic interests"], 15 | "answer": "Containment of communism", 16 | "explanation": "The U.S. entered the Vietnam War to prevent the spread of communism in Southeast Asia, in line with the broader Cold War strategy of containing communism." 17 | }, 18 | { 19 | "question": "Which country controlled Vietnam before it gained independence in 1954?", 20 | "options": ["China", "Japan", "France", "United Kingdom"], 21 | "answer": "France", 22 | "explanation": "Vietnam was a French colony known as French Indochina until it gained independence in 1954 after the First Indochina War." 23 | }, 24 | { 25 | "question": "Who was the leader of North Vietnam during most of the war?", 26 | "options": ["Nguyen Van Thieu", "Ho Chi Minh", "Diem Bien Phu", "Vo Nguyen Giap"], 27 | "answer": "Ho Chi Minh", 28 | "explanation": "Ho Chi Minh was the leader of North Vietnam and a key figure in the struggle for Vietnamese independence from French colonial rule and later in the Vietnam War." 29 | }, 30 | { 31 | "question": "What was the name of the communist forces in South Vietnam?", 32 | "options": ["Viet Cong", "Khmer Rouge", "Red Army", "Pathet Lao"], 33 | "answer": "Viet Cong", 34 | "explanation": "The Viet Cong, also known as the National Front for the Liberation of South Vietnam, were communist insurgents who fought against the South Vietnamese government during the Vietnam War." 35 | }, 36 | { 37 | "question": "Which major offensive by North Vietnam in 1968 marked a turning point in the war?", 38 | "options": ["Dien Bien Phu Battle", "Tet Offensive", "Fall of Saigon", "My Lai Massacre"], 39 | "answer": "Tet Offensive", 40 | "explanation": "The Tet Offensive in 1968 was a coordinated series of attacks by North Vietnam and the Viet Cong on South Vietnam, marking a turning point in the war and shifting U.S. public opinion." 41 | }, 42 | { 43 | "question": "What chemical defoliant was used by the U.S. military to destroy jungle cover?", 44 | "options": ["Agent Blue", "Agent Orange", "Napalm", "Mustard Gas"], 45 | "answer": "Agent Orange", 46 | "explanation": "Agent Orange was a herbicide used by the U.S. to defoliate forests and crops in Vietnam, causing widespread environmental damage and health issues for both Vietnamese civilians and U.S. veterans." 47 | }, 48 | { 49 | "question": "When did Saigon fall, marking the end of the Vietnam War?", 50 | "options": ["April 30, 1973", "April 30, 1975", "May 1, 1976", "March 15, 1974"], 51 | "answer": "April 30, 1975", 52 | "explanation": "Saigon fell on April 30, 1975, marking the end of the Vietnam War and the reunification of Vietnam under communist control." 53 | }, 54 | { 55 | "question": "Which U.S. president significantly escalated American troop presence in Vietnam?", 56 | "options": ["Dwight Eisenhower", "John F. Kennedy", "Lyndon B. Johnson", "Richard Nixon"], 57 | "answer": "Lyndon B. Johnson", 58 | "explanation": "President Lyndon B. Johnson significantly escalated U.S. military involvement in Vietnam, deploying large numbers of American troops during the early 1960s." 59 | }, 60 | { 61 | "question": "What was the name of the peace agreement that ended U.S. direct involvement in the war?", 62 | "options": ["Geneva Accords", "Paris Peace Accords", "Yalta Agreement", "Potsdam Conference"], 63 | "answer": "Paris Peace Accords", 64 | "explanation": "The Paris Peace Accords, signed in 1973, marked the formal agreement that ended U.S. direct involvement in the Vietnam War, leading to a ceasefire and the eventual fall of Saigon." 65 | } 66 | ] 67 | } 68 | -------------------------------------------------------------------------------- /src/content/quiz/dien-bien-phu-war.json: -------------------------------------------------------------------------------- 1 | { 2 | "slug": "dien-bien-phu-victory", 3 | "title": "Điện Biên Phủ Victory Quiz", 4 | "description": "Test your knowledge about the Điện Biên Phủ Victory with these challenging questions!", 5 | "questions": [ 6 | { 7 | "question": "When did the Battle of Điện Biên Phủ take place?", 8 | "options": ["1952", "1953", "1954", "1955"], 9 | "answer": "1954", 10 | "explanation": "The Battle of Điện Biên Phủ took place from March 13 to May 7, 1954, marking a crucial victory for the Vietnamese forces against the French." 11 | }, 12 | { 13 | "question": "Which country was the main opponent of Vietnam in the Battle of Điện Biên Phủ?", 14 | "options": ["United States", "China", "France", "United Kingdom"], 15 | "answer": "France", 16 | "explanation": "France was the main opponent, as the battle was part of the First Indochina War between the French colonial forces and the Viet Minh." 17 | }, 18 | { 19 | "question": "Who was the Vietnamese general leading the campaign at Điện Biên Phủ?", 20 | "options": ["Hồ Chí Minh", "Nguyễn Chí Thanh", "Võ Nguyên Giáp", "Trường Chinh"], 21 | "answer": "Võ Nguyên Giáp", 22 | "explanation": "General Võ Nguyên Giáp was the mastermind behind the Vietnamese strategy, leading the Viet Minh forces to victory through careful planning and execution." 23 | }, 24 | { 25 | "question": "Which military strategy did the Vietnamese forces use to defeat the French at Điện Biên Phủ?", 26 | "options": ["Blitzkrieg", "Human-wave attack", "Encirclement and siege", "Guerilla warfare"], 27 | "answer": "Encirclement and siege", 28 | "explanation": "The Viet Minh used an encirclement and siege strategy, cutting off French supply lines and bombarding their positions until they surrendered." 29 | }, 30 | { 31 | "question": "What was the name of the French commander at Điện Biên Phủ?", 32 | "options": ["Jean de Lattre de Tassigny", "Henri Navarre", "Christian de Castries", "Philippe Leclerc"], 33 | "answer": "Christian de Castries", 34 | "explanation": "Christian de Castries was the French commander in charge of the defense at Điện Biên Phủ, ultimately surrendering after the prolonged siege." 35 | }, 36 | { 37 | "question": "How long did the Battle of Điện Biên Phủ last?", 38 | "options": ["27 days", "45 days", "56 days", "78 days"], 39 | "answer": "56 days", 40 | "explanation": "The battle lasted for 56 days, from March 13 to May 7, 1954, culminating in a decisive Vietnamese victory." 41 | }, 42 | { 43 | "question": "What was the significance of the Battle of Điện Biên Phủ?", 44 | "options": [ 45 | "It marked the beginning of the Cold War", 46 | "It led to the end of French colonial rule in Indochina", 47 | "It resulted in Vietnam's unification", 48 | "It caused the Vietnam War to start" 49 | ], 50 | "answer": "It led to the end of French colonial rule in Indochina", 51 | "explanation": "The defeat at Điện Biên Phủ forced France to negotiate peace and eventually withdraw from Indochina, leading to Vietnamese independence." 52 | }, 53 | { 54 | "question": "Which agreement was signed after the Vietnamese victory at Điện Biên Phủ?", 55 | "options": ["Geneva Accords", "Paris Peace Accords", "Yalta Agreement", "Versailles Treaty"], 56 | "answer": "Geneva Accords", 57 | "explanation": "The Geneva Accords were signed in 1954, dividing Vietnam into North and South at the 17th parallel, pending future elections." 58 | }, 59 | { 60 | "question": "What type of terrain posed a challenge for both French and Vietnamese forces at Điện Biên Phủ?", 61 | "options": ["Deserts", "Mountains and jungles", "Plains", "Swamps"], 62 | "answer": "Mountains and jungles", 63 | "explanation": "The rugged mountainous and jungle terrain made logistics and movement difficult for both sides, but the Viet Minh adapted better to these conditions." 64 | }, 65 | { 66 | "question": "Which of the following weapons were heavily used by the Vietnamese forces at Điện Biên Phủ?", 67 | "options": ["Tanks", "Naval warships", "Artillery and anti-aircraft guns", "Biological weapons"], 68 | "answer": "Artillery and anti-aircraft guns", 69 | "explanation": "The Viet Minh relied heavily on artillery and anti-aircraft guns, which were transported through difficult terrain and used effectively against French positions." 70 | } 71 | ] 72 | } 73 | -------------------------------------------------------------------------------- /src/content/quiz/general-knowledge.json: -------------------------------------------------------------------------------- 1 | { 2 | "slug": "general-knowledge", 3 | "title": "General Knowledge Quiz", 4 | "description": "Test your general knowledge with these fun questions!", 5 | "questions": [ 6 | { 7 | "question": "What is the capital of France?", 8 | "options": ["Berlin", "Madrid", "Paris", "Rome"], 9 | "answer": "Paris", 10 | "explanation": "Paris is the capital and largest city of France, known for its rich history, art, and landmarks like the Eiffel Tower." 11 | }, 12 | { 13 | "question": "Which planet is known as the Red Planet?", 14 | "options": ["Earth", "Mars", "Jupiter", "Venus"], 15 | "answer": "Mars", 16 | "explanation": "Mars is often called the Red Planet due to its reddish appearance, which is caused by iron oxide (rust) on its surface." 17 | }, 18 | { 19 | "question": "Who wrote 'To Kill a Mockingbird'?", 20 | "options": ["Harper Lee", "Mark Twain", "Ernest Hemingway", "J.K. Rowling"], 21 | "answer": "Harper Lee", 22 | "explanation": "Harper Lee wrote 'To Kill a Mockingbird,' a novel published in 1960 that deals with racial injustice in the American South." 23 | }, 24 | { 25 | "question": "Which is the largest ocean on Earth?", 26 | "options": ["Atlantic", "Indian", "Pacific", "Arctic"], 27 | "answer": "Pacific", 28 | "explanation": "The Pacific Ocean is the largest ocean, covering more than 63 million square miles and extending from the Arctic to the Southern Ocean." 29 | }, 30 | { 31 | "question": "What is the chemical symbol for gold?", 32 | "options": ["Go", "Au", "Ag", "Gd"], 33 | "answer": "Au", 34 | "explanation": "The chemical symbol for gold is 'Au,' derived from the Latin word 'Aurum,' meaning 'shining dawn.'" 35 | }, 36 | { 37 | "question": "How many continents are there?", 38 | "options": ["5", "6", "7", "8"], 39 | "answer": "7", 40 | "explanation": "There are seven continents: Africa, Antarctica, Asia, Europe, North America, Oceania, and South America." 41 | }, 42 | { 43 | "question": "What year did World War II end?", 44 | "options": ["1942", "1945", "1950", "1939"], 45 | "answer": "1945", 46 | "explanation": "World War II ended in 1945 with the surrender of Germany in May and Japan in September after the atomic bombings of Hiroshima and Nagasaki." 47 | }, 48 | { 49 | "question": "Which is the longest river in the world?", 50 | "options": ["Amazon", "Nile", "Yangtze", "Mississippi"], 51 | "answer": "Nile", 52 | "explanation": "The Nile River is the longest river in the world, stretching about 6,650 km (4,130 miles) and flowing through northeastern Africa." 53 | }, 54 | { 55 | "question": "Who painted the Mona Lisa?", 56 | "options": ["Van Gogh", "Picasso", "Leonardo da Vinci", "Rembrandt"], 57 | "answer": "Leonardo da Vinci", 58 | "explanation": "Leonardo da Vinci painted the Mona Lisa, one of the most famous artworks in the world, displayed at the Louvre Museum in Paris." 59 | }, 60 | { 61 | "question": "What is the hardest natural substance on Earth?", 62 | "options": ["Gold", "Iron", "Diamond", "Platinum"], 63 | "answer": "Diamond", 64 | "explanation": "Diamond is the hardest natural substance on Earth, formed under extreme pressure and used in cutting tools and jewelry." 65 | }, 66 | { 67 | "question": "What does DNA stand for?", 68 | "options": ["Deoxyribonucleic Acid", "Dynamic Neural Algorithm", "Digital Network Array", "Data Node Access"], 69 | "answer": "Deoxyribonucleic Acid", 70 | "explanation": "DNA stands for Deoxyribonucleic Acid, the molecule that carries genetic instructions for the development and functioning of all living organisms." 71 | }, 72 | { 73 | "question": "How many bones are in the adult human body?", 74 | "options": ["200", "206", "215", "198"], 75 | "answer": "206", 76 | "explanation": "The adult human body has 206 bones, which provide structure, protect organs, and support movement." 77 | }, 78 | { 79 | "question": "What is the smallest country in the world?", 80 | "options": ["Vatican City", "Monaco", "Malta", "Liechtenstein"], 81 | "answer": "Vatican City", 82 | "explanation": "Vatican City is the smallest country in the world, covering about 44 hectares (110 acres) and serving as the headquarters of the Roman Catholic Church." 83 | } 84 | ] 85 | } 86 | -------------------------------------------------------------------------------- /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "projectName": "open-english-vn", 3 | "projectOwner": "Gianguyen1234", 4 | "repoType": "github", 5 | "repoHost": "https://github.com", 6 | "files": [ 7 | "README.md" 8 | ], 9 | "imageSize": 100, 10 | "commit": true, 11 | "commitConvention": "angular", 12 | "contributors": [ 13 | { 14 | "login": "VuongKha", 15 | "name": "VuongKha", 16 | "avatar_url": "https://avatars.githubusercontent.com/u/182387157?v=4", 17 | "profile": "https://github.com/VuongKha", 18 | "contributions": [ 19 | "doc" 20 | ] 21 | }, 22 | { 23 | "login": "vovanduc", 24 | "name": "Duc Vo", 25 | "avatar_url": "https://avatars.githubusercontent.com/u/3851842?v=4", 26 | "profile": "https://www.linkedin.com/in/vovanduc", 27 | "contributions": [ 28 | "content" 29 | ] 30 | }, 31 | { 32 | "login": "natural-mess", 33 | "name": "Natural Mess", 34 | "avatar_url": "https://avatars.githubusercontent.com/u/37369211?v=4", 35 | "profile": "https://github.com/natural-mess", 36 | "contributions": [ 37 | "content" 38 | ] 39 | }, 40 | { 41 | "login": "astrobot-houston", 42 | "name": "Houston (Bot)", 43 | "avatar_url": "https://avatars.githubusercontent.com/u/108291165?v=4", 44 | "profile": "https://astro.build/", 45 | "contributions": [ 46 | "doc" 47 | ] 48 | }, 49 | { 50 | "login": "Lupu29", 51 | "name": "Lupu29", 52 | "avatar_url": "https://avatars.githubusercontent.com/u/182874747?v=4", 53 | "profile": "https://github.com/Lupu29", 54 | "contributions": [ 55 | "content" 56 | ] 57 | }, 58 | { 59 | "login": "Gianguyen1234", 60 | "name": "Holy_Dev", 61 | "avatar_url": "https://avatars.githubusercontent.com/u/112406680?v=4", 62 | "profile": "https://harrypage.hashnode.dev/", 63 | "contributions": [ 64 | "code", 65 | "doc", 66 | "question", 67 | "review", 68 | "tutorial" 69 | ] 70 | }, 71 | { 72 | "login": "vinhsang7410", 73 | "name": "vinhsang7410", 74 | "avatar_url": "https://avatars.githubusercontent.com/u/36439454?v=4", 75 | "profile": "https://github.com/vinhsang7410", 76 | "contributions": [ 77 | "infra" 78 | ] 79 | }, 80 | { 81 | "login": "Paxle86", 82 | "name": "Le Tat Thanh", 83 | "avatar_url": "https://avatars.githubusercontent.com/u/57349163?v=4", 84 | "profile": "https://github.com/Paxle86", 85 | "contributions": [ 86 | "content" 87 | ] 88 | }, 89 | { 90 | "login": "Hoang-Nguyen-Huy", 91 | "name": "Nguyễn Huy Hoàng", 92 | "avatar_url": "https://avatars.githubusercontent.com/u/121879570?v=4", 93 | "profile": "https://github.com/Hoang-Nguyen-Huy", 94 | "contributions": [ 95 | "doc" 96 | ] 97 | }, 98 | { 99 | "login": "nguyenthanhxuan", 100 | "name": "Xuan Nguyen", 101 | "avatar_url": "https://avatars.githubusercontent.com/u/2492355?v=4", 102 | "profile": "https://nguyenthanhxuan.name.vn/", 103 | "contributions": [ 104 | "content" 105 | ] 106 | }, 107 | { 108 | "login": "YarC7", 109 | "name": "NgD.Cankkun", 110 | "avatar_url": "https://avatars.githubusercontent.com/u/70331512?v=4", 111 | "profile": "https://cray7.netlify.app/", 112 | "contributions": [ 113 | "content" 114 | ] 115 | }, 116 | { 117 | "login": "GiapKun", 118 | "name": "Trần Đình Giáp", 119 | "avatar_url": "https://avatars.githubusercontent.com/u/133072403?v=4", 120 | "profile": "https://github.com/GiapKun", 121 | "contributions": [ 122 | "content" 123 | ] 124 | }, 125 | { 126 | "login": "minhbka", 127 | "name": "PHAN VAN MINH", 128 | "avatar_url": "https://avatars.githubusercontent.com/u/22513525?v=4", 129 | "profile": "https://github.com/minhbka", 130 | "contributions": [ 131 | "content" 132 | ] 133 | }, 134 | { 135 | "login": "kitajima2910", 136 | "name": "Phạm Xuân Hoài", 137 | "avatar_url": "https://avatars.githubusercontent.com/u/50172777?v=4", 138 | "profile": "https://github.com/kitajima2910", 139 | "contributions": [ 140 | "content" 141 | ] 142 | }, 143 | { 144 | "login": "MyNameIsKry", 145 | "name": "Kry", 146 | "avatar_url": "https://avatars.githubusercontent.com/u/117553015?v=4", 147 | "profile": "https://github.com/MyNameIsKry", 148 | "contributions": [ 149 | "content" 150 | ] 151 | }, 152 | { 153 | "login": "yuran1811", 154 | "name": "Yuran", 155 | "avatar_url": "https://avatars.githubusercontent.com/u/76398420?v=4", 156 | "profile": "https://www.facebook.com/YuranLegends", 157 | "contributions": [ 158 | "content", 159 | "design", 160 | "bug" 161 | ] 162 | }, 163 | { 164 | "login": "ThangNguyen23", 165 | "name": "ThangNguyen23", 166 | "avatar_url": "https://avatars.githubusercontent.com/u/63710361?v=4", 167 | "profile": "https://github.com/ThangNguyen23", 168 | "contributions": [ 169 | "content" 170 | ] 171 | } 172 | ], 173 | "contributorsPerLine": 7, 174 | "linkToUsage": true 175 | } 176 | -------------------------------------------------------------------------------- /src/layouts/MarkdownLayout.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from './Layout.astro'; 3 | const { frontmatter } = Astro.props; 4 | --- 5 | 6 | 7 |
8 |
9 |

10 | {frontmatter.title} 11 |

12 |
13 | {frontmatter.author} 14 | 15 | 22 |
23 | {frontmatter.image && ( 24 | {frontmatter.title} 29 | )} 30 |

31 | {frontmatter.description} 32 |

33 | {frontmatter.tags && ( 34 |
35 | {frontmatter.tags.map((tag: string) => ( 36 | 37 | {tag} 38 | 39 | ))} 40 |
41 | )} 42 |
43 | 44 |
45 | 46 |
47 |
48 |
49 | 50 | -------------------------------------------------------------------------------- /src/content/blog/common-english-mistakes.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Master These Common English Grammar Patterns" 3 | description: "A practical guide for Vietnamese learners to understand and correct frequent English grammar mistakes, with clear examples and explanations." 4 | pubDate: 2024-03-20 5 | author: "English Learning Team" 6 | image: "/open-english-vn/images/blog/english-grammar.jpg" 7 | tags: ["grammar", "common mistakes", "vietnamese learners", "english learning"] 8 | --- 9 | 10 |
11 | 12 | ## Quick Navigation 13 | - [Subject-Verb Agreement](#subject-verb-agreement) 14 | - [Article Usage](#article-usage) 15 | - [Preposition Usage](#preposition-usage) 16 | - [Tense Usage](#tense-usage) 17 | - [Countable vs Uncountable Nouns](#countable-vs-uncountable-nouns) 18 | - [Practice Tips](#practice-tips) 19 | 20 | 21 | ## Subject-Verb Agreement 22 | 23 |
24 | One of the fundamental rules in English is that the subject and verb must agree in number. This means singular subjects need singular verbs, and plural subjects need plural verbs. 25 | 26 |
27 | ❌ Incorrect: 28 | - He play football every weekend. 29 | - The students in my class is very smart. 30 |
31 | 32 |
33 | ✅ Correct: 34 | - He plays football every weekend. 35 | - The students in my class are very smart. 36 | 37 | Why? In the present simple tense: 38 | - Singular subjects (he/she/it) use verb + s 39 | - Plural subjects use the base form of the verb 40 |
41 |
42 | 43 | ## Article Usage 44 | 45 |
46 | Articles (a, an, the) are often challenging for Vietnamese speakers since Vietnamese doesn't have an equivalent system. 47 | 48 |
49 | ❌ Incorrect: 50 | - I bought ∅ new phone yesterday. 51 | - She is ∅ best student in class. 52 |
53 | 54 |
55 | ✅ Correct: 56 | - I bought a new phone yesterday. 57 | - She is the best student in class. 58 | 59 | Why? 60 | - Use "a/an" for singular countable nouns when mentioning something for the first time 61 | - Use "the" when referring to something specific or already mentioned 62 |
63 | 64 |
65 | 💡 Pro Tip: Think of "the" as pointing to something specific, like when you point at something with your finger. If you can point at it specifically, you probably need "the". 66 |
67 |
68 | 69 | ## Preposition Usage 70 | 71 |
72 | Prepositions in English often don't match directly with their Vietnamese counterparts. 73 | 74 |
75 | ❌ Incorrect: 76 | - I will arrive to the airport at 3PM. 77 | - He is good in playing guitar. 78 |
79 | 80 |
81 | ✅ Correct: 82 | - I will arrive at the airport at 3PM. 83 | - He is good at playing guitar. 84 | 85 | Common Patterns: 86 | - arrive at (a specific place) 87 | - good at (a skill) 88 | - different from (not different than/to) 89 | - depend on (not depend in/at) 90 |
91 |
92 | 93 | ## Tense Usage 94 | 95 |
96 | English has a more complex tense system compared to Vietnamese, which often leads to confusion. 97 | 98 |
99 | ❌ Incorrect: 100 | - I live in Hanoi since 2010. 101 | - When I arrived home, she already left. 102 |
103 | 104 |
105 | ✅ Correct: 106 | - I have lived in Hanoi since 2010. 107 | - When I arrived home, she had already left. 108 | 109 | Key Points: 110 | - Use present perfect for actions starting in the past and continuing to now 111 | - Use past perfect for actions completed before another past action 112 |
113 |
114 | 115 | ## Countable vs Uncountable Nouns 116 | 117 |
118 | Understanding whether a noun is countable or uncountable affects article usage and verb agreement. 119 | 120 |
121 | ❌ Incorrect: 122 | - I need some informations about the course. 123 | - I would like to buy a furniture for my room. 124 |
125 | 126 |
127 | ✅ Correct: 128 | - I need some information about the course. 129 | - I would like to buy a piece of furniture for my room. 130 | 131 | Common Uncountable Nouns: 132 | - information 133 | - furniture 134 | - advice 135 | - knowledge 136 | - homework 137 | - research 138 |
139 |
140 | 141 | ## Practice Tips 142 | 143 |
144 | To master these patterns, try these effective practice methods: 145 | 146 | 1. Daily Journal Writing 147 | - Write about your day using the patterns you've learned 148 | - Have a native speaker or teacher check your writing 149 | 150 | 2. Error Correction Exercise 151 | - Find mistakes in your own writing 152 | - Keep a log of your common mistakes 153 | - Practice correcting similar errors 154 | 155 | 3. Pattern Practice 156 | - Create your own examples using each pattern 157 | - Practice with a study partner 158 | - Use flashcards for common patterns 159 | 160 |
161 | 💡 Remember: Learning from mistakes is a natural part of language learning. Don't be afraid to make mistakes – they're opportunities to improve! 162 |
163 |
164 | 165 | --- 166 | 167 | Want to practice more? Try creating sentences using these patterns and share them in the comments below! 168 | -------------------------------------------------------------------------------- /src/content/blog/phonics-starting.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Học Tiếng Anh Đúng Cách: Bắt Đầu Từ Phonics" 3 | description: "Học phát âm tiếng Anh đúng cách như trẻ em học tiếng Việt. Bắt đầu với Phonics để cải thiện kỹ năng nghe, nói và giao tiếp tự tin." 4 | pubDate: 2024-03-21 5 | author: "Holy_Dev" 6 | image: "/open-english-vn/images/blog/english-learning.png" 7 | tags: ["learn English", "pronunciation", "phonics", "listening and speaking", "English communication"] 8 | --- 9 | 10 | ## Hầu hết người Việt học tiếng Anh đều “cầm đèn chạy trước ô tô” 11 | 12 | Hầu hết người Việt học tiếng Anh đều cầm đèn chạy trước ô tô, nghĩa là học viết trước khi học nghe và đọc. Điều này khiến cho dù có nhìn vào chữ thì mình biết nghĩa, nhưng lại không phát âm chuẩn được. Khi nói chuyện bằng tiếng Anh thì cứ ấp a ấp úng, câu nói được câu không, vừa nói vừa dịch từ tiếng Việt sang tiếng Anh trong đầu. Lý do là vì không có nền tảng về Phonics, dẫn đến phát âm sai, mà phát âm sai thì làm sao nói cho đúng được. Không nói được thì làm sao tự tin mà giao tiếp bằng tiếng Anh. Chính vì không nói được nên nhiều người sinh ra sợ, không dám học tiếng Anh nữa. Vậy nên, hôm nay mình sẽ chia sẻ với các bạn cách học tiếng Anh giống như hồi nhỏ mình học tiếng Việt vậy. 13 | 14 | ## 1. Những Hậu Quả Của Việc Học Sai Phương Pháp 15 | 16 | Rất nhiều người học tiếng Anh hiện nay gặp phải tình trạng: 17 | 18 | - Phát âm sai: Bạn có thể nhìn biết nghĩa của từ nhưng lại không biết cách phát âm đúng. Điều này thường do bạn chưa nắm được quy tắc phát âm cơ bản. 19 | - Không tự tin khi nói: Vì phát âm sai, khi nói bạn thường phải dịch từ tiếng Việt sang tiếng Anh trong đầu, dẫn đến ấp úng và mất tự tin. 20 | - Phát âm sai kéo theo nhiều hệ quả: Khi không phát âm đúng, việc nghe và nói trở nên khó khăn hơn, dẫn đến giao tiếp không trôi chảy. 21 | 22 | Tất cả những vấn đề này khiến nhiều người ngại học và tránh xa tiếng Anh vì cảm thấy nó quá khó. Nhưng đừng lo, nếu chúng ta học đúng cách, mọi thứ sẽ dễ dàng hơn nhiều. 23 | 24 | ## 2. Học Tiếng Anh Như Trẻ Em Học Tiếng Việt 25 | 26 | Chúng ta hãy thử tưởng tượng lại cách chúng ta học tiếng Việt lúc nhỏ. Khi còn bé, trước khi học viết hay đọc, chúng ta phải: 27 | 28 | - Học cách phát âm từng vần: Hồi nhỏ, ai trong chúng ta cũng phải học phát âm từng âm tiết như “a”, “ớ”, “á” trước khi học đọc từng chữ như “ba”, “má” rồi sau đó mới học đọc và viết. 29 | - Nghe trước, nói sau: Trẻ con được tiếp xúc với tiếng nói từ người lớn, rồi dần dần mới bắt chước nói theo những gì nghe được. 30 | 31 | Nhưng khi học tiếng Anh, chúng ta lại làm ngược lại. Thay vì học phát âm từng từ hoặc nghe cách người bản xứ phát âm, chúng ta lại lao vào đọc cả câu mà không biết cách phát âm từng từ sao cho đúng. Điều này làm cho phát âm không chuẩn, dẫn đến việc nghe và nói tiếng Anh trở nên kém tự nhiên và thiếu tự tin. 32 | 33 | ## 3. Học Phonics: Bước Đầu Tiên Quan Trọng Để Phát Âm Đúng 34 | 35 | Phonics là phương pháp học tập trung vào âm vị (các âm đơn lẻ) và quy tắc phát âm của từng âm tiết trong tiếng Anh. Đây là một phần quan trọng khi học phát âm, giúp người học hiểu và phát âm chính xác từng từ, từ đó cải thiện khả năng nói và nghe. 36 | 37 | ### Vậy Phonics Là Gì? 38 | 39 | Phonics là phương pháp giảng dạy mối liên hệ giữa các âm và chữ cái. Thông qua việc học Phonics, bạn sẽ: 40 | 41 | - Hiểu cách âm được tạo ra trong từ. 42 | - Biết cách kết hợp các âm để phát âm chính xác một từ. 43 | - Giúp bạn tự tin hơn khi phát âm các từ mới và phức tạp. 44 | 45 | ## 4. Cách Học Phonics Hiệu Quả 46 | 47 | ### Bắt đầu từ các âm cơ bản: 48 | 49 | - Học cách phát âm từng âm đơn lẻ trong bảng chữ cái tiếng Anh. Các âm cơ bản bao gồm nguyên âm và phụ âm. 50 | - Ví dụ, nguyên âm như `a, e, i, o, u` đều có các cách phát âm khác nhau tùy theo vị trí và cách kết hợp trong từ. Bắt đầu bằng cách học cách phát âm từng âm một. 51 | 52 | Bạn có thể tham khảo thêm: [English Vowel Sounds](#) 53 | 54 | ### Học cách kết hợp âm: 55 | 56 | - Sau khi học được các âm cơ bản, bạn cần học cách kết hợp các âm để tạo ra âm tiết. Đây là giai đoạn quan trọng trong Phonics. 57 | - Ví dụ, âm `ch` trong từ “chat” hay âm `th` trong “this” là những âm được tạo ra từ việc kết hợp các phụ âm lại với nhau. 58 | 59 | ### Luyện phát âm các từ đơn giản: 60 | 61 | - Khi đã hiểu cách kết hợp âm, hãy thử luyện tập bằng các từ đơn giản. Bắt đầu bằng việc phát âm từng từ, sau đó mới ghép thành câu. 62 | - Ví dụ, hãy thử luyện tập các từ như: `cat, dog, fish` trước khi chuyển sang những từ khó hơn. 63 | 64 | ### Luyện nghe để cải thiện phát âm: 65 | 66 |
Tips:
67 | 68 | - Khi chọn nghe tiếng Anh, hãy chọn các kênh có giọng đọc chậm rãi, rõ ràng. Không nên chọn các kênh học tiếng Anh nổi tiếng trên YouTube vì các kênh đó chỉ dành cho dân pro. 69 | - Có thể chọn kênh dạy phát âm của người Việt hay người châu Á nói chung, bởi vì cùng khẩu âm nên việc nghe sẽ dễ hơn so với người bản xứ. Một gợi ý hay cho bạn là Cô Bình Tiếng Anh, cô hướng dẫn phát âm, luyện đọc tiếng Anh rất dễ hiểu và thực tế. 70 | - Keywords để tìm kiếm nguồn học tiếng Anh cho người mới bắt đầu: `comprehensible english`, `look and learn english`, `english for kids`. 71 | 72 | 73 | ## 5. Sau Khi Học Phonics Vững Chắc, Chúng Ta Cần Làm Gì Tiếp Theo? 74 | 75 | Sau khi bạn đã xây dựng được nền tảng Phonics vững chắc, việc học tiếng Anh của bạn sẽ dễ dàng hơn nhiều. Tuy nhiên, để tiến xa hơn, bạn cần phải: 76 | 77 | ### Phát Triển Kỹ Năng Nghe 78 | 79 | - Khi đã biết cách phát âm, bạn sẽ bắt đầu nghe hiểu tiếng Anh tốt hơn. Điều này là do bạn đã nhận diện được các âm và từ khi nghe. 80 | - Luyện nghe từ những nguồn phù hợp với trình độ của bạn, chẳng hạn như các chương trình radio hoặc podcast đơn giản. Bắt đầu từ các bài nghe ngắn và dễ hiểu, sau đó dần dần tăng độ khó. 81 | 82 | ### Luyện Tập Nói Theo Từng Câu Đơn Giản 83 | 84 | - Khi đã phát âm đúng từng từ, bạn có thể luyện tập nói thành câu đơn giản. Điều này giúp bạn kết hợp các âm và từ thành một bài nói lưu loát. 85 | - Ví dụ, hãy thử luyện những câu như: 86 | - “What is this?” 87 | - “Can you help me?” 88 | - “Where is the bus stop?” 89 | 90 | ### Tự Tin Khi Nói 91 | 92 | - Khi phát âm chuẩn xác, sự tự tin sẽ theo sau. Bạn sẽ không còn phải sợ mình phát âm không chuẩn hay nói giọng địa phương nữa, thay vào đó bạn sẽ nói tự nhiên và lưu loát hơn. 93 | 94 | ### Tiếp Tục Luyện Tập Hàng Ngày 95 | 96 | - Giống như bất kỳ kỹ năng nào khác, luyện tập hàng ngày là chìa khóa để thành công. Hãy dành ít nhất 15-20 phút mỗi ngày để luyện nghe, nói, và đọc. 97 | 98 | ## 6. Lời Khuyên Cuối Cùng 99 | 100 | Đừng sợ học tiếng Anh! Nếu bạn bắt đầu đúng cách, học từng bước từ phát âm đến luyện tập nghe và nói, chắc chắn bạn sẽ cải thiện đáng kể khả năng tiếng Anh của mình. Học Phonics không chỉ giúp bạn phát âm chuẩn mà còn giúp bạn nghe và nói tự nhiên hơn. Hãy kiên trì và bạn sẽ thấy sự thay đổi rõ rệt trong quá trình học tiếng Anh của mình! 101 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Open English VN Resources 2 | 3 | [![All Contributors](https://img.shields.io/badge/all_contributors-17-orange.svg?style=flat-square)](#contributors-) 4 | 5 | 6 | A curated collection of English learning resources for Vietnamese learners. 7 | 8 | ## Contributors ✨ 9 | 10 | Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 48 | 49 | 50 |
VuongKha
VuongKha

📖
Duc Vo
Duc Vo

🖋
Natural Mess
Natural Mess

🖋
Houston (Bot)
Houston (Bot)

📖
Lupu29
Lupu29

🖋
Holy_Dev
Holy_Dev

💻 📖 💬 👀
vinhsang7410
vinhsang7410

🚇
Le Tat Thanh
Le Tat Thanh

🖋
Nguyễn Huy Hoàng
Nguyễn Huy Hoàng

📖
Xuan Nguyen
Xuan Nguyen

🖋
NgD.Cankkun
NgD.Cankkun

🖋
Trần Đình Giáp
Trần Đình Giáp

🖋
PHAN VAN MINH
PHAN VAN MINH

🖋
Phạm Xuân Hoài
Phạm Xuân Hoài

🖋
Kry
Kry

🖋
Yuran
Yuran

🖋 🎨 🐛
ThangNguyen23
ThangNguyen23

🖋
44 | 45 | Add your contributions 46 | 47 |
51 | 52 | 53 | 54 | 55 | 56 | 57 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! 58 | 59 | ## 🌟 Features 60 | 61 | - 📚 Curated collection of English learning resources 62 | - 🎯 Categorized by skill level and topic 63 | - 🌙 Dark mode support 64 | - 📱 Mobile responsive design 65 | - 🔍 Easy to navigate interface 66 | - 🏛️ **Vietnam History Quiz** – Test your knowledge of Vietnam’s rich history with interactive quizzes! 67 | 68 | ## 🤝 Contributing 69 | ( Video hướng dẫn contributing ) 70 | - Don't know how to contribute? Watch this video: https://youtu.be/ZMb9EHfdgi8 71 | 72 | We welcome contributions from developers who create English learning resources! Here's how you can contribute: 73 | 74 | 1. Fork this repository 75 | 2. Create a new branch for your resource 76 | 3. Add your resource using the template in `src/content/resources/_template.json` 77 | 4. Submit a pull request 78 | 79 | For detailed guidelines, please see our [Contributing Guide](CONTRIBUTING.md). 80 | 81 | ## 📖 Categories 82 | 83 | - Letters and Sounds 84 | - Punctuation 85 | - Words and Spelling 86 | - Learning to Read 87 | - Writing 88 | - Stories 89 | - Grammar 90 | - Speaking 91 | - Listening 92 | - Reading 93 | - Vocabulary 94 | - IELTS 95 | - TOEFL 96 | - General 97 | 98 | ## 🚀 Getting Started 99 | 100 | 1. Clone the repository 101 | 2. Install dependencies: `npm install` 102 | 3. Start the development server: `npm run dev` 103 | 4. Open [http://localhost:4321/open-english-vn/](http://localhost:4321/open-english-vn/) in your browser 104 | 105 | For Docker-compose: Run command `docker-compose up --build` 106 | 107 | ## 📝 License 108 | 109 | MIT License - feel free to use this project for your own learning resources! 110 | 111 | ## 🛠️ Built With 112 | 113 | - [Astro](https://astro.build) - The web framework for content-driven websites 114 | - [TailwindCSS](https://tailwindcss.com) - A utility-first CSS framework 115 | - [TypeScript](https://www.typescriptlang.org) - JavaScript with syntax for types 116 | 117 | ## 🙏 Acknowledgments 118 | 119 | - Thanks to all contributors who have helped shape this project 120 | - Inspired by various resource collections in the web development community 121 | 122 | 123 | ## 📫 Contact 124 | 125 | Gian Nguyen - [@giannguyen](https://twitter.com/giannguyen) - giannguyen@example.com 126 | 127 | Project Link: [https://github.com/Gianguyen1234/open-english-vn](https://github.com/Gianguyen1234/open-english-vn) 128 | Live Site: [https://gianguyen1234.github.io/open-english-vn/](https://gianguyen1234.github.io/open-english-vn/) 129 | -------------------------------------------------------------------------------- /src/pages/quiz/[id].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from '../../layouts/Layout.astro'; 3 | import { getCollection } from 'astro:content'; 4 | 5 | export const getStaticPaths = async () => { 6 | const quizzes = await getCollection('quiz'); 7 | return quizzes.map((quiz) => ({ 8 | params: { id: quiz.id }, 9 | })); 10 | }; 11 | const base = import.meta.env.BASE_URL; 12 | 13 | const { id } = Astro.params; 14 | const quizzes = await getCollection('quiz'); 15 | const quiz = quizzes.find(q => q.id === id); 16 | 17 | if (!quiz) { 18 | throw new Error(`Quiz not found: ${id}`); 19 | } 20 | 21 | const quizJson = JSON.stringify(quiz.data.questions); 22 | --- 23 | 24 | 25 |
26 |
27 | 28 | 29 | 30 | 31 | Back to Quiz List 32 | 33 | 34 |
35 |

{quiz.data.title}

36 |

{quiz.data.description || "Test your knowledge!"}

37 |
38 | 39 |
42 | 43 | 44 |
45 |
46 | 47 | 48 |
49 |
50 |
52 |
53 |
54 | 55 | 56 | 81 | 82 |
83 | 112 |
113 | 114 |
115 |
116 | Score: / 117 | (%) 118 |
119 | 120 |
121 | 128 | 129 | 136 | 137 | 143 |
144 |
145 |
146 |
147 |
148 |
149 | 150 | 225 | 226 | 227 | -------------------------------------------------------------------------------- /src/components/Navbar.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import icon from "astro-icon"; 3 | // import { QuizIcon } from '../assets/icons/quiz-icon.svg'; // Go up two levels from /src/components 4 | const base = import.meta.env.BASE_URL; 5 | --- 6 | 7 | 283 | 284 | 336 | -------------------------------------------------------------------------------- /src/pages/resources.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from '../layouts/Layout.astro'; 3 | import { getCollection } from 'astro:content'; 4 | import { Image } from 'astro:assets'; 5 | 6 | interface Resource { 7 | data: { 8 | title: string; 9 | description: string; 10 | url: string; 11 | image?: string; 12 | category: string; 13 | tags: string[]; 14 | free: boolean; 15 | }; 16 | } 17 | 18 | const resources = await getCollection('resources'); 19 | 20 | // Group resources by category 21 | const groupedResources: Record = resources.reduce((acc, resource) => { 22 | const category = resource.data.category || 'Other'; 23 | if (!acc[category]) acc[category] = []; 24 | acc[category].push(resource); 25 | return acc; 26 | }, {} as Record); 27 | 28 | // Get unique tags and categories 29 | const allTags = [...new Set(resources.flatMap((resource) => resource.data.tags))]; 30 | const allCategories = [...new Set(resources.map((resource) => resource.data.category))]; 31 | 32 | // Get the base URL from environment 33 | const baseUrl = import.meta.env.BASE_URL; 34 | --- 35 | 36 | 37 |
38 |
39 |

40 | Global English Learning Resources 41 |

42 |
43 |

44 | Explore our curated collection of English learning resources, carefully organized by category to help you master every aspect of the English language. 45 |

46 |
47 |
48 |

Foundation Skills

49 |
    50 |
  • Letters and Sounds - Master phonics and pronunciation
  • 51 |
  • Words and Spelling - Build your vocabulary
  • 52 |
  • Punctuation - Learn proper writing mechanics
  • 53 |
54 |
55 |
56 |

Core Skills

57 |
    58 |
  • Reading - Improve comprehension
  • 59 |
  • Writing - Develop composition skills
  • 60 |
  • Speaking - Enhance verbal communication
  • 61 |
  • Listening - Strengthen audio comprehension
  • 62 |
63 |
64 |
65 |

Advanced Learning

66 |
    67 |
  • Grammar - Perfect your language structure
  • 68 |
  • IELTS/TOEFL - Prepare for exams
  • 69 |
  • Stories - Practice through literature
  • 70 |
71 |
72 |
73 |
74 |
75 | 76 | 77 |
78 | 79 |
80 | 86 |
87 | 88 | 89 |
90 |

Categories

91 |
92 | 98 | {allCategories.map((category) => ( 99 | 105 | ))} 106 |
107 |
108 | 109 | 110 |
111 |

Tags

112 |
113 | {allTags.map((tag) => ( 114 | 120 | ))} 121 |
122 |
123 |
124 | 125 | 126 |
127 | {Object.entries(groupedResources).map(([category, items]) => ( 128 |
129 |
130 |

{category}

131 |
132 |
133 |
134 | {items.map((resource) => ( 135 |
136 |
137 |
138 |
139 | {resource.data.title} 146 |
147 |

148 | {resource.data.title} 149 |

150 |

151 | {resource.data.description} 152 |

153 |
154 | {resource.data.description} 155 |
156 |
157 |
158 |
159 | {resource.data.tags?.map((tag) => ( 160 | 161 | {tag} 162 | 163 | ))} 164 |
165 |
166 | 172 | Visit Resource 173 | 174 | {resource.data.free && ( 175 | 176 | Free 177 | 178 | )} 179 |
180 |
181 |
182 |
183 | ))} 184 |
185 |
186 |
187 | ))} 188 |
189 |
190 | 191 | 285 | 286 | 335 |
-------------------------------------------------------------------------------- /src/pages/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from '../layouts/Layout.astro'; 3 | import { getCollection } from 'astro:content'; 4 | 5 | interface Skill { 6 | name: string; 7 | completed?: boolean; 8 | } 9 | 10 | interface DetailedSkill { 11 | name: string; 12 | description: string; 13 | examples: string[]; 14 | resources: string[]; 15 | tips: string[]; 16 | } 17 | 18 | interface Step { 19 | title: string; 20 | description: string; 21 | skills: string[]; 22 | duration: string; 23 | sequence: number; 24 | dependencies: string[]; 25 | detailedSkills: DetailedSkill[]; 26 | } 27 | 28 | interface LevelStep { 29 | level: string; 30 | color: string; 31 | description: string; 32 | steps: Step[]; 33 | } 34 | 35 | // Get all resources and make them available to the client 36 | const resources = await getCollection('resources'); 37 | 38 | // Initialize roadmap data 39 | const roadmapSteps: LevelStep[] = [ 40 | { 41 | level: "Foundation", 42 | color: "emerald", 43 | description: "Build your English foundation with essential skills", 44 | steps: [ 45 | { 46 | title: "Pronunciation & Listening", 47 | description: "Master English sounds and basic listening", 48 | skills: [ 49 | "IPA & Phonics", 50 | "Word stress & rhythm", 51 | "Connected speech", 52 | "Basic listening comprehension" 53 | ], 54 | duration: "2-3 months", 55 | sequence: 1, 56 | dependencies: [], 57 | detailedSkills: [ 58 | { 59 | name: "IPA & Phonics", 60 | description: "Learn the International Phonetic Alphabet and basic sound patterns", 61 | examples: [ 62 | "Vowel sounds: /æ/ (cat), /ə/ (about)", 63 | "Consonant sounds: /θ/ (think), /ð/ (this)", 64 | "Sound combinations: /tr/, /dr/, /st/" 65 | ], 66 | resources: ["Balloon Phonics", "Starfall's ABCs"], 67 | tips: [ 68 | "Practice each sound in isolation first", 69 | "Record yourself and compare with native speakers", 70 | "Focus on sounds that don't exist in Vietnamese" 71 | ] 72 | }, 73 | { 74 | name: "Word stress & rhythm", 75 | description: "Master the natural stress patterns of English words and sentences", 76 | examples: [ 77 | "Two-syllable words: PREsent (n) vs preSENT (v)", 78 | "Sentence stress: I WANT to GO to the STORE", 79 | "Rhythm patterns in questions" 80 | ], 81 | resources: ["BBC Learning English"], 82 | tips: [ 83 | "Clap or tap the rhythm while speaking", 84 | "Listen to English songs and poetry", 85 | "Practice with tongue twisters" 86 | ] 87 | }, 88 | // ... other detailed skills ... 89 | ] 90 | }, 91 | { 92 | title: "Core Vocabulary", 93 | description: "Learn essential words for daily life", 94 | skills: [ 95 | "500 most common words", 96 | "Basic phrases & expressions", 97 | "Numbers & time", 98 | "Daily life vocabulary" 99 | ], 100 | duration: "2-3 months", 101 | sequence: 2, 102 | dependencies: ["Pronunciation & Listening"], 103 | detailedSkills: [ 104 | { 105 | name: "500 most common words", 106 | description: "Master the most frequently used English words", 107 | examples: [ 108 | "Basic verbs: be, have, do, go", 109 | "Common nouns: house, food, time", 110 | "Essential adjectives: good, bad, big, small" 111 | ], 112 | resources: ["BBC Learning English"], 113 | tips: [ 114 | "Learn words in context", 115 | "Use flashcards for practice", 116 | "Focus on high-frequency words first" 117 | ] 118 | }, 119 | { 120 | name: "Basic phrases & expressions", 121 | description: "Learn everyday expressions and common phrases", 122 | examples: [ 123 | "Excuse me, could you help me?", 124 | "I'd like to...", 125 | "How do you say... in English?" 126 | ], 127 | resources: ["BBC Learning English"], 128 | tips: [ 129 | "Practice in real situations", 130 | "Learn phrases as complete units", 131 | "Focus on natural pronunciation" 132 | ] 133 | } 134 | ] 135 | }, 136 | { 137 | title: "Basic Grammar", 138 | description: "Learn fundamental sentence patterns", 139 | skills: [ 140 | "Subject-verb-object", 141 | "Present & past tenses", 142 | "Basic questions", 143 | "Common prepositions" 144 | ], 145 | duration: "3-4 months", 146 | sequence: 3, 147 | dependencies: ["Core Vocabulary"], 148 | detailedSkills: [ 149 | { 150 | name: "Subject-verb-object", 151 | description: "Master basic English sentence structure", 152 | examples: [ 153 | "I eat breakfast", 154 | "She reads books", 155 | "They play football" 156 | ], 157 | resources: ["BBC Learning English"], 158 | tips: [ 159 | "Start with simple sentences", 160 | "Practice with different subjects", 161 | "Learn common verb forms" 162 | ] 163 | } 164 | ] 165 | } 166 | ] 167 | }, 168 | { 169 | level: "Practical Skills", 170 | color: "indigo", 171 | description: "Develop practical communication abilities", 172 | steps: [ 173 | { 174 | title: "Daily Communication", 175 | description: "Handle everyday conversations confidently", 176 | skills: [ 177 | "Small talk & greetings", 178 | "Shopping & dining out", 179 | "Giving directions", 180 | "Making appointments" 181 | ], 182 | duration: "3-4 months", 183 | sequence: 1, 184 | dependencies: [], 185 | detailedSkills: [ 186 | { 187 | name: "Small talk & greetings", 188 | description: "Master common conversation starters and greetings", 189 | examples: [ 190 | "How's it going?", 191 | "Nice weather today, isn't it?", 192 | "Have a great weekend!" 193 | ], 194 | resources: ["BBC Learning English"], 195 | tips: [ 196 | "Practice with different situations", 197 | "Learn cultural differences in greetings", 198 | "Use appropriate formality levels" 199 | ] 200 | }, 201 | // ... add similar detailed skills for other skills in this step 202 | ] 203 | }, 204 | { 205 | title: "Intermediate Grammar", 206 | description: "Express more complex ideas", 207 | skills: [ 208 | "Perfect tenses", 209 | "Modal verbs", 210 | "Conditionals (0,1,2)", 211 | "Relative clauses" 212 | ], 213 | duration: "4-5 months", 214 | sequence: 2, 215 | dependencies: ["Daily Communication"], 216 | detailedSkills: [ 217 | { 218 | name: "Perfect tenses", 219 | description: "Master present perfect, past perfect, and future perfect tenses", 220 | examples: [ 221 | "I have lived here for 5 years", 222 | "She had finished before I arrived", 223 | "They will have completed it by then" 224 | ], 225 | resources: ["BBC Learning English"], 226 | tips: [ 227 | "Learn the time expressions", 228 | "Practice with real-life situations", 229 | "Compare with simple tenses" 230 | ] 231 | } 232 | ] 233 | }, 234 | { 235 | title: "Essential Writing", 236 | description: "Write clear messages and texts", 237 | skills: [ 238 | "Emails & messages", 239 | "Social media posts", 240 | "Short stories", 241 | "Personal blog posts" 242 | ], 243 | duration: "3-4 months", 244 | sequence: 3, 245 | dependencies: ["Intermediate Grammar"], 246 | detailedSkills: [ 247 | { 248 | name: "Emails & messages", 249 | description: "Write effective professional and personal emails", 250 | examples: [ 251 | "Formal business emails", 252 | "Casual friend messages", 253 | "Meeting arrangements" 254 | ], 255 | resources: ["BBC Learning English"], 256 | tips: [ 257 | "Use proper email format", 258 | "Learn common phrases", 259 | "Practice different styles" 260 | ] 261 | } 262 | ] 263 | } 264 | ] 265 | }, 266 | { 267 | level: "Advanced Skills", 268 | color: "rose", 269 | description: "Master advanced English for academic and professional success", 270 | steps: [ 271 | { 272 | title: "Test Preparation", 273 | description: "Prepare for international exams", 274 | skills: [ 275 | "IELTS strategies (6.5+)", 276 | "TOEFL techniques", 277 | "Academic vocabulary", 278 | "Test-taking skills" 279 | ], 280 | duration: "4-6 months", 281 | sequence: 1, 282 | dependencies: [], 283 | detailedSkills: [ 284 | { 285 | name: "IELTS strategies (6.5+)", 286 | description: "Master strategies for achieving a high IELTS score", 287 | examples: [ 288 | "Time management techniques", 289 | "Question types analysis", 290 | "Writing task structures" 291 | ], 292 | resources: ["IELTS Fighter"], 293 | tips: [ 294 | "Practice with official materials", 295 | "Focus on weak areas", 296 | "Take mock tests regularly" 297 | ] 298 | } 299 | ] 300 | }, 301 | { 302 | title: "Business English", 303 | description: "Succeed in professional environments", 304 | skills: [ 305 | "Meeting participation", 306 | "Business writing", 307 | "Presentations", 308 | "Negotiations" 309 | ], 310 | duration: "4-5 months", 311 | sequence: 2, 312 | dependencies: ["Test Preparation"], 313 | detailedSkills: [ 314 | { 315 | name: "Meeting participation", 316 | description: "Learn to effectively participate in business meetings", 317 | examples: [ 318 | "Expressing opinions professionally", 319 | "Making suggestions", 320 | "Agreeing and disagreeing politely" 321 | ], 322 | resources: ["BBC Learning English"], 323 | tips: [ 324 | "Learn meeting vocabulary", 325 | "Practice active listening", 326 | "Use appropriate formality" 327 | ] 328 | } 329 | ] 330 | }, 331 | { 332 | title: "Native-Like Fluency", 333 | description: "Achieve natural English communication", 334 | skills: [ 335 | "Idiomatic expressions", 336 | "Cultural references", 337 | "Accent reduction", 338 | "Natural conversation" 339 | ], 340 | duration: "Ongoing", 341 | sequence: 3, 342 | dependencies: ["Business English"], 343 | detailedSkills: [ 344 | { 345 | name: "Idiomatic expressions", 346 | description: "Master common English idioms and expressions", 347 | examples: [ 348 | "It's raining cats and dogs", 349 | "Break a leg", 350 | "Hit the books" 351 | ], 352 | resources: ["BBC Learning English"], 353 | tips: [ 354 | "Learn expressions in context", 355 | "Practice with native speakers", 356 | "Watch English movies and TV shows" 357 | ] 358 | } 359 | ] 360 | } 361 | ] 362 | } 363 | ]; 364 | 365 | // Add progress tracking 366 | const storedProgress = typeof localStorage !== 'undefined' ? localStorage.getItem('learningProgress') : null; 367 | const initialProgress: Record = storedProgress ? JSON.parse(storedProgress) : {}; 368 | --- 369 | 370 | 371 |
372 |
373 |

374 | Master English Step by Step 375 |

376 |

377 | A comprehensive roadmap designed specifically for Vietnamese learners to achieve English fluency 378 |

379 |
380 | 381 | 382 |
383 | {roadmapSteps.map((level) => ( 384 |
385 |
386 |

387 | {level.level} 388 |

389 | 390 | 0% 391 | 392 |
393 |
394 |
395 |
396 |
397 | ))} 398 |
399 | 400 | 401 |
402 |

Suggested Learning Path

403 |

404 | Follow this recommended order to maximize your learning efficiency. Each step builds upon previous knowledge. 405 |

406 |
407 | {roadmapSteps.map((level) => ( 408 |
409 |

410 | {level.level} 411 |

412 |
    413 | {level.steps.map((step) => ( 414 |
  1. 415 | 416 | {step.sequence} 417 | 418 |
    419 |

    {step.title}

    420 | {step.dependencies.length > 0 && ( 421 |

    422 | Prerequisites: {step.dependencies.join(", ")} 423 |

    424 | )} 425 |
    426 |
  2. 427 | ))} 428 |
429 |
430 | ))} 431 |
432 |
433 | 434 |
435 | {roadmapSteps.map((level, levelIndex) => ( 436 |
437 | {levelIndex > 0 && ( 438 |
439 | )} 440 |
441 |
442 |
443 | {level.level} 444 |
445 |
446 |

{level.level}

447 |

{level.description}

448 |
449 |
450 |
451 | {level.steps.map((step, stepIndex) => ( 452 |
457 |
458 |
459 | 460 | {step.sequence} 461 | 462 |

{step.title}

463 |
464 | 465 | {step.duration} 466 | 467 |
468 |

{step.description}

469 | {step.dependencies.length > 0 && ( 470 |
471 | Prerequisites: {step.dependencies.join(", ")} 472 |
473 | )} 474 |
    475 | {step.skills.map((skill) => ( 476 |
  • 477 |
    478 | 479 | 480 | 481 | {skill} 482 |
    483 | 489 |
  • 490 | ))} 491 |
492 | 493 | 494 | 565 |
566 | ))} 567 |
568 |
569 |
570 | ))} 571 |
572 | 573 | 584 |
585 |
586 | 587 | 588 | 744 | 745 | 823 | --------------------------------------------------------------------------------