{"id":12864,"date":"2025-07-15T15:48:38","date_gmt":"2025-07-15T07:48:38","guid":{"rendered":"https:\/\/tiffanysmandarin.com\/?p=12864"},"modified":"2026-08-31T14:25:51","modified_gmt":"2026-08-31T06:25:51","slug":"contemporary-chinese-vocabulary-practice-b1l2","status":"publish","type":"post","link":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/","title":{"rendered":"B1 L2 Vocabulary and Practice"},"content":{"rendered":"\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:33px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<!--\n  \u7576\u4ee3\u4e2d\u6587 Book 1 \u00b7 Lesson 2 \u300c\u6211\u7684\u5bb6\u4eba\u300d My Family \u2014 Vocabulary Embed\n  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  Paste this whole block into a WordPress \"Custom HTML\" block.\n  Same technical pattern as dangdai-b1l1-vocab-embed.html \u2014 see that file's\n  comment for the fuller rationale. Key points repeated here:\n    - No <!DOCTYPE>\/<html>\/<head>\/<body>, no page-level toggle UI (site's own\n      Text Display \/ Pinyin Display toggle covers that); no external Quizlet\n      embed on the page \u2014 flashcard deck (07) + Match It game (08) below\n      replace it entirely\n    - CSS scoped under .dangdai-b1l2-vocab-embed with its own --db2-*\n      variables, same oxblood\/mustard\/sage\/bone palette as the L1 page\n    - Ruby: <ruby class=\"lang-zh-TW\">...<\/ruby><ruby class=\"lang-zh-CN\">...<\/ruby>\n      written consecutively; every example\/dialogue sentence is segmented\n      WORD BY WORD into its own ruby+pinyin chunk, punctuation is plain text\n    - Root lookup by id (#dangdai-b1l2-vocab-embed-1), not currentScript\n    - Speaker buttons: inline SVG play-triangle icon, flex-locked to a true\n      circle (flex:0 0 26px; padding:0), data-trad\/data-simp + one\n      delegated click listener\n    - W(t,s,p) = shared pinyin; WD(t,s,pt,ps) = genuinely different TW\/CN\n      pinyin (neutral-tone words) \u2014 reused here for \u559c\u6b61\/\u559c\u6b22 (x\u01d0hu\u0101n\/x\u01d0huan),\n      carried over from Lesson 1 vocab that resurfaces in this lesson's\n      examples. None of this lesson's OWN new words need WD (checked: \u7238\u7238,\n      \u5abd\u5abd\/\u5988\u5988, \u54e5\u54e5, \u59d0\u59d0, \u5f1f\u5f1f, \u59b9\u59b9 all keep the same pinyin in both\n      regions \u2014 only the hanzi form differs for \u5abd\u5abd\/\u5988\u5988)\n    - Several headwords have genuinely different trad\/simp CHARACTERS, not\n      just font style, verified individually: \u500b\/\u4e2a, \u5169\/\u4e24, \u8ab0\/\u8c01, \u9019\/\u8fd9,\n      \u5f35\/\u5f20, \u807d\/\u542c, \u5e7e\/\u51e0, \u9031\u672b\/\u5468\u672b, \u5abd\u5abd\/\u5988\u5988, \u9ad8\u8208\/\u9ad8\u5174, \u904b\u52d5\/\u8fd0\u52a8,\n      \u97f3\u6a02\/\u97f3\u4e50, \u66f8\/\u4e66 \u2014 double-checked each before writing, since silently\n      reusing the traditional form for both sides is a very easy mistake\n    - Traditional\/Simplified conversion: every piece of Chinese text uses the\n      site's own shared `lang-zh-TW` \/ `lang-zh-CN` classes, so the site's\n      existing cookie-driven, hyperscript-powered Text Display toggle\n      shows\/hides them automatically \u2014 including content this script injects\n      after page load. No separate cookie-reading JS is added here (an\n      earlier draft added one; it was removed once testing showed the site's\n      own toggle already reaches dynamically-injected elements, and a second,\n      guessed-cookie-name implementation only risked conflicting with it)\n    - Because the site's toggle script reaches into every lang-zh-TW\/\n      lang-zh-CN element it finds (including <ruby>\/<rt> here) and can zero\n      out font-size or force text color, `ruby`\/`.rb`\/`rt` all get their\n      color and font-size pinned with `!important`\n    - No literal `&&` appears inside the <script> tag (WordPress's content\n      filter can mangle it into `&#038;&#038;` and break the script) \u2014 every\n      spot that needs two chained conditions uses nested `if` blocks instead\n    - Top-of-page support note + a disclaimer above the invented practice\n      dialogue (both first person, \"I\"), same as Lesson 1\n-->\n<div class=\"dangdai-b1l2-vocab-embed\" id=\"dangdai-b1l2-vocab-embed-1\">\n<style>\n.dangdai-b1l2-vocab-embed {\n  --db2-oxblood: #7b2d26;\n  --db2-oxblood-dark: #5e211c;\n  --db2-mustard: #c9922b;\n  --db2-sage: #7c8b6f;\n  --db2-bone: #f7f1e6;\n  --db2-ink: #2c2620;\n  --db2-line: #e4d9c4;\n  font-family: 'Work Sans', -apple-system, sans-serif;\n  color: var(--db2-ink);\n  background: #fff;\n  max-width: 760px;\n  margin: 0 auto;\n  padding: 8px 4px 24px;\n  line-height: 1.6;\n}\n.dangdai-b1l2-vocab-embed * { box-sizing: border-box; }\n.dangdai-b1l2-vocab-embed h1,\n.dangdai-b1l2-vocab-embed h2,\n.dangdai-b1l2-vocab-embed h3 {\n  font-family: 'Bitter', Georgia, serif;\n  color: var(--db2-oxblood-dark);\n  margin: 0 0 8px;\n}\n.dangdai-b1l2-vocab-embed .db2-support-note {\n  font-size: 0.85rem;\n  color: var(--db2-sage);\n  border-bottom: 1px solid var(--db2-line);\n  padding-bottom: 12px;\n  margin: 0 0 16px;\n}\n.dangdai-b1l2-vocab-embed .db2-lede {\n  margin: 0 0 24px;\n  padding: 14px 16px;\n  background: var(--db2-bone);\n  border-left: 4px solid var(--db2-mustard);\n  border-radius: 4px;\n  font-size: 0.98rem;\n}\n.dangdai-b1l2-vocab-embed .db2-lede b { color: var(--db2-oxblood-dark); }\n.dangdai-b1l2-vocab-embed .db2-sec-eyebrow {\n  display: inline-block;\n  font-family: 'IBM Plex Mono', monospace;\n  font-size: 0.75rem;\n  letter-spacing: 0.08em;\n  color: #fff;\n  background: var(--db2-oxblood);\n  padding: 3px 9px;\n  border-radius: 3px;\n  margin: 32px 0 10px;\n}\n.dangdai-b1l2-vocab-embed .db2-word-card {\n  border: 1px solid var(--db2-line);\n  border-radius: 8px;\n  padding: 12px 14px;\n  margin-bottom: 10px;\n  background: #fff;\n}\n.dangdai-b1l2-vocab-embed .db2-word-top {\n  display: flex;\n  align-items: baseline;\n  gap: 10px;\n  flex-wrap: wrap;\n}\n.dangdai-b1l2-vocab-embed .db2-num {\n  font-family: 'IBM Plex Mono', monospace;\n  font-size: 0.75rem;\n  color: var(--db2-mustard);\n  min-width: 22px;\n}\n.dangdai-b1l2-vocab-embed .db2-hanzi { font-size: 1.35rem; font-weight: 600; }\n.dangdai-b1l2-vocab-embed ruby {\n  ruby-position: over;\n  margin-right: 2px;\n  color: var(--db2-ink) !important;\n  font-size: inherit !important;\n}\n.dangdai-b1l2-vocab-embed .rb {\n  color: var(--db2-ink) !important;\n  font-size: inherit !important;\n}\n.dangdai-b1l2-vocab-embed rt {\n  font-family: 'IBM Plex Mono', monospace;\n  font-size: 0.6rem !important;\n  color: var(--db2-sage) !important;\n  font-weight: 400;\n}\n.dangdai-b1l2-vocab-embed rt.hidden { display: none; }\n.dangdai-b1l2-vocab-embed rt.mouseover { opacity: 0; }\n.dangdai-b1l2-vocab-embed rt.mouseover:hover { opacity: 1; }\n.dangdai-b1l2-vocab-embed .db2-meaning { font-style: italic; color: #6b5f52; font-size: 0.92rem; }\n.dangdai-b1l2-vocab-embed .db2-speaker {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  flex: 0 0 26px;\n  width: 26px;\n  height: 26px;\n  padding: 0;\n  border: none;\n  background: var(--db2-bone);\n  color: var(--db2-oxblood);\n  border-radius: 50%;\n  cursor: pointer;\n  margin-left: auto;\n}\n.dangdai-b1l2-vocab-embed .db2-speaker:hover { background: var(--db2-mustard); color: #fff; }\n.dangdai-b1l2-vocab-embed .db2-example {\n  margin-top: 8px;\n  padding-top: 8px;\n  border-top: 1px dashed var(--db2-line);\n  font-size: 0.95rem;\n}\n.dangdai-b1l2-vocab-embed .db2-example .db2-sent-word { display: inline-flex; }\n.dangdai-b1l2-vocab-embed .db2-example .db2-punct { margin-right: 2px; }\n.dangdai-b1l2-vocab-embed .db2-example .db2-en {\n  display: block;\n  color: #6b5f52;\n  font-size: 0.85rem;\n  margin-top: 4px;\n}\n.dangdai-b1l2-vocab-embed .db2-dialogue-note { font-size: 0.85rem; color: #6b5f52; margin: 0 0 10px; }\n.dangdai-b1l2-vocab-embed .db2-dialogue {\n  background: var(--db2-bone);\n  border-radius: 8px;\n  padding: 16px 18px;\n  margin-top: 8px;\n}\n.dangdai-b1l2-vocab-embed .db2-line {\n  display: flex;\n  gap: 8px;\n  margin-bottom: 12px;\n  align-items: flex-start;\n  flex-wrap: wrap;\n}\n.dangdai-b1l2-vocab-embed .db2-speaker-tag {\n  font-family: 'IBM Plex Mono', monospace;\n  font-size: 0.72rem;\n  color: var(--db2-oxblood);\n  min-width: 46px;\n  padding-top: 3px;\n}\n.dangdai-b1l2-vocab-embed .db2-line-body { flex: 1; min-width: 200px; }\n.dangdai-b1l2-vocab-embed .db2-line-en { display: block; color: #6b5f52; font-size: 0.82rem; margin-top: 2px; }\n\n.dangdai-b1l2-vocab-embed .db2-fc-hint { font-size: 0.85rem; color: #6b5f52; margin: 0 0 12px; text-align: center; }\n.dangdai-b1l2-vocab-embed .db2-flashcard-wrap { max-width: 320px; margin: 0 auto 14px; perspective: 1200px; }\n.dangdai-b1l2-vocab-embed .db2-flashcard {\n  position: relative;\n  width: 100%;\n  height: 230px;\n  cursor: pointer;\n  transform-style: preserve-3d;\n  transition: transform 0.5s;\n}\n.dangdai-b1l2-vocab-embed .db2-flashcard.db2-flipped { transform: rotateY(180deg); }\n.dangdai-b1l2-vocab-embed .db2-fc-face {\n  position: absolute;\n  inset: 0;\n  backface-visibility: hidden;\n  border: 1px solid var(--db2-line);\n  border-radius: 12px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: 16px;\n  background: #fff;\n  text-align: center;\n}\n.dangdai-b1l2-vocab-embed .db2-fc-back { transform: rotateY(180deg); background: var(--db2-bone); }\n.dangdai-b1l2-vocab-embed .db2-fc-front .db2-hanzi { font-size: 4rem !important; }\n.dangdai-b1l2-vocab-embed .db2-flashcard-wrap rt { font-size: 1.2rem !important; }\n.dangdai-b1l2-vocab-embed .db2-fc-back .db2-meaning { font-style: italic; color: var(--db2-oxblood-dark); font-size: 1.725rem; }\n.dangdai-b1l2-vocab-embed .db2-flashcard-controls { display: flex; align-items: center; justify-content: center; gap: 14px; margin-bottom: 28px; }\n.dangdai-b1l2-vocab-embed .db2-game-btn {\n  font-family: 'Work Sans', sans-serif;\n  font-size: 0.85rem;\n  border: 1px solid var(--db2-oxblood);\n  color: var(--db2-oxblood);\n  background: #fff;\n  padding: 6px 14px;\n  border-radius: 20px;\n  cursor: pointer;\n}\n.dangdai-b1l2-vocab-embed .db2-game-btn:hover { background: var(--db2-oxblood); color: #fff; }\n.dangdai-b1l2-vocab-embed .db2-game-bar { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; flex-wrap: wrap; }\n.dangdai-b1l2-vocab-embed .db2-game-status { font-family: 'IBM Plex Mono', monospace; font-size: 0.82rem; color: var(--db2-sage); }\n.dangdai-b1l2-vocab-embed .db2-game-board { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }\n.dangdai-b1l2-vocab-embed .db2-game-col { display: flex; flex-direction: column; gap: 8px; }\n.dangdai-b1l2-vocab-embed .db2-tile {\n  font-family: 'Work Sans', sans-serif;\n  text-align: left;\n  border: 1px solid var(--db2-line);\n  background: #fff;\n  border-radius: 6px;\n  padding: 10px 12px;\n  cursor: pointer;\n  font-size: 0.95rem;\n  color: var(--db2-ink);\n  transition: background 0.15s, border-color 0.15s, transform 0.1s;\n}\n.dangdai-b1l2-vocab-embed .db2-tile .db2-tile-py {\n  display: block;\n  font-family: 'IBM Plex Mono', monospace;\n  font-size: 0.7rem;\n  color: var(--db2-sage);\n  margin-top: 2px;\n}\n.dangdai-b1l2-vocab-embed .db2-tile:hover:not(.db2-matched):not(.db2-selected) { border-color: var(--db2-mustard); }\n.dangdai-b1l2-vocab-embed .db2-tile.db2-selected { border-color: var(--db2-oxblood); background: var(--db2-bone); }\n.dangdai-b1l2-vocab-embed .db2-tile.db2-matched { border-color: var(--db2-sage); background: #eef2e9; color: var(--db2-sage); cursor: default; }\n.dangdai-b1l2-vocab-embed .db2-tile.db2-wrong { border-color: #b5453d; background: #fbeceb; animation: db2-shake 0.3s; }\n@keyframes db2-shake { 0%, 100% { transform: translateX(0); } 25% { transform: translateX(-4px); } 75% { transform: translateX(4px); } }\n.dangdai-b1l2-vocab-embed .db2-game-win { text-align: center; padding: 14px; font-family: 'Bitter', serif; color: var(--db2-oxblood-dark); display: none; }\n.dangdai-b1l2-vocab-embed .db2-game-win.db2-show { display: block; }\n@media (max-width: 480px) { .dangdai-b1l2-vocab-embed .db2-game-board { grid-template-columns: 1fr; } }\n.dangdai-b1l2-vocab-embed .db2-quiz { background: #fff; border: 1px solid var(--db2-line); border-radius: 12px; padding: 20px 22px; margin-top: 8px; }\n.dangdai-b1l2-vocab-embed .db2-quiz-progress { font-size: 0.82rem; color: var(--db2-sage); margin: 0 0 10px; font-family: 'IBM Plex Mono', monospace; }\n.dangdai-b1l2-vocab-embed .db2-quiz-prompt { font-size: 1.1rem; margin: 0 0 14px; }\n.dangdai-b1l2-vocab-embed .db2-quiz-options { display: flex; flex-direction: column; gap: 8px; margin: 0 0 10px; }\n.dangdai-b1l2-vocab-embed .db2-quiz-opt { text-align: left; border: 1px solid var(--db2-line); background: var(--db2-bone); border-radius: 8px; padding: 10px 14px; cursor: pointer; font-size: 0.98rem; color: var(--db2-ink); }\n.dangdai-b1l2-vocab-embed .db2-quiz-opt:hover { background: #f0e6d2; }\n.dangdai-b1l2-vocab-embed .db2-quiz-opt.correct { background: #e3efdd; border-color: #7fae6d; color: #3d5c34; }\n.dangdai-b1l2-vocab-embed .db2-quiz-opt.incorrect { background: #f5e0dc; border-color: var(--db2-oxblood); color: var(--db2-oxblood-dark); }\n.dangdai-b1l2-vocab-embed .db2-quiz-opt[disabled] { cursor: default; }\n.dangdai-b1l2-vocab-embed .db2-quiz-input-row { display: flex; gap: 8px; margin: 0 0 10px; flex-wrap: wrap; }\n.dangdai-b1l2-vocab-embed .db2-quiz-input { flex: 1 1 200px; border: 1px solid var(--db2-line); border-radius: 8px; padding: 9px 12px; font-size: 0.98rem; }\n.dangdai-b1l2-vocab-embed .db2-quiz-submit, .dangdai-b1l2-vocab-embed .db2-quiz-next, .dangdai-b1l2-vocab-embed .db2-quiz-retake { border: none; background: var(--db2-oxblood); color: #fff; border-radius: 20px; padding: 8px 18px; font-size: 0.9rem; cursor: pointer; }\n.dangdai-b1l2-vocab-embed .db2-quiz-submit:hover, .dangdai-b1l2-vocab-embed .db2-quiz-next:hover, .dangdai-b1l2-vocab-embed .db2-quiz-retake:hover { background: var(--db2-oxblood-dark); }\n.dangdai-b1l2-vocab-embed .db2-quiz-feedback { font-size: 0.95rem; margin: 0 0 10px; min-height: 1.4em; }\n.dangdai-b1l2-vocab-embed .db2-quiz-feedback.correct { color: #3d5c34; }\n.dangdai-b1l2-vocab-embed .db2-quiz-feedback.incorrect { color: var(--db2-oxblood-dark); }\n.dangdai-b1l2-vocab-embed .db2-quiz-score { text-align: center; }\n.dangdai-b1l2-vocab-embed .db2-quiz-score .db2-quiz-score-num { font-size: 2.2rem; font-weight: 700; color: var(--db2-oxblood-dark); display: block; margin-bottom: 8px; font-family: 'Bitter', serif; }\n<\/style>\n\n<p class=\"db2-support-note\"><em>A note before you start: I&#8217;d love for you to support the official textbook \u2014 this page is only meant as a review tool for people who already own a copy, not a replacement for it.<\/em><\/p>\n\n<p class=\"db2-lede\">\n<b><span class=\"lang-zh-TW\">\u7576\u4ee3\u4e2d\u6587\u8ab2\u7a0b<\/span><span class=\"lang-zh-CN\">\u5f53\u4ee3\u4e2d\u6587\u8bfe\u7a0b<\/span> Book 1 \u00b7 Lesson 2\u300c\u6211\u7684\u5bb6\u4eba\u300dMy Family<\/b> \u2014 the vocabulary from this lesson, with pinyin, meaning, and an example sentence for every word, segmented word by word so you can see how each piece works on its own.\n<\/p>\n\n<div class=\"db2-sec-eyebrow\">01 \u2014 FAMILY &amp; HOME<\/div>\n<div id=\"db2-word-list-1\"><\/div>\n\n<div class=\"db2-sec-eyebrow\">02 \u2014 NUMBERS &amp; QUANTITY<\/div>\n<div id=\"db2-word-list-2\"><\/div>\n\n<div class=\"db2-sec-eyebrow\">03 \u2014 QUESTION WORDS &amp; PARTICLES<\/div>\n<div id=\"db2-word-list-3\"><\/div>\n\n<div class=\"db2-sec-eyebrow\">04 \u2014 DESCRIBING PEOPLE &amp; THINGS<\/div>\n<div id=\"db2-word-list-4\"><\/div>\n\n<div class=\"db2-sec-eyebrow\">05 \u2014 ACTIVITIES &amp; INTERESTS<\/div>\n<div id=\"db2-word-list-5\"><\/div>\n\n<div class=\"db2-sec-eyebrow\">06 \u2014 PUT IT TOGETHER<\/div>\n<p class=\"db2-dialogue-note\"><em>Note: this dialogue is not from the textbook \u2014 it&#8217;s a short conversation I made up using the vocabulary above so you can see the words used together. For the actual Lesson 2 dialogue, I&#8217;d recommend picking up a copy of the textbook itself.<\/em><\/p>\n<div class=\"db2-dialogue\" id=\"db2-dialogue\"><\/div>\n\n<div class=\"db2-sec-eyebrow\">07 \u2014 FLASHCARDS<\/div>\n<p class=\"db2-fc-hint\">Tap the card to flip it, then use the arrows to move through the deck.<\/p>\n<div class=\"db2-flashcard-wrap\">\n  <div class=\"db2-flashcard\" id=\"db2-flashcard\">\n    <div class=\"db2-fc-face db2-fc-front\" id=\"db2-fc-front\"><\/div>\n    <div class=\"db2-fc-face db2-fc-back\" id=\"db2-fc-back\"><\/div>\n  <\/div>\n<\/div>\n<div class=\"db2-flashcard-controls\">\n  <button class=\"db2-game-btn\" id=\"db2-fc-prev\">\u2039 Prev<\/button>\n  <span class=\"db2-game-status\" id=\"db2-fc-progress\">1 \/ 32<\/span>\n  <button class=\"db2-game-btn\" id=\"db2-fc-next\">Next \u203a<\/button>\n<\/div>\n\n<div class=\"db2-sec-eyebrow\">08 \u2014 MATCH IT<\/div>\n<p style=\"font-size:0.9rem;color:#6b5f52;margin:0 0 10px;\">Tap a Chinese word, then tap the English meaning that matches it. Get all 8 pairs to finish the round.<\/p>\n<div class=\"db2-game-bar\">\n  <button class=\"db2-game-btn\" id=\"db2-game-new\">New Round<\/button>\n  <span class=\"db2-game-status\" id=\"db2-game-status\">0 \/ 8 matched<\/span>\n<\/div>\n<div class=\"db2-game-board\">\n  <div class=\"db2-game-col\" id=\"db2-game-col-zh\"><\/div>\n  <div class=\"db2-game-col\" id=\"db2-game-col-en\"><\/div>\n<\/div>\n<div class=\"db2-game-win\" id=\"db2-game-win\">\ud83c\udf89 All matched! Nice work.<\/div>\n\n<div class=\"db2-sec-eyebrow\">09 \u2014 VOCABULARY QUIZ<\/div>\n<p style=\"font-size:0.9rem;color:#6b5f52;margin:0 0 10px;\">15 questions covering this lesson&#8217;s vocabulary \u2014 a mix of multiple choice and type-the-answer.<\/p>\n<div class=\"db2-quiz\" id=\"db2-quiz\"><\/div>\n\n<script>\n(function () {\n  var root = document.getElementById('dangdai-b1l2-vocab-embed-1');\n  if (!root) return;\n\n  var SPEAKER_SVG = '<svg viewBox=\"0 0 24 24\" width=\"12\" height=\"12\" fill=\"currentColor\" aria-hidden=\"true\">' +\n    '<path d=\"M7 4.5v15l13-7.5z\"><\/path>' +\n    '<\/svg>';\n\n  function W(t, s, p) { return { t: t, s: s, pt: p, ps: p }; }\n  function WD(t, s, pt, ps) { return { t: t, s: s, pt: pt, ps: ps }; }\n\n  var GROUPS = {\n    'db2-word-list-1': [\n      { t: '\u5bb6', s: '\u5bb6', p: 'ji\u0101', meaning: 'family; home',\n        ex: [W('\u6211','\u6211','W\u01d2'), W('\u5bb6','\u5bb6','ji\u0101'), W('\u6709','\u6709','y\u01d2u'), W('\u4e94','\u4e94','w\u01d4'), W('\u500b','\u4e2a','ge'), W('\u4eba','\u4eba','r\u00e9n'), '\u3002'],\n        exEn: 'There are five people in my family.' },\n      { t: '\u7238\u7238', s: '\u7238\u7238', p: 'b\u00e0ba', meaning: 'father',\n        ex: [W('\u6211','\u6211','W\u01d2'), W('\u7238\u7238','\u7238\u7238','b\u00e0ba'), WD('\u559c\u6b61','\u559c\u6b22','x\u01d0hu\u0101n','x\u01d0huan'), W('\u904b\u52d5','\u8fd0\u52a8','y\u00f9nd\u00f2ng'), '\u3002'],\n        exEn: 'My dad likes sports.' },\n      { t: '\u5abd\u5abd', s: '\u5988\u5988', p: 'm\u0101ma', meaning: 'mother',\n        ex: [W('\u5abd\u5abd','\u5988\u5988','M\u0101ma'), W('\u5f88','\u5f88','h\u011bn'), WD('\u559c\u6b61','\u559c\u6b22','x\u01d0hu\u0101n','x\u01d0huan'), W('\u807d','\u542c','t\u012bng'), W('\u97f3\u6a02','\u97f3\u4e50','y\u012bnyu\u00e8'), '\u3002'],\n        exEn: 'Mom really likes listening to music.' },\n      { t: '\u54e5\u54e5', s: '\u54e5\u54e5', p: 'g\u0113ge', meaning: 'older brother',\n        ex: [W('\u6211','\u6211','W\u01d2'), W('\u54e5\u54e5','\u54e5\u54e5','g\u0113ge'), W('\u662f','\u662f','sh\u00ec'), W('\u8001\u5e2b','\u8001\u5e08','l\u01ceosh\u012b'), '\u3002'],\n        exEn: 'My older brother is a teacher.' },\n      { t: '\u59d0\u59d0', s: '\u59d0\u59d0', p: 'ji\u011bjie', meaning: 'older sister',\n        ex: [W('\u59d0\u59d0','\u59d0\u59d0','Ji\u011bjie'), W('\u7684','\u7684','de'), W('\u7167\u7247','\u7167\u7247','zh\u00e0opi\u00e0n'), W('\u5f88','\u5f88','h\u011bn'), W('\u597d\u770b','\u597d\u770b','h\u01ceok\u00e0n'), '\u3002'],\n        exEn: \"My older sister's photo looks great.\" },\n      { t: '\u5f1f\u5f1f', s: '\u5f1f\u5f1f', p: 'd\u00ecdi', meaning: 'younger brother',\n        ex: [W('\u6211','\u6211','W\u01d2'), W('\u5f1f\u5f1f','\u5f1f\u5f1f','d\u00ecdi'), W('\u5f88','\u5f88','h\u011bn'), W('\u9ad8\u8208','\u9ad8\u5174','g\u0101ox\u00ecng'), '\u3002'],\n        exEn: 'My younger brother is very happy.' },\n      { t: '\u59b9\u59b9', s: '\u59b9\u59b9', p: 'm\u00e8imei', meaning: 'younger sister',\n        ex: [W('\u59b9\u59b9','\u59b9\u59b9','M\u00e8imei'), WD('\u559c\u6b61','\u559c\u6b22','x\u01d0hu\u0101n','x\u01d0huan'), W('\u7167\u76f8','\u7167\u76f8','zh\u00e0oxi\u00e0ng'), '\u3002'],\n        exEn: 'My younger sister likes taking photos.' },\n      { t: '\u592a\u592a', s: '\u592a\u592a', p: 't\u00e0itai', meaning: 'wife; Mrs.',\n        ex: [W('\u738b','\u738b','W\u00e1ng'), W('\u592a\u592a','\u592a\u592a','t\u00e0itai'), W('\u662f','\u662f','sh\u00ec'), W('\u6211','\u6211','w\u01d2'), W('\u5abd\u5abd','\u5988\u5988','m\u0101ma'), '\u3002'],\n        exEn: 'Mrs. Wang is my mother.' },\n      { t: '\u623f\u5b50', s: '\u623f\u5b50', p: 'f\u00e1ngzi', meaning: 'house',\n        ex: [W('\u4f60','\u4f60','N\u01d0'), W('\u7684','\u7684','de'), W('\u623f\u5b50','\u623f\u5b50','f\u00e1ngzi'), W('\u5f88','\u5f88','h\u011bn'), W('\u6f02\u4eae','\u6f02\u4eae','pi\u00e0oliang'), '\u3002'],\n        exEn: 'Your house is very pretty.' }\n    ],\n    'db2-word-list-2': [\n      { t: '\u500b', s: '\u4e2a', p: 'ge', meaning: 'measure word (general, for people\/things)',\n        ex: [W('\u6211','\u6211','W\u01d2'), W('\u5bb6','\u5bb6','ji\u0101'), W('\u6709','\u6709','y\u01d2u'), W('\u4e94','\u4e94','w\u01d4'), W('\u500b','\u4e2a','ge'), W('\u4eba','\u4eba','r\u00e9n'), '\u3002'],\n        exEn: 'There are five people in my family.' },\n      { t: '\u4f4d', s: '\u4f4d', p: 'w\u00e8i', meaning: 'measure word (polite, for people)',\n        ex: [W('\u9019','\u8fd9','Zh\u00e8'), W('\u4f4d','\u4f4d','w\u00e8i'), W('\u662f','\u662f','sh\u00ec'), W('\u6211','\u6211','w\u01d2'), W('\u7238\u7238','\u7238\u7238','b\u00e0ba'), '\u3002'],\n        exEn: 'This is my father.' },\n      { t: '\u5f35', s: '\u5f20', p: 'zh\u0101ng', meaning: 'measure word (for flat objects, like photos)',\n        ex: [W('\u9019','\u8fd9','Zh\u00e8'), W('\u5f35','\u5f20','zh\u0101ng'), W('\u7167\u7247','\u7167\u7247','zh\u00e0opi\u00e0n'), W('\u5f88','\u5f88','h\u011bn'), W('\u597d\u770b','\u597d\u770b','h\u01ceok\u00e0n'), '\u3002'],\n        exEn: 'This photo looks great.' },\n      { t: '\u5169', s: '\u4e24', p: 'li\u01ceng', meaning: 'two',\n        ex: [W('\u6211','\u6211','W\u01d2'), W('\u6709','\u6709','y\u01d2u'), W('\u5169','\u4e24','li\u01ceng'), W('\u500b','\u4e2a','ge'), W('\u5f1f\u5f1f','\u5f1f\u5f1f','d\u00ecdi'), '\u3002'],\n        exEn: 'I have two younger brothers.' },\n      { t: '\u5e7e', s: '\u51e0', p: 'j\u01d0', meaning: 'how many (small numbers)',\n        ex: [W('\u4f60','\u4f60','N\u01d0'), W('\u5bb6','\u5bb6','ji\u0101'), W('\u6709','\u6709','y\u01d2u'), W('\u5e7e','\u51e0','j\u01d0'), W('\u500b','\u4e2a','ge'), W('\u4eba','\u4eba','r\u00e9n'), '\uff1f'],\n        exEn: 'How many people are in your family?' },\n      { t: '\u591a\u5c11', s: '\u591a\u5c11', p: 'du\u014dsh\u01ceo', meaning: 'how many; how much',\n        ex: [W('\u4f60','\u4f60','N\u01d0'), W('\u5bb6','\u5bb6','ji\u0101'), W('\u6709','\u6709','y\u01d2u'), W('\u591a\u5c11','\u591a\u5c11','du\u014dsh\u01ceo'), W('\u66f8','\u4e66','sh\u016b'), '\uff1f'],\n        exEn: 'How many books does your family have?' },\n      { t: '\u5f88\u591a', s: '\u5f88\u591a', p: 'h\u011bndu\u014d', meaning: 'many; a lot',\n        ex: [W('\u6211','\u6211','W\u01d2'), W('\u5bb6','\u5bb6','ji\u0101'), W('\u6709','\u6709','y\u01d2u'), W('\u5f88\u591a','\u5f88\u591a','h\u011bndu\u014d'), W('\u7167\u7247','\u7167\u7247','zh\u00e0opi\u00e0n'), '\u3002'],\n        exEn: 'My family has a lot of photos.' }\n    ],\n    'db2-word-list-3': [\n      { t: '\u8ab0', s: '\u8c01', p: 'sh\u00e9i', meaning: 'who',\n        ex: [W('\u9019','\u8fd9','Zh\u00e8'), W('\u662f','\u662f','sh\u00ec'), W('\u8ab0','\u8c01','sh\u00e9i'), W('\u7684','\u7684','de'), W('\u7167\u7247','\u7167\u7247','zh\u00e0opi\u00e0n'), '\uff1f'],\n        exEn: 'Whose photo is this?' },\n      { t: '\u7684', s: '\u7684', p: 'de', meaning: \"possessive\/descriptive particle ('s)\",\n        ex: [W('\u9019','\u8fd9','Zh\u00e8'), W('\u662f','\u662f','sh\u00ec'), W('\u6211','\u6211','w\u01d2'), W('\u7684','\u7684','de'), W('\u66f8','\u4e66','sh\u016b'), '\u3002'],\n        exEn: 'This is my book.' },\n      { t: '\u90fd', s: '\u90fd', p: 'd\u014du', meaning: 'all; both',\n        ex: [W('\u6211\u5011','\u6211\u4eec','W\u01d2men'), W('\u90fd','\u90fd','d\u014du'), WD('\u559c\u6b61','\u559c\u6b22','x\u01d0hu\u0101n','x\u01d0huan'), W('\u904b\u52d5','\u8fd0\u52a8','y\u00f9nd\u00f2ng'), '\u3002'],\n        exEn: 'We all like sports.' },\n      { t: '\u9019', s: '\u8fd9', p: 'zh\u00e8', meaning: 'this',\n        ex: [W('\u9019','\u8fd9','Zh\u00e8'), W('\u662f','\u662f','sh\u00ec'), W('\u6211','\u6211','w\u01d2'), W('\u7238\u7238','\u7238\u7238','b\u00e0ba'), '\u3002'],\n        exEn: 'This is my father.' },\n      { t: '\u90a3', s: '\u90a3', p: 'n\u00e0', meaning: 'that',\n        ex: [W('\u90a3','\u90a3','N\u00e0'), W('\u662f','\u662f','sh\u00ec'), W('\u6211','\u6211','w\u01d2'), W('\u59d0\u59d0','\u59d0\u59d0','ji\u011bjie'), '\u3002'],\n        exEn: 'That is my older sister.' }\n    ],\n    'db2-word-list-4': [\n      { t: '\u6f02\u4eae', s: '\u6f02\u4eae', p: 'pi\u00e0oliang', meaning: 'pretty',\n        ex: [W('\u6211','\u6211','W\u01d2'), W('\u5abd\u5abd','\u5988\u5988','m\u0101ma'), W('\u5f88','\u5f88','h\u011bn'), W('\u6f02\u4eae','\u6f02\u4eae','pi\u00e0oliang'), '\u3002'],\n        exEn: 'My mom is very pretty.' },\n      { t: '\u9ad8\u8208', s: '\u9ad8\u5174', p: 'g\u0101ox\u00ecng', meaning: 'happy',\n        ex: [W('\u6211','\u6211','W\u01d2'), W('\u5f88','\u5f88','h\u011bn'), W('\u9ad8\u8208','\u9ad8\u5174','g\u0101ox\u00ecng'), W('\u8a8d\u8b58','\u8ba4\u8bc6','r\u00e8nsh\u00ec'), W('\u4f60','\u4f60','n\u01d0'), '\u3002'],\n        exEn: \"I'm very happy to meet you.\" },\n      { t: '\u597d\u770b', s: '\u597d\u770b', p: 'h\u01ceok\u00e0n', meaning: 'good-looking; nice to look at',\n        ex: [W('\u9019','\u8fd9','Zh\u00e8'), W('\u5f35','\u5f20','zh\u0101ng'), W('\u7167\u7247','\u7167\u7247','zh\u00e0opi\u00e0n'), W('\u5f88','\u5f88','h\u011bn'), W('\u597d\u770b','\u597d\u770b','h\u01ceok\u00e0n'), '\u3002'],\n        exEn: 'This photo looks great.' }\n    ],\n    'db2-word-list-5': [\n      { t: '\u904b\u52d5', s: '\u8fd0\u52a8', p: 'y\u00f9nd\u00f2ng', meaning: 'sports; to exercise',\n        ex: [W('\u6211','\u6211','W\u01d2'), W('\u9031\u672b','\u5468\u672b','zh\u014dum\u00f2'), W('\u5e38','\u5e38','ch\u00e1ng'), W('\u904b\u52d5','\u8fd0\u52a8','y\u00f9nd\u00f2ng'), '\u3002'],\n        exEn: 'I often exercise on weekends.' },\n      { t: '\u7167\u76f8', s: '\u7167\u76f8', p: 'zh\u00e0oxi\u00e0ng', meaning: 'to take photos',\n        ex: [W('\u6211\u5011','\u6211\u4eec','W\u01d2men'), WD('\u559c\u6b61','\u559c\u6b22','x\u01d0hu\u0101n','x\u01d0huan'), W('\u7167\u76f8','\u7167\u76f8','zh\u00e0oxi\u00e0ng'), '\u3002'],\n        exEn: 'We like taking photos.' },\n      { t: '\u7167\u7247', s: '\u7167\u7247', p: 'zh\u00e0opi\u00e0n', meaning: 'photo',\n        ex: [W('\u9019','\u8fd9','Zh\u00e8'), W('\u662f','\u662f','sh\u00ec'), W('\u6211','\u6211','w\u01d2'), W('\u5bb6','\u5bb6','ji\u0101'), W('\u7684','\u7684','de'), W('\u7167\u7247','\u7167\u7247','zh\u00e0opi\u00e0n'), '\u3002'],\n        exEn: 'This is a photo of my family.' },\n      { t: '\u97f3\u6a02', s: '\u97f3\u4e50', p: 'y\u012bnyu\u00e8', meaning: 'music',\n        ex: [W('\u6211','\u6211','W\u01d2'), WD('\u559c\u6b61','\u559c\u6b22','x\u01d0hu\u0101n','x\u01d0huan'), W('\u807d','\u542c','t\u012bng'), W('\u97f3\u6a02','\u97f3\u4e50','y\u012bnyu\u00e8'), '\u3002'],\n        exEn: 'I like listening to music.' },\n      { t: '\u807d', s: '\u542c', p: 't\u012bng', meaning: 'to listen',\n        ex: [W('\u5abd\u5abd','\u5988\u5988','M\u0101ma'), W('\u5f88','\u5f88','h\u011bn'), WD('\u559c\u6b61','\u559c\u6b22','x\u01d0hu\u0101n','x\u01d0huan'), W('\u807d','\u542c','t\u012bng'), W('\u97f3\u6a02','\u97f3\u4e50','y\u012bnyu\u00e8'), '\u3002'],\n        exEn: 'Mom really likes listening to music.' },\n      { t: '\u66f8', s: '\u4e66', p: 'sh\u016b', meaning: 'book',\n        ex: [W('\u5f1f\u5f1f','\u5f1f\u5f1f','D\u00ecdi'), W('\u6709','\u6709','y\u01d2u'), W('\u5f88\u591a','\u5f88\u591a','h\u011bndu\u014d'), W('\u66f8','\u4e66','sh\u016b'), '\u3002'],\n        exEn: 'My younger brother has a lot of books.' },\n      { t: '\u9031\u672b', s: '\u5468\u672b', p: 'zh\u014dum\u00f2', meaning: 'weekend',\n        ex: [W('\u4f60','\u4f60','N\u01d0'), W('\u9031\u672b','\u5468\u672b','zh\u014dum\u00f2'), W('\u505a','\u505a','zu\u00f2'), W('\u4ec0\u9ebc','\u4ec0\u4e48','sh\u00e9nme'), '\uff1f'],\n        exEn: 'What do you do on weekends?' },\n      { t: '\u5e38', s: '\u5e38', p: 'ch\u00e1ng', meaning: 'often',\n        ex: [W('\u6211','\u6211','W\u01d2'), W('\u5e38','\u5e38','ch\u00e1ng'), W('\u807d','\u542c','t\u012bng'), W('\u97f3\u6a02','\u97f3\u4e50','y\u012bnyu\u00e8'), '\u3002'],\n        exEn: 'I often listen to music.' }\n    ]\n  };\n\n  var DIALOGUE = [\n    { speakerT: '\u8001\u5e2b', speakerS: '\u8001\u5e08',\n      tokens: [W('\u9019','\u8fd9','Zh\u00e8'), W('\u662f','\u662f','sh\u00ec'), W('\u4f60','\u4f60','n\u01d0'), W('\u5bb6','\u5bb6','ji\u0101'), W('\u7684','\u7684','de'), W('\u7167\u7247','\u7167\u7247','zh\u00e0opi\u00e0n'), W('\u55ce','\u5417','ma'), '\uff1f'],\n      en: 'Is this a photo of your family?' },\n    { speakerT: '\u4f60', speakerS: '\u4f60',\n      tokens: [W('\u5c0d','\u5bf9','Du\u00ec'), '\uff0c', W('\u9019','\u8fd9','zh\u00e8'), W('\u662f','\u662f','sh\u00ec'), W('\u6211','\u6211','w\u01d2'), W('\u5bb6\u4eba','\u5bb6\u4eba','ji\u0101r\u00e9n'), '\u3002', W('\u6211','\u6211','W\u01d2'), W('\u5bb6','\u5bb6','ji\u0101'), W('\u6709','\u6709','y\u01d2u'), W('\u4e94','\u4e94','w\u01d4'), W('\u500b','\u4e2a','ge'), W('\u4eba','\u4eba','r\u00e9n'), '\u3002'],\n      en: 'Yes, these are my family. There are five people in my family.' },\n    { speakerT: '\u8001\u5e2b', speakerS: '\u8001\u5e08',\n      tokens: [W('\u4f60','\u4f60','N\u01d0'), W('\u5bb6','\u5bb6','ji\u0101'), W('\u6709','\u6709','y\u01d2u'), W('\u8ab0','\u8c01','sh\u00e9i'), '\uff1f'],\n      en: \"Who's in your family?\" },\n    { speakerT: '\u4f60', speakerS: '\u4f60',\n      tokens: [W('\u7238\u7238','\u7238\u7238','B\u00e0ba'), '\u3001', W('\u5abd\u5abd','\u5988\u5988','m\u0101ma'), '\u3001', W('\u54e5\u54e5','\u54e5\u54e5','g\u0113ge'), W('\u548c','\u548c','h\u00e9'), W('\u6211','\u6211','w\u01d2'), '\u3002', W('\u54e5\u54e5','\u54e5\u54e5','G\u0113ge'), W('\u662f','\u662f','sh\u00ec'), W('\u8001\u5e2b','\u8001\u5e08','l\u01ceosh\u012b'), '\uff0c', W('\u4ed6','\u4ed6','t\u0101'), W('\u5f88','\u5f88','h\u011bn'), W('\u9ad8\u8208','\u9ad8\u5174','g\u0101ox\u00ecng'), W('\u8a8d\u8b58','\u8ba4\u8bc6','r\u00e8nsh\u00ec'), W('\u4f60','\u4f60','n\u01d0'), '\u3002'],\n      en: \"Dad, Mom, my older brother, and me. My older brother is a teacher \u2014 he's very happy to meet you.\" }\n  ];\n\n  var ALL_WORDS = [];\n  Object.keys(GROUPS).forEach(function (k) {\n    GROUPS[k].forEach(function (w) { ALL_WORDS.push(w); });\n  });\n\n  function rubyWord(w) {\n    return '<span class=\"db2-sent-word\">' +\n      '<ruby class=\"lang-zh-TW\"><span class=\"rb\">' + w.t + '<\/span><rt>' + w.pt + '<\/rt><\/ruby>' +\n      '<ruby class=\"lang-zh-CN\"><span class=\"rb\">' + w.s + '<\/span><rt>' + w.ps + '<\/rt><\/ruby>' +\n      '<\/span>';\n  }\n\n  function renderTokens(tokens) {\n    var html = '';\n    tokens.forEach(function (tok) {\n      if (typeof tok === 'string') {\n        html += '<span class=\"db2-punct\">' + tok + '<\/span>';\n      } else {\n        html += rubyWord(tok);\n      }\n    });\n    return html;\n  }\n\n  function headwordRuby(t, s, pt, ps) {\n    return '<ruby class=\"lang-zh-TW\"><span class=\"rb\">' + t + '<\/span><rt>' + pt + '<\/rt><\/ruby>' +\n           '<ruby class=\"lang-zh-CN\"><span class=\"rb\">' + s + '<\/span><rt>' + ps + '<\/rt><\/ruby>';\n  }\n\n  var counter = 0;\n  Object.keys(GROUPS).forEach(function (containerId) {\n    var container = root.querySelector('#' + containerId);\n    if (!container) return;\n    var html = '';\n    GROUPS[containerId].forEach(function (w) {\n      counter++;\n      var num = (counter < 10 ? '0' : '') + counter;\n      html += '<div class=\"db2-word-card\">' +\n        '<div class=\"db2-word-top\">' +\n          '<span class=\"db2-num\">' + num + '<\/span>' +\n          '<span class=\"db2-hanzi\">' + headwordRuby(w.t, w.s, w.pt || w.p, w.ps || w.p) + '<\/span>' +\n          '<span class=\"db2-meaning\">' + w.meaning + '<\/span>' +\n          '<button class=\"db2-speaker\" data-trad=\"' + w.t + '\" data-simp=\"' + w.s + '\" aria-label=\"Play pronunciation\">' + SPEAKER_SVG + '<\/button>' +\n        '<\/div>' +\n        '<div class=\"db2-example\">' +\n          renderTokens(w.ex) +\n          '<span class=\"db2-en\">' + w.exEn + '<\/span>' +\n        '<\/div>' +\n      '<\/div>';\n    });\n    container.innerHTML = html;\n  });\n\n  var dialogueEl = root.querySelector('#db2-dialogue');\n  if (dialogueEl) {\n    var dHtml = '';\n    DIALOGUE.forEach(function (line) {\n      dHtml += '<div class=\"db2-line\">' +\n        '<span class=\"db2-speaker-tag\">' +\n          '<span class=\"lang-zh-TW\">' + line.speakerT + '<\/span>' +\n          '<span class=\"lang-zh-CN\">' + line.speakerS + '<\/span>' +\n        '<\/span>' +\n        '<span class=\"db2-line-body\">' +\n          renderTokens(line.tokens) +\n          '<span class=\"db2-line-en\">' + line.en + '<\/span>' +\n        '<\/span>' +\n      '<\/div>';\n    });\n    dialogueEl.innerHTML = dHtml;\n  }\n\n  \/\/ ---- Flashcards ----\n  var fcCard = root.querySelector('#db2-flashcard');\n  var fcFront = root.querySelector('#db2-fc-front');\n  var fcBack = root.querySelector('#db2-fc-back');\n  var fcProgress = root.querySelector('#db2-fc-progress');\n  var fcPrevBtn = root.querySelector('#db2-fc-prev');\n  var fcNextBtn = root.querySelector('#db2-fc-next');\n  var fcIndex = 0;\n  var fcFlipped = false;\n\n  function renderFlashcard() {\n    var w = ALL_WORDS[fcIndex];\n    if (!w || !fcFront || !fcBack) return;\n    fcFront.innerHTML = '<span class=\"db2-hanzi\">' + headwordRuby(w.t, w.s, w.pt || w.p, w.ps || w.p) + '<\/span>';\n    fcBack.innerHTML = '<span class=\"db2-meaning\">' + w.meaning + '<\/span>';\n    if (fcProgress) fcProgress.textContent = (fcIndex + 1) + ' \/ ' + ALL_WORDS.length;\n    if (fcCard) fcCard.classList.remove('db2-flipped');\n    fcFlipped = false;\n  }\n\n  if (fcCard) {\n    fcCard.addEventListener('click', function () {\n      fcFlipped = !fcFlipped;\n      fcCard.classList.toggle('db2-flipped', fcFlipped);\n    });\n  }\n  if (fcPrevBtn) fcPrevBtn.addEventListener('click', function () {\n    fcIndex = (fcIndex - 1 + ALL_WORDS.length) % ALL_WORDS.length;\n    renderFlashcard();\n  });\n  if (fcNextBtn) fcNextBtn.addEventListener('click', function () {\n    fcIndex = (fcIndex + 1) % ALL_WORDS.length;\n    renderFlashcard();\n  });\n  renderFlashcard();\n\n  \/\/ ---- Match It game ----\n  var gameColZh = root.querySelector('#db2-game-col-zh');\n  var gameColEn = root.querySelector('#db2-game-col-en');\n  var gameStatus = root.querySelector('#db2-game-status');\n  var gameWin = root.querySelector('#db2-game-win');\n  var gameNewBtn = root.querySelector('#db2-game-new');\n  var gameRound = [];\n  var gameSelectedZh = null;\n  var gameSelectedEn = null;\n  var gameMatchedCount = 0;\n  var gameBusy = false;\n\n  function shuffle(arr) {\n    var a = arr.slice();\n    for (var i = a.length - 1; i > 0; i--) {\n      var j = Math.floor(Math.random() * (i + 1));\n      var tmp = a[i]; a[i] = a[j]; a[j] = tmp;\n    }\n    return a;\n  }\n\n  function startRound() {\n    gameRound = shuffle(ALL_WORDS).slice(0, 8);\n    gameSelectedZh = null;\n    gameSelectedEn = null;\n    gameMatchedCount = 0;\n    gameBusy = false;\n    if (gameWin) gameWin.classList.remove('db2-show');\n\n    var zhOrder = shuffle(gameRound);\n    var enOrder = shuffle(gameRound);\n\n    gameColZh.innerHTML = zhOrder.map(function (w) {\n      return '<button class=\"db2-tile\" data-id=\"' + w.t + '\" data-side=\"zh\">' +\n        '<span class=\"lang-zh-TW\">' + w.t + '<\/span><span class=\"lang-zh-CN\">' + w.s + '<\/span>' +\n        '<span class=\"db2-tile-py\">' + (w.pt || w.p) + '<\/span>' +\n      '<\/button>';\n    }).join('');\n\n    gameColEn.innerHTML = enOrder.map(function (w) {\n      return '<button class=\"db2-tile\" data-id=\"' + w.t + '\" data-side=\"en\">' + w.meaning + '<\/button>';\n    }).join('');\n\n    updateGameStatus();\n  }\n\n  function updateGameStatus() {\n    if (gameStatus) gameStatus.textContent = gameMatchedCount + ' \/ ' + gameRound.length + ' matched';\n  }\n\n  function handleTileClick(tile) {\n    if (gameBusy || tile.classList.contains('db2-matched')) return;\n    var side = tile.getAttribute('data-side');\n\n    if (side === 'zh') {\n      if (gameSelectedZh) gameSelectedZh.classList.remove('db2-selected');\n      gameSelectedZh = tile;\n      tile.classList.add('db2-selected');\n    } else {\n      if (gameSelectedEn) gameSelectedEn.classList.remove('db2-selected');\n      gameSelectedEn = tile;\n      tile.classList.add('db2-selected');\n    }\n\n    if (gameSelectedZh) {\n      if (gameSelectedEn) {\n        var zhId = gameSelectedZh.getAttribute('data-id');\n        var enId = gameSelectedEn.getAttribute('data-id');\n        if (zhId === enId) {\n          gameSelectedZh.classList.remove('db2-selected');\n          gameSelectedEn.classList.remove('db2-selected');\n          gameSelectedZh.classList.add('db2-matched');\n          gameSelectedEn.classList.add('db2-matched');\n          gameMatchedCount++;\n          updateGameStatus();\n          gameSelectedZh = null;\n          gameSelectedEn = null;\n          var roundDone = (gameMatchedCount === gameRound.length);\n          if (roundDone) {\n            if (gameWin) {\n              gameWin.classList.add('db2-show');\n            }\n          }\n        } else {\n          gameBusy = true;\n          var z = gameSelectedZh, en = gameSelectedEn;\n          z.classList.add('db2-wrong');\n          en.classList.add('db2-wrong');\n          setTimeout(function () {\n            z.classList.remove('db2-selected', 'db2-wrong');\n            en.classList.remove('db2-selected', 'db2-wrong');\n            gameBusy = false;\n          }, 400);\n          gameSelectedZh = null;\n          gameSelectedEn = null;\n        }\n      }\n    }\n  }\n\n  root.addEventListener('click', function (e) {\n    var tile = e.target.closest('.db2-tile');\n    if (tile) {\n      if (root.contains(tile)) handleTileClick(tile);\n    }\n  });\n  if (gameNewBtn) gameNewBtn.addEventListener('click', startRound);\n\n  startRound();\n\n  \/\/ ---- Vocabulary Quiz ----\n  var QUIZ_DATA = [\n    { type: 'mc', prompt: '\u7238\u7238 means...', options: ['father', 'mother', 'older brother', 'older sister'], answer: 0 },\n    { type: 'type', prompt: 'Type the pinyin for <span class=\"lang-zh-TW\">\u5abd\u5abd<\/span><span class=\"lang-zh-CN\">\u5988\u5988<\/span>.', accept: ['mama'] },\n    { type: 'mc', prompt: '\u54e5\u54e5 means...', options: ['older brother', 'younger brother', 'older sister', 'younger sister'], answer: 0 },\n    { type: 'type', prompt: 'Type the English word for \u623f\u5b50.', accept: ['house'] },\n    { type: 'mc', prompt: 'Which word is the measure word for photos (flat objects)?', options: ['<span class=\"lang-zh-TW\">\u5f35<\/span><span class=\"lang-zh-CN\">\u5f20<\/span>', '<span class=\"lang-zh-TW\">\u500b<\/span><span class=\"lang-zh-CN\">\u4e2a<\/span>', '\u4f4d', '<span class=\"lang-zh-TW\">\u5169<\/span><span class=\"lang-zh-CN\">\u4e24<\/span>'], answer: 0 },\n    { type: 'type', prompt: 'Type the pinyin for <span class=\"lang-zh-TW\">\u8ab0<\/span><span class=\"lang-zh-CN\">\u8c01<\/span>.', accept: ['shei'] },\n    { type: 'mc', prompt: '\u6f02\u4eae means...', options: ['pretty', 'happy', 'many', 'often'], answer: 0 },\n    { type: 'type', prompt: 'Type the English word for <span class=\"lang-zh-TW\">\u9ad8\u8208<\/span><span class=\"lang-zh-CN\">\u9ad8\u5174<\/span>.', accept: ['happy'] },\n    { type: 'mc', prompt: '<span class=\"lang-zh-TW\">\u97f3\u6a02<\/span><span class=\"lang-zh-CN\">\u97f3\u4e50<\/span> means...', options: ['music', 'photo', 'book', 'weekend'], answer: 0 },\n    { type: 'type', prompt: 'Type the pinyin for <span class=\"lang-zh-TW\">\u9031\u672b<\/span><span class=\"lang-zh-CN\">\u5468\u672b<\/span>.', accept: ['zhoumo'] },\n    { type: 'mc', prompt: 'Which word means \"who\"?', options: ['<span class=\"lang-zh-TW\">\u8ab0<\/span><span class=\"lang-zh-CN\">\u8c01<\/span>', '<span class=\"lang-zh-TW\">\u9019<\/span><span class=\"lang-zh-CN\">\u8fd9<\/span>', '\u90a3', '\u90fd'], answer: 0 },\n    { type: 'type', prompt: 'Type the English word for \u5e38.', accept: ['often'] },\n    { type: 'mc', prompt: '\u7167\u76f8 means...', options: ['to take photos', 'to exercise', 'to listen', 'weekend'], answer: 0 },\n    { type: 'type', prompt: 'Type the pinyin for \u5f88\u591a.', accept: ['henduo'] },\n    { type: 'mc', prompt: '<span class=\"lang-zh-TW\">\u66f8<\/span><span class=\"lang-zh-CN\">\u4e66<\/span> means...', options: ['book', 'photo', 'music', 'house'], answer: 0 }\n  ];\n\n  function stripTones(s) {\n    return s.normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '').toLowerCase().replace(\/[^a-z0-9]\/g, '');\n  }\n\n  (function initQuiz() {\n    var qRoot = root.querySelector('#db2-quiz');\n    if (!qRoot) return;\n    var current = 0;\n    var score = 0;\n    var answered = false;\n\n    function render() {\n      if (current >= QUIZ_DATA.length) { renderScore(); return; }\n      var q = QUIZ_DATA[current];\n      answered = false;\n      var html = '<p class=\"db2-quiz-progress\">Question ' + (current + 1) + ' of ' + QUIZ_DATA.length + '<\/p>';\n      html += '<p class=\"db2-quiz-prompt\">' + q.prompt + '<\/p>';\n      if (q.type === 'mc') {\n        html += '<div class=\"db2-quiz-options\">';\n        for (var i = 0; i < q.options.length; i++) {\n          html += '<button type=\"button\" class=\"db2-quiz-opt\" data-i=\"' + i + '\">' + q.options[i] + '<\/button>';\n        }\n        html += '<\/div>';\n      } else {\n        html += '<div class=\"db2-quiz-input-row\">';\n        html += '<input type=\"text\" class=\"db2-quiz-input\" placeholder=\"Type your answer\">';\n        html += '<button type=\"button\" class=\"db2-quiz-submit\">Submit<\/button>';\n        html += '<\/div>';\n      }\n      html += '<p class=\"db2-quiz-feedback\"><\/p>';\n      html += '<button type=\"button\" class=\"db2-quiz-next\" style=\"display:none;\">Next<\/button>';\n      qRoot.innerHTML = html;\n\n      if (q.type === 'mc') {\n        var opts = qRoot.querySelectorAll('.db2-quiz-opt');\n        opts.forEach(function (btn) {\n          btn.addEventListener('click', function () {\n            if (answered) return;\n            answered = true;\n            var i = parseInt(this.getAttribute('data-i'), 10);\n            var correct = i === q.answer;\n            if (correct) score++;\n            opts.forEach(function (b, bi) {\n              b.setAttribute('disabled', 'disabled');\n              if (bi === q.answer) b.classList.add('correct');\n              else if (bi === i) b.classList.add('incorrect');\n            });\n            showFeedback(correct);\n          });\n        });\n      } else {\n        var input = qRoot.querySelector('.db2-quiz-input');\n        var submitBtn = qRoot.querySelector('.db2-quiz-submit');\n        function submit() {\n          if (answered) return;\n          answered = true;\n          var val = stripTones(input.value || '');\n          var correct = q.accept.indexOf(val) !== -1;\n          if (correct) score++;\n          input.setAttribute('disabled', 'disabled');\n          submitBtn.setAttribute('disabled', 'disabled');\n          showFeedback(correct, q.accept[0]);\n        }\n        submitBtn.addEventListener('click', submit);\n        input.addEventListener('keydown', function (e) { if (e.key === 'Enter') submit(); });\n      }\n\n      function showFeedback(correct, correctAnswer) {\n        var fb = qRoot.querySelector('.db2-quiz-feedback');\n        if (correct) {\n          fb.textContent = 'Correct!';\n        } else if (correctAnswer) {\n          fb.textContent = 'Not quite \u2014 the answer is \"' + correctAnswer + '\".';\n        } else {\n          fb.textContent = 'Not quite \u2014 check the highlighted answer above.';\n        }\n        fb.className = 'db2-quiz-feedback ' + (correct ? 'correct' : 'incorrect');\n        var nextBtn = qRoot.querySelector('.db2-quiz-next');\n        nextBtn.style.display = 'inline-block';\n        nextBtn.addEventListener('click', function () { current++; render(); });\n      }\n    }\n\n    function renderScore() {\n      qRoot.innerHTML =\n        '<div class=\"db2-quiz-score\">' +\n        '<span class=\"db2-quiz-score-num\">' + score + ' \/ ' + QUIZ_DATA.length + '<\/span>' +\n        '<p>Nice work! Want to try again?<\/p>' +\n        '<button type=\"button\" class=\"db2-quiz-retake\">Retake Quiz<\/button>' +\n        '<\/div>';\n      qRoot.querySelector('.db2-quiz-retake').addEventListener('click', function () {\n        current = 0; score = 0; render();\n      });\n    }\n\n    render();\n  })();\n\n  \/\/ Speaker buttons (event delegation, Web Speech API) \u2014 headword cards only\n  root.addEventListener('click', function (e) {\n    var btn = e.target.closest('.db2-speaker');\n    if (!btn || !root.contains(btn)) return;\n    if (!('speechSynthesis' in window)) return;\n    var showingSimp = false;\n    var simpEl = root.querySelector('.lang-zh-CN');\n    if (simpEl) {\n      if (simpEl.offsetParent !== null) showingSimp = true;\n    }\n    var text = showingSimp ? btn.getAttribute('data-simp') : btn.getAttribute('data-trad');\n    var utter = new SpeechSynthesisUtterance(text);\n    utter.lang = showingSimp ? 'zh-CN' : 'zh-TW';\n    window.speechSynthesis.cancel();\n    window.speechSynthesis.speak(utter);\n  });\n})();\n<\/script>\n<\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-medium is-resized\"><a href=\"https:\/\/ko-fi.com\/tiffanystalk\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"58\" src=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-300x58.png\" alt=\"\" class=\"wp-image-570\" style=\"width:150px;height:29px\" srcset=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-300x58.png 300w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-600x115.png 600w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-1024x197.png 1024w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-768x148.png 768w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-1536x296.png 1536w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-2048x394.png 2048w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/fcacd-buymeacoffee_red402x-850x164.png 850w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption class=\"wp-element-caption\">Do you like it? \ud83d\ude42<\/figcaption><\/figure>\n<\/div>\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium is-resized\"><a href=\"https:\/\/tiffanysmandarin.com\/index.php\/contemporary-chinese-book-1\/\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"86\" src=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/e68f92e59c963-300x86.png\" alt=\"\" class=\"wp-image-571\" style=\"width:150px;height:43px\" srcset=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/e68f92e59c963-300x86.png 300w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/e68f92e59c963-600x171.png 600w, https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/e68f92e59c963.png 700w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/figure>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":10970,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_wp_convertkit_post_meta":{"form":"-1","landing_page":"0","tag":"0","restrict_content":"0"},"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1099],"tags":[],"class_list":["post-12864","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-1099"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>B1 L2 Vocabulary and Practice - OneDotDot Chinese<\/title>\n<meta name=\"description\" content=\"Strengthen your vocabulary \u7576\u4ee3\u4e2d\u6587\u7b2c\u4e00\u518a\u7b2c\u4e8c\u8ab2 \u55ae\u8a5e\u7df4\u7fd2 \u8907\u7fd2 \u8003\u8a66 Contemporary Chinese Vocabulary Practice Book 1 \u2013 Lesson 2\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"B1 L2 Vocabulary and Practice - OneDotDot Chinese\" \/>\n<meta property=\"og:description\" content=\"Strengthen your vocabulary \u7576\u4ee3\u4e2d\u6587\u7b2c\u4e00\u518a\u7b2c\u4e8c\u8ab2 \u55ae\u8a5e\u7df4\u7fd2 \u8907\u7fd2 \u8003\u8a66 Contemporary Chinese Vocabulary Practice Book 1 \u2013 Lesson 2\" \/>\n<meta property=\"og:url\" content=\"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/\" \/>\n<meta property=\"og:site_name\" content=\"OneDotDot Chinese\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-15T07:48:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-31T06:25:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2024\/09\/\u7576\u4ee3\u4e2d\u6587.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"tiffany\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"tiffany\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l2\\\/\"},\"author\":{\"name\":\"tiffany\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\"},\"headline\":\"B1 L2 Vocabulary and Practice\",\"datePublished\":\"2025-07-15T07:48:38+00:00\",\"dateModified\":\"2026-08-31T06:25:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l2\\\/\"},\"wordCount\":9,\"publisher\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\"},\"image\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/\u7576\u4ee3\u4e2d\u6587.jpg\",\"articleSection\":[\"\u7576\u4ee3\u4e2d\u6587 1\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l2\\\/\",\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l2\\\/\",\"name\":\"B1 L2 Vocabulary and Practice - OneDotDot Chinese\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/\u7576\u4ee3\u4e2d\u6587.jpg\",\"datePublished\":\"2025-07-15T07:48:38+00:00\",\"dateModified\":\"2026-08-31T06:25:51+00:00\",\"description\":\"Strengthen your vocabulary \u7576\u4ee3\u4e2d\u6587\u7b2c\u4e00\u518a\u7b2c\u4e8c\u8ab2 \u55ae\u8a5e\u7df4\u7fd2 \u8907\u7fd2 \u8003\u8a66 Contemporary Chinese Vocabulary Practice Book 1 \u2013 Lesson 2\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l2\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/\u7576\u4ee3\u4e2d\u6587.jpg\",\"contentUrl\":\"https:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/\u7576\u4ee3\u4e2d\u6587.jpg\",\"width\":800,\"height\":300,\"caption\":\"\u7576\u4ee3\u4e2d\u65871\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2025\\\/07\\\/15\\\/contemporary-chinese-vocabulary-practice-b1l2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9801\",\"item\":\"https:\\\/\\\/tiffanysmandarin.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"B1 L2 Vocabulary and Practice\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#website\",\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/\",\"name\":\"OneDotDot Chinese\",\"description\":\"Learn a little Chinese every day\",\"publisher\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/tiffanysmandarin.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\",\"name\":\"tiffany\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\",\"url\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\",\"contentUrl\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\",\"width\":214,\"height\":214,\"caption\":\"tiffany\"},\"logo\":{\"@id\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\"},\"sameAs\":[\"https:\\\/\\\/www.instagram.com\\\/tiffanys_talk\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/tiffany-huang-mandarin\\\/\"],\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/author\\\/tiffany\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"B1 L2 Vocabulary and Practice - OneDotDot Chinese","description":"Strengthen your vocabulary \u7576\u4ee3\u4e2d\u6587\u7b2c\u4e00\u518a\u7b2c\u4e8c\u8ab2 \u55ae\u8a5e\u7df4\u7fd2 \u8907\u7fd2 \u8003\u8a66 Contemporary Chinese Vocabulary Practice Book 1 \u2013 Lesson 2","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/","og_locale":"en_US","og_type":"article","og_title":"B1 L2 Vocabulary and Practice - OneDotDot Chinese","og_description":"Strengthen your vocabulary \u7576\u4ee3\u4e2d\u6587\u7b2c\u4e00\u518a\u7b2c\u4e8c\u8ab2 \u55ae\u8a5e\u7df4\u7fd2 \u8907\u7fd2 \u8003\u8a66 Contemporary Chinese Vocabulary Practice Book 1 \u2013 Lesson 2","og_url":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/","og_site_name":"OneDotDot Chinese","article_published_time":"2025-07-15T07:48:38+00:00","article_modified_time":"2026-08-31T06:25:51+00:00","og_image":[{"width":800,"height":300,"url":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2024\/09\/\u7576\u4ee3\u4e2d\u6587.jpg","type":"image\/jpeg"}],"author":"tiffany","twitter_card":"summary_large_image","twitter_misc":{"Written by":"tiffany","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/#article","isPartOf":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/"},"author":{"name":"tiffany","@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99"},"headline":"B1 L2 Vocabulary and Practice","datePublished":"2025-07-15T07:48:38+00:00","dateModified":"2026-08-31T06:25:51+00:00","mainEntityOfPage":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/"},"wordCount":9,"publisher":{"@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99"},"image":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/#primaryimage"},"thumbnailUrl":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2024\/09\/\u7576\u4ee3\u4e2d\u6587.jpg","articleSection":["\u7576\u4ee3\u4e2d\u6587 1"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/","url":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/","name":"B1 L2 Vocabulary and Practice - OneDotDot Chinese","isPartOf":{"@id":"https:\/\/tiffanysmandarin.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/#primaryimage"},"image":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/#primaryimage"},"thumbnailUrl":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2024\/09\/\u7576\u4ee3\u4e2d\u6587.jpg","datePublished":"2025-07-15T07:48:38+00:00","dateModified":"2026-08-31T06:25:51+00:00","description":"Strengthen your vocabulary \u7576\u4ee3\u4e2d\u6587\u7b2c\u4e00\u518a\u7b2c\u4e8c\u8ab2 \u55ae\u8a5e\u7df4\u7fd2 \u8907\u7fd2 \u8003\u8a66 Contemporary Chinese Vocabulary Practice Book 1 \u2013 Lesson 2","breadcrumb":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/#primaryimage","url":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2024\/09\/\u7576\u4ee3\u4e2d\u6587.jpg","contentUrl":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2024\/09\/\u7576\u4ee3\u4e2d\u6587.jpg","width":800,"height":300,"caption":"\u7576\u4ee3\u4e2d\u65871"},{"@type":"BreadcrumbList","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2025\/07\/15\/contemporary-chinese-vocabulary-practice-b1l2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9801","item":"https:\/\/tiffanysmandarin.com\/"},{"@type":"ListItem","position":2,"name":"B1 L2 Vocabulary and Practice"}]},{"@type":"WebSite","@id":"https:\/\/tiffanysmandarin.com\/#website","url":"https:\/\/tiffanysmandarin.com\/","name":"OneDotDot Chinese","description":"Learn a little Chinese every day","publisher":{"@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/tiffanysmandarin.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99","name":"tiffany","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png","url":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png","contentUrl":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png","width":214,"height":214,"caption":"tiffany"},"logo":{"@id":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png"},"sameAs":["https:\/\/www.instagram.com\/tiffanys_talk\/","https:\/\/www.linkedin.com\/in\/tiffany-huang-mandarin\/"],"url":"https:\/\/tiffanysmandarin.com\/index.php\/author\/tiffany\/"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2024\/09\/\u7576\u4ee3\u4e2d\u6587.jpg","_links":{"self":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts\/12864","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/comments?post=12864"}],"version-history":[{"count":8,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts\/12864\/revisions"}],"predecessor-version":[{"id":16294,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts\/12864\/revisions\/16294"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/media\/10970"}],"wp:attachment":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/media?parent=12864"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/categories?post=12864"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/tags?post=12864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}