diff --git a/app/src/keyboards/java/be/scri/services/EnglishKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/EnglishKeyboardIME.kt index 5cfbb8cf..549281da 100644 --- a/app/src/keyboards/java/be/scri/services/EnglishKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/EnglishKeyboardIME.kt @@ -6,11 +6,12 @@ import android.text.InputType import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler +import be.scri.models.ScribeLanguage /** * The EnglishKeyboardIME class provides the input method for the English language keyboard. */ -class EnglishKeyboardIME : GeneralKeyboardIME("English") { +class EnglishKeyboardIME : GeneralKeyboardIME(ScribeLanguage.ENGLISH) { override fun getKeyboardLayoutXML(): Int = when { isTablet() -> R.xml.keys_letters_english_tablet diff --git a/app/src/keyboards/java/be/scri/services/FrenchKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/FrenchKeyboardIME.kt index fdd26509..bf077ebd 100644 --- a/app/src/keyboards/java/be/scri/services/FrenchKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/FrenchKeyboardIME.kt @@ -6,11 +6,12 @@ import android.text.InputType import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler +import be.scri.models.ScribeLanguage /** * The FrenchKeyboardIME class provides the input method for the French language keyboard. */ -class FrenchKeyboardIME : GeneralKeyboardIME("French") { +class FrenchKeyboardIME : GeneralKeyboardIME(ScribeLanguage.FRENCH) { override fun getKeyboardLayoutXML(): Int = when { isTablet() -> R.xml.keys_letters_french_tablet diff --git a/app/src/keyboards/java/be/scri/services/GeneralKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/GeneralKeyboardIME.kt index dc831952..fb5a198e 100644 --- a/app/src/keyboards/java/be/scri/services/GeneralKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/GeneralKeyboardIME.kt @@ -68,6 +68,7 @@ import be.scri.helpers.clipboard.ClipboardHandler import be.scri.helpers.data.AutocompletionDataManager import be.scri.helpers.english.ENInterfaceVariables.ALREADY_PLURAL_MSG import be.scri.helpers.ui.KeyboardUIManager +import be.scri.models.ScribeLanguage import be.scri.models.ScribeState import be.scri.views.KeyboardView import java.util.Locale @@ -77,11 +78,16 @@ private const val DATA_CONSTANT_3 = 3 @Suppress("TooManyFunctions", "LargeClass") abstract class GeneralKeyboardIME( - override var language: String, + val scribeLanguage: ScribeLanguage, ) : InputMethodService(), KeyboardView.OnKeyboardActionListener, KeyboardUIManager.KeyboardUIListener, KeyboardBase.KeyboardContextProvider { + constructor(languageName: String) : this(ScribeLanguage.fromDisplayName(languageName)) + + override val language: String + get() = scribeLanguage.displayName + // Abstract members required by subclasses (like EnglishKeyboardIME). abstract override fun getKeyboardLayoutXML(): Int diff --git a/app/src/keyboards/java/be/scri/services/GermanKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/GermanKeyboardIME.kt index c67e2df6..ff9a670b 100644 --- a/app/src/keyboards/java/be/scri/services/GermanKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/GermanKeyboardIME.kt @@ -7,11 +7,12 @@ import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler import be.scri.helpers.PreferencesHelper.getIsAccentCharacterDisabled +import be.scri.models.ScribeLanguage /** * The GermanKeyboardIME class provides the input method for the German language keyboard. */ -class GermanKeyboardIME : GeneralKeyboardIME("German") { +class GermanKeyboardIME : GeneralKeyboardIME(ScribeLanguage.GERMAN) { override fun getKeyboardLayoutXML(): Int = if (isTablet()) { R.xml.keys_letters_german_tablet diff --git a/app/src/keyboards/java/be/scri/services/ItalianKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/ItalianKeyboardIME.kt index 2579944f..a83eac3e 100644 --- a/app/src/keyboards/java/be/scri/services/ItalianKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/ItalianKeyboardIME.kt @@ -6,11 +6,12 @@ import android.text.InputType import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler +import be.scri.models.ScribeLanguage /** * The ItalianKeyboardIME class provides the input method for the Italian language keyboard. */ -class ItalianKeyboardIME : GeneralKeyboardIME("Italian") { +class ItalianKeyboardIME : GeneralKeyboardIME(ScribeLanguage.ITALIAN) { override fun getKeyboardLayoutXML(): Int = when { isTablet() -> R.xml.keys_letters_italian_tablet diff --git a/app/src/keyboards/java/be/scri/services/PortugueseKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/PortugueseKeyboardIME.kt index ecad059d..af3cbb4d 100644 --- a/app/src/keyboards/java/be/scri/services/PortugueseKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/PortugueseKeyboardIME.kt @@ -6,11 +6,12 @@ import android.text.InputType import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler +import be.scri.models.ScribeLanguage /** * The PortugueseKeyboardIME class provides the input method for the Portuguese language keyboard. */ -class PortugueseKeyboardIME : GeneralKeyboardIME("Portuguese") { +class PortugueseKeyboardIME : GeneralKeyboardIME(ScribeLanguage.PORTUGUESE) { override fun getKeyboardLayoutXML(): Int = when { isTablet() -> R.xml.keys_letters_portuguese_tablet diff --git a/app/src/keyboards/java/be/scri/services/RussianKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/RussianKeyboardIME.kt index 6ff94536..088860ee 100644 --- a/app/src/keyboards/java/be/scri/services/RussianKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/RussianKeyboardIME.kt @@ -6,11 +6,12 @@ import android.text.InputType import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler +import be.scri.models.ScribeLanguage /** * The RussianKeyboardIME class provides the input method for the Russian language keyboard. */ -class RussianKeyboardIME : GeneralKeyboardIME("Russian") { +class RussianKeyboardIME : GeneralKeyboardIME(ScribeLanguage.RUSSIAN) { override fun getKeyboardLayoutXML(): Int = when { isTablet() -> R.xml.keys_letters_russian_tablet diff --git a/app/src/keyboards/java/be/scri/services/SpanishKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/SpanishKeyboardIME.kt index 3227b348..7535de6d 100644 --- a/app/src/keyboards/java/be/scri/services/SpanishKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/SpanishKeyboardIME.kt @@ -7,11 +7,12 @@ import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler import be.scri.helpers.PreferencesHelper.getIsAccentCharacterDisabled +import be.scri.models.ScribeLanguage /** * The SpanishKeyboardIME class provides the input method for the Spanish language keyboard. */ -class SpanishKeyboardIME : GeneralKeyboardIME("Spanish") { +class SpanishKeyboardIME : GeneralKeyboardIME(ScribeLanguage.SPANISH) { override fun getKeyboardLayoutXML(): Int = when { isTablet() -> R.xml.keys_letters_spanish_tablet diff --git a/app/src/keyboards/java/be/scri/services/SwedishKeyboardIME.kt b/app/src/keyboards/java/be/scri/services/SwedishKeyboardIME.kt index ebc4dca8..081e3719 100644 --- a/app/src/keyboards/java/be/scri/services/SwedishKeyboardIME.kt +++ b/app/src/keyboards/java/be/scri/services/SwedishKeyboardIME.kt @@ -7,11 +7,12 @@ import android.view.inputmethod.EditorInfo.IME_ACTION_NONE import be.scri.R import be.scri.helpers.KeyHandler import be.scri.helpers.PreferencesHelper.getIsAccentCharacterDisabled +import be.scri.models.ScribeLanguage /** * The SwedishKeyboardIME class provides the input method for the Swedish language keyboard. */ -class SwedishKeyboardIME : GeneralKeyboardIME("Swedish") { +class SwedishKeyboardIME : GeneralKeyboardIME(ScribeLanguage.SWEDISH) { override fun getKeyboardLayoutXML(): Int = when { isTablet() -> R.xml.keys_letters_swedish_tablet diff --git a/app/src/main/java/be/scri/helpers/LanguageMappingConstants.kt b/app/src/main/java/be/scri/helpers/LanguageMappingConstants.kt index 9e9d2108..6a11a2b3 100644 --- a/app/src/main/java/be/scri/helpers/LanguageMappingConstants.kt +++ b/app/src/main/java/be/scri/helpers/LanguageMappingConstants.kt @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later package be.scri.helpers +import be.scri.models.ScribeLanguage + /** * Object containing constant mappings related to language-specific data. * This includes conversions for grammatical annotations. @@ -27,6 +29,11 @@ object LanguageMappingConstants { "Russian" to mapOf("F" to "Ж", "M" to "М", "N" to "Н"), ) + /** + * Converts a [ScribeLanguage] to its two-letter ISO alias (e.g., "EN"). + */ + fun getLanguageAlias(language: ScribeLanguage): String = language.isoCode + /** * Converts a full language name (e.g., "English") to its two-letter ISO alias (e.g., "EN"). * @@ -34,16 +41,5 @@ object LanguageMappingConstants { * * @return The two-letter alias. */ - fun getLanguageAlias(language: String): String = - when (language) { - "English" -> "EN" - "French" -> "FR" - "German" -> "DE" - "Italian" -> "IT" - "Portuguese" -> "PT" - "Russian" -> "RU" - "Spanish" -> "ES" - "Swedish" -> "SV" - else -> "" - } + fun getLanguageAlias(language: String): String = ScribeLanguage.fromDisplayName(language).isoCode } diff --git a/app/src/main/java/be/scri/models/ScribeLanguage.kt b/app/src/main/java/be/scri/models/ScribeLanguage.kt new file mode 100644 index 00000000..448181a7 --- /dev/null +++ b/app/src/main/java/be/scri/models/ScribeLanguage.kt @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package be.scri.models + +/** + * Represents the supported languages in Scribe. + * + * @property displayName The human-readable name of the language (e.g., "English"). + * @property isoCode The two-letter ISO code for the language (e.g., "EN"). + */ +enum class ScribeLanguage( + val displayName: String, + val isoCode: String, +) { + ENGLISH("English", "EN"), + FRENCH("French", "FR"), + GERMAN("German", "DE"), + ITALIAN("Italian", "IT"), + PORTUGUESE("Portuguese", "PT"), + RUSSIAN("Russian", "RU"), + SPANISH("Spanish", "ES"), + SWEDISH("Swedish", "SV"), + ; + + companion object { + /** + * Resolves a [ScribeLanguage] from a display name, ISO code, or string representation. + * Case-insensitive matching. Defaults to [ENGLISH] if not found. + * + * @param value The string name or code to parse. + * @return The matching [ScribeLanguage], or [ENGLISH] as fallback. + */ + fun fromString(value: String?): ScribeLanguage { + if (value.isNullOrBlank()) return ENGLISH + val trimmed = value.trim() + return entries.firstOrNull { lang -> + lang.displayName.equals(trimmed, ignoreCase = true) || + lang.isoCode.equals(trimmed, ignoreCase = true) || + lang.name.equals(trimmed, ignoreCase = true) + } ?: ENGLISH + } + + /** + * Resolves a [ScribeLanguage] from a display name (e.g., "English", "French"). + */ + fun fromDisplayName(displayName: String?): ScribeLanguage = fromString(displayName) + + /** + * Resolves a [ScribeLanguage] from a two-letter ISO code (e.g., "EN", "FR"). + */ + fun fromIsoCode(isoCode: String?): ScribeLanguage = fromString(isoCode) + } +}