abouttreesummaryrefslogcommitdiff
path: root/res/values
diff options
context:
space:
mode:
authorJules Aguillon2026-02-02 00:20:00 +0100
committerGitHub2026-02-02 00:20:00 +0100
commit77c4a27c4c37b3620defcab94ffd1b2f536c88cb (patch)
tree1bf2c5b723e1f86b0904257e7e57f4fda15378e9 /res/values
parent2ecf93d9904544ee73159e9f0ee74b49057bca6c (diff)
downloadunexpected-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.xml237
-rw-r--r--res/values/strings.xml4
-rw-r--r--res/values/styles.xml33
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