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; }