Skip to content

Conversation

@Julow
Copy link
Owner

@Julow Julow commented Dec 13, 2025

This adds dictionary-based spell checking to the keyboard. The keyboard looks at the word being typed and matches it against a dictionary to either complete the rest of the word or find alternative spellings.

The core of this feature is implemented in cdict, a project that I developed for this purpose.
The dictionaries are hosted in this repository and can be downloaded from within the app. The wordlists used to build the dictionaries are the same ones used by HeliBoard (from this repository).

This is still a work in progress. I plan to improve the interface and add more features:

  • Phonetic-based spell checking
  • Custom dictionary
  • Emoji lookup
  • More customisation

This work was fully funded by the NLnet foundation. I would like to thanks them for giving me the time required to work on this feature.

Closes #343 #716 #745 #596 #571

This is the most requested feature and I hope it will be enjoyed.
I'm eager to receive feedback from anyone willing to test this new feature.

This was referenced Dec 13, 2025
@starlingnia
Copy link

Cool, this is what I am looking forward for unexpected keyboard

@Julow Julow mentioned this pull request Dec 28, 2025
Julow added 12 commits December 28, 2025 19:03
Build cdict's C library and Java bindings and link them into the app.
Uses libcdict to query a dictionary each time the word before the cursor
changes. The candidates view is updated.

The dictionary is embedded into the app for now.
The main package is getting big.
Add an activity accessible from the launcher app that lists available
dictionaries with a download button.

The Dictionaries class manages installed dictionaries. Dictionaries are
installed as individual files into the app's private directory.

The DictionaryListView view shows the list of available dictionaries and
handles downloading and installing them.
The message is updated when the config is refreshed.
This is an important information that users might want to know before
clicking download.
Disables automatic compression, which doesn't always work, and instead
compress statically the dictionaries on the server. Compression is
disabled in the request and then forced on the client side.
Update the CI to work with the new vendor/cdict submodule.
The checkout action is upgraded to v6.
@alotbsol555
Copy link
Contributor

wow, I just found this and installed the debug build from here, correct?

https://github.com/Julow/Unexpected-Keyboard/actions/runs/20557555689

however, I'm still struggling to test this properly:

  • the launcher app is light themed and not dark like my system theme and the official launcher app.
  • the installation dialog to download dictionaries is almost white on white, see screen shot below
  • after downloading a dictionary, there is still the install button above the keyboard and no suggestions

Screenshot_20251228-212051_1.png

what am I doing wrong?

`dictionaries.xml` replaces the generated `SupportedDictionaries.java`
and `dict_names.xml`. It is generated from the
Unexpected-Keyboard-dictionaries project and contains the list of
available dictionaries.

This file is easier to update when the dictionaries are re-built and can
be parsed by gen_method_xml.py later to assign dictionaries to locales.
@Julow
Copy link
Owner Author

Julow commented Dec 29, 2025

You are not doing anything wrong. This is how the interface is at this stage and that's what I'm working on next.
Make sure to install only one dictionary. Which one doesn't work for you ?

@alotbsol555
Copy link
Contributor

ok, with only one dictionary installed, it works. there are max 3 suggestions, which can be chosen. this looks good for the basic functionality!

`gen_method_xml.py` reads `res/values/dictionaries.xml` and assign a
dictionary to each subtypes.

The script is rewritten to avoid using large format strings.
This moves the code from Keyboard2 that handles the active IME subtypes
and the current one.

The goal is to access this information from the dictionary activity
while simplifying the code of Keyboard2.
Instead of the full list of the supported dictionaries.
Use the information in DeviceLocales to select the right dictionary. A
cache is added into Dictionaries to avoid unecessary loads when
switching locale.
@PickleHik3
Copy link

I've tried the recent builds, Downloaded the dictionary when prompted, but it kept prompting to download it (even though i had it downloaded) and could not get it working.

I'll keep an eye out for future builds!
cheers!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Word predicion and correcting

5 participants