diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java
index 25a9e39d..e6f602a4 100644
--- a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java
+++ b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java
@@ -7,6 +7,7 @@ import io.github.sspanak.tt9.db.words.DictionaryLoader;
import io.github.sspanak.tt9.ime.helpers.TextField;
import io.github.sspanak.tt9.ime.modes.InputMode;
import io.github.sspanak.tt9.ime.modes.InputModeKind;
+import io.github.sspanak.tt9.languages.LanguageKind;
import io.github.sspanak.tt9.ui.UI;
import io.github.sspanak.tt9.util.Ternary;
@@ -121,7 +122,7 @@ public abstract class HotkeyHandler extends CommandHandler {
}
if (keyCode == settings.getKeySpaceKorean()) {
- return onText(" ", validateOnly);
+ return onKeySpaceKorean(validateOnly);
}
if (keyCode == settings.getKeyShowSettings()) {
@@ -391,22 +392,26 @@ public abstract class HotkeyHandler extends CommandHandler {
}
+ /**
+ * For CJK languages: when there are suggestions, accept the current one, otherwise type a space.
+ * For Non-CJK languages: accept the current suggestion (if any) AND type a space.
+ * The name is kept for historical reasons, because Korean was the first to introduce this behavior.
+ */
public boolean onKeySpaceKorean(boolean validateOnly) {
- if (shouldBeOff() || !InputModeKind.isCheonjiin(mInputMode)) {
- return false;
- }
-
- // type a space when there is nothing to accept
- if (suggestionOps.isEmpty() && !onText(" ", validateOnly)) {
+ if (shouldBeOff()) {
return false;
}
// simulate accept with OK when there are suggestions
- if (!suggestionOps.isEmpty()) {
- onAcceptSuggestionManually(suggestionOps.acceptCurrent(), KeyEvent.KEYCODE_ENTER);
+ if (!suggestionOps.isEmpty() && LanguageKind.isCJK(mLanguage)) {
+ if (!validateOnly) {
+ onAcceptSuggestionManually(suggestionOps.acceptCurrent(), KeyEvent.KEYCODE_ENTER);
+ }
+ return true;
}
- return true;
+ // type a space when there is nothing to accept
+ return onText(" ", validateOnly);
}
diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/MainViewHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/MainViewHandler.java
index db682b1f..8b9a9fbd 100644
--- a/app/src/main/java/io/github/sspanak/tt9/ime/MainViewHandler.java
+++ b/app/src/main/java/io/github/sspanak/tt9/ime/MainViewHandler.java
@@ -10,7 +10,6 @@ import io.github.sspanak.tt9.ime.helpers.OrientationListener;
import io.github.sspanak.tt9.ime.modes.InputModeKind;
import io.github.sspanak.tt9.ime.voice.VoiceInputOps;
import io.github.sspanak.tt9.languages.Language;
-import io.github.sspanak.tt9.languages.LanguageKind;
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
import io.github.sspanak.tt9.ui.main.ResizableMainView;
@@ -192,11 +191,6 @@ abstract public class MainViewHandler extends HotkeyHandler {
}
- public boolean hasLettersOnAllKeys() {
- return LanguageKind.isKorean(mLanguage) || LanguageKind.isChineseBopomofo(mLanguage);
- }
-
-
private void resetNormalizedDimensions() {
normalizedWidth = -1;
normalizedHeight = -1;
diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModePinyin.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModePinyin.java
index 1065d12f..d5130687 100644
--- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModePinyin.java
+++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/ModePinyin.java
@@ -63,7 +63,9 @@ public class ModePinyin extends ModeIdeograms {
@Override
public boolean shouldAcceptPreviousSuggestion(int nextKey, boolean hold) {
- // In East Asian languages, 0-key must accept the current word, or type a space when there is no word.
+ // In East Asian languages, Space must accept the current word, or type a space when there is no word.
+ // Here, we handle the case when 0-key is Space, unlike the Space hotkey in HotkeyHandler,
+ // which could be a different key, assigned by the user.
if (!digitSequence.isEmpty() && !digitSequence.endsWith(SPECIAL_CHAR_SEQUENCE) && nextKey == SPECIAL_CHAR_KEY) {
ignoreNextSpace = true;
}
diff --git a/app/src/main/java/io/github/sspanak/tt9/languages/Language.java b/app/src/main/java/io/github/sspanak/tt9/languages/Language.java
index d0e3b906..af4f74f0 100644
--- a/app/src/main/java/io/github/sspanak/tt9/languages/Language.java
+++ b/app/src/main/java/io/github/sspanak/tt9/languages/Language.java
@@ -14,6 +14,7 @@ abstract public class Language {
protected String currency;
protected String dictionaryFile;
protected boolean hasABC = true;
+ private Boolean hasLettersOnAllKeys = null;
protected boolean hasSpaceBetweenWords = true;
protected boolean hasUpperCase = true;
protected boolean hasTranscriptionsEmbedded = false;
@@ -69,6 +70,30 @@ abstract public class Language {
return hasABC;
}
+ final public boolean hasLettersOnAllKeys() {
+ if (hasLettersOnAllKeys != null) {
+ return hasLettersOnAllKeys;
+ }
+
+ boolean hasCharsOn0 = false;
+ for (String ch : getKeyCharacters(0)) {
+ if (Character.isAlphabetic(ch.charAt(0))) {
+ hasCharsOn0 = true;
+ break;
+ }
+ }
+
+ boolean hasCharsOn1 = false;
+ for (String ch : getKeyCharacters(1)) {
+ if (Character.isAlphabetic(ch.charAt(0))) {
+ hasCharsOn1 = true;
+ break;
+ }
+ }
+
+ return hasLettersOnAllKeys = hasCharsOn0 && hasCharsOn1;
+ }
+
final public boolean hasSpaceBetweenWords() {
return hasSpaceBetweenWords;
}
diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java
index 139904a8..2847832f 100644
--- a/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java
+++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java
@@ -281,10 +281,13 @@ class MainLayoutNumpad extends BaseMainLayout {
setWidth(tt9.getSettings().getWidthPercent(), tt9.getSettings().getAlignment());
setKeyColumnWidth(tt9.getSettings().getNumpadFnKeyScale());
setBackgroundBlending();
+
+ boolean hasLettersOnAllKeys = tt9.getLanguage() != null && tt9.getLanguage().hasLettersOnAllKeys();
showLongSpace(
- tt9.getSettings().isNumpadShapeLongSpace() && !tt9.isInputModeNumeric() && !tt9.hasLettersOnAllKeys(),
+ tt9.getSettings().isNumpadShapeLongSpace() && !tt9.isInputModeNumeric() && !hasLettersOnAllKeys,
defaultKeyHeight
);
+
for (SoftKey key : getKeys()) {
key.render();
}
diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java
index 4f167850..1e23625e 100644
--- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java
+++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java
@@ -41,7 +41,7 @@ public class SoftKey extends BaseClickableKey {
protected boolean hasLettersOnAllKeys() {
- return tt9 != null && tt9.hasLettersOnAllKeys();
+ return tt9 != null && tt9.getLanguage() != null && tt9.getLanguage().hasLettersOnAllKeys();
}
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index cf71349c..9103f721 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -158,7 +158,7 @@
Жълт бутон
Син бутон
Заглушаване на звук
- Интервал (корейски)
+ Интервал
Говорете
Трябва да разрешите достъпа до микрофона, за да използвате гласовото въвеждане.
Несъвместим гласов асистент
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 6c267907..dc44f3c5 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -147,7 +147,7 @@
Gelber Knopf
Blauer Knopf
Stummschalttaste
- Leertaste (Koreanisch)
+ Leertaste
Sprechen
Sie müssen dem Mikrofon die Erlaubnis erteilen, die Spracheingabe zu verwenden.
Inkompatibler Sprachassistent
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index a99fe921..0e331d38 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -160,7 +160,7 @@
Botón amarillo
Botón azul
Botón de silencio
- Espacio (coreano)
+ Espacio
Hable
Debe otorgar permiso al micrófono para usar la entrada de voz.
Asistente de voz incompatible
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index a853c29a..564d0ffb 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -158,7 +158,7 @@
Bouton jaune
Bouton bleu
Muet
- Espace (coréen)
+ Espace
Parlez
Vous devez accorder l\'autorisation au microphone pour utiliser la saisie vocale.
Assistant vocal incompatible
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index a38380e5..b977fae8 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -148,7 +148,7 @@
Pulsante giallo
Pulsante blu
Muto
- Spazio (coreano)
+ Spazio
Parli
Devi concedere l\'autorizzazione al microfono per utilizzare l\'input vocale.
Assistente vocale incompatibile
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index 569e63c5..2f75d51e 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -161,7 +161,7 @@
כפתור צהוב
כפתור כחול
כפתור השתק
- רווח (קוריאנית)
+ רווח
האזנה
עליך להעניק למיקרופון הרשאה להשתמש בקלט קולי.
עוזר קולי לא תואם
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index ef540e31..30992b0f 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -169,7 +169,7 @@
Geltonas mygtukas
Mėlynas mygtukas
Nutildymo mygt.
- Tarpas (korėjiečių)
+ Tarpas
Kalbėkite
Turite suteikti mikrofonui leidimą naudoti balso įvestį.
Nesuderinamas balso asistentas
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index fc0f6c39..184e54ff 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -148,7 +148,7 @@
Gele knop
Blauwe knop
Stilteknop
- Spatie (Koreaans)
+ Spatie
Spreek
U moet de microfoon toestemming geven om spraakopvoer te gebruiken.
Onverenigbare spraakassistent
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 339b2699..7dab06f6 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -162,7 +162,7 @@
Botão amarelo
Botão azul
Mudo
- Espaço (coreano)
+ Espaço
Fale
Você deve conceder permissão ao microfone para usar a entrada de voz.
Assistente de voz incompatível
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index b1c86c05..4e40885e 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -160,7 +160,7 @@
Жёлтая кнопка
Синяя кнопка
Выключения звука
- Пробел (корейский)
+ Пробел
Говорите
Вы должны предоставить микрофону разрешение на использование голосового ввода.
Несовместимый голосовой ассистент
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 6cc1102d..19b81a6b 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -162,7 +162,7 @@
Sarı düğme
Mavi düğme
Sessiz tuşu
- Boşluk (Korece)
+ Boşluk
Konuşun
Sesli giriş kullanmak için mikrofona izin vermelisiniz.
Uyumsuz sesli asistan
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 3abd8a6f..c98721a4 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -171,7 +171,7 @@
Жовта кнопка
Синя кнопка
Вимкнення звуку
- Пробіл (корейська)
+ Пробіл
Диктуйте
Ви повинні надати мікрофону дозвіл на використання голосового введення.
Несумісний голосовий асистент
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 541dd084..0d4a3f05 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -239,7 +239,7 @@
Del
Mode
Shift
- Space (Korean)
+ Space
Speak
Turning off the microphone…