# Downloadable dictionaries

> Wordlists for 430 languages, in size tiers, downloaded on demand.

URL: https://wmkeyboard.pages.dev/languages/dictionaries/
Section: Languages

Most languages ship with no word list at all: suggestions come only from what you type. A downloadable dictionary adds instant completions in your chosen size, and protects its own words from autocorrect, entirely offline once it's on the device. The exception is the common typos a big list contains, such as "thw", which are still corrected (see [Autocorrect](https://wmkeyboard.pages.dev/smart/autocorrect/)).

  languages/dictionary-download-row — A language's Dictionary section: the built-in note, a size tier, and the Download button.

## What a dictionary changes

Only English and Bangla ship a built-in dictionary inside the app itself. Every other language starts empty, learning words only from what you type and from any list you import yourself (see [Options](#options) below). The **Word list** row in the Dictionaries section on a language's own screen says which case you're in:

- **Built-in list. A bigger list is available.**: downloading trades the small on-device list for a larger, more complete one.
- **Built-in list**: no downloadable list exists for that language yet.
- **For suggestions, autocorrect and glide typing**, with a Download button: nothing is built in, but a list is available.
- **No Word list row at all**: nothing is available. The keyboard learns your words as you type, and you can still import a list.

Bangla's built-in list, its phonetic index, and the English→Bangla transliteration map it feeds load only while Bangla is one of your enabled languages. Add it and they load. Remove it and they go. Nobody typing French and Japanese carries the Bangla machinery around for nothing. English is the exception and stays loaded, because it's what fields that force plain ASCII fall back to.

A downloaded dictionary does two things at once: it adds its words as completions while you type, and it stops autocorrect from "fixing" any word that's in it. For English and Bangla, downloading replaces the built-in list outright, since the bigger file becomes the one the keyboard actually uses. Every other language has no built-in list to replace, so the download's words are combined with anything you've imported yourself. A word in either list gets completions and autocorrect protection, and downloading one doesn't clear the other. That's why French, German, or Spanish, none of which ship anything built in, can still get real completions once you fetch a list. [Glide typing](https://wmkeyboard.pages.dev/typing/glide-typing/) needs the list too, since a swipe is decoded against it, and the keyboard puts a chip on the strip pointing here when a language has none.

## Two sources: AOSP and Frequency

23 languages have two word lists to choose from: Czech, Danish, Dutch, English, Finnish, French, German, Greek, Hebrew, Croatian, Italian, Latvian, Lithuanian, Norwegian Bokmål, Polish, Portuguese, Romanian, Russian, Serbian, Slovenian, Spanish, Swedish and Turkish.

| Source | What it is |
|---|---|
| **AOSP** (default) | The curated list that Android's own open source keyboard (AOSP LatinIME) ships, under the Apache 2.0 license. Usually 150,000 to 240,000 words, with far fewer names, typos and subtitle noise than a counted list |
| **Frequency** | The list this app uses for every other language, counted from subtitles and web text. Many more words, including more names, slang and misspellings |

German's AOSP list has one change of ours. AOSP counted written text, so everyday words like `ich`, `du` and `mir` ranked far too low for typing, and a swipe for `mir` read `mit`. Those words are lifted using the Frequency list, and a few it lacked, like `verstehst`, are added. A list you already downloaded keeps its old figures until you download it again.

For these languages the download dialog opens on **AOSP**, with a **Source** choice above the sizes, so you can pick **Frequency** instead. English's AOSP list comes in **United States**, **United Kingdom**, **Canada** and **Australia** spellings, and Portuguese has **Europe** and **Brazil** for both sources. With the Canadian, British or Australian list in use, the 726 American spellings the Canadian list respells (`color`, `center`, `favorite` and their forms) are never offered unless that list itself has them, or you added the word by hand. The word pairs and the context model learned from American text, so without this they offered `color` above `colour`. You can still type an American spelling and keep it. Switching source keeps the region where the other source has it.

AOSP itself ships only the American and British lists, so the other two are made from them, keeping AOSP's word ratings and changing only the spelling. **Canada** is the American list with the roughly 730 spellings Canada writes differently swapped in: centre, colour, travelled, cheque, with -ize left as it is. **Australia** is the list LineageOS built from the British one (it adds words like ute and mozzie), with a dozen more Australian spellings such as program. Which spelling each region uses comes from the [English Speller Database](https://github.com/en-wl/wordlist) (formerly SCOWL), the data behind most English spell checkers.

To change sources after a download, use the arrow button on the downloaded row. For these languages it opens **Change the word list**, the same dialog, and the list you have stays in use until the new one has finished. The row title says which list is on the device, for example "Word list (AOSP, United States)". A list you downloaded before AOSP lists existed stays what it is (a Frequency list) until you change it.

AOSP rates each word on its own 0 to 255 scale. That scale is logarithmic, and the keyboard turns it back into counts on the same scale as a Frequency list, so the two rank words alike. AOSP's lowest-rated words are kept: the list is curated, so there's no noise tail to cut. Records AOSP marks as not being words (misspellings it keeps only to correct, like "aint") are left out.

## Choosing a size

Download on the Word list row opens a dialog that asks how many of the most frequent words to keep. Each size says how many words it keeps and about how much it downloads:

| Tier | Words kept |
|---|---|
| Small | 50,000 |
| Medium | 150,000 |
| Large (default) | 300,000 |
| Everything | the whole list, however long it is |

The source lists are sorted by frequency and downloaded over a streaming connection, so picking a smaller tier doesn't just trim the result: it stops the transfer early. Thai's full list is 4 million words and 41 MB compressed, but downloading Large only pulls the first 300,000 of them, a fraction of the total transfer. **Everything** is the one tier with no cap: it reads to the end of the list, which for a language like Thai means the whole 41 MB.

Every count in the picker is an upper bound, which is why each one reads "up to". Two things can stop a download before its tier does, and both are deliberate:

- **The one-timers are dropped** (Frequency lists only). The transfer stops at the first word that occurs only once in the source text. Those are overwhelmingly typos, names, and OCR noise, and letting them in would tell autocorrect that every misspelling is a real word.
- **Some words are skipped**: anything over 48 characters, and anything containing a space.

The gap can be wide on a smaller language. Welsh's list is 123,099 lines, but only the first 50,637 occur more than once, and 47,596 of those survive the other filters. So every tier from Small upward gives Welsh the same 47,596 words, and the number you see afterward is smaller than the number the tier promised. That's the list, not a failed download.

Tiers that would all keep the same words collapse into one, and the picker disappears entirely for a language whose whole list is already smaller than Small, since there is nothing to trim.

A list with no frequencies at all goes the other way and is always kept whole, whichever tier you pick, since it has no order to cut by. Bangla's 451,000-word list used to be one of these. It now carries counts from 4.8 million sentences of Bangla text, so its tiers keep its commonest words like any other language's. A word that text never uses is still in the list, at the lowest count, so **All** keeps every word. A Bangla list downloaded before the counts came still ranks by them, because they come with the phonetic index. Fetch the list again with the arrow button on its row to have them in the list itself, and to have the smaller tiers cut by them. The built-in list's frequencies are added to the counts either way (see [Bangla](https://wmkeyboard.pages.dev/languages/bengali/#options)).

The tier you pick is remembered, so the dialog opens on it for the next language, and **Download all** uses it too. It starts at Large. Changing it doesn't touch a dictionary you've already fetched, but you don't have to delete one to move it to another tier either: a downloaded row has an arrow button beside its Delete that reopens the same dialog on the size that list is at now. See [Changing the size of a list you already have](#changing-the-size-of-a-list-you-already-have) below. A finished download reports what it actually kept, as an exact word count and file size.

When the language also has word pairs (455 languages do; [Downloads](https://wmkeyboard.pages.dev/languages/downloads/) lists them), they download together with the word list, and the dialog says how much they add.

A language with more than one list (the two sources above, and Portuguese's European and Brazilian lists or English's American and British ones) still has a single download slot. Fetching one replaces whichever is on the device, so only one list is active for a language at a time.

## Changing the size of a list you already have

A downloaded **Word list** row carries an arrow button to the left of its Delete. It opens the same size dialog, already on the tier that list was fetched at, so swapping a Small list for a Large one (or a 41&nbsp;MB Everything list for a Medium one) is one press rather than a delete and a fresh download.

The arrows say which way the trade can go before you open anything:

| Icon | What it means |
|---|---|
| Double arrow up | The list is at the smallest tier this language has. Only bigger ones are left |
| Double arrow down | The list is at the largest tier. Only smaller ones are left |
| Up-and-down arrows | Tiers exist in both directions |

There's no button at all on a language whose whole list already fits inside Small, since the tiers all keep the same words and there is nothing to trade.

Picking a size downloads that tier and replaces the file when it finishes. The list you already have stays in place and stays in use for the whole download, because the new one is only swapped in at the very last step. Cancel it, or lose your connection partway, and the old list is still there untouched. A failed attempt says so on the row, in red, and keeps the checkbox and the Delete beside it. Going *down* a tier still downloads: a smaller list is fetched fresh from the source rather than trimmed out of the one on your device, so it costs the transfer for that tier.

Portuguese's two lists share the dialog and the download slot, so the same button is also how you move a downloaded Portuguese list between European and Brazilian without deleting it first.

The tier you pick here is remembered as the app-wide default, exactly as the first download's is, so the next language's dialog opens on it too.

## Downloading, updating, and deleting

Tap **Download** on the Word list row and choose a size to start it. Progress shows as an indeterminate bar rather than a percentage. A capped download stops before the file's full size, so there's no meaningful total to count up to. To cancel, tap the close icon while the download runs. The partial file is discarded and the row goes back to "Download."

Once a dictionary is downloaded, the row has a checkbox, a size button (above) and a delete button. Deleting removes the file for that language. English and Bangla fall back to their built-in list, and every other language falls back to learned words plus any imported custom list.

  languages/dictionary-download-progress — A dictionary mid-download, with the indeterminate progress bar and cancel action.

You don't need to restart the keyboard for a download to take effect. It goes live the next time you focus a text field after the download finishes.

A download can fail for a few distinct reasons, each with its own message: no network connection, not enough free storage ("Delete some files, then try again"), an empty or unreadable word list, or a server that answered with an HTTP error code, which the row prints. A failed row shows **Retry** in place of Download.

## Emoji keyword packs

Emoji search ships with English and Bangla keywords built in. A separate, much smaller catalog of 126 language keyword packs lets emoji search and suggestions work in other languages too. The pipeline is the same shape (stream, unpack, use locally), but the packs are small enough that there's no size tier, and unlike word dictionaries they can download automatically as soon as you enable a language. That toggle and the rest of the keyword-pack details live on [Emoji customization](https://wmkeyboard.pages.dev/emoji/customization/); this page covers word dictionaries only.

## Options

Languages & layouts / (a language) / Dictionaries

There's no global dictionary settings screen. Each language's own screen has one **Dictionaries** section, reached from **Languages** in the app. It has up to three items, and a row for the language that has nothing to offer is left out:

- **Word list**: the built-in or downloaded list.
- **Emoji keywords**: the keyword pack, downloaded or imported.
- **Word pairs**: the bigram and trigram data that next-word predictions read. 455 languages have it, and the row doesn't show for the others.

An item that is on the device has a checkbox and a delete button, and the word list has a size button between them. An item that is not has a **Download** button. The checkbox turns the item off and keeps the file:

- Off on **Word list**, the keyboard forgets those words for that language and reads only lists you imported, plus what it learned from you. It's the same setting the Custom dictionaries screen shows the other way up as **Use only my word lists**. English and Bangla always have the checkbox, because their built-in list is on the device.
- Off on **Emoji keywords**, emoji search and suggestions stop answering in that language.
- Off on **Word pairs**, predictions stop reading the pack.

While anything is still missing, the section heading has a **Download all (*size*)** button. It fetches every item that is not on the device yet, with the word list at the size you last picked, and it goes away once everything is downloaded. Below the items, **Custom dictionaries** opens the screen where you import your own lists.

The **dictionary bar** on [Rows & bars](https://wmkeyboard.pages.dev/reference/settings/rows/#dictionary-bar) puts the word list and emoji keyword switches, and each imported list's own, on a row above the keys as chips, with a language filter at its left edge.

A few related settings live elsewhere:

- **Download data automatically**, at Languages & layouts / Language data / Download data automatically, is **on** by default, except on F-Droid builds, where it starts **off** so the app makes no connection nobody asked for. It's the master switch over everything the keyboard fetches by itself: emoji keyword packs and word-pair data. Word dictionaries aren't in that set, so it never downloads one.
- **Emoji keywords auto-download**, at Emoji / Emoji keywords / Download automatically, is **on** by default. It's the emoji half of the switch above, and both have to be on for a pack to arrive by itself. It governs the emoji keyword packs, not word dictionaries.
- **Custom dictionaries** (import your own word list), under Typing / Suggestions / Custom dictionaries. The same screen is also one tap from a language's own Dictionaries section, above.
- **Personal dictionary** (words the keyboard has learned from your typing), under Typing / Suggestions / Personal dictionary. This is a different, unrelated store from anything on this page.

## Details & edge cases

- **Downloaded and imported word lists are combined.** A downloaded wordlist and anything you've imported yourself live in separate on-disk stores, but the keyboard reads from both at once for every language, English and Bangla included. A word in either one gets completions and autocorrect protection. Downloading a list doesn't clear an import, and importing doesn't clear a download.
- **Chinese, Cantonese and Japanese lists feed the candidates.** Those languages are typed by conversion, so a list imported for one of them joins its conversion table instead of a word list, and only lines that carry a reading count. See [Your own word lists](https://wmkeyboard.pages.dev/languages/cjk/#your-own-word-lists).
- **Custom and personal dictionaries are different things.** A custom dictionary is a word list you import yourself. The personal dictionary is what the keyboard has learned from your own typing. Neither is the downloadable-wordlist catalog this page covers. See [Options](#options) above for where each one lives.
- **The size shown in the wordlist table below is a download cap, not a storage promise.** It's the compressed size of the full remote file, used only as an upper bound while the progress bar is indeterminate. What actually lands on your device depends on the tier you pick and is reported as an exact figure once the download finishes.
- **Romanized languages are their own catalog entries, not a toggle.** Fourteen languages (including Bangla, Hindi, Arabic, and Russian in Latin transliteration) have their own separate dictionary entry and their own selectable language (Banglish, Hinglish, Arabizi, and so on), distinct from the native-script version. Eleven of them (Banglish, Hinglish, and the Gujarati, Kannada, Malayalam, Marathi, Punjabi, Sinhala, Tamil, Telugu and Urdu lists) now also count words from the Dakshina dataset, romanizations native speakers wrote plus running text, so common words such as `hai` and `nahi` are listed and rank first. A romanized list you already downloaded stays as it is until you download it again.
- **Downloads come from one place.** Every wordlist and every emoji keyword pack downloads from the same public data repository over a plain HTTPS connection, and nothing else is contacted. Once a file is written to disk, using it needs no further network access. See [Network policy](https://wmkeyboard.pages.dev/privacy/network/) for the full picture of what this keyboard sends and when.
- **Romanian lists are respelt on the way in.** Romanian writes ș and ț with a comma below, but text counted from the web and from subtitles is full of the Turkish cedilla letters ş and ţ that eight-bit code pages used in their place, and the spelling a word list carries is the one autocorrect commits. The keyboard replaces the cedilla with the comma while it reads any Romanian list, downloaded or imported, and merges the two spellings of a word into one entry, so `trăiești` is what you get. A Romanian list downloaded before this is repaired in place the next time the keyboard starts, with nothing re-downloaded; an **Everything**-size list is too big to rebuild on the device and keeps its old spelling until you download one again. No other language is touched: Turkish, Azerbaijani, Gagauz, Zazaki and Kurmanji all write a real cedilla.
- **Downloadable wordlists keep their own licenses.** The bundled seed data (bigrams, the loanword map, the offensive-word filter) is hand-curated for this project, but each downloadable wordlist carries whatever license its own upstream source uses.
- **One download here can ask before spending mobile data.** While [Data saver](https://wmkeyboard.pages.dev/privacy/data-saver/) is on (off unless you pick a trigger), its **Downloads** row, set to **Ask each time** by default, puts a size-naming confirmation in front of the **Download all** button. The individual Download buttons on the rows don't consult it, and neither do the automatic packs. They start on whatever connection is up. [Downloads & mobile data](https://wmkeyboard.pages.dev/languages/downloads/) has the full picture, including which downloads elsewhere in the app ask first.

## Every wordlist

All {wordlists.length} downloadable wordlists, AOSP and Frequency. Word counts are the full list;
the Small/Medium/Large tiers keep the most frequent 50k/150k/300k words, and
Everything keeps them all.

The size in the **Download** column links the file itself. On a phone that cannot download (the no-internet build, or a blocked network), fetch it in a browser and bring it in with **Import from a file** on the language's **Dictionaries** screen. That screen's **Get the files** button lists the same links, with copy and open buttons, plus the language pack that holds them all.

 [
		w.id,
		w.name,
		w.source,
		w.words.toLocaleString('en-US'),
		{
			text: `${(w.gzBytes / 1024 / 1024).toFixed(w.gzBytes < 1024 * 1024 ? 2 : 1)} MB`,
			href: w.url,
		},
	])}
	extras={wordlists.map((w) => w.english)}
	placeholder="Filter wordlists…"
	caption="Generated from the app's dictionary catalog; sizes are the gzipped downloads."
/>

See also [Languages overview](https://wmkeyboard.pages.dev/languages/overview/) for enabling a language in the first place, and [Emoji customization](https://wmkeyboard.pages.dev/emoji/customization/) for the keyword-pack side of this same pipeline.
