1
0
Fork 0

the Korean Space key is now just Space key with the correct behavior in all languages

This commit is contained in:
sspanak 2025-04-14 13:09:33 +03:00 committed by Dimo Karaivanov
parent b446e41120
commit a622aa0d70
19 changed files with 61 additions and 32 deletions

View file

@ -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.helpers.TextField;
import io.github.sspanak.tt9.ime.modes.InputMode; import io.github.sspanak.tt9.ime.modes.InputMode;
import io.github.sspanak.tt9.ime.modes.InputModeKind; 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.ui.UI;
import io.github.sspanak.tt9.util.Ternary; import io.github.sspanak.tt9.util.Ternary;
@ -121,7 +122,7 @@ public abstract class HotkeyHandler extends CommandHandler {
} }
if (keyCode == settings.getKeySpaceKorean()) { if (keyCode == settings.getKeySpaceKorean()) {
return onText(" ", validateOnly); return onKeySpaceKorean(validateOnly);
} }
if (keyCode == settings.getKeyShowSettings()) { 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) { public boolean onKeySpaceKorean(boolean validateOnly) {
if (shouldBeOff() || !InputModeKind.isCheonjiin(mInputMode)) { if (shouldBeOff()) {
return false;
}
// type a space when there is nothing to accept
if (suggestionOps.isEmpty() && !onText(" ", validateOnly)) {
return false; return false;
} }
// simulate accept with OK when there are suggestions // simulate accept with OK when there are suggestions
if (!suggestionOps.isEmpty()) { if (!suggestionOps.isEmpty() && LanguageKind.isCJK(mLanguage)) {
onAcceptSuggestionManually(suggestionOps.acceptCurrent(), KeyEvent.KEYCODE_ENTER); if (!validateOnly) {
onAcceptSuggestionManually(suggestionOps.acceptCurrent(), KeyEvent.KEYCODE_ENTER);
}
return true;
} }
return true; // type a space when there is nothing to accept
return onText(" ", validateOnly);
} }

View file

@ -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.modes.InputModeKind;
import io.github.sspanak.tt9.ime.voice.VoiceInputOps; import io.github.sspanak.tt9.ime.voice.VoiceInputOps;
import io.github.sspanak.tt9.languages.Language; 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.preferences.settings.SettingsStore;
import io.github.sspanak.tt9.ui.main.ResizableMainView; 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() { private void resetNormalizedDimensions() {
normalizedWidth = -1; normalizedWidth = -1;
normalizedHeight = -1; normalizedHeight = -1;

View file

@ -63,7 +63,9 @@ public class ModePinyin extends ModeIdeograms {
@Override @Override
public boolean shouldAcceptPreviousSuggestion(int nextKey, boolean hold) { 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) { if (!digitSequence.isEmpty() && !digitSequence.endsWith(SPECIAL_CHAR_SEQUENCE) && nextKey == SPECIAL_CHAR_KEY) {
ignoreNextSpace = true; ignoreNextSpace = true;
} }

View file

@ -14,6 +14,7 @@ abstract public class Language {
protected String currency; protected String currency;
protected String dictionaryFile; protected String dictionaryFile;
protected boolean hasABC = true; protected boolean hasABC = true;
private Boolean hasLettersOnAllKeys = null;
protected boolean hasSpaceBetweenWords = true; protected boolean hasSpaceBetweenWords = true;
protected boolean hasUpperCase = true; protected boolean hasUpperCase = true;
protected boolean hasTranscriptionsEmbedded = false; protected boolean hasTranscriptionsEmbedded = false;
@ -69,6 +70,30 @@ abstract public class Language {
return hasABC; 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() { final public boolean hasSpaceBetweenWords() {
return hasSpaceBetweenWords; return hasSpaceBetweenWords;
} }

View file

@ -281,10 +281,13 @@ class MainLayoutNumpad extends BaseMainLayout {
setWidth(tt9.getSettings().getWidthPercent(), tt9.getSettings().getAlignment()); setWidth(tt9.getSettings().getWidthPercent(), tt9.getSettings().getAlignment());
setKeyColumnWidth(tt9.getSettings().getNumpadFnKeyScale()); setKeyColumnWidth(tt9.getSettings().getNumpadFnKeyScale());
setBackgroundBlending(); setBackgroundBlending();
boolean hasLettersOnAllKeys = tt9.getLanguage() != null && tt9.getLanguage().hasLettersOnAllKeys();
showLongSpace( showLongSpace(
tt9.getSettings().isNumpadShapeLongSpace() && !tt9.isInputModeNumeric() && !tt9.hasLettersOnAllKeys(), tt9.getSettings().isNumpadShapeLongSpace() && !tt9.isInputModeNumeric() && !hasLettersOnAllKeys,
defaultKeyHeight defaultKeyHeight
); );
for (SoftKey key : getKeys()) { for (SoftKey key : getKeys()) {
key.render(); key.render();
} }

View file

@ -41,7 +41,7 @@ public class SoftKey extends BaseClickableKey {
protected boolean hasLettersOnAllKeys() { protected boolean hasLettersOnAllKeys() {
return tt9 != null && tt9.hasLettersOnAllKeys(); return tt9 != null && tt9.getLanguage() != null && tt9.getLanguage().hasLettersOnAllKeys();
} }

View file

@ -158,7 +158,7 @@
<string name="key_yellow">Жълт бутон</string> <string name="key_yellow">Жълт бутон</string>
<string name="key_blue">Син бутон</string> <string name="key_blue">Син бутон</string>
<string name="key_volume_mute">Заглушаване на звук</string> <string name="key_volume_mute">Заглушаване на звук</string>
<string name="virtual_key_space_korean">Интервал (корейски)</string> <string name="virtual_key_space_korean">Интервал</string>
<string name="voice_input_listening">Говорете</string> <string name="voice_input_listening">Говорете</string>
<string name="voice_input_mic_permission_is_needed">Трябва да разрешите достъпа до микрофона, за да използвате гласовото въвеждане.</string> <string name="voice_input_mic_permission_is_needed">Трябва да разрешите достъпа до микрофона, за да използвате гласовото въвеждане.</string>
<string name="voice_input_error_incompatible_voice_service">Несъвместим гласов асистент</string> <string name="voice_input_error_incompatible_voice_service">Несъвместим гласов асистент</string>

View file

@ -147,7 +147,7 @@
<string name="key_yellow">Gelber Knopf</string> <string name="key_yellow">Gelber Knopf</string>
<string name="key_blue">Blauer Knopf</string> <string name="key_blue">Blauer Knopf</string>
<string name="key_volume_mute">Stummschalttaste</string> <string name="key_volume_mute">Stummschalttaste</string>
<string name="virtual_key_space_korean">Leertaste (Koreanisch)</string> <string name="virtual_key_space_korean">Leertaste</string>
<string name="voice_input_listening">Sprechen</string> <string name="voice_input_listening">Sprechen</string>
<string name="voice_input_mic_permission_is_needed">Sie müssen dem Mikrofon die Erlaubnis erteilen, die Spracheingabe zu verwenden.</string> <string name="voice_input_mic_permission_is_needed">Sie müssen dem Mikrofon die Erlaubnis erteilen, die Spracheingabe zu verwenden.</string>
<string name="voice_input_error_incompatible_voice_service">Inkompatibler Sprachassistent</string> <string name="voice_input_error_incompatible_voice_service">Inkompatibler Sprachassistent</string>

View file

@ -160,7 +160,7 @@
<string name="key_yellow">Botón amarillo</string> <string name="key_yellow">Botón amarillo</string>
<string name="key_blue">Botón azul</string> <string name="key_blue">Botón azul</string>
<string name="key_volume_mute">Botón de silencio</string> <string name="key_volume_mute">Botón de silencio</string>
<string name="virtual_key_space_korean">Espacio (coreano)</string> <string name="virtual_key_space_korean">Espacio</string>
<string name="voice_input_listening">Hable</string> <string name="voice_input_listening">Hable</string>
<string name="voice_input_mic_permission_is_needed">Debe otorgar permiso al micrófono para usar la entrada de voz.</string> <string name="voice_input_mic_permission_is_needed">Debe otorgar permiso al micrófono para usar la entrada de voz.</string>
<string name="voice_input_error_incompatible_voice_service">Asistente de voz incompatible</string> <string name="voice_input_error_incompatible_voice_service">Asistente de voz incompatible</string>

View file

@ -158,7 +158,7 @@
<string name="key_yellow">Bouton jaune</string> <string name="key_yellow">Bouton jaune</string>
<string name="key_blue">Bouton bleu</string> <string name="key_blue">Bouton bleu</string>
<string name="key_volume_mute">Muet</string> <string name="key_volume_mute">Muet</string>
<string name="virtual_key_space_korean">Espace (coréen)</string> <string name="virtual_key_space_korean">Espace</string>
<string name="voice_input_listening">Parlez</string> <string name="voice_input_listening">Parlez</string>
<string name="voice_input_mic_permission_is_needed">Vous devez accorder l\'autorisation au microphone pour utiliser la saisie vocale.</string> <string name="voice_input_mic_permission_is_needed">Vous devez accorder l\'autorisation au microphone pour utiliser la saisie vocale.</string>
<string name="voice_input_error_incompatible_voice_service">Assistant vocal incompatible</string> <string name="voice_input_error_incompatible_voice_service">Assistant vocal incompatible</string>

View file

@ -148,7 +148,7 @@
<string name="key_yellow">Pulsante giallo</string> <string name="key_yellow">Pulsante giallo</string>
<string name="key_blue">Pulsante blu</string> <string name="key_blue">Pulsante blu</string>
<string name="key_volume_mute">Muto</string> <string name="key_volume_mute">Muto</string>
<string name="virtual_key_space_korean">Spazio (coreano)</string> <string name="virtual_key_space_korean">Spazio</string>
<string name="voice_input_listening">Parli</string> <string name="voice_input_listening">Parli</string>
<string name="voice_input_mic_permission_is_needed">Devi concedere l\'autorizzazione al microfono per utilizzare l\'input vocale.</string> <string name="voice_input_mic_permission_is_needed">Devi concedere l\'autorizzazione al microfono per utilizzare l\'input vocale.</string>
<string name="voice_input_error_incompatible_voice_service">Assistente vocale incompatibile</string> <string name="voice_input_error_incompatible_voice_service">Assistente vocale incompatibile</string>

View file

@ -161,7 +161,7 @@
<string name="key_yellow">כפתור צהוב</string> <string name="key_yellow">כפתור צהוב</string>
<string name="key_blue">כפתור כחול</string> <string name="key_blue">כפתור כחול</string>
<string name="key_volume_mute">כפתור השתק</string> <string name="key_volume_mute">כפתור השתק</string>
<string name="virtual_key_space_korean">רווח (קוריאנית)</string> <string name="virtual_key_space_korean">רווח</string>
<string name="voice_input_listening">האזנה</string> <string name="voice_input_listening">האזנה</string>
<string name="voice_input_mic_permission_is_needed">עליך להעניק למיקרופון הרשאה להשתמש בקלט קולי.</string> <string name="voice_input_mic_permission_is_needed">עליך להעניק למיקרופון הרשאה להשתמש בקלט קולי.</string>
<string name="voice_input_error_incompatible_voice_service">עוזר קולי לא תואם</string> <string name="voice_input_error_incompatible_voice_service">עוזר קולי לא תואם</string>

View file

@ -169,7 +169,7 @@
<string name="key_yellow">Geltonas mygtukas</string> <string name="key_yellow">Geltonas mygtukas</string>
<string name="key_blue">Mėlynas mygtukas</string> <string name="key_blue">Mėlynas mygtukas</string>
<string name="key_volume_mute">Nutildymo mygt.</string> <string name="key_volume_mute">Nutildymo mygt.</string>
<string name="virtual_key_space_korean">Tarpas (korėjiečių)</string> <string name="virtual_key_space_korean">Tarpas</string>
<string name="voice_input_listening">Kalbėkite</string> <string name="voice_input_listening">Kalbėkite</string>
<string name="voice_input_mic_permission_is_needed">Turite suteikti mikrofonui leidimą naudoti balso įvestį.</string> <string name="voice_input_mic_permission_is_needed">Turite suteikti mikrofonui leidimą naudoti balso įvestį.</string>
<string name="voice_input_error_incompatible_voice_service">Nesuderinamas balso asistentas</string> <string name="voice_input_error_incompatible_voice_service">Nesuderinamas balso asistentas</string>

View file

@ -148,7 +148,7 @@
<string name="key_yellow">Gele knop</string> <string name="key_yellow">Gele knop</string>
<string name="key_blue">Blauwe knop</string> <string name="key_blue">Blauwe knop</string>
<string name="key_volume_mute">Stilteknop</string> <string name="key_volume_mute">Stilteknop</string>
<string name="virtual_key_space_korean">Spatie (Koreaans)</string> <string name="virtual_key_space_korean">Spatie</string>
<string name="voice_input_listening">Spreek</string> <string name="voice_input_listening">Spreek</string>
<string name="voice_input_mic_permission_is_needed">U moet de microfoon toestemming geven om spraakopvoer te gebruiken.</string> <string name="voice_input_mic_permission_is_needed">U moet de microfoon toestemming geven om spraakopvoer te gebruiken.</string>
<string name="voice_input_error_incompatible_voice_service">Onverenigbare spraakassistent</string> <string name="voice_input_error_incompatible_voice_service">Onverenigbare spraakassistent</string>

View file

@ -162,7 +162,7 @@
<string name="key_yellow">Botão amarelo</string> <string name="key_yellow">Botão amarelo</string>
<string name="key_blue">Botão azul</string> <string name="key_blue">Botão azul</string>
<string name="key_volume_mute">Mudo</string> <string name="key_volume_mute">Mudo</string>
<string name="virtual_key_space_korean">Espaço (coreano)</string> <string name="virtual_key_space_korean">Espaço</string>
<string name="voice_input_listening">Fale</string> <string name="voice_input_listening">Fale</string>
<string name="voice_input_mic_permission_is_needed">Você deve conceder permissão ao microfone para usar a entrada de voz.</string> <string name="voice_input_mic_permission_is_needed">Você deve conceder permissão ao microfone para usar a entrada de voz.</string>
<string name="voice_input_error_incompatible_voice_service">Assistente de voz incompatível</string> <string name="voice_input_error_incompatible_voice_service">Assistente de voz incompatível</string>

View file

@ -160,7 +160,7 @@
<string name="key_yellow">Жёлтая кнопка</string> <string name="key_yellow">Жёлтая кнопка</string>
<string name="key_blue">Синяя кнопка</string> <string name="key_blue">Синяя кнопка</string>
<string name="key_volume_mute">Выключения звука</string> <string name="key_volume_mute">Выключения звука</string>
<string name="virtual_key_space_korean">Пробел (корейский)</string> <string name="virtual_key_space_korean">Пробел</string>
<string name="voice_input_listening">Говорите</string> <string name="voice_input_listening">Говорите</string>
<string name="voice_input_mic_permission_is_needed">Вы должны предоставить микрофону разрешение на использование голосового ввода.</string> <string name="voice_input_mic_permission_is_needed">Вы должны предоставить микрофону разрешение на использование голосового ввода.</string>
<string name="voice_input_error_incompatible_voice_service">Несовместимый голосовой ассистент</string> <string name="voice_input_error_incompatible_voice_service">Несовместимый голосовой ассистент</string>

View file

@ -162,7 +162,7 @@
<string name="key_yellow">Sarı düğme</string> <string name="key_yellow">Sarı düğme</string>
<string name="key_blue">Mavi düğme</string> <string name="key_blue">Mavi düğme</string>
<string name="key_volume_mute">Sessiz tuşu</string> <string name="key_volume_mute">Sessiz tuşu</string>
<string name="virtual_key_space_korean">Boşluk (Korece)</string> <string name="virtual_key_space_korean">Boşluk</string>
<string name="voice_input_listening">Konuşun</string> <string name="voice_input_listening">Konuşun</string>
<string name="voice_input_mic_permission_is_needed">Sesli giriş kullanmak için mikrofona izin vermelisiniz.</string> <string name="voice_input_mic_permission_is_needed">Sesli giriş kullanmak için mikrofona izin vermelisiniz.</string>
<string name="voice_input_error_incompatible_voice_service">Uyumsuz sesli asistan</string> <string name="voice_input_error_incompatible_voice_service">Uyumsuz sesli asistan</string>

View file

@ -171,7 +171,7 @@
<string name="key_yellow">Жовта кнопка</string> <string name="key_yellow">Жовта кнопка</string>
<string name="key_blue">Синя кнопка</string> <string name="key_blue">Синя кнопка</string>
<string name="key_volume_mute">Вимкнення звуку</string> <string name="key_volume_mute">Вимкнення звуку</string>
<string name="virtual_key_space_korean">Пробіл (корейська)</string> <string name="virtual_key_space_korean">Пробіл</string>
<string name="voice_input_listening">Диктуйте</string> <string name="voice_input_listening">Диктуйте</string>
<string name="voice_input_mic_permission_is_needed">Ви повинні надати мікрофону дозвіл на використання голосового введення.</string> <string name="voice_input_mic_permission_is_needed">Ви повинні надати мікрофону дозвіл на використання голосового введення.</string>
<string name="voice_input_error_incompatible_voice_service">Несумісний голосовий асистент</string> <string name="voice_input_error_incompatible_voice_service">Несумісний голосовий асистент</string>

View file

@ -239,7 +239,7 @@
<string name="virtual_key_del" translatable="false">Del</string> <string name="virtual_key_del" translatable="false">Del</string>
<string name="virtual_key_input_mode" translatable="false">Mode</string> <string name="virtual_key_input_mode" translatable="false">Mode</string>
<string name="virtual_key_shift" translatable="false">Shift</string> <string name="virtual_key_shift" translatable="false">Shift</string>
<string name="virtual_key_space_korean">Space (Korean)</string> <string name="virtual_key_space_korean">Space</string>
<string name="voice_input_listening">Speak</string> <string name="voice_input_listening">Speak</string>
<string name="voice_input_stopping">Turning off the microphone…</string> <string name="voice_input_stopping">Turning off the microphone…</string>