English | 简体中文 | 繁體中文 | Español | Português | Français | Deutsch | Русский | Українська | 日本語 | 한국어 | ไทย | Tiếng Việt | Bahasa Indonesia
Learn Chinese, one keystroke at a time — type the pinyin, hear the tone, keep the word. An open-source tool for practising Chinese words and texts.
https://www.typingchinese.club
Ask questions, share your progress, or report a bug:
- Discord — https://discord.gg/4kZ7nETEEc
- GitHub — https://github.com/CodeTrainerMan/typingchinese
- Four practice modes: follow-along (see the hanzi, type the pinyin), dictation (listen only), self-test (pinyin shown, produce the word), write-from-meaning (only the translation is shown)
- Three typing modes: full pinyin
zhongguo, initialszg, or toneszhong1 guo2 - Two input methods: type Latin letters on an English keyboard with instant per-letter feedback, or type hanzi with your Chinese IME (Microsoft Pinyin and friends) and get graded per word
- Tone-marked pinyin, Chinese speech synthesis and a translation on every word
- Repeat each word as many times as you like; mistyped words can be cleared and retyped automatically
- Built-in graded texts from beginner to intermediate (short sentences up to short fables)
- Add your own article: paste the text and start typing it sentence by sentence
- Each sentence is pronounced as you go, so reading, listening and typing reinforce each other
- Every word you get wrong is collected into the mistake book for later review
- Reviews are scheduled with FSRS (Free Spaced Repetition Scheduler); the daily review ratio is configurable
- Daily goal, words per day, time spent, accuracy and keystrokes are tracked on the statistics page
- Keyboard sound effects and word/keystroke sounds, volume and speech rate
- Custom shortcuts: replay-key (Tab / F2) and next-word key (Space / Enter)
- Virtual on-screen keyboard, light / dark / follow-system theme
- 14 interface languages — the UI follows your choice, while the learning content is always Chinese
- Modern, ad-free interface
- Runs entirely in the browser: no account, no backend, no forced sign-up
- All progress is stored locally in
localStorage
Built in: Daily Words (59), Advanced Vocabulary (51), Four-character Idioms (40).
Bring your own: paste a list or upload .json / .csv / .txt. One entry per line, in any of these shapes — pinyin is generated automatically:
中国,国家名称
旅行 lv you
安静=没有声音
See sample-words.csv for a ready-to-import example.
The app is a Next.js project and needs Node.js 18 or newer.
git clone https://github.com/CodeTrainerMan/typingchinese.git
cd typingchinese/web
npm install
npm run devOpen http://localhost:3000.
| Command | What it does |
|---|---|
npm run dev |
Start the dev server |
npm run build |
Production build |
npm run start |
Serve the production build |
npm run lint |
ESLint |
npm run gen:dict |
Rebuild public/dicts/*.json from scripts/seed-words.mjs |
web/ Next.js application (the only deployable unit)
src/app/ Routes: / (home) /practice /article /dicts /wrong /stats /setting
src/i18n/ Language packs (add a language: new pack + one entry in LOCALES)
src/lib/ Dictionaries, pinyin, TTS, FSRS scheduling, local storage
public/dicts/ Pre-generated dictionaries
public/articles/ Built-in practice texts
scripts/ Seed word list and dictionary generator
sample-words.csv Example file for importing your own dictionary
The repository root has no package.json, so the Root Directory must be set to web when importing the project on Vercel (or any other platform). Everything else uses the Next.js defaults.
This project is young and features are still being added. Ideas and bug reports are welcome as Issues; if you like the approach, feel free to open a PR.
- Adding a language: drop a pack into
src/i18n/messages/and register it insrc/i18n/index.tsx - Adding words: edit
scripts/seed-words.mjsand runnpm run gen:dict