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

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

View file

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

View file

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

View file

@ -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();
}

View file

@ -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();
}

View file

@ -158,7 +158,7 @@
<string name="key_yellow">Жълт бутон</string>
<string name="key_blue">Син бутон</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_mic_permission_is_needed">Трябва да разрешите достъпа до микрофона, за да използвате гласовото въвеждане.</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_blue">Blauer Knopf</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_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>

View file

@ -160,7 +160,7 @@
<string name="key_yellow">Botón amarillo</string>
<string name="key_blue">Botón azul</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_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>

View file

@ -158,7 +158,7 @@
<string name="key_yellow">Bouton jaune</string>
<string name="key_blue">Bouton bleu</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_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>

View file

@ -148,7 +148,7 @@
<string name="key_yellow">Pulsante giallo</string>
<string name="key_blue">Pulsante blu</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_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>

View file

@ -161,7 +161,7 @@
<string name="key_yellow">כפתור צהוב</string>
<string name="key_blue">כפתור כחול</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_mic_permission_is_needed">עליך להעניק למיקרופון הרשאה להשתמש בקלט קולי.</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_blue">Mėlynas mygtukas</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_mic_permission_is_needed">Turite suteikti mikrofonui leidimą naudoti balso įvestį.</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_blue">Blauwe knop</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_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>

View file

@ -162,7 +162,7 @@
<string name="key_yellow">Botão amarelo</string>
<string name="key_blue">Botão azul</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_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>

View file

@ -160,7 +160,7 @@
<string name="key_yellow">Жёлтая кнопка</string>
<string name="key_blue">Синяя кнопка</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_mic_permission_is_needed">Вы должны предоставить микрофону разрешение на использование голосового ввода.</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_blue">Mavi düğme</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_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>

View file

@ -171,7 +171,7 @@
<string name="key_yellow">Жовта кнопка</string>
<string name="key_blue">Синя кнопка</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_mic_permission_is_needed">Ви повинні надати мікрофону дозвіл на використання голосового введення.</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_input_mode" translatable="false">Mode</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_stopping">Turning off the microphone…</string>