diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 81a9afee..9b2df599 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -9,7 +9,7 @@
Не може да се въведе празна дума.
Не може да се въведе дума с непозволени символи за %1$s (%2$s).
Думата „%1$s“ е вече речника.
- За да добавите нова дума, първо изберете език.
+ Не може да добавяте думи без да е избран език.
Добавяне на дума
За приложението
@@ -20,13 +20,13 @@
Речници
Отмени зареждането
- Неуспешно зареждане. Невалидна дума \"%1$s\" на ред %2$d за език \"%3$s\".
- Несупешно зареждане на речник за език \"%1$s\" (%2$s).
+ Неуспешно зареждане. Невалидна дума „%1$s“ на ред %2$d за език „%3$s“.
+ Несупешно зареждане на речник за език „%1$s“ (%2$s).
Неуспешно зареждане на речник.
Зареждането на речник приключи.
Зареждане на речник (%1$s)…
Зареди речник
- Неуспешно зареждане. Липсва речник за \"%1$s\".
+ Неуспешно зареждане. Липсва речник за „%1$s“.
Речникът е изтрит успешно.
Облик
Бутони за бърз достъп
@@ -39,7 +39,7 @@
Режим на писане
Настройки
Възстанови стандартните бутони
- Възстановени са стандартните \"бързи\" бутони.
+ Възстановени са стандартните „бързи“ бутони.
(задръж)
Зареждане на речник
Зареждането е отменено.
@@ -48,4 +48,5 @@
Автоматични главни букви
Започвай автоматично изреченията с главни букви.
Подсказващ режим
+ Няма речник за език „%1$s“. Заредете го в Настройки.
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 83456206..f404311e 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -1,6 +1,6 @@
- Configuration TT9
+ Paramètres de TT9
Fermer
Fini
Une erreur inattendue s\'est produite.
@@ -28,7 +28,7 @@
Echec du chargement. Dictionnaire «%1$s» introuvable.
Raccourcis clavier
Apparance
- Echec du chargement. Mot inadmissible \"%1$s\" à la ligne %2$d de langue \"%3$s\".
+ Echec du chargement. Mot inadmissible «%1$s\" à la ligne %2$d de langue «%3$s».
Le dictionaire est vidé avec succès.
Boutons à l\'écran
Chargement du dictionnaire
@@ -38,4 +38,6 @@
Majuscules automatiques
Ajouter automatiquement un espace après signes de ponctuation et mots.
Commencer automatiquement les phrases avec une majuscule.
+ Pas de dictionnaire pour langue «%1$s». Veuillez le charger à l\'écran Paramètres.
+ Impossible d\'ajouter un mot, si aucune langue n\'est choisie.
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 76d48cb0..696f52a4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -11,7 +11,7 @@
Blank word not added.
Cannot add word with unmappable character for %1$s (%2$s).
Word \"%1$s\" already in the dictionary.
- Cannot insert a word when no language is selected.
+ Cannot add a word when no language is selected.
Add Word
About
@@ -38,6 +38,7 @@
Loading dictionary (%1$s)…
Loading dictionary
Load dictionary
+ No dictionary for language \"%1$s\". Go to Settings to load it.
Loading failed. Dictionary for \"%1$s\" not found.
Clear dictionary
Dictionary successfully cleared.
diff --git a/src/io/github/sspanak/tt9/db/DictionaryDb.java b/src/io/github/sspanak/tt9/db/DictionaryDb.java
index 67f2c5d2..3de1379f 100644
--- a/src/io/github/sspanak/tt9/db/DictionaryDb.java
+++ b/src/io/github/sspanak/tt9/db/DictionaryDb.java
@@ -70,6 +70,17 @@ public class DictionaryDb {
}
+ public static void areThereWords(Handler handler, Language language) {
+ new Thread() {
+ @Override
+ public void run() {
+ int langId = language != null ? language.getId() : -1;
+ handler.sendEmptyMessage(getInstance().wordsDao().count(langId) > 0 ? 1 : 0);
+ }
+ }.start();
+ }
+
+
public static void truncateWords(Handler handler) {
new Thread() {
@Override
diff --git a/src/io/github/sspanak/tt9/db/WordsDao.java b/src/io/github/sspanak/tt9/db/WordsDao.java
index cae9eccc..f481efe3 100644
--- a/src/io/github/sspanak/tt9/db/WordsDao.java
+++ b/src/io/github/sspanak/tt9/db/WordsDao.java
@@ -9,6 +9,9 @@ import java.util.List;
@Dao
interface WordsDao {
+ @Query("SELECT COUNT(id) FROM words WHERE :langId < 0 OR lang = :langId")
+ int count(int langId);
+
@Query(
"SELECT * " +
"FROM words " +
diff --git a/src/io/github/sspanak/tt9/ime/EmptyDatabaseWarning.java b/src/io/github/sspanak/tt9/ime/EmptyDatabaseWarning.java
new file mode 100644
index 00000000..146ef728
--- /dev/null
+++ b/src/io/github/sspanak/tt9/ime/EmptyDatabaseWarning.java
@@ -0,0 +1,67 @@
+package io.github.sspanak.tt9.ime;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+
+import java.util.HashMap;
+
+import io.github.sspanak.tt9.R;
+import io.github.sspanak.tt9.db.DictionaryDb;
+import io.github.sspanak.tt9.languages.Language;
+import io.github.sspanak.tt9.languages.LanguageCollection;
+import io.github.sspanak.tt9.preferences.SettingsStore;
+import io.github.sspanak.tt9.ui.UI;
+
+public class EmptyDatabaseWarning {
+ final int WARNING_INTERVAL;
+ private static final HashMap warningDisplayedTime = new HashMap<>();
+
+ private Language language;
+
+ public EmptyDatabaseWarning(SettingsStore settings) {
+ WARNING_INTERVAL = settings.getDictionaryMissingWarningInterval();
+
+ for (Language lang : LanguageCollection.getAll()) {
+ if (!warningDisplayedTime.containsKey(lang.getId())) {
+ warningDisplayedTime.put(lang.getId(), 0L);
+ }
+ }
+ }
+
+ public void emitOnce(Language language) {
+ if (language == null) {
+ return;
+ }
+
+ this.language = language;
+ DictionaryDb.areThereWords(handleWordCount, language);
+ }
+
+ private final Handler handleWordCount = new Handler(Looper.getMainLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ boolean areThereWords = msg.what == 1;
+
+ if (areThereWords) {
+ return;
+ }
+
+ Context context = TraditionalT9.getMainContext();
+ if (context == null || !warningDisplayedTime.containsKey(language.getId())) {
+ return;
+ }
+
+ long now = System.currentTimeMillis();
+ Long lastWarningTime = warningDisplayedTime.get(language.getId());
+ boolean isItWarningTimeAgain = lastWarningTime != null && now - lastWarningTime > WARNING_INTERVAL;
+
+ if (isItWarningTimeAgain) {
+ String message = context.getString(R.string.dictionary_missing_go_load_it, language.getName());
+ UI.toastLong(context, message);
+ warningDisplayedTime.put(language.getId(), now);
+ }
+ }
+ };
+}
diff --git a/src/io/github/sspanak/tt9/ime/modes/ModePredictive.java b/src/io/github/sspanak/tt9/ime/modes/ModePredictive.java
index 498171e8..539400c5 100644
--- a/src/io/github/sspanak/tt9/ime/modes/ModePredictive.java
+++ b/src/io/github/sspanak/tt9/ime/modes/ModePredictive.java
@@ -10,12 +10,14 @@ import java.util.regex.Pattern;
import io.github.sspanak.tt9.Logger;
import io.github.sspanak.tt9.db.DictionaryDb;
+import io.github.sspanak.tt9.ime.EmptyDatabaseWarning;
import io.github.sspanak.tt9.ime.InputFieldHelper;
import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.Punctuation;
import io.github.sspanak.tt9.preferences.SettingsStore;
public class ModePredictive extends InputMode {
+ private final EmptyDatabaseWarning emptyDbWarning;
private final SettingsStore settings;
public int getId() { return MODE_PREDICTIVE; }
@@ -42,11 +44,13 @@ public class ModePredictive extends InputMode {
ModePredictive(SettingsStore settings) {
- this.settings = settings;
allowedTextCases.add(CASE_LOWER);
allowedTextCases.add(CASE_CAPITALIZE);
allowedTextCases.add(CASE_UPPER);
+ emptyDbWarning = new EmptyDatabaseWarning(settings);
+ this.settings = settings;
+
// digitSequence limiter when selecting emoji
// "11" = Emoji level 0, "111" = Emoji level 1,... up to the maximum amount of 1s
StringBuilder maxEmojiSequenceBuilder = new StringBuilder();
@@ -344,6 +348,7 @@ public class ModePredictive extends InputMode {
dbSuggestions = dbSuggestions == null ? new ArrayList<>() : dbSuggestions;
if (dbSuggestions.size() == 0 && digitSequence.length() > 0) {
+ emptyDbWarning.emitOnce(currentLanguage);
dbSuggestions = generatePossibleCompletions(currentLanguage, currentInputFieldWord);
}
diff --git a/src/io/github/sspanak/tt9/preferences/SettingsStore.java b/src/io/github/sspanak/tt9/preferences/SettingsStore.java
index ae869558..ba936ff1 100644
--- a/src/io/github/sspanak/tt9/preferences/SettingsStore.java
+++ b/src/io/github/sspanak/tt9/preferences/SettingsStore.java
@@ -209,6 +209,8 @@ public class SettingsStore {
public int getDictionaryImportProgressUpdateInterval() { return 250; /* ms */ }
public int getDictionaryImportWordChunkSize() { return 1000; /* words */ }
+ public int getDictionaryMissingWarningInterval() { return 30000; /* ms */ }
+
public int getSuggestionsMax() { return 20; }
public int getSuggestionsMin() { return 8; }