Three new language packs: Ukrainian, Polish and Czech
Three new packs are live: Ukrainian, Polish and Czech. Each comes complete with an on-device dictionary with inflections, a frequency-banded cloze bank, and a TTS voice. Lector now supports fourteen languages at that depth.
Ukrainian is not a Russian preset
My naive assumption was that Russian would be a reasonable proxy for Ukrainian, but a user reported issues of mistranslations and reader parser issues. I'm not sure on the exact distance between the two languages, but I assume it's similar to Dutch and Afrikaans. The same goes for many related languages; the same word can have a meaningful difference between the two.
The reader now supports Ukrainian words that use an apostrophe as a letter -- e.g. п'ять (five),м'ясо (meat), з'їзд (congress). Russian has no such thing, so the Russian pack treats an apostrophe as a boundary and splits those words into two fragments, neither of which is in any dictionary.
The Ukrainian pack fixes both. The apostrophe joins the word rather than breaking it, so п'ять stays one tappable token. Sources in the wild disagree about which apostrophe character to type. It might be straight, curly, or a modifier letter, so a lookup finds the same entry whichever one your text used. The alphabet includes ґ, є, і and ї, and the definitions are Ukrainian definitions.
Polish
Polish relies heavily on inflection. There are seven cases across three genders, verb aspect pairs, and consonant alternations that change the stem rather than just the ending. noga becomes nodze. miasto becomesmieście. pies becomes psowi. No suffix-stripping rule reaches any of those, so the pack resolves them through a table of 1,137,470 inflected forms instead of guessing. All I can say is that I'm praying for all you Polish learners, because this sounds very difficult!
Polish uses the apostrophe too, but for the opposite job: it attaches a Polish case ending to a foreign name, as in Joyce'a or Kennedy'ego. This highlights the complexity of languages. The same character may have completely opposing rules across packs.
Czech
In Czech, vowel length carries meaning. byt is a flat.být is the verb to be. They differ by one accent, and a lookup that folded that accent away would answer the wrong question every time. The pack keys them as two separate words.
The stem changes are similar to Polish's: kůň becomes koňmi, město becomes městě, pes becomes psovi. Czech also has a letter that is not a character — ch is a single letter of the alphabet for sorting, but two characters in text, which turns out to need no special handling at all.
What a pack actually contains
A language pack consists of four elements:
| Ukrainian | Polish | Czech | |
|---|---|---|---|
| Dictionary entries | 54,563 | 169,953 | 68,249 |
| English senses | 83,546 | 270,331 | 88,200 |
| Inflected forms | 346,122 | 1,137,470 | 439,882 |
| Cloze sentences | 9,663 | 10,518 | 9,312 |
| Dictionary coverage | 96.2% | 96.7% | 94.8% |
For self-hosters, the dictionary runs on your own instance, so no lookup leaves the machine (aside from words not found on Wiktionary. This is usually more pronounced on more obscure languages). Definitions carry IPA on all three, which means tapping a word shows how to say it as well as what it means. Each pack has a voice too.
That last row is the one worth explaining. Coverage is measured by taking the 5,000 most frequent words in the language and asking how many of them the dictionary can actually resolve. A score below 85% indicates that further enrichment is needed from other sources (related: my blog post about OCRing an Afrikaans bilingual dictionary).
What's next
Czech, Polish and Ukrainian sit together on purpose: once one Slavic pack works, the next one is mostly data. The same reasoning puts Hungarian, Swedish, Finnish and modern Greek within reach.
If you would like to request a new language, there is a form on the home page or on reference data. If you leave your email address, we can reach out to you when it's ready. For everything not on the roadmap, feel free to join the Discord and request it.