diff options
| author | Jules Aguillon | 2026-02-02 00:20:00 +0100 |
|---|---|---|
| committer | GitHub | 2026-02-02 00:20:00 +0100 |
| commit | 77c4a27c4c37b3620defcab94ffd1b2f536c88cb (patch) | |
| tree | 1bf2c5b723e1f86b0904257e7e57f4fda15378e9 /res/values | |
| parent | 2ecf93d9904544ee73159e9f0ee74b49057bca6c (diff) | |
| download | unexpected-keyboard-77c4a27c4c37b3620defcab94ffd1b2f536c88cb.tar.gz unexpected-keyboard-77c4a27c4c37b3620defcab94ffd1b2f536c88cb.zip | |
Spell checking (#1137)
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, which is included as a
submodule in vendor/cidct.
Cdict is developped at https://github.com/Julow/cdict
The dictionaries are hosted at https://github.com/Julow/Unexpected-Keyboard-dictionaries/
The wordlists used to build the dictionaries are the same ones used by
HeliBoard from https://codeberg.org/Helium314/aosp-dictionaries
- Add an activity accessible from the launcher app that lists available
dictionaries with a download button.
The DictionaryListView view shows the list of available dictionaries and
handles downloading and installing them.
- The Dictionaries class manages installed dictionaries. Dictionaries are
installed as individual files into the app's private directory.
- Available dictionaries are listed in dictionaries.xml, which is generated
when building Unexpected-Keyboard-dictionaries.
method.xml mentions the dictionary name for each locales.
Diffstat (limited to 'res/values')
| -rw-r--r-- | res/values/dictionaries.xml | 237 | ||||
| -rw-r--r-- | res/values/strings.xml | 4 | ||||
| -rw-r--r-- | res/values/styles.xml | 33 |
3 files changed, 273 insertions, 1 deletions
diff --git a/res/values/dictionaries.xml b/res/values/dictionaries.xml new file mode 100644 index 0000000..f3e73fd --- /dev/null +++ b/res/values/dictionaries.xml @@ -0,0 +1,237 @@ +<?xml version='1.0' encoding='utf-8'?> +<resources> + <string name="dict_name_ar">Arabic</string> + <string name="dict_name_as">Assamese</string> + <string name="dict_name_be">Belarusian</string> + <string name="dict_name_bg">Bulgarian</string> + <string name="dict_name_bn">Bangla</string> + <string name="dict_name_bs">Bosnian</string> + <string name="dict_name_ca">Catalan</string> + <string name="dict_name_cs">Czech</string> + <string name="dict_name_da">Danish</string> + <string name="dict_name_de">German</string> + <string name="dict_name_de_ch">German (Switzerland)</string> + <string name="dict_name_el">Greek</string> + <string name="dict_name_en_au">English (Australia)</string> + <string name="dict_name_en_gb">English (United Kingdom)</string> + <string name="dict_name_en_us">English (United States)</string> + <string name="dict_name_es">Spanish</string> + <string name="dict_name_eu">Basque</string> + <string name="dict_name_fi">Finnish</string> + <string name="dict_name_fr">French</string> + <string name="dict_name_gl">Galician</string> + <string name="dict_name_gu">Gujarati</string> + <string name="dict_name_hi">Hindi</string> + <string name="dict_name_hr">Croatian</string> + <string name="dict_name_hu">Hungarian</string> + <string name="dict_name_hy">Armenian</string> + <string name="dict_name_it">Italian</string> + <string name="dict_name_iw">Hebrew</string> + <string name="dict_name_ka">Georgian</string> + <string name="dict_name_km">Khmer</string> + <string name="dict_name_kn">Kannada</string> + <string name="dict_name_lb">Luxembourgish</string> + <string name="dict_name_lt">Lithuanian</string> + <string name="dict_name_lv">Latvian</string> + <string name="dict_name_mai">Maithili</string> + <string name="dict_name_ml">Malayalam</string> + <string name="dict_name_mr">Marathi</string> + <string name="dict_name_nb">Norwegian Bokmål</string> + <string name="dict_name_nl">Dutch</string> + <string name="dict_name_or">Odia</string> + <string name="dict_name_pa">Punjabi</string> + <string name="dict_name_pl">Polish</string> + <string name="dict_name_pt_br">Portuguese (Brazil)</string> + <string name="dict_name_pt_pt">Portuguese (Portugal)</string> + <string name="dict_name_ro">Romanian</string> + <string name="dict_name_ru">Russian</string> + <string name="dict_name_sa">Sanskrit</string> + <string name="dict_name_sat">Santali</string> + <string name="dict_name_sd">Sindhi</string> + <string name="dict_name_sl">Slovenian</string> + <string name="dict_name_sr">Serbian</string> + <string name="dict_name_sv">Swedish</string> + <string name="dict_name_ta">Tamil</string> + <string name="dict_name_te">Telugu</string> + <string name="dict_name_tr">Turkish</string> + <string name="dict_name_uk">Ukrainian</string> + <string name="dict_name_ur">Urdu</string> + <string name="dict_name_zgh">Standard Moroccan Tamazight</string> + <string-array name="dictionaries_locale"> + <item>ar</item> + <item>as</item> + <item>be</item> + <item>bg</item> + <item>bn</item> + <item>bs</item> + <item>ca</item> + <item>cs</item> + <item>da</item> + <item>de</item> + <item>de_CH</item> + <item>el</item> + <item>en_AU</item> + <item>en_GB</item> + <item>en_US</item> + <item>es</item> + <item>eu</item> + <item>fi</item> + <item>fr</item> + <item>gl</item> + <item>gu</item> + <item>hi</item> + <item>hr</item> + <item>hu</item> + <item>hy</item> + <item>it</item> + <item>iw</item> + <item>ka</item> + <item>km</item> + <item>kn</item> + <item>lb</item> + <item>lt</item> + <item>lv</item> + <item>mai</item> + <item>ml</item> + <item>mr</item> + <item>nb</item> + <item>nl</item> + <item>or</item> + <item>pa</item> + <item>pl</item> + <item>pt_BR</item> + <item>pt_PT</item> + <item>ro</item> + <item>ru</item> + <item>sa</item> + <item>sat</item> + <item>sd</item> + <item>sl</item> + <item>sr</item> + <item>sv</item> + <item>ta</item> + <item>te</item> + <item>tr</item> + <item>uk</item> + <item>ur</item> + <item>zgh</item> + </string-array> + <string-array name="dictionaries_name"> + <item>@string/dict_name_ar</item> + <item>@string/dict_name_as</item> + <item>@string/dict_name_be</item> + <item>@string/dict_name_bg</item> + <item>@string/dict_name_bn</item> + <item>@string/dict_name_bs</item> + <item>@string/dict_name_ca</item> + <item>@string/dict_name_cs</item> + <item>@string/dict_name_da</item> + <item>@string/dict_name_de</item> + <item>@string/dict_name_de_ch</item> + <item>@string/dict_name_el</item> + <item>@string/dict_name_en_au</item> + <item>@string/dict_name_en_gb</item> + <item>@string/dict_name_en_us</item> + <item>@string/dict_name_es</item> + <item>@string/dict_name_eu</item> + <item>@string/dict_name_fi</item> + <item>@string/dict_name_fr</item> + <item>@string/dict_name_gl</item> + <item>@string/dict_name_gu</item> + <item>@string/dict_name_hi</item> + <item>@string/dict_name_hr</item> + <item>@string/dict_name_hu</item> + <item>@string/dict_name_hy</item> + <item>@string/dict_name_it</item> + <item>@string/dict_name_iw</item> + <item>@string/dict_name_ka</item> + <item>@string/dict_name_km</item> + <item>@string/dict_name_kn</item> + <item>@string/dict_name_lb</item> + <item>@string/dict_name_lt</item> + <item>@string/dict_name_lv</item> + <item>@string/dict_name_mai</item> + <item>@string/dict_name_ml</item> + <item>@string/dict_name_mr</item> + <item>@string/dict_name_nb</item> + <item>@string/dict_name_nl</item> + <item>@string/dict_name_or</item> + <item>@string/dict_name_pa</item> + <item>@string/dict_name_pl</item> + <item>@string/dict_name_pt_br</item> + <item>@string/dict_name_pt_pt</item> + <item>@string/dict_name_ro</item> + <item>@string/dict_name_ru</item> + <item>@string/dict_name_sa</item> + <item>@string/dict_name_sat</item> + <item>@string/dict_name_sd</item> + <item>@string/dict_name_sl</item> + <item>@string/dict_name_sr</item> + <item>@string/dict_name_sv</item> + <item>@string/dict_name_ta</item> + <item>@string/dict_name_te</item> + <item>@string/dict_name_tr</item> + <item>@string/dict_name_uk</item> + <item>@string/dict_name_ur</item> + <item>@string/dict_name_zgh</item> + </string-array> + <integer-array name="dictionaries_size"> + <item>455658</item> + <item>307451</item> + <item>1745968</item> + <item>347735</item> + <item>301586</item> + <item>481783</item> + <item>335099</item> + <item>657214</item> + <item>933060</item> + <item>1071580</item> + <item>1075177</item> + <item>964195</item> + <item>645068</item> + <item>644719</item> + <item>650605</item> + <item>635119</item> + <item>359849</item> + <item>1003794</item> + <item>871636</item> + <item>240926</item> + <item>279333</item> + <item>301928</item> + <item>727487</item> + <item>331818</item> + <item>948362</item> + <item>696974</item> + <item>352933</item> + <item>488139</item> + <item>263411</item> + <item>286588</item> + <item>331897</item> + <item>736799</item> + <item>854603</item> + <item>333644</item> + <item>354875</item> + <item>301259</item> + <item>776481</item> + <item>926933</item> + <item>357107</item> + <item>107120</item> + <item>740895</item> + <item>705536</item> + <item>996904</item> + <item>1421447</item> + <item>907625</item> + <item>342293</item> + <item>322250</item> + <item>256078</item> + <item>228729</item> + <item>740293</item> + <item>916845</item> + <item>297338</item> + <item>304295</item> + <item>690598</item> + <item>1179318</item> + <item>265324</item> + <item>628168</item> + </integer-array> +</resources> diff --git a/res/values/strings.xml b/res/values/strings.xml index e01e98f..d46b828 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -108,6 +108,7 @@ <string name="key_action_send">Send</string> <string name="launcher_button_imesettings">Enable keyboard</string> <string name="launcher_button_imepicker">Select keyboard</string> + <string name="launcher_button_dictionaries">Install dictionaries</string> <string name="launcher_description">This application is a virtual keyboard. Go to the system settings by clicking on the button below and enable Unexpected-Keyboard.</string> <string name="launcher_sourcecode">This is a free and open source application. You can find the source code or report bugs on GitHub.</string> <string name="launcher_tryhere">After enabling, you can try the keyboard here:</string> @@ -154,6 +155,9 @@ <string name="pref_clipboard_history_duration_30">At most 30 minutes</string> <string name="pref_clipboard_history_duration_stop">Until the app stops</string> <string name="pref_dialog_edit_text">Custom definition</string> + <string name="dictionaries_from_internet">Download a dictionary from the Internet</string> + <string name="dictionaries_download_success">Dictionary installed</string> + <string name="dictionaries_download_failed">Download failed</string> <string name="candidates_status_no_dict">No dictionary installed</string> <string name="candidates_status_install">Install</string> </resources> diff --git a/res/values/styles.xml b/res/values/styles.xml index 5defb7b..6977e00 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -64,7 +64,7 @@ <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_marginVertical">8dp</item> - <item name="android:layout_marginHorizontal">16dp</item> + <item name="android:layout_marginHorizontal">24dp</item> <item name="android:layout_gravity">center</item> </style> <style name="anim"> @@ -90,6 +90,37 @@ <item name="android:layout_width">wrap_content</item> <item name="android:orientation">horizontal</item> </style> + <!-- Dictionaries activity --> + <style name="dictionary_list_view"> + <item name="android:layout_width">fill_parent</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_marginVertical">24dp</item> + </style> + <style name="dictionary_download_item"> + <item name="android:orientation">horizontal</item> + <item name="android:layout_width">fill_parent</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_marginVertical">8dp</item> + <item name="android:gravity">center</item> + <item name="android:paddingHorizontal">48dp</item> + </style> + <style name="dictionary_download_locale"> + <item name="android:layout_weight">1</item> + <item name="android:layout_width">fill_parent</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:textSize">16sp</item> + </style> + <style name="dictionary_download_size"> + <item name="android:layout_weight">0</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_marginRight">8dp</item> + <item name="android:textSize">12sp</item> + </style> + <style name="dictionary_download_button"> + <item name="android:layout_width">24dp</item> + <item name="android:layout_height">24dp</item> + </style> <style name="appTheme" parent="@android:style/Theme.Material.Light"/> <style name="settingsTheme" parent="appTheme"> <!-- Setting this in the activity theme so it propagate to nested |
