From 912ba45d5eaddb56f9363bc7b802094d2c761287 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 8 Mar 2025 07:35:08 +0100 Subject: [PATCH 001/175] fix default additional subtypes --- .../main/java/helium314/keyboard/latin/settings/Defaults.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt index 0301409ba..40b2bd6cc 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt @@ -74,9 +74,9 @@ object Defaults { const val PREF_LANGUAGE_SWITCH_KEY = "internal" const val PREF_SHOW_EMOJI_KEY = false const val PREF_VARIABLE_TOOLBAR_DIRECTION = true - const val PREF_ADDITIONAL_SUBTYPES = "de${Separators.SET}${ExtraValue.KEYBOARD_LAYOUT_SET}=qwerty${Separators.SETS}" + - "fr${Separators.SET}${ExtraValue.KEYBOARD_LAYOUT_SET}=qwertz${Separators.SETS}" + - "hu${Separators.SET}${ExtraValue.KEYBOARD_LAYOUT_SET}=qwerty" + const val PREF_ADDITIONAL_SUBTYPES = "de${Separators.SET}${ExtraValue.KEYBOARD_LAYOUT_SET}=MAIN:qwerty${Separators.SETS}" + + "fr${Separators.SET}${ExtraValue.KEYBOARD_LAYOUT_SET}=MAIN:qwertz${Separators.SETS}" + + "hu${Separators.SET}${ExtraValue.KEYBOARD_LAYOUT_SET}=MAIN:qwerty" const val PREF_ENABLE_SPLIT_KEYBOARD = false const val PREF_ENABLE_SPLIT_KEYBOARD_LANDSCAPE = false const val PREF_SPLIT_SPACER_SCALE = SettingsValues.DEFAULT_SIZE_SCALE From fa9ac20d39cf28fb9a4f56c44be404f41298ab08 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 8 Mar 2025 07:35:49 +0100 Subject: [PATCH 002/175] fix edited subtypes not showing up when they weren't enabled --- .../helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt index 048a7410b..8056dca20 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt @@ -81,6 +81,8 @@ object SubtypeUtilsAdditional { SubtypeSettings.removeEnabledSubtype(context, fromSubtype) SubtypeSettings.addEnabledSubtype(prefs, toSubtype) } + if (!isEnabled && !isSelected) + SubtypeSettings.reloadEnabledSubtypes(context) } fun createAdditionalSubtypes(prefSubtypes: String): List { From 15c1526895f6667b57428d205a8eab60ed910b32 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 8 Mar 2025 07:48:15 +0100 Subject: [PATCH 003/175] toAdditional subtype not nullable any more was causing too much trouble and only was in there because "it always has been there" --- .../latin/settings/SettingsSubtype.kt | 20 ++----------------- .../keyboard/latin/utils/SubtypeSettings.kt | 13 ++++-------- .../latin/utils/SubtypeUtilsAdditional.kt | 10 +++++----- .../settings/dialogs/SubtypeDialog.kt | 4 ++-- 4 files changed, 13 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsSubtype.kt b/app/src/main/java/helium314/keyboard/latin/settings/SettingsSubtype.kt index a5745295b..62899ddb8 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsSubtype.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsSubtype.kt @@ -11,11 +11,9 @@ import helium314.keyboard.latin.common.LocaleUtils.constructLocale import helium314.keyboard.latin.define.DebugFlags import helium314.keyboard.latin.utils.LayoutType import helium314.keyboard.latin.utils.LayoutType.Companion.toExtraValue -import helium314.keyboard.latin.utils.LayoutUtilsCustom import helium314.keyboard.latin.utils.Log import helium314.keyboard.latin.utils.ScriptUtils import helium314.keyboard.latin.utils.ScriptUtils.script -import helium314.keyboard.latin.utils.SubtypeLocaleUtils import helium314.keyboard.latin.utils.SubtypeUtilsAdditional import helium314.keyboard.latin.utils.locale import java.util.Locale @@ -27,23 +25,9 @@ data class SettingsSubtype(val locale: Locale, val extraValues: String) { /** Creates an additional subtype from the SettingsSubtype. * Resulting InputMethodSubtypes are equal if SettingsSubtypes are equal */ - fun toAdditionalSubtype(): InputMethodSubtype? { + fun toAdditionalSubtype(): InputMethodSubtype { val asciiCapable = locale.script() == ScriptUtils.SCRIPT_LATIN - val subtype = SubtypeUtilsAdditional.createAdditionalSubtype(locale, extraValues, asciiCapable, true) - - // todo: this is returns null for all non-latin layouts - // either fix it, or remove the check - // if removed, removing a layout will result in fallback qwerty even for non-ascii, but this is better than the current alternative -/* if (subtype.nameResId == SubtypeLocaleUtils.UNKNOWN_KEYBOARD_LAYOUT - && mainLayoutName()?.endsWith("+") != true // "+" layouts and custom layouts are always "unknown" - && !LayoutUtilsCustom.isCustomLayout(mainLayoutName() ?: SubtypeLocaleUtils.QWERTY) - ) { - // Skip unknown keyboard layout subtype. This may happen when predefined keyboard - // layout has been removed. - Log.w(SettingsSubtype::class.simpleName, "unknown additional subtype $this") - return null - }*/ - return subtype + return SubtypeUtilsAdditional.createAdditionalSubtype(locale, extraValues, asciiCapable, true) } fun mainLayoutName() = LayoutType.getMainLayoutFromExtraValue(extraValues) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt index 18739953b..82388aeb8 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt @@ -74,10 +74,8 @@ object SubtypeSettings { fun getSelectedSubtype(prefs: SharedPreferences): InputMethodSubtype { val selectedSubtype = prefs.getString(Settings.PREF_SELECTED_SUBTYPE, Defaults.PREF_SELECTED_SUBTYPE)!!.toSettingsSubtype() - if (selectedSubtype.isAdditionalSubtype(prefs)) { - val selectedAdditionalSubtype = selectedSubtype.toAdditionalSubtype() - if (selectedAdditionalSubtype != null) return selectedAdditionalSubtype - } + if (selectedSubtype.isAdditionalSubtype(prefs)) + return selectedSubtype.toAdditionalSubtype() // no additional subtype, must be a resource subtype val subtype = enabledSubtypes.firstOrNull { it.toSettingsSubtype() == selectedSubtype } @@ -224,11 +222,8 @@ object SubtypeSettings { .split(Separators.SETS).filter { it.isNotEmpty() }.map { it.toSettingsSubtype() } for (settingsSubtype in settingsSubtypes) { if (settingsSubtype.isAdditionalSubtype(prefs)) { - val additionalSubtype = settingsSubtype.toAdditionalSubtype() - if (additionalSubtype != null) { - enabledSubtypes.add(additionalSubtype) - continue - } + enabledSubtypes.add(settingsSubtype.toAdditionalSubtype()) + continue } val subtypesForLocale = resourceSubtypesByLocale[settingsSubtype.locale] if (subtypesForLocale == null) { diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt index 8056dca20..f110d59df 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt @@ -72,12 +72,12 @@ object SubtypeUtilsAdditional { } + to.toPref() prefs.edit().putString(Settings.PREF_ADDITIONAL_SUBTYPES, new.joinToString(Separators.SETS)).apply() - val fromSubtype = from.toAdditionalSubtype() // will be null if we edit a resource subtype - val toSubtype = to.toAdditionalSubtype() // should never be null - if (isSelected && toSubtype != null) { + val fromSubtype = from.toAdditionalSubtype() + val toSubtype = to.toAdditionalSubtype() + if (isSelected) { SubtypeSettings.setSelectedSubtype(prefs, toSubtype) } - if (fromSubtype != null && isEnabled && toSubtype != null) { + if (isEnabled) { SubtypeSettings.removeEnabledSubtype(context, fromSubtype) SubtypeSettings.addEnabledSubtype(prefs, toSubtype) } @@ -88,7 +88,7 @@ object SubtypeUtilsAdditional { fun createAdditionalSubtypes(prefSubtypes: String): List { if (prefSubtypes.isEmpty()) return emptyList() - return prefSubtypes.split(Separators.SETS).mapNotNull { it.toSettingsSubtype().toAdditionalSubtype() } + return prefSubtypes.split(Separators.SETS).map { it.toSettingsSubtype().toAdditionalSubtype() } } fun createPrefSubtypes(subtypes: Collection): String { diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt index 7da713ec3..1c59b96ed 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt @@ -125,8 +125,8 @@ fun SubtypeDialog( onConfirmed = { onConfirmed(currentSubtype) }, neutralButtonText = if (initialSubtype.isAdditionalSubtype(prefs)) stringResource(R.string.delete) else null, onNeutral = { - SubtypeUtilsAdditional.removeAdditionalSubtype(ctx, initialSubtype.toAdditionalSubtype()!!) - SubtypeSettings.removeEnabledSubtype(ctx, initialSubtype.toAdditionalSubtype()!!) + SubtypeUtilsAdditional.removeAdditionalSubtype(ctx, initialSubtype.toAdditionalSubtype()) + SubtypeSettings.removeEnabledSubtype(ctx, initialSubtype.toAdditionalSubtype()) onDismissRequest() }, title = { From a4d96a12a990636408e58aa6019b8be4fca8612a Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 8 Mar 2025 09:05:33 +0100 Subject: [PATCH 004/175] fix some issues with subtypes being disabled or not shown as enabled after editing --- .../latin/settings/SettingsSubtype.kt | 2 +- .../latin/utils/SubtypeUtilsAdditional.kt | 27 ++++++++++--------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsSubtype.kt b/app/src/main/java/helium314/keyboard/latin/settings/SettingsSubtype.kt index 62899ddb8..ca18b7fda 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsSubtype.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsSubtype.kt @@ -38,7 +38,7 @@ data class SettingsSubtype(val locale: Locale, val extraValues: String) { val newList = extraValues.split(",") .filterNot { it.isBlank() || it.startsWith("$extraValueKey=") || it == extraValueKey } val newValue = if (extraValue == null) extraValueKey else "$extraValueKey=$extraValue" - val newValues = (newList + newValue).joinToString(",") + val newValues = (newList + newValue).sorted().joinToString(",") return copy(extraValues = newValues) } diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt index f110d59df..53ac40e1a 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt @@ -74,6 +74,12 @@ object SubtypeUtilsAdditional { val fromSubtype = from.toAdditionalSubtype() val toSubtype = to.toAdditionalSubtype() + if (SubtypeSettings.getResourceSubtypesForLocale(to.locale).any { it.toSettingsSubtype() == to }) { + // all settings changed to default -> make additional subtype disappear as magically as it was added + // if we don't do this, enabling the base subtype will result in the additional subtype being enabled, + // as both have the same settingsSubtype + removeAdditionalSubtype(context, toSubtype) + } if (isSelected) { SubtypeSettings.setSelectedSubtype(prefs, toSubtype) } @@ -81,21 +87,18 @@ object SubtypeUtilsAdditional { SubtypeSettings.removeEnabledSubtype(context, fromSubtype) SubtypeSettings.addEnabledSubtype(prefs, toSubtype) } - if (!isEnabled && !isSelected) - SubtypeSettings.reloadEnabledSubtypes(context) + // reloading is often unnecessary, but fast enough to not care about calling it only when necessary + SubtypeSettings.reloadEnabledSubtypes(context) } - fun createAdditionalSubtypes(prefSubtypes: String): List { - if (prefSubtypes.isEmpty()) - return emptyList() - return prefSubtypes.split(Separators.SETS).map { it.toSettingsSubtype().toAdditionalSubtype() } - } + fun createAdditionalSubtypes(prefSubtypes: String): List = + prefSubtypes.split(Separators.SETS).mapNotNull { + if (it.isEmpty()) null + else it.toSettingsSubtype().toAdditionalSubtype() + } - fun createPrefSubtypes(subtypes: Collection): String { - if (subtypes.isEmpty()) - return "" - return subtypes.joinToString(Separators.SETS) { it.toSettingsSubtype().toPref() } - } + fun createPrefSubtypes(subtypes: Collection): String = + subtypes.joinToString(Separators.SETS) { it.toSettingsSubtype().toPref() } private fun getNameResId(locale: Locale, mainLayoutName: String): Int { val nameId = SubtypeLocaleUtils.getSubtypeNameResId(locale, mainLayoutName) From e1f02dab31072b4054f110fd1bc5d099641e49f1 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 8 Mar 2025 09:23:41 +0100 Subject: [PATCH 005/175] add some tests for subtype enablement --- .../java/helium314/keyboard/SubtypeTest.kt | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 app/src/test/java/helium314/keyboard/SubtypeTest.kt diff --git a/app/src/test/java/helium314/keyboard/SubtypeTest.kt b/app/src/test/java/helium314/keyboard/SubtypeTest.kt new file mode 100644 index 000000000..a101c07d9 --- /dev/null +++ b/app/src/test/java/helium314/keyboard/SubtypeTest.kt @@ -0,0 +1,75 @@ +package helium314.keyboard + +import helium314.keyboard.keyboard.KeyboardId +import helium314.keyboard.keyboard.KeyboardLayoutSet +import helium314.keyboard.keyboard.internal.KeyboardParams +import helium314.keyboard.keyboard.internal.keyboard_parser.POPUP_KEYS_NORMAL +import helium314.keyboard.keyboard.internal.keyboard_parser.addLocaleKeyTextsToParams +import helium314.keyboard.latin.LatinIME +import helium314.keyboard.latin.common.LocaleUtils.constructLocale +import helium314.keyboard.latin.settings.Settings +import helium314.keyboard.latin.settings.SettingsSubtype.Companion.toSettingsSubtype +import helium314.keyboard.latin.utils.LayoutType +import helium314.keyboard.latin.utils.POPUP_KEYS_LAYOUT +import helium314.keyboard.latin.utils.SubtypeSettings +import helium314.keyboard.latin.utils.SubtypeUtilsAdditional +import helium314.keyboard.latin.utils.prefs +import org.junit.runner.RunWith +import org.robolectric.Robolectric +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +import org.robolectric.shadows.ShadowLog +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +@RunWith(RobolectricTestRunner::class) +@Config(shadows = [ + ShadowInputMethodManager2::class +]) +class SubtypeTest { + private lateinit var latinIME: LatinIME + private lateinit var params: KeyboardParams + + @BeforeTest fun setUp() { + latinIME = Robolectric.setupService(LatinIME::class.java) + ShadowLog.setupLogging() + ShadowLog.stream = System.out + params = KeyboardParams() + params.mId = KeyboardLayoutSet.getFakeKeyboardId(KeyboardId.ELEMENT_ALPHABET) + params.mPopupKeyTypes.add(POPUP_KEYS_LAYOUT) + addLocaleKeyTextsToParams(latinIME, params, POPUP_KEYS_NORMAL) + } + + @Test fun emptyAdditionalSubtypesResultsInEmptyList() { + // avoid issues where empty string results in additional subtype for undefined locale + val prefs = latinIME.prefs() + prefs.edit().putString(Settings.PREF_ADDITIONAL_SUBTYPES, "").apply() + assertTrue(SubtypeSettings.getAdditionalSubtypes().isEmpty()) + val from = SubtypeSettings.getResourceSubtypesForLocale("es".constructLocale()).first() + + // no change, and "changed" subtype actually is resource subtype -> still expect empty list + SubtypeUtilsAdditional.changeAdditionalSubtype(from.toSettingsSubtype(), from.toSettingsSubtype(), latinIME) + assertEquals(emptyList(), SubtypeSettings.getAdditionalSubtypes().map { it.toSettingsSubtype() }) + } + + @Test fun subtypeStaysEnabledOnEdits() { + val prefs = latinIME.prefs() + prefs.edit().putString(Settings.PREF_ADDITIONAL_SUBTYPES, "").apply() // clear it for convenience + + // edit enabled resource subtype + val from = SubtypeSettings.getResourceSubtypesForLocale("es".constructLocale()).first() + SubtypeSettings.addEnabledSubtype(prefs, from) + val to = from.toSettingsSubtype().withLayout(LayoutType.SYMBOLS, "symbols_arabic") + SubtypeUtilsAdditional.changeAdditionalSubtype(from.toSettingsSubtype(), to, latinIME) + assertEquals(to, SubtypeSettings.getEnabledSubtypes(false).single().toSettingsSubtype()) + + // change the new subtype to effectively be the same as original resource subtype + val toNew = to.withoutLayout(LayoutType.SYMBOLS) + assertEquals(from.toSettingsSubtype(), toNew) + SubtypeUtilsAdditional.changeAdditionalSubtype(to, toNew, latinIME) + assertEquals(emptyList(), SubtypeSettings.getAdditionalSubtypes().map { it.toSettingsSubtype() }) + assertEquals(from.toSettingsSubtype(), SubtypeSettings.getEnabledSubtypes(false).single().toSettingsSubtype()) + } +} From c47da4203fda2dd0ebf5295e8eb08e242c5918d6 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 8 Mar 2025 09:34:33 +0100 Subject: [PATCH 006/175] consistent way of for settingsSubtypes <-> string --- .../main/java/helium314/keyboard/latin/App.kt | 4 +-- .../keyboard/latin/settings/Settings.java | 4 --- .../keyboard/latin/utils/SubtypeSettings.kt | 25 ++++++++++++------- .../latin/utils/SubtypeUtilsAdditional.kt | 12 ++++----- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/App.kt b/app/src/main/java/helium314/keyboard/latin/App.kt index 23308a14a..6172dac58 100644 --- a/app/src/main/java/helium314/keyboard/latin/App.kt +++ b/app/src/main/java/helium314/keyboard/latin/App.kt @@ -161,7 +161,7 @@ fun checkVersionUpgrade(context: Context) { split[1] = newName split.joinToString(":") } - Settings.writePrefAdditionalSubtypes(prefs, newSubtypeStrings.joinToString(";")) + prefs.edit().putString(Settings.PREF_ADDITIONAL_SUBTYPES, newSubtypeStrings.joinToString(";")).apply() } // rename other custom layouts LayoutUtilsCustom.onLayoutFileChanged() @@ -630,7 +630,7 @@ private fun upgradesWhenComingFromOldAppName(context: Context) { val localeString = it.substringBefore(":") additionalSubtypes.add(it.replace(localeString, localeString.constructLocale().toLanguageTag())) } - Settings.writePrefAdditionalSubtypes(prefs, additionalSubtypes.joinToString(";")) + prefs.edit().putString(Settings.PREF_ADDITIONAL_SUBTYPES, additionalSubtypes.joinToString(";")).apply() } // move pinned clips to credential protected storage if device is not locked (should never happen) if (!prefs.contains(Settings.PREF_PINNED_CLIPS)) return diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java index 89e93e8dd..1510a65be 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -312,10 +312,6 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang mPrefs.edit().putBoolean(Settings.PREF_ALWAYS_INCOGNITO_MODE, !oldValue).apply(); } - public static void writePrefAdditionalSubtypes(final SharedPreferences prefs, final String prefSubtypes) { - prefs.edit().putString(PREF_ADDITIONAL_SUBTYPES, prefSubtypes).apply(); - } - public static int readHorizontalSpaceSwipe(final SharedPreferences prefs) { return switch (prefs.getString(PREF_SPACE_HORIZONTAL_SWIPE, Defaults.PREF_SPACE_HORIZONTAL_SWIPE)) { case "move_cursor" -> KeyboardActionListener.SWIPE_MOVE_CURSOR; diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt index 82388aeb8..f533223ec 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt @@ -52,9 +52,8 @@ object SubtypeSettings { fun addEnabledSubtype(prefs: SharedPreferences, newSubtype: InputMethodSubtype) { val subtype = newSubtype.toSettingsSubtype() - val subtypes = prefs.getString(Settings.PREF_ENABLED_SUBTYPES, Defaults.PREF_ENABLED_SUBTYPES)!! - .split(Separators.SETS).filter { it.isNotBlank() }.map { it.toSettingsSubtype() } + subtype - val newString = subtypes.map { it.toPref() }.toSortedSet().joinToString(Separators.SETS) + val subtypes = createSettingsSubtypes(prefs.getString(Settings.PREF_ENABLED_SUBTYPES, Defaults.PREF_ENABLED_SUBTYPES)!!) + subtype + val newString = createPrefSubtypes(subtypes) prefs.edit { putString(Settings.PREF_ENABLED_SUBTYPES, newString) } if (newSubtype !in enabledSubtypes) { @@ -155,6 +154,15 @@ object SubtypeSettings { RichInputMethodManager.getInstance().refreshSubtypeCaches() } + fun createSettingsSubtypes(prefSubtypes: String): List = + prefSubtypes.split(Separators.SETS).mapNotNull { + if (it.isEmpty()) null + else it.toSettingsSubtype() + } + + fun createPrefSubtypes(subtypes: Collection): String = + subtypes.map { it.toPref() }.toSortedSet().joinToString(Separators.SETS) + fun init(context: Context) { SubtypeLocaleUtils.init(context) // necessary to get the correct getKeyboardLayoutSetName @@ -205,7 +213,8 @@ object SubtypeSettings { } if (subtypesToRemove.isEmpty()) return Log.w(TAG, "removing custom subtypes without main layout files: $subtypesToRemove") - Settings.writePrefAdditionalSubtypes(prefs, additionalSubtypes.filterNot { it in subtypesToRemove }.joinToString(Separators.SETS)) + // todo: now we have a qwerty fallback anyway, consider removing this method (makes bugs more obvious to users) + prefs.edit().putString(Settings.PREF_ADDITIONAL_SUBTYPES, additionalSubtypes.filterNot { it in subtypesToRemove }.joinToString(Separators.SETS)).apply() } private fun loadAdditionalSubtypes(prefs: SharedPreferences) { @@ -218,8 +227,7 @@ object SubtypeSettings { // requires loadResourceSubtypes to be called before private fun loadEnabledSubtypes(context: Context) { val prefs = context.prefs() - val settingsSubtypes = prefs.getString(Settings.PREF_ENABLED_SUBTYPES, Defaults.PREF_ENABLED_SUBTYPES)!! - .split(Separators.SETS).filter { it.isNotEmpty() }.map { it.toSettingsSubtype() } + val settingsSubtypes = createSettingsSubtypes(prefs.getString(Settings.PREF_ENABLED_SUBTYPES, Defaults.PREF_ENABLED_SUBTYPES)!!) for (settingsSubtype in settingsSubtypes) { if (settingsSubtype.isAdditionalSubtype(prefs)) { enabledSubtypes.add(settingsSubtype.toAdditionalSubtype()) @@ -253,12 +261,11 @@ object SubtypeSettings { /** @return whether pref was changed */ private fun removeEnabledSubtype(prefs: SharedPreferences, subtype: SettingsSubtype): Boolean { - val oldSubtypes = prefs.getString(Settings.PREF_ENABLED_SUBTYPES, Defaults.PREF_ENABLED_SUBTYPES)!! - .split(Separators.SETS).filter { it.isNotEmpty() }.map { it.toSettingsSubtype() } + val oldSubtypes = createSettingsSubtypes(prefs.getString(Settings.PREF_ENABLED_SUBTYPES, Defaults.PREF_ENABLED_SUBTYPES)!!) val newSubtypes = oldSubtypes - subtype if (oldSubtypes == newSubtypes) return false // already removed - prefs.edit { putString(Settings.PREF_ENABLED_SUBTYPES, newSubtypes.joinToString(Separators.SETS) { it.toPref() }) } + prefs.edit { putString(Settings.PREF_ENABLED_SUBTYPES, createPrefSubtypes(newSubtypes)) } if (subtype == prefs.getString(Settings.PREF_SELECTED_SUBTYPE, Defaults.PREF_SELECTED_SUBTYPE)!!.toSettingsSubtype()) { // switch subtype if the currently used one has been disabled try { diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt index 53ac40e1a..1609b083f 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt @@ -53,10 +53,11 @@ object SubtypeUtilsAdditional { val prefs = context.prefs() SubtypeSettings.removeEnabledSubtype(context, subtype) val oldAdditionalSubtypesString = prefs.getString(Settings.PREF_ADDITIONAL_SUBTYPES, Defaults.PREF_ADDITIONAL_SUBTYPES)!! - val oldAdditionalSubtypes = createAdditionalSubtypes(oldAdditionalSubtypesString) - val newAdditionalSubtypes = oldAdditionalSubtypes.filter { it != subtype } - val newAdditionalSubtypesString = createPrefSubtypes(newAdditionalSubtypes) - Settings.writePrefAdditionalSubtypes(prefs, newAdditionalSubtypesString) + val oldAdditionalSubtypes = SubtypeSettings.createSettingsSubtypes(oldAdditionalSubtypesString) + val settingsSubtype = subtype.toSettingsSubtype() + val newAdditionalSubtypes = oldAdditionalSubtypes.filter { it != settingsSubtype } + val newAdditionalSubtypesString = SubtypeSettings.createPrefSubtypes(newAdditionalSubtypes) + prefs.edit().putString(Settings.PREF_ADDITIONAL_SUBTYPES, newAdditionalSubtypesString).apply() } // updates additional subtypes, enabled subtypes, and selected subtype @@ -97,9 +98,6 @@ object SubtypeUtilsAdditional { else it.toSettingsSubtype().toAdditionalSubtype() } - fun createPrefSubtypes(subtypes: Collection): String = - subtypes.joinToString(Separators.SETS) { it.toSettingsSubtype().toPref() } - private fun getNameResId(locale: Locale, mainLayoutName: String): Int { val nameId = SubtypeLocaleUtils.getSubtypeNameResId(locale, mainLayoutName) if (nameId != SubtypeLocaleUtils.UNKNOWN_KEYBOARD_LAYOUT) return nameId From 2b8c39b125abbaa7df86533d6c2f7ef559db4b3e Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 8 Mar 2025 10:26:24 +0100 Subject: [PATCH 007/175] make editing the "+" layouts work --- .../internal/keyboard_parser/LayoutParser.kt | 3 +-- .../keyboard/latin/utils/LayoutUtils.kt | 26 +++++++++++++++++++ .../settings/dialogs/SubtypeDialog.kt | 2 +- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LayoutParser.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LayoutParser.kt index 3164cc698..d2b51fb92 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LayoutParser.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LayoutParser.kt @@ -59,8 +59,7 @@ object LayoutParser { /** Parse simple layouts, defined only as rows of (normal) keys with popup keys. */ fun parseSimpleString(layoutText: String): List> { - val rowStrings = layoutText.replace("\r\n", "\n").split("\\n\\s*\\n".toRegex()).filter { it.isNotBlank() } - return rowStrings.map { row -> + return LayoutUtils.getSimpleRowStrings(layoutText).map { row -> row.split("\n").mapNotNull { parseKey(it) } } } diff --git a/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtils.kt index 56afe9ce9..68a99be99 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtils.kt @@ -1,6 +1,8 @@ package helium314.keyboard.latin.utils import android.content.Context +import helium314.keyboard.keyboard.internal.keyboard_parser.floris.SimplePopups +import helium314.keyboard.keyboard.internal.keyboard_parser.getOrCreate import helium314.keyboard.latin.R import helium314.keyboard.latin.settings.Defaults.default import helium314.keyboard.latin.utils.LayoutType.Companion.folder @@ -26,6 +28,7 @@ object LayoutUtils { fun getLMainLayoutsForLocales(locales: List, context: Context): Collection = locales.flatMapTo(HashSet()) { getAvailableLayouts(LayoutType.MAIN, context, it) }.sorted() + /** gets content for built-in (non-custom) layout [layoutName], with fallback to qwerty */ fun getContent(layoutType: LayoutType, layoutName: String, context: Context): String { val layouts = context.assets.list(layoutType.folder)!! layouts.firstOrNull { it.startsWith("$layoutName.") } @@ -33,4 +36,27 @@ object LayoutUtils { val fallback = layouts.first { it.startsWith(layoutType.default) } // must exist! return context.assets.open(layoutType.folder + File.separator + fallback).reader().readText() } + + fun getContentWithPlus(mainLayoutName: String, locale: Locale, context: Context): String { + val content = getContent(LayoutType.MAIN, mainLayoutName, context) + if (!mainLayoutName.endsWith("+")) + return content + // the stuff below will not work if we add "+" layouts in json format + // ideally we should serialize keyData to json to solve this + val rows = getSimpleRowStrings(content) + val localeKeyboardInfos = getOrCreate(context, locale) + return rows.mapIndexed { i, row -> + val extraKeys = localeKeyboardInfos.getExtraKeys(i + 1) ?: return@mapIndexed row + val rowList = row.split("\n").filterNot { it.isEmpty() }.toMutableList() + extraKeys.forEach { key -> + val popups = (key.popup as? SimplePopups)?.popupKeys?.joinToString(" ") + ?.takeIf { it.isNotEmpty() }?.let { " $it" } ?: "" + rowList.add(key.label + popups) + } + rowList.joinToString("\n") + }.joinToString("\n\n") + } + + fun getSimpleRowStrings(layoutContent: String): List = + layoutContent.replace("\r\n", "\n").split("\\n\\s*\\n".toRegex()).filter { it.isNotBlank() } } diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt index 1c59b96ed..7db7cadbf 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt @@ -393,7 +393,7 @@ private fun MainLayoutRow( if (showLayoutEditDialog != null) { val layoutName = showLayoutEditDialog!!.first val startContent = showLayoutEditDialog?.second - ?: if (layoutName in appLayouts) LayoutUtils.getContent(LayoutType.MAIN, layoutName, ctx) + ?: if (layoutName in appLayouts) LayoutUtils.getContentWithPlus(layoutName, currentSubtype.locale, ctx) else null LayoutEditDialog( onDismissRequest = { showLayoutEditDialog = null }, From e9a2a7ebb119e36071323493f7b01d0f3a339234 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 8 Mar 2025 17:55:02 +0100 Subject: [PATCH 008/175] remove unnecessary settings reloads during adjusting additional subtype --- .../latin/utils/SubtypeUtilsAdditional.kt | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt index 1609b083f..b9bce10a9 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt @@ -67,28 +67,29 @@ object SubtypeUtilsAdditional { val isSelected = prefs.getString(Settings.PREF_SELECTED_SUBTYPE, Defaults.PREF_SELECTED_SUBTYPE)!!.toSettingsSubtype() == from val isEnabled = prefs.getString(Settings.PREF_ENABLED_SUBTYPES, Defaults.PREF_ENABLED_SUBTYPES)!!.split(Separators.SETS) .any { it.toSettingsSubtype() == from } - val new = prefs.getString(Settings.PREF_ADDITIONAL_SUBTYPES, Defaults.PREF_ADDITIONAL_SUBTYPES)!! - .split(Separators.SETS).mapNotNullTo(sortedSetOf()) { - if (it == from.toPref()) null else it - } + to.toPref() - prefs.edit().putString(Settings.PREF_ADDITIONAL_SUBTYPES, new.joinToString(Separators.SETS)).apply() - - val fromSubtype = from.toAdditionalSubtype() - val toSubtype = to.toAdditionalSubtype() - if (SubtypeSettings.getResourceSubtypesForLocale(to.locale).any { it.toSettingsSubtype() == to }) { - // all settings changed to default -> make additional subtype disappear as magically as it was added - // if we don't do this, enabling the base subtype will result in the additional subtype being enabled, - // as both have the same settingsSubtype - removeAdditionalSubtype(context, toSubtype) + val additionalSubtypes = SubtypeSettings.createSettingsSubtypes(prefs.getString(Settings.PREF_ADDITIONAL_SUBTYPES, Defaults.PREF_ADDITIONAL_SUBTYPES)!!) + .toMutableList() + additionalSubtypes.remove(from) + if (SubtypeSettings.getResourceSubtypesForLocale(to.locale).none { it.toSettingsSubtype() == to }) { + // We only add the "to" subtype if it's not equal to a resource subtype. + // This means we make additional subtype disappear as magically as it was added if all settings are default. + // If we don't do this, enabling the base subtype will result in the additional subtype being enabled, + // as both have the same settingsSubtype. + additionalSubtypes.add(to) } + val editor = prefs.edit() + editor.putString(Settings.PREF_ADDITIONAL_SUBTYPES, SubtypeSettings.createPrefSubtypes(additionalSubtypes)) if (isSelected) { - SubtypeSettings.setSelectedSubtype(prefs, toSubtype) + editor.putString(Settings.PREF_SELECTED_SUBTYPE, to.toPref()) } if (isEnabled) { - SubtypeSettings.removeEnabledSubtype(context, fromSubtype) - SubtypeSettings.addEnabledSubtype(prefs, toSubtype) + val enabled = SubtypeSettings.createSettingsSubtypes(prefs.getString(Settings.PREF_ENABLED_SUBTYPES, Defaults.PREF_ENABLED_SUBTYPES)!!) + .toMutableList() + enabled.remove(from) + enabled.add(to) + editor.putString(Settings.PREF_ENABLED_SUBTYPES, SubtypeSettings.createPrefSubtypes(enabled)) } - // reloading is often unnecessary, but fast enough to not care about calling it only when necessary + editor.apply() SubtypeSettings.reloadEnabledSubtypes(context) } From bf713d69672c5a8e3439f0d1a69ed8f3092a3d34 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 10 Mar 2025 18:27:45 +0100 Subject: [PATCH 009/175] copy user-supplied library to final file instead of renaming apparently fixes #1251 --- .../java/helium314/keyboard/latin/settings/Defaults.kt | 3 --- .../main/java/helium314/keyboard/latin/utils/JniUtils.java | 3 +-- .../settings/preferences/LoadGestureLibPreference.kt | 7 +++++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt index 40b2bd6cc..689087f9f 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt @@ -9,7 +9,6 @@ import helium314.keyboard.keyboard.KeyboardTheme import helium314.keyboard.latin.BuildConfig import helium314.keyboard.latin.common.Constants.Separators import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue -import helium314.keyboard.latin.utils.JniUtils import helium314.keyboard.latin.utils.LayoutType import helium314.keyboard.latin.utils.POPUP_KEYS_LABEL_DEFAULT import helium314.keyboard.latin.utils.POPUP_KEYS_ORDER_DEFAULT @@ -152,8 +151,6 @@ object Defaults { const val PREF_EMOJI_RECENT_KEYS = "" const val PREF_LAST_SHOWN_EMOJI_CATEGORY_PAGE_ID = 0 const val PREF_PINNED_CLIPS = "" - @JvmField - val PREF_LIBRARY_CHECKSUM: String = JniUtils.expectedDefaultChecksum() const val PREF_SHOW_DEBUG_SETTINGS = false val PREF_DEBUG_MODE = BuildConfig.DEBUG const val PREF_SHOW_SUGGESTION_INFOS = false diff --git a/app/src/main/java/helium314/keyboard/latin/utils/JniUtils.java b/app/src/main/java/helium314/keyboard/latin/utils/JniUtils.java index 603e32ab6..6bae92d5e 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/JniUtils.java +++ b/app/src/main/java/helium314/keyboard/latin/utils/JniUtils.java @@ -13,7 +13,6 @@ import android.text.TextUtils; import helium314.keyboard.latin.App; import helium314.keyboard.latin.BuildConfig; -import helium314.keyboard.latin.settings.Defaults; import helium314.keyboard.latin.settings.Settings; import java.io.File; @@ -63,7 +62,7 @@ public final class JniUtils { // we want the default preferences, because storing the checksum in device protected storage is discouraged // see https://developer.android.com/reference/android/content/Context#createDeviceProtectedStorageContext() // if device is locked, this will throw an IllegalStateException - wantedChecksum = KtxKt.protectedPrefs(app).getString(Settings.PREF_LIBRARY_CHECKSUM, Defaults.PREF_LIBRARY_CHECKSUM); + wantedChecksum = KtxKt.protectedPrefs(app).getString(Settings.PREF_LIBRARY_CHECKSUM, expectedDefaultChecksum()); } final FileInputStream libStream = new FileInputStream(userSuppliedLibrary); final String checksum = ChecksumCalculator.INSTANCE.checksum(libStream); diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/LoadGestureLibPreference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/LoadGestureLibPreference.kt index 591d4a5c7..5b51bdbe2 100644 --- a/app/src/main/java/helium314/keyboard/settings/preferences/LoadGestureLibPreference.kt +++ b/app/src/main/java/helium314/keyboard/settings/preferences/LoadGestureLibPreference.kt @@ -35,10 +35,13 @@ fun LoadGestureLibPreference(setting: Setting) { val abi = Build.SUPPORTED_ABIS[0] val libFile = File(ctx.filesDir?.absolutePath + File.separator + JniUtils.JNI_LIB_IMPORT_FILE_NAME) fun renameToLibFileAndRestart(file: File, checksum: String) { + libFile.setWritable(true) libFile.delete() - // store checksum in default preferences (soo JniUtils) + // store checksum in default preferences (see JniUtils) prefs.edit().putString(Settings.PREF_LIBRARY_CHECKSUM, checksum).commit() - file.renameTo(libFile) + file.copyTo(libFile) + libFile.setReadOnly() + file.delete() Runtime.getRuntime().exit(0) // exit will restart the app, so library will be loaded } var tempFilePath: String? by rememberSaveable { mutableStateOf(null) } From d05a59e4edb866c52889f38f27ecb9cf70e75971 Mon Sep 17 00:00:00 2001 From: unlair <593746+unlair@users.noreply.github.com> Date: Tue, 11 Mar 2025 16:25:32 -0400 Subject: [PATCH 010/175] Track overridden subtypes when auto-switching due to HintLocales (#1410) * Track overridden subtypes when auto-switching due to HintLocales * Move hint-locale switching logic to SubtypeState --- .../helium314/keyboard/latin/LatinIME.java | 89 ++++++++++++++++--- 1 file changed, 75 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/LatinIME.java b/app/src/main/java/helium314/keyboard/latin/LatinIME.java index d2e75a457..f18c530e7 100644 --- a/app/src/main/java/helium314/keyboard/latin/LatinIME.java +++ b/app/src/main/java/helium314/keyboard/latin/LatinIME.java @@ -523,6 +523,11 @@ public class LatinIME extends InputMethodService implements } final class SubtypeState { + // When HintLocales causes a subtype override, we store + // the overridden subtype here in order to restore it when + // we switch to another input context that has no HintLocales. + private InputMethodSubtype mOverriddenByLocale; + private InputMethodSubtype mLastActiveSubtype; private boolean mCurrentSubtypeHasBeenUsed = true; // starting with true avoids immediate switch @@ -530,6 +535,70 @@ public class LatinIME extends InputMethodService implements mCurrentSubtypeHasBeenUsed = true; } + // TextFields can provide locale/language hints that the IME should use via 'hintLocales'. + // If a matching subtype is found, we temporarily switch to that subtype until + // we return to a context that does not provide any hints, or until the user + // explicitly changes the language/subtype in use. + public InputMethodSubtype getSubtypeForLocales(final RichInputMethodManager richImm, final Iterable locales) { + final InputMethodSubtype overriddenByLocale = mOverriddenByLocale; + if (locales == null) { + if (overriddenByLocale != null) { + // no locales provided, so switch back to + // whatever subtype was used last time. + mOverriddenByLocale = null; + + return overriddenByLocale; + } + + return null; + } + + final InputMethodSubtype currentSubtype = richImm.getCurrentSubtype().getRawSubtype(); + final Locale currentSubtypeLocale = richImm.getCurrentSubtypeLocale(); + final int minimumMatchLevel = 3; // LocaleUtils.LOCALE_LANGUAGE_MATCH_COUNTRY_DIFFER; + + // Try finding a subtype matching the hint language. + for (final Locale hintLocale : locales) { + if (LocaleUtils.INSTANCE.getMatchLevel(hintLocale, currentSubtypeLocale) >= minimumMatchLevel + || CollectionsKt.any(mSettings.getCurrent().mSecondaryLocales, + (secLocale) -> LocaleUtils.INSTANCE.getMatchLevel(hintLocale, secLocale) >= minimumMatchLevel)) { + // current locales are already a good match, and we want to avoid unnecessary layout switches. + return null; + } + + final InputMethodSubtype subtypeForHintLocale = richImm.findSubtypeForHintLocale(hintLocale); + if (subtypeForHintLocale == null) { + continue; + } + + if (subtypeForHintLocale.equals(currentSubtype)) { + // no need to switch, we already use the correct locale. + return null; + } + + if (overriddenByLocale == null) { + // auto-switching based on hint locale, so store + // whatever subtype was in use so we can switch back + // to it later when there are no hint locales. + mOverriddenByLocale = currentSubtype; + } + + return subtypeForHintLocale; + } + + return null; + } + + public void onSubtypeChanged(final InputMethodSubtype oldSubtype, + final InputMethodSubtype newSubtype) { + if (oldSubtype != mOverriddenByLocale) { + // Whenever the subtype is changed, clear tracking + // the subtype that is overridden by a HintLocale as + // we no longer have a subtype to automatically switch back to. + mOverriddenByLocale = null; + } + } + public void switchSubtype(final RichInputMethodManager richImm) { final InputMethodSubtype currentSubtype = richImm.getCurrentSubtype().getRawSubtype(); final InputMethodSubtype lastActiveSubtype = mLastActiveSubtype; @@ -858,6 +927,8 @@ public class LatinIME extends InputMethodService implements return; } InputMethodSubtype oldSubtype = mRichImm.getCurrentSubtype().getRawSubtype(); + + mSubtypeState.onSubtypeChanged(oldSubtype, subtype); StatsUtils.onSubtypeChanged(oldSubtype, subtype); mRichImm.onSubtypeChanged(subtype); mInputLogic.onSubtypeChanged(SubtypeLocaleUtils.getCombiningRulesExtraValue(subtype), @@ -876,20 +947,10 @@ public class LatinIME extends InputMethodService implements super.onStartInput(editorInfo, restarting); final List hintLocales = EditorInfoCompatUtils.getHintLocales(editorInfo); - if (hintLocales == null) { - return; - } - // Try switching to a subtype matching the hint language. - for (final Locale hintLocale : hintLocales) { - if (LocaleUtils.INSTANCE.getMatchLevel(hintLocale, mRichImm.getCurrentSubtypeLocale()) >= 3 - || CollectionsKt.any(mSettings.getCurrent().mSecondaryLocales, (secLocale) -> LocaleUtils.INSTANCE.getMatchLevel(hintLocale, secLocale) >= 3)) - return; // current locales are already a good match, and we want to avoid unnecessary layout switches - final InputMethodSubtype newSubtype = mRichImm.findSubtypeForHintLocale(hintLocale); - if (newSubtype == null) continue; - if (newSubtype.equals(mRichImm.getCurrentSubtype().getRawSubtype())) - return; // no need to switch, we already use the correct locale - mHandler.postSwitchLanguage(newSubtype); - break; + final InputMethodSubtype subtypeForLocales = mSubtypeState.getSubtypeForLocales(mRichImm, hintLocales); + if (subtypeForLocales != null) { + // found a better subtype using hint locales that we should switch to. + mHandler.postSwitchLanguage(subtypeForLocales); } } From 18a328cd2b455f6594796b0f1783252b44052bf9 Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Thu, 13 Mar 2025 17:31:03 +0200 Subject: [PATCH 011/175] Show TLD popup keys (#1399) * Add option to replace period key's popup keys with the locale-specific top level domains for URL and email inputs. On by default. Also change the wide keyboard's '.com' key to use the same TLD list. Tweak TLD list order, putting default ones first, so that .com is the first TLD. * Enable TLD hint Avoid TLD popups on tablet Revert to using set for TLDs, and insert default ones first Move setting one slot up Tweak setting description Update docs * Preserve case on period key * Prevent non-TLD hints on period key --- README.md | 2 -- .../layouts/functional/functional_keys.json | 2 +- .../keyboard_parser/LocaleKeyboardInfos.kt | 21 +++++++------ .../keyboard_parser/floris/TextKeyData.kt | 31 ++++++++++++++----- .../keyboard/latin/settings/Defaults.kt | 1 + .../keyboard/latin/settings/Settings.java | 1 + .../latin/settings/SettingsValues.java | 2 ++ .../settings/screens/PreferencesScreen.kt | 7 +++++ app/src/main/res/values/strings.xml | 4 +++ layouts.md | 2 +- 10 files changed, 52 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index ae62abc00..113f49dce 100644 --- a/README.md +++ b/README.md @@ -100,8 +100,6 @@ __Planned features and improvements:__ * Add and enable emoji dictionaries by default (if available for language) * Clearer / more intuitive arrangement of settings * Maybe hide some less used settings by default (similar to color customization) -* Make use of the `.com` key in URL fields (currently only available for tablets) - * With language-dependent TLDs * [Bug fixes](https://github.com/Helium314/HeliBoard/issues?q=is%3Aissue+is%3Aopen+label%3Abug) __What will _not_ be added:__ diff --git a/app/src/main/assets/layouts/functional/functional_keys.json b/app/src/main/assets/layouts/functional/functional_keys.json index 6d28dd24f..788e44796 100644 --- a/app/src/main/assets/layouts/functional/functional_keys.json +++ b/app/src/main/assets/layouts/functional/functional_keys.json @@ -15,7 +15,7 @@ { "$": "keyboard_state_selector", "emojiKeyEnabled": { "$": "keyboard_state_selector", "alphabet": { "label": "emoji" }}}, { "$": "keyboard_state_selector", "symbols": { "label": "numpad" }}, { "label": "space" }, - { "label": "period", "labelFlags": 1073741824 }, + { "label": "period" }, { "label": "action", "width": 0.15 } ] ] diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt index 260eb9571..eba17161e 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt @@ -44,7 +44,7 @@ class LocaleKeyboardInfos(dataStream: InputStream?, locale: Locale) { "mns" -> Key.LABEL_FLAGS_FOLLOW_KEY_LETTER_RATIO else -> 0 } - val tlds = getLocaleTlds(locale) // todo: USE IT + val tlds = getLocaleTlds(locale) init { readStream(dataStream, false, true) @@ -89,12 +89,6 @@ class LocaleKeyboardInfos(dataStream: InputStream?, locale: Locale) { } } - fun addDefaultTlds(locale: Locale) { - if ((locale.language != "en" && euroLocales.matches(locale.language)) || euroCountries.matches(locale.country)) - tlds.add(".eu") - tlds.addAll(defaultTlds.splitOnWhitespace()) - } - /** Pair(extraKeysLeft, extraKeysRight) */ fun getTabletExtraKeys(elementId: Int): Pair, List> { val flags = Key.LABEL_FLAGS_FONT_DEFAULT @@ -205,7 +199,6 @@ private fun createLocaleKeyTexts(context: Context, params: KeyboardParams, popup if (locale == params.mId.locale) return@forEach lkt.addFile(getStreamForLocale(locale, context), true) } - lkt.addDefaultTlds(params.mId.locale) when (popupKeysSetting) { POPUP_KEYS_MAIN -> lkt.addFile(context.assets.open("$LOCALE_TEXTS_FOLDER/more_popups_main.txt"), false) POPUP_KEYS_MORE -> lkt.addFile(context.assets.open("$LOCALE_TEXTS_FOLDER/more_popups_more.txt"), false) @@ -227,19 +220,27 @@ private fun getStreamForLocale(locale: Locale, context: Context) = } private fun getLocaleTlds(locale: Locale): LinkedHashSet { + val tlds = getDefaultTlds(locale) val ccLower = locale.country.lowercase() - val tlds = LinkedHashSet() if (ccLower.isEmpty() || locale.language == SubtypeLocaleUtils.NO_LANGUAGE) return tlds specialCountryTlds.forEach { if (ccLower != it.first) return@forEach tlds.addAll(it.second.splitOnWhitespace()) - return tlds + return@getLocaleTlds tlds } tlds.add(".$ccLower") return tlds } +private fun getDefaultTlds(locale: Locale): LinkedHashSet { + val tlds = linkedSetOf() + tlds.addAll(defaultTlds.splitOnWhitespace()) + if ((locale.language != "en" && euroLocales.matches(locale.language)) || euroCountries.matches(locale.country)) + tlds.add(".eu") + return tlds +} + fun clearCache() = localeKeyboardInfosCache.clear() // cache the texts, so they don't need to be read over and over diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt index eff715490..757ea9a5a 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt @@ -24,6 +24,7 @@ import helium314.keyboard.latin.common.StringUtils import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.spellcheck.AndroidSpellCheckerService import helium314.keyboard.latin.utils.InputTypeUtils +import helium314.keyboard.latin.utils.LayoutType import helium314.keyboard.latin.utils.Log import helium314.keyboard.latin.utils.ToolbarKey import helium314.keyboard.latin.utils.getCodeForToolbarKey @@ -482,8 +483,7 @@ sealed interface KeyData : AbstractKeyData { KeyLabel.DELETE -> "!icon/delete_key|!code/key_delete" KeyLabel.SHIFT -> "${getShiftLabel(params)}|!code/key_shift" // KeyLabel.EMOJI -> "!icon/emoji_normal_key|!code/key_emoji" - // todo (later): label and popupKeys for .com should be in localeKeyTexts, handled similar to currency key - KeyLabel.COM -> ".com" + KeyLabel.COM -> params.mLocaleKeyboardInfos.tlds.first() KeyLabel.LANGUAGE_SWITCH -> "!icon/language_switch_key|!code/key_language_switch" KeyLabel.ZWNJ -> "!icon/zwnj_key|\u200C" KeyLabel.CURRENCY -> params.mLocaleKeyboardInfos.currencyKey.first @@ -526,8 +526,11 @@ sealed interface KeyData : AbstractKeyData { return when (label) { KeyLabel.ALPHA, KeyLabel.SYMBOL_ALPHA, KeyLabel.SYMBOL -> Key.LABEL_FLAGS_PRESERVE_CASE or Key.LABEL_FLAGS_FOLLOW_FUNCTIONAL_TEXT_COLOR KeyLabel.COMMA -> Key.LABEL_FLAGS_HAS_POPUP_HINT - // essentially this only changes the appearance of the armenian period key in holo theme - KeyLabel.PERIOD -> Key.LABEL_FLAGS_HAS_POPUP_HINT and if (params.mId.isAlphabetKeyboard) params.mLocaleKeyboardInfos.labelFlags else 0 + // essentially the first term only changes the appearance of the armenian period key in holo theme + KeyLabel.PERIOD -> (Key.LABEL_FLAGS_HAS_POPUP_HINT and + if (params.mId.isAlphabetKeyboard) params.mLocaleKeyboardInfos.labelFlags else 0) or + (if (shouldShowTldPopups(params)) 0 else Key.LABEL_FLAGS_DISABLE_HINT_LABEL) or + Key.LABEL_FLAGS_PRESERVE_CASE KeyLabel.ACTION -> { Key.LABEL_FLAGS_PRESERVE_CASE or Key.LABEL_FLAGS_AUTO_X_SCALE or Key.LABEL_FLAGS_FOLLOW_KEY_LABEL_RATIO or Key.LABEL_FLAGS_FOLLOW_FUNCTIONAL_TEXT_COLOR or @@ -546,12 +549,12 @@ sealed interface KeyData : AbstractKeyData { private fun getAdditionalPopupKeys(params: KeyboardParams): PopupSet? { if (groupId == GROUP_COMMA) return SimplePopups(getCommaPopupKeys(params)) - if (groupId == GROUP_PERIOD) return SimplePopups(getPunctuationPopupKeys(params)) + if (groupId == GROUP_PERIOD) return getPeriodPopups(params) if (groupId == GROUP_ENTER) return getActionKeyPopupKeys(params) if (groupId == GROUP_NO_DEFAULT_POPUP) return null return when (label) { KeyLabel.COMMA -> SimplePopups(getCommaPopupKeys(params)) - KeyLabel.PERIOD -> SimplePopups(getPunctuationPopupKeys(params)) + KeyLabel.PERIOD -> getPeriodPopups(params) KeyLabel.ACTION -> getActionKeyPopupKeys(params) KeyLabel.SHIFT -> { if (params.mId.isAlphabetKeyboard) SimplePopups( @@ -561,13 +564,27 @@ sealed interface KeyData : AbstractKeyData { ) ) else null // why the alphabet popup keys actually? } - KeyLabel.COM -> SimplePopups(listOf(Key.POPUP_KEYS_HAS_LABELS, ".net", ".org", ".gov", ".edu")) + KeyLabel.COM -> SimplePopups( + listOf(Key.POPUP_KEYS_HAS_LABELS).plus(params.mLocaleKeyboardInfos.tlds.drop(1)) + ) + KeyLabel.ZWNJ -> SimplePopups(listOf("!icon/zwj_key|\u200D")) // only add currency popups if there are none defined on the key KeyLabel.CURRENCY -> if (popup.isEmpty()) SimplePopups(params.mLocaleKeyboardInfos.currencyKey.second) else null else -> null } } + + private fun getPeriodPopups(params: KeyboardParams): SimplePopups = + SimplePopups( + if (shouldShowTldPopups(params)) params.mLocaleKeyboardInfos.tlds + else getPunctuationPopupKeys(params) + ) + + private fun shouldShowTldPopups(params: KeyboardParams): Boolean = + (Settings.getInstance().current.mShowTldPopupKeys + && params.mId.mSubtype.layouts[LayoutType.FUNCTIONAL] != "functional_keys_tablet" + && params.mId.mMode in setOf(KeyboardId.MODE_URL, KeyboardId.MODE_EMAIL)) } /** diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt index 689087f9f..8e1261c04 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt @@ -122,6 +122,7 @@ object Defaults { const val PREF_POPUP_KEYS_ORDER = POPUP_KEYS_ORDER_DEFAULT const val PREF_POPUP_KEYS_LABELS_ORDER = POPUP_KEYS_LABEL_DEFAULT const val PREF_SHOW_POPUP_HINTS = false + const val PREF_SHOW_TLD_POPUP_KEYS = true const val PREF_MORE_POPUP_KEYS = "main" const val PREF_SPACE_TO_CHANGE_LANG = true const val PREF_LANGUAGE_SWIPE_DISTANCE = 5 diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java index 1510a65be..8d9e7bef9 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -131,6 +131,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_POPUP_KEYS_LABELS_ORDER = "popup_keys_labels_order"; public static final String PREF_SHOW_POPUP_HINTS = "show_popup_hints"; public static final String PREF_MORE_POPUP_KEYS = "more_popup_keys"; + public static final String PREF_SHOW_TLD_POPUP_KEYS = "show_tld_popup_keys"; public static final String PREF_SPACE_TO_CHANGE_LANG = "prefs_long_press_keyboard_to_change_lang"; public static final String PREF_LANGUAGE_SWIPE_DISTANCE = "language_swipe_distance"; diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java index 8576bc1d2..25c2ec150 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java @@ -65,6 +65,7 @@ public class SettingsValues { public final boolean mShowNumberRowHints; public final boolean mShowsHints; public final boolean mShowsPopupHints; + public final boolean mShowTldPopupKeys; public final boolean mSpaceForLangChange; public final boolean mShowsEmojiKey; public final boolean mVarToolbarDirection; @@ -172,6 +173,7 @@ public class SettingsValues { mShowNumberRowHints = prefs.getBoolean(Settings.PREF_SHOW_NUMBER_ROW_HINTS, Defaults.PREF_SHOW_NUMBER_ROW_HINTS); mShowsHints = prefs.getBoolean(Settings.PREF_SHOW_HINTS, Defaults.PREF_SHOW_HINTS); mShowsPopupHints = prefs.getBoolean(Settings.PREF_SHOW_POPUP_HINTS, Defaults.PREF_SHOW_POPUP_HINTS); + mShowTldPopupKeys = prefs.getBoolean(Settings.PREF_SHOW_TLD_POPUP_KEYS, Defaults.PREF_SHOW_TLD_POPUP_KEYS); mSpaceForLangChange = prefs.getBoolean(Settings.PREF_SPACE_TO_CHANGE_LANG, Defaults.PREF_SPACE_TO_CHANGE_LANG); mShowsEmojiKey = prefs.getBoolean(Settings.PREF_SHOW_EMOJI_KEY, Defaults.PREF_SHOW_EMOJI_KEY); mVarToolbarDirection = prefs.getBoolean(Settings.PREF_VARIABLE_TOOLBAR_DIRECTION, Defaults.PREF_VARIABLE_TOOLBAR_DIRECTION); diff --git a/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt index 17486bae8..d7e88c849 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt @@ -46,6 +46,7 @@ fun PreferencesScreen( Settings.PREF_POPUP_KEYS_LABELS_ORDER else null, Settings.PREF_POPUP_KEYS_ORDER, Settings.PREF_SHOW_POPUP_HINTS, + Settings.PREF_SHOW_TLD_POPUP_KEYS, Settings.PREF_POPUP_ON, if (AudioAndHapticFeedbackManager.getInstance().hasVibrator()) Settings.PREF_VIBRATE_ON else null, @@ -89,6 +90,12 @@ fun createPreferencesSettings(context: Context) = listOf( Setting(context, Settings.PREF_POPUP_KEYS_ORDER, R.string.popup_order) { ReorderSwitchPreference(it, Defaults.PREF_POPUP_KEYS_ORDER) }, + Setting( + context, Settings.PREF_SHOW_TLD_POPUP_KEYS, R.string.show_tld_popup_keys, + R.string.show_tld_popup_keys_summary + ) { + SwitchPreference(it, Defaults.PREF_SHOW_TLD_POPUP_KEYS) { KeyboardSwitcher.getInstance().setThemeNeedsReload() } + }, Setting(context, Settings.PREF_SHOW_POPUP_HINTS, R.string.show_popup_hints, R.string.show_popup_hints_summary) { SwitchPreference(it, Defaults.PREF_SHOW_POPUP_HINTS) { KeyboardSwitcher.getInstance().setThemeNeedsReload() } }, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 903b3cbd7..e6bb1d30b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -249,6 +249,10 @@ Select hint source Select popup key order + + Show TLD popup keys + + Replace period key popups with top level domains when typing URLs and email addresses Number row Language diff --git a/layouts.md b/layouts.md index 2af0f5624..b442e934b 100644 --- a/layouts.md +++ b/layouts.md @@ -89,7 +89,7 @@ Usually the label is what is displayed on the key. However, there are some speci * _symbol_alpha_: toggle alpha / symbol keyboard * _numpad_: toggle numpad layout * _emoji_: switch to emoji view - * _com_: display common TLDs (.com and similar, currently not localized) + * _com_: display common TLDs (.com and similar, localized) * _language_switch_: language switch key * _action_: the action (enter) key * _delete_: delete key From d3401e5c0490d18b87a299e3d0eb3d5c5368a639 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Fri, 14 Mar 2025 22:57:00 +0100 Subject: [PATCH 012/175] re-add background to app icon in about screen --- .../java/helium314/keyboard/settings/Misc.kt | 25 ++++++++++++++++++- .../settings/preferences/Preference.kt | 3 ++- .../keyboard/settings/screens/AboutScreen.kt | 2 +- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/Misc.kt b/app/src/main/java/helium314/keyboard/settings/Misc.kt index 05925afb3..d295c2eb5 100644 --- a/app/src/main/java/helium314/keyboard/settings/Misc.kt +++ b/app/src/main/java/helium314/keyboard/settings/Misc.kt @@ -1,13 +1,18 @@ // SPDX-License-Identifier: GPL-3.0-only package helium314.keyboard.settings +import android.graphics.drawable.VectorDrawable +import androidx.annotation.DrawableRes +import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -17,8 +22,13 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp - +import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.toBitmap +import androidx.core.util.TypedValueCompat @Composable fun WithSmallTitle( @@ -31,6 +41,19 @@ fun WithSmallTitle( } } +/** Icon if resource is a vector image, (bitmap) Image otherwise */ +@Composable +fun IconOrImage(@DrawableRes resId: Int, name: String?, sizeDp: Float) { + val ctx = LocalContext.current + val drawable = ContextCompat.getDrawable(ctx, resId) + if (drawable is VectorDrawable) + Icon(painterResource(resId), name, Modifier.size(sizeDp.dp)) + else { + val px = TypedValueCompat.dpToPx(sizeDp, ctx.resources.displayMetrics).toInt() + Image(drawable!!.toBitmap(px, px).asImageBitmap(), name) + } +} + @Composable fun DropDownField( items: List, diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/Preference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/Preference.kt index 33cd45b63..00a30c23a 100644 --- a/app/src/main/java/helium314/keyboard/settings/preferences/Preference.kt +++ b/app/src/main/java/helium314/keyboard/settings/preferences/Preference.kt @@ -29,6 +29,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import helium314.keyboard.latin.R +import helium314.keyboard.settings.IconOrImage import helium314.keyboard.settings.Theme import helium314.keyboard.settings.previewDark @@ -69,7 +70,7 @@ fun Preference( verticalAlignment = Alignment.CenterVertically ) { if (icon != null) - Icon(painterResource(icon), name, modifier = Modifier.size(36.dp)) + IconOrImage(icon, name, 36f) Column(modifier = Modifier.weight(1f)) { Text(text = name, style = MaterialTheme.typography.bodyLarge) if (description != null) { diff --git a/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt index 0b827952b..562810347 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt @@ -69,7 +69,7 @@ fun createAboutSettings(context: Context) = listOf( name = it.title, description = it.description, onClick = { }, - icon = R.drawable.ic_launcher_foreground // use the bitmap trick here if we really want the colored icon + icon = R.mipmap.ic_launcher_round ) }, Setting(context, SettingsWithoutKey.VERSION, R.string.version) { From 55259b2915f1e2298beebba4f0f3c322318f25bf Mon Sep 17 00:00:00 2001 From: Helium314 Date: Fri, 14 Mar 2025 23:21:41 +0100 Subject: [PATCH 013/175] fix disappearing all_colors for dark theme on upgrade from 2.3 --- app/src/main/java/helium314/keyboard/latin/App.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/latin/App.kt b/app/src/main/java/helium314/keyboard/latin/App.kt index 6172dac58..c2d91df5f 100644 --- a/app/src/main/java/helium314/keyboard/latin/App.kt +++ b/app/src/main/java/helium314/keyboard/latin/App.kt @@ -232,7 +232,7 @@ fun checkVersionUpgrade(context: Context) { KeyboardTheme.writeUserMoreColors(prefs, themeNameNight, moreColorsNight) } if (prefs.contains("theme_dark_color_all_colors")) { - val allColorsNight = readAllColorsMap(false) + val allColorsNight = readAllColorsMap(true) prefs.edit().remove("theme_dark_color_all_colors").apply() KeyboardTheme.writeUserAllColors(prefs, themeNameNight, allColorsNight) } From ba881296410a39fe16bfe558495e0e4b97fd6449 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 15 Mar 2025 09:06:10 +0100 Subject: [PATCH 014/175] make navigation transistion animation duration follow system transition animation scale --- .../keyboard/settings/SettingsNavHost.kt | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/SettingsNavHost.kt b/app/src/main/java/helium314/keyboard/settings/SettingsNavHost.kt index f3773125e..761610a5c 100644 --- a/app/src/main/java/helium314/keyboard/settings/SettingsNavHost.kt +++ b/app/src/main/java/helium314/keyboard/settings/SettingsNavHost.kt @@ -1,11 +1,16 @@ // SPDX-License-Identifier: GPL-3.0-only package helium314.keyboard.settings +import android.provider.Settings +import android.provider.Settings.Global +import androidx.compose.animation.core.tween import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.LayoutDirection import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable @@ -41,6 +46,10 @@ fun SettingsNavHost( val dir = if (LocalLayoutDirection.current == LayoutDirection.Ltr) 1 else -1 val target = SettingsDestination.navTarget.collectAsState() + // duration does not change when system setting changes, but that's rare enough to not care + val duration = (250 * Settings.System.getFloat(LocalContext.current.contentResolver, Global.TRANSITION_ANIMATION_SCALE, 1f)).toInt() + val animation = tween(durationMillis = duration) + fun goBack() { if (!navController.popBackStack()) onClickBack() } @@ -48,10 +57,10 @@ fun SettingsNavHost( NavHost( navController = navController, startDestination = startDestination ?: SettingsDestination.Settings, - enterTransition = { slideInHorizontally(initialOffsetX = { +it * dir }) }, - exitTransition = { slideOutHorizontally(targetOffsetX = { -it * dir }) }, - popEnterTransition = { slideInHorizontally(initialOffsetX = { -it * dir }) }, - popExitTransition = { slideOutHorizontally(targetOffsetX = { +it * dir }) } + enterTransition = { slideInHorizontally(initialOffsetX = { +it * dir }, animationSpec = animation) }, + exitTransition = { slideOutHorizontally(targetOffsetX = { -it * dir }, animationSpec = animation) }, + popEnterTransition = { slideInHorizontally(initialOffsetX = { -it * dir }, animationSpec = animation) }, + popExitTransition = { slideOutHorizontally(targetOffsetX = { +it * dir }, animationSpec = animation) } ) { composable(SettingsDestination.Settings) { MainSettingsScreen( From a6b6d1b659f70edad816a9c6fe3f279e41fb5902 Mon Sep 17 00:00:00 2001 From: Quantom2 <113715737+Quantom2@users.noreply.github.com> Date: Sat, 15 Mar 2025 15:05:05 +0200 Subject: [PATCH 015/175] Rework of UK and RU standard layout plus added extended layout (#1215) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rework of UK and RU standard layout plus added extended layout (similar to PC keyboard) as optional; - Added 'ї' as separate letter (it used much more often, just to be optional key in popups) - Added [ { } } popups to fill empty hint space (similar to PC layout) - Added ' (apostrofee) suggestion onto 'є' key (similar to oter keyboards and to PC layout) RU) Added siggestion to 'ъ' on 'х' key (similar to other keyboards, anyway there was no popups at all) - Added [ { } } popups to fill empty hint space (similar to PC layout) - Added 'э́' suggestion similar to other keyboards Both) - Improvements to multilanguage typing (now this is possible to sue UK-RU or RU-UK pair, I added letters from other language as popups) Added) - UK Extended with separate ' key (used less often than 'ї', but still used pretty often) - RU Extended, with separate 'ъ' key (similar to full desk PC layout) --- app/src/main/assets/layouts/main/russian.txt | 4 +-- .../assets/layouts/main/russian_extended.txt | 34 ++++++++++++++++++ .../main/assets/layouts/main/ukrainian.txt | 7 ++-- .../layouts/main/ukrainian_extended.txt | 35 +++++++++++++++++++ app/src/main/assets/locale_key_texts/ru.txt | 14 ++++++-- app/src/main/assets/locale_key_texts/uk.txt | 16 +++++++-- app/src/main/res/xml/method.xml | 21 +++++++++++ 7 files changed, 121 insertions(+), 10 deletions(-) create mode 100644 app/src/main/assets/layouts/main/russian_extended.txt create mode 100644 app/src/main/assets/layouts/main/ukrainian_extended.txt diff --git a/app/src/main/assets/layouts/main/russian.txt b/app/src/main/assets/layouts/main/russian.txt index 7ceb2435d..7da99f64e 100644 --- a/app/src/main/assets/layouts/main/russian.txt +++ b/app/src/main/assets/layouts/main/russian.txt @@ -8,7 +8,7 @@ ш щ з -х +х ъ [ { ф ы @@ -20,7 +20,7 @@ л д ж -э +э э́ ] } я ч diff --git a/app/src/main/assets/layouts/main/russian_extended.txt b/app/src/main/assets/layouts/main/russian_extended.txt new file mode 100644 index 000000000..8b3249fee --- /dev/null +++ b/app/src/main/assets/layouts/main/russian_extended.txt @@ -0,0 +1,34 @@ +й +ц +у +к +е +н +г +ш +щ +з +х [ { +ъ ] } + +ф +ы +в +а +п +р +о +л +д +ж +э э́ + +я +ч +с +м +и +т +ь +б < +ю > diff --git a/app/src/main/assets/layouts/main/ukrainian.txt b/app/src/main/assets/layouts/main/ukrainian.txt index 7e01cde38..ff1ed643a 100644 --- a/app/src/main/assets/layouts/main/ukrainian.txt +++ b/app/src/main/assets/layouts/main/ukrainian.txt @@ -8,7 +8,8 @@ ш щ з -х +х [ { +ї ] } ф і @@ -20,7 +21,7 @@ л д ж -є +є ' " я ч @@ -30,4 +31,4 @@ т ь б < -ю > +ю > ґ diff --git a/app/src/main/assets/layouts/main/ukrainian_extended.txt b/app/src/main/assets/layouts/main/ukrainian_extended.txt new file mode 100644 index 000000000..7e37e93cc --- /dev/null +++ b/app/src/main/assets/layouts/main/ukrainian_extended.txt @@ -0,0 +1,35 @@ +й +ц +у +к +е +н +г +ш +щ +з +х [ { +ї ] } + +ф +і +в +а +п +р +о +л +д +ж +є ' " +' " + +я +ч +с +м +и +т +ь +б < +ю > ґ diff --git a/app/src/main/assets/locale_key_texts/ru.txt b/app/src/main/assets/locale_key_texts/ru.txt index bbb9a2478..59583da42 100644 --- a/app/src/main/assets/locale_key_texts/ru.txt +++ b/app/src/main/assets/locale_key_texts/ru.txt @@ -1,9 +1,19 @@ [popup_keys] -е ё -ь ъ +е ё е́ ѣ +ф ѳ +ы ы́ +а а́ +о о́ +я я́ +и и́ +ь ъ ы +ю ю́ ' ’ ‚ ‘ › ‹ " ” „ “ » « +і ы +є э э́ + [labels] alphabet: АБВ diff --git a/app/src/main/assets/locale_key_texts/uk.txt b/app/src/main/assets/locale_key_texts/uk.txt index 9ee926c94..080bf826b 100644 --- a/app/src/main/assets/locale_key_texts/uk.txt +++ b/app/src/main/assets/locale_key_texts/uk.txt @@ -1,9 +1,19 @@ [popup_keys] +е е́ г ґ -ь +ф ѳ і ї -' ’ ‚ ‘ -" ” „ “ +а а́ +о о́ +я я́ +и и́ і ї +г ґ +ю ю́ +' ’ ‚ ‘ › ‹ +" ” „ “ » « + +ы і ї +э є [labels] alphabet: АБВ diff --git a/app/src/main/res/xml/method.xml b/app/src/main/res/xml/method.xml index 2733268ba..213f288dd 100644 --- a/app/src/main/res/xml/method.xml +++ b/app/src/main/res/xml/method.xml @@ -90,6 +90,7 @@ pt_PT: Portuguese (Portugal)/qwerty ro: Romanian/qwerty ru: Russian/russian + ru: Russian (Extended)/russian_extended ru: Russian (Student)/russian_student si_LK: Sinhala (Sri Lanka)/sinhala # This is a preliminary keyboard layout. sk: Slovak/qwerty @@ -107,6 +108,7 @@ tr: Turkish/turkish ur_PK: Urdu Pakistan uk: Ukrainian/ukrainian + uk: Ukrainian (Extended)/ukrainian_extended uz_UZ: Uzbek (Uzbekistan)/uzbek # This is a preliminary keyboard layout. vi: Vietnamese/qwerty zu: Zulu/qwerty @@ -912,6 +914,16 @@ android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:russian,SupportTouchPositionCorrection,EmojiCapable" android:isAsciiCapable="false" /> + + Date: Sat, 15 Mar 2025 15:35:55 +0100 Subject: [PATCH 016/175] better way of determining whether a key should have action key background mostly relevant for popups fixes #1008 --- .../java/helium314/keyboard/keyboard/Key.java | 18 ++++++------------ .../keyboard/keyboard/KeyboardView.java | 2 +- .../keyboard/keyboard/MainKeyboardView.java | 2 +- .../keyboard/keyboard/PopupKeysKeyboard.java | 3 ++- .../keyboard/internal/PopupKeySpec.java | 8 +++----- 5 files changed, 13 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/Key.java b/app/src/main/java/helium314/keyboard/keyboard/Key.java index 3d0917976..c80c1eb3b 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/Key.java +++ b/app/src/main/java/helium314/keyboard/keyboard/Key.java @@ -24,6 +24,7 @@ import helium314.keyboard.latin.common.StringUtils; import helium314.keyboard.latin.utils.PopupKeysUtilsKt; import helium314.keyboard.latin.utils.ToolbarKey; import helium314.keyboard.latin.utils.ToolbarUtilsKt; +import kotlin.collections.ArraysKt; import java.util.Arrays; import java.util.Locale; @@ -919,7 +920,7 @@ public class Key implements Comparable { @NonNull final Drawable spacebarBackground, @NonNull final Drawable actionKeyBackground) { final Drawable background; - if (isAccentColored()) { + if (hasActionKeyBackground()) { background = actionKeyBackground; } else if (hasFunctionalBackground()) { background = functionalKeyBackground; @@ -933,17 +934,10 @@ public class Key implements Comparable { return background; } - public final boolean isAccentColored() { - if (hasActionKeyBackground()) return true; - final String iconName = getIconName(); - if (iconName == null) return false; - // todo: other way of identifying the color? - // this should be done differently, as users can set any icon now - // how is the background drawable selected? can we use the same way? - return iconName.equals(KeyboardIconsSet.NAME_NEXT_KEY) - || iconName.equals(KeyboardIconsSet.NAME_PREVIOUS_KEY) - || iconName.equals("clipboard_action_key") - || iconName.equals("emoji_action_key"); + public final boolean hasActionKeyPopups() { + if (!hasActionKeyBackground()) return false; + // only use the special action key popups for action colored keys, and only for icon popups + return ArraysKt.none(getPopupKeys(), (key) -> key.mIconName == null); } public boolean hasFunctionalBackground() { diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java index 1c484dfbb..2226e3600 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java @@ -610,7 +610,7 @@ public class KeyboardView extends View { } private void setKeyIconColor(Key key, Drawable icon, Keyboard keyboard) { - if (key.isAccentColored()) { + if (key.hasActionKeyBackground()) { mColors.setColor(icon, ColorType.ACTION_KEY_ICON); } else if (key.isShift() && keyboard != null) { if (keyboard.mId.mElementId == KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED diff --git a/app/src/main/java/helium314/keyboard/keyboard/MainKeyboardView.java b/app/src/main/java/helium314/keyboard/keyboard/MainKeyboardView.java index 9239f5ea1..91807cdbd 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/MainKeyboardView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/MainKeyboardView.java @@ -505,7 +505,7 @@ public final class MainKeyboardView extends KeyboardView implements DrawingProxy mPopupKeysKeyboardCache.put(key, popupKeysKeyboard); } - final View container = key.hasActionKeyBackground() ? mPopupKeysKeyboardForActionContainer + final View container = key.hasActionKeyPopups() ? mPopupKeysKeyboardForActionContainer : mPopupKeysKeyboardContainer; final PopupKeysKeyboardView popupKeysKeyboardView = container.findViewById(R.id.popup_keys_keyboard_view); diff --git a/app/src/main/java/helium314/keyboard/keyboard/PopupKeysKeyboard.java b/app/src/main/java/helium314/keyboard/keyboard/PopupKeysKeyboard.java index 113404375..645e420bb 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/PopupKeysKeyboard.java +++ b/app/src/main/java/helium314/keyboard/keyboard/PopupKeysKeyboard.java @@ -328,12 +328,13 @@ public final class PopupKeysKeyboard extends Keyboard { final PopupKeysKeyboardParams params = mParams; final int popupKeyFlags = mParentKey.getPopupKeyLabelFlags(); final PopupKeySpec[] popupKeys = mParentKey.getPopupKeys(); + final int background = mParentKey.hasActionKeyPopups() ? Key.BACKGROUND_TYPE_ACTION : Key.BACKGROUND_TYPE_NORMAL; for (int n = 0; n < popupKeys.length; n++) { final PopupKeySpec popupKeySpec = popupKeys[n]; final int row = n / params.mNumColumns; final int x = params.getX(n, row); final int y = params.getY(row); - final Key key = popupKeySpec.buildKey(x, y, popupKeyFlags, params); + final Key key = popupKeySpec.buildKey(x, y, popupKeyFlags, background, params); params.markAsEdgeKey(key, row); params.onAddKey(key); diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/PopupKeySpec.java b/app/src/main/java/helium314/keyboard/keyboard/internal/PopupKeySpec.java index a1b41b79c..695a660af 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/PopupKeySpec.java +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/PopupKeySpec.java @@ -68,11 +68,9 @@ public final class PopupKeySpec { } @NonNull - public Key buildKey(final int x, final int y, final int labelFlags, - @NonNull final KeyboardParams params) { - return new Key(mLabel, mIconName, mCode, mOutputText, null /* hintLabel */, labelFlags, - Key.BACKGROUND_TYPE_NORMAL, x, y, params.mDefaultAbsoluteKeyWidth, params.mDefaultAbsoluteRowHeight, - params.mHorizontalGap, params.mVerticalGap); + public Key buildKey(final int x, final int y, final int labelFlags, final int background, @NonNull final KeyboardParams params) { + return new Key(mLabel, mIconName, mCode, mOutputText, null, labelFlags, background, x, y, + params.mDefaultAbsoluteKeyWidth, params.mDefaultAbsoluteRowHeight, params.mHorizontalGap, params.mVerticalGap); } @Override From 8298542c392aa7da6d3d59ce4db362c76c55fb03 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 15 Mar 2025 15:59:49 +0100 Subject: [PATCH 017/175] add setting to switch to alphabet after typing on numpad and pressing space fixes #1224 --- .../keyboard/keyboard/internal/KeyboardState.java | 15 ++++++++++++++- .../helium314/keyboard/latin/settings/Defaults.kt | 1 + .../keyboard/latin/settings/Settings.java | 1 + .../keyboard/latin/settings/SettingsValues.java | 2 ++ .../keyboard/settings/screens/AdvancedScreen.kt | 6 ++++++ app/src/main/res/values/strings.xml | 2 ++ 6 files changed, 26 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardState.java b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardState.java index 51dc98b0d..07639d3fa 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardState.java +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardState.java @@ -80,6 +80,7 @@ public final class KeyboardState { private static final int SWITCH_STATE_SYMBOL_BEGIN = 1; private static final int SWITCH_STATE_SYMBOL = 2; private static final int SWITCH_STATE_NUMPAD = 3; + private static final int SWITCH_STATE_NUMPAD_BEGIN = 9; private static final int SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL = 4; private static final int SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE = 5; private static final int SWITCH_STATE_MOMENTARY_ALPHA_SHIFT = 6; @@ -403,7 +404,7 @@ public final class KeyboardState { mMode = MODE_NUMPAD; mRecapitalizeMode = RecapitalizeStatus.NOT_A_RECAPITALIZE_MODE; mSwitchActions.setNumpadKeyboard(); - mSwitchState = withSliding ? SWITCH_STATE_MOMENTARY_TO_NUMPAD : SWITCH_STATE_NUMPAD; + mSwitchState = withSliding ? SWITCH_STATE_MOMENTARY_TO_NUMPAD : SWITCH_STATE_NUMPAD_BEGIN; } public void toggleNumpad(final boolean withSliding, final int autoCapsFlags, final int recapitalizeMode, @@ -789,6 +790,17 @@ public final class KeyboardState { mPrevSymbolsKeyboardWasShifted = false; } break; + case SWITCH_STATE_NUMPAD: + // Switch back to alpha keyboard mode if user types one or more non-space/enter + // characters followed by a space/enter. + if (isSpaceOrEnter(code) && Settings.getValues().mAlphaAfterNumpadAndSpace) { + toggleNumpad(false, autoCapsFlags, recapitalizeMode, true, false); + } + break; + case SWITCH_STATE_NUMPAD_BEGIN: + if (!isSpaceOrEnter(code)) + mSwitchState = SWITCH_STATE_NUMPAD; + break; } // If the code is a letter, update keyboard shift state. @@ -833,6 +845,7 @@ public final class KeyboardState { case SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE -> "MOMENTARY-SYMBOL-MORE"; case SWITCH_STATE_MOMENTARY_ALPHA_SHIFT -> "MOMENTARY-ALPHA_SHIFT"; case SWITCH_STATE_NUMPAD -> "NUMPAD"; + case SWITCH_STATE_NUMPAD_BEGIN -> "NUMPAD-BEGIN"; case SWITCH_STATE_MOMENTARY_TO_NUMPAD -> "MOMENTARY-TO-NUMPAD"; case SWITCH_STATE_MOMENTARY_FROM_NUMPAD -> "MOMENTARY-FROM-NUMPAD"; default -> null; diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt index 8e1261c04..1a890fa22 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt @@ -145,6 +145,7 @@ object Defaults { const val PREF_ABC_AFTER_EMOJI = false const val PREF_ABC_AFTER_CLIP = false const val PREF_ABC_AFTER_SYMBOL_SPACE = true + const val PREF_ABC_AFTER_NUMPAD_SPACE = false const val PREF_REMOVE_REDUNDANT_POPUPS = false const val PREF_SPACE_BAR_TEXT = "" @JvmField diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java index 8d9e7bef9..6d45548af 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -155,6 +155,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_ABC_AFTER_EMOJI = "abc_after_emoji"; public static final String PREF_ABC_AFTER_CLIP = "abc_after_clip"; public static final String PREF_ABC_AFTER_SYMBOL_SPACE = "abc_after_symbol_space"; + public static final String PREF_ABC_AFTER_NUMPAD_SPACE = "abc_after_numpad_space"; public static final String PREF_REMOVE_REDUNDANT_POPUPS = "remove_redundant_popups"; public static final String PREF_SPACE_BAR_TEXT = "space_bar_text"; diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java index 25c2ec150..9a18fde2e 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java @@ -114,6 +114,7 @@ public class SettingsValues { public final boolean mAlphaAfterEmojiInEmojiView; public final boolean mAlphaAfterClipHistoryEntry; public final boolean mAlphaAfterSymbolAndSpace; + public final boolean mAlphaAfterNumpadAndSpace; public final boolean mRemoveRedundantPopups; public final String mSpaceBarText; public final float mFontSizeMultiplier; @@ -268,6 +269,7 @@ public class SettingsValues { mAlphaAfterEmojiInEmojiView = prefs.getBoolean(Settings.PREF_ABC_AFTER_EMOJI, Defaults.PREF_ABC_AFTER_EMOJI); mAlphaAfterClipHistoryEntry = prefs.getBoolean(Settings.PREF_ABC_AFTER_CLIP, Defaults.PREF_ABC_AFTER_CLIP); mAlphaAfterSymbolAndSpace = prefs.getBoolean(Settings.PREF_ABC_AFTER_SYMBOL_SPACE, Defaults.PREF_ABC_AFTER_SYMBOL_SPACE); + mAlphaAfterNumpadAndSpace = prefs.getBoolean(Settings.PREF_ABC_AFTER_NUMPAD_SPACE, Defaults.PREF_ABC_AFTER_NUMPAD_SPACE); mRemoveRedundantPopups = prefs.getBoolean(Settings.PREF_REMOVE_REDUNDANT_POPUPS, Defaults.PREF_REMOVE_REDUNDANT_POPUPS); mSpaceBarText = prefs.getString(Settings.PREF_SPACE_BAR_TEXT, Defaults.PREF_SPACE_BAR_TEXT); mEmojiMaxSdk = prefs.getInt(Settings.PREF_EMOJI_MAX_SDK, Defaults.PREF_EMOJI_MAX_SDK); diff --git a/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt index 3605a4228..c81f3025f 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt @@ -66,6 +66,7 @@ fun AdvancedSettingsScreen( Settings.PREF_ENABLE_EMOJI_ALT_PHYSICAL_KEY, if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) Settings.PREF_SHOW_SETUP_WIZARD_ICON else null, Settings.PREF_ABC_AFTER_SYMBOL_SPACE, + Settings.PREF_ABC_AFTER_NUMPAD_SPACE, Settings.PREF_ABC_AFTER_EMOJI, Settings.PREF_ABC_AFTER_CLIP, Settings.PREF_CUSTOM_CURRENCY_KEY, @@ -154,6 +155,11 @@ fun createAdvancedSettings(context: Context) = listOf( { SwitchPreference(it, Defaults.PREF_ABC_AFTER_SYMBOL_SPACE) }, + Setting(context, Settings.PREF_ABC_AFTER_NUMPAD_SPACE, + R.string.switch_keyboard_after, R.string.after_numpad_and_space) + { + SwitchPreference(it, Defaults.PREF_ABC_AFTER_NUMPAD_SPACE) + }, Setting(context, Settings.PREF_ABC_AFTER_EMOJI, R.string.switch_keyboard_after, R.string.after_emoji) { SwitchPreference(it, Defaults.PREF_ABC_AFTER_EMOJI) }, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e6bb1d30b..e063b07c1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -581,6 +581,8 @@ disposition rather than other common dispositions for Latin languages. --> Selecting clipboard history entry Pressing enter or space after other keys in symbols view + + Pressing enter or space after other keys in numpad Set image for day or night mode? From cb70553484719a088419a21f6021d3115a4cbc5f Mon Sep 17 00:00:00 2001 From: KuRa KuRd <3160786+GoRaN909@users.noreply.github.com> Date: Sun, 16 Mar 2025 16:00:23 +0300 Subject: [PATCH 018/175] Add Central Kurdish layout (#1417) --- .../assets/layouts/main/central_kurdish.txt | 31 +++++++++++++++ app/src/main/assets/locale_key_texts/ckb.txt | 39 +++++++++++++++++++ .../keyboard/latin/utils/ScriptUtils.kt | 2 +- app/src/main/res/xml/method.xml | 10 +++++ 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 app/src/main/assets/layouts/main/central_kurdish.txt create mode 100644 app/src/main/assets/locale_key_texts/ckb.txt diff --git a/app/src/main/assets/layouts/main/central_kurdish.txt b/app/src/main/assets/layouts/main/central_kurdish.txt new file mode 100644 index 000000000..eec1593e8 --- /dev/null +++ b/app/src/main/assets/layouts/main/central_kurdish.txt @@ -0,0 +1,31 @@ +ق +و +ە +ر +ت +ی +ێ +ئ +ۆ +پ + +ا +س +ش +د +ف +ھ|ه +ژ +ل +ک +گ + +ز +ع +ح +ج +چ +خ +ب +ن +م diff --git a/app/src/main/assets/locale_key_texts/ckb.txt b/app/src/main/assets/locale_key_texts/ckb.txt new file mode 100644 index 000000000..5e13897b8 --- /dev/null +++ b/app/src/main/assets/locale_key_texts/ckb.txt @@ -0,0 +1,39 @@ +[popup_keys] +ق ٯ +و وو +ە ة ﻪ ـہ +ر ڕ ڒ ࢪ +ت ط +ی ي ې ۍ +ێ ؽ +ئ ء ﺋ +ۆ ؤ ۏ ۊ ۋ ۉ ۇ +پ ث +ا أ إ آ ٱ +س ص +ش ض +د ۮ ڌ ﮆ +ف ڤ ڡ +ھ ھ +ژ ━|ـ +ل ڵ +ک ك ڪ +گ غ +ز ظ +ع ؏ +ب ى +punctuation !autoColumnOrder!8 \؟ ! ، ٫ ؍ : ؛ ; : | - @ _ # * ٪ & ^ +« „ “ ” +» ‚ ‘ ’ ‹ › + +[labels] +alphabet: ئ‌پ‌گ +symbol: ٣٢١؟ +comma: ، +question: ؟ + +[number_row] +١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ٠ + +[tlds] +iq krd diff --git a/app/src/main/java/helium314/keyboard/latin/utils/ScriptUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/ScriptUtils.kt index df442089d..f66c76aba 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/ScriptUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/ScriptUtils.kt @@ -162,7 +162,7 @@ object ScriptUtils { return SCRIPT_LATIN } return when (language) { - "ar", "ur", "fa" -> SCRIPT_ARABIC + "ar", "ckb", "ur", "fa" -> SCRIPT_ARABIC "hy" -> SCRIPT_ARMENIAN "bn" -> SCRIPT_BENGALI "sr", "mk", "ru", "uk", "mn", "be", "kk", "ky", "bg", "xdq", "cv", "mhr", "mns", "dru" -> SCRIPT_CYRILLIC diff --git a/app/src/main/res/xml/method.xml b/app/src/main/res/xml/method.xml index 213f288dd..e46d5be38 100644 --- a/app/src/main/res/xml/method.xml +++ b/app/src/main/res/xml/method.xml @@ -23,6 +23,7 @@ bn_IN: Bengali (India)/bengali_inscript bn_IN: Bengali (India)/Baishakhi ca: Catalan/qwerty+ + ckb: Central Kurdish/central_kurdish cs: Czech/qwertz cv: Chuvash/chuvash da: Danish/qwerty+ @@ -289,6 +290,15 @@ android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:qwerty+,AsciiCapable,EmojiCapable" android:isAsciiCapable="true" /> + Date: Sun, 16 Mar 2025 14:33:53 +0100 Subject: [PATCH 019/175] remove appcompat was mainly used for settings --- app/build.gradle.kts | 1 - .../keyboard/keyboard/MainKeyboardView.java | 2 +- .../keyboard/internal/KeyPreviewView.java | 10 ++++------ .../java/helium314/keyboard/latin/LatinIME.java | 2 +- .../keyboard/latin/utils/DialogUtils.kt | 2 +- .../keyboard/latin/utils/InputMethodPicker.kt | 2 +- .../keyboard/settings/screens/AboutScreen.kt | 2 +- .../res/drawable/sym_keyboard_paste_rounded.xml | 3 +-- app/src/main/res/values-v28/platform-theme.xml | 17 +++++++++++++++++ app/src/main/res/values-v31/platform-theme.xml | 8 ++------ app/src/main/res/values/platform-theme.xml | 14 ++++++++++++-- 11 files changed, 41 insertions(+), 22 deletions(-) create mode 100644 app/src/main/res/values-v28/platform-theme.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 30956503b..a73820c5d 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -97,7 +97,6 @@ android { dependencies { // androidx implementation("androidx.core:core-ktx:1.13.1") - implementation("androidx.appcompat:appcompat:1.7.0") implementation("androidx.recyclerview:recyclerview:1.3.2") implementation("androidx.autofill:autofill:1.1.0") diff --git a/app/src/main/java/helium314/keyboard/keyboard/MainKeyboardView.java b/app/src/main/java/helium314/keyboard/keyboard/MainKeyboardView.java index 91807cdbd..d84998e8b 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/MainKeyboardView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/MainKeyboardView.java @@ -18,6 +18,7 @@ import android.graphics.Paint; import android.graphics.Paint.Align; import android.graphics.Typeface; import android.util.AttributeSet; +import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -25,7 +26,6 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.view.ContextThemeWrapper; import helium314.keyboard.accessibility.AccessibilityUtils; import helium314.keyboard.accessibility.MainKeyboardAccessibilityDelegate; diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyPreviewView.java b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyPreviewView.java index c7069ec0f..64ef4bfea 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyPreviewView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyPreviewView.java @@ -15,8 +15,7 @@ import android.text.TextUtils; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; - -import androidx.appcompat.widget.AppCompatTextView; +import android.widget.TextView; import helium314.keyboard.keyboard.Key; import helium314.keyboard.latin.R; @@ -25,10 +24,9 @@ import helium314.keyboard.latin.settings.Settings; import java.util.HashSet; -/** - * The pop up key preview view. - */ -public class KeyPreviewView extends AppCompatTextView { +/** The pop up key preview view. */ +// Android Studio complains about TextView, but we're not using tint or auto-size that should be the relevant differences +public class KeyPreviewView extends TextView { public static final int POSITION_MIDDLE = 0; public static final int POSITION_LEFT = 1; public static final int POSITION_RIGHT = 2; diff --git a/app/src/main/java/helium314/keyboard/latin/LatinIME.java b/app/src/main/java/helium314/keyboard/latin/LatinIME.java index f18c530e7..5913bf701 100644 --- a/app/src/main/java/helium314/keyboard/latin/LatinIME.java +++ b/app/src/main/java/helium314/keyboard/latin/LatinIME.java @@ -7,6 +7,7 @@ package helium314.keyboard.latin; import android.annotation.SuppressLint; +import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -100,7 +101,6 @@ import java.util.concurrent.TimeUnit; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; -import androidx.appcompat.app.AlertDialog; import androidx.core.content.ContextCompat; /** diff --git a/app/src/main/java/helium314/keyboard/latin/utils/DialogUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/DialogUtils.kt index 470743bbb..e13f2f101 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/DialogUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/DialogUtils.kt @@ -1,7 +1,7 @@ package helium314.keyboard.latin.utils import android.content.Context -import androidx.appcompat.view.ContextThemeWrapper +import android.view.ContextThemeWrapper import helium314.keyboard.latin.R // todo: ideally the custom InputMethodPicker would be removed / replaced with compose dialog, then this can be removed diff --git a/app/src/main/java/helium314/keyboard/latin/utils/InputMethodPicker.kt b/app/src/main/java/helium314/keyboard/latin/utils/InputMethodPicker.kt index 33ac3d5d5..3f534842f 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/InputMethodPicker.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/InputMethodPicker.kt @@ -2,6 +2,7 @@ package helium314.keyboard.latin.utils +import android.app.AlertDialog import android.os.IBinder import android.text.Spannable import android.text.SpannableString @@ -10,7 +11,6 @@ import android.text.style.RelativeSizeSpan import android.view.WindowManager import android.view.inputmethod.InputMethodInfo import android.view.inputmethod.InputMethodSubtype -import androidx.appcompat.app.AlertDialog import helium314.keyboard.latin.LatinIME import helium314.keyboard.latin.R import helium314.keyboard.latin.RichInputMethodManager diff --git a/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt index 562810347..9d84985c6 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt @@ -2,6 +2,7 @@ package helium314.keyboard.settings.screens import android.app.Activity +import android.app.AlertDialog import android.content.Context import android.content.Intent import android.text.method.LinkMovementMethod @@ -10,7 +11,6 @@ import android.widget.TextView import android.widget.Toast import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts -import androidx.appcompat.app.AlertDialog import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue diff --git a/app/src/main/res/drawable/sym_keyboard_paste_rounded.xml b/app/src/main/res/drawable/sym_keyboard_paste_rounded.xml index 6e57a69b2..051630b7d 100644 --- a/app/src/main/res/drawable/sym_keyboard_paste_rounded.xml +++ b/app/src/main/res/drawable/sym_keyboard_paste_rounded.xml @@ -8,8 +8,7 @@ android:width="24dp" android:height="24dp" android:viewportWidth="960" - android:viewportHeight="960" - android:tint="?attr/colorControlNormal"> + android:viewportHeight="960"> \ No newline at end of file diff --git a/app/src/main/res/values-v28/platform-theme.xml b/app/src/main/res/values-v28/platform-theme.xml new file mode 100644 index 000000000..77a73ae9e --- /dev/null +++ b/app/src/main/res/values-v28/platform-theme.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/app/src/main/res/values-v31/platform-theme.xml b/app/src/main/res/values-v31/platform-theme.xml index 4c40353c6..5014fc748 100644 --- a/app/src/main/res/values-v31/platform-theme.xml +++ b/app/src/main/res/values-v31/platform-theme.xml @@ -5,12 +5,11 @@ - - diff --git a/app/src/main/res/values/platform-theme.xml b/app/src/main/res/values/platform-theme.xml index 432d20715..2942b101f 100644 --- a/app/src/main/res/values/platform-theme.xml +++ b/app/src/main/res/values/platform-theme.xml @@ -6,11 +6,21 @@ --> - + + From 9b7eaa4cf282b8b4690110a64db135cc23e16904 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 16 Mar 2025 14:49:04 +0100 Subject: [PATCH 020/175] use default text button style for popup key order / hint source buttons --- .../java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt index 7db7cadbf..33d4d850b 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt @@ -151,14 +151,14 @@ fun SubtypeDialog( } Row { TextButton(onClick = { showKeyOrderDialog = true }, Modifier.weight(1f)) - { Text(stringResource(R.string.popup_order), style = MaterialTheme.typography.bodyLarge) } + { Text(stringResource(R.string.popup_order)) } DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) == null) { setCurrentSubtype(currentSubtype.without(ExtraValue.POPUP_ORDER)) } } Row { TextButton(onClick = { showHintOrderDialog = true }, Modifier.weight(1f)) - { Text(stringResource(R.string.hint_source), style = MaterialTheme.typography.bodyLarge) } + { Text(stringResource(R.string.hint_source)) } DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.HINT_ORDER) == null) { setCurrentSubtype(currentSubtype.without(ExtraValue.HINT_ORDER)) } From a3bada8d258a8ae25e5275921971ba188a215107 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 16 Mar 2025 15:01:39 +0100 Subject: [PATCH 021/175] upgrade version and translations --- app/build.gradle.kts | 4 +- app/src/main/res/values-ar/strings.xml | 12 ++-- app/src/main/res/values-be/strings.xml | 61 ++++++++++++++++++- app/src/main/res/values-bg/strings.xml | 2 + app/src/main/res/values-bn/strings.xml | 51 +++++++--------- app/src/main/res/values-ca/strings.xml | 2 + app/src/main/res/values-de/strings.xml | 3 + app/src/main/res/values-et/strings.xml | 2 + app/src/main/res/values-fr/strings.xml | 2 + app/src/main/res/values-it/strings.xml | 9 ++- app/src/main/res/values-nl/strings.xml | 2 + app/src/main/res/values-pl/strings.xml | 20 +++--- app/src/main/res/values-pt-rBR/strings.xml | 2 + app/src/main/res/values-ro/strings.xml | 31 ++++++++++ app/src/main/res/values-ru/strings.xml | 10 +-- app/src/main/res/values-zh-rCN/strings.xml | 2 + .../metadata/android/bn/full_description.txt | 2 +- 17 files changed, 165 insertions(+), 52 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a73820c5d..27915d044 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,8 +13,8 @@ android { applicationId = "helium314.keyboard" minSdk = 21 targetSdk = 34 - versionCode = 3000 - versionName = "3.0-alpha1" + versionCode = 3001 + versionName = "3.0-alpha2" ndk { abiFilters.clear() abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 04d268499..36b7b516e 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -75,16 +75,16 @@ "الرموز التعبيرية للوحة مفاتيح فعلية" "‏مفتاح Alt الفعلي يعرض لوحة الرموز التعبيرية" "التلقائية" - مرحبًا بكم في%s + مرحبًا بكم في %s مع الكتابة بالإيماءة "بدء الاستخدام" "الخطوة التالية" - قيد الإعداد%s - مكِّن%s + قيد الإعداد %s + مكِّن %s يرجى التحقق من \\%s\" في إعدادات الإدخال واللغات. سيؤدي ذلك إلى تمكين لوحة المفاتيح على جهازك.\" <xliff:g id=\"APPLICATION_NAME\" مثال=\"لوحة مفاتيح أندرويد\">%s</xliff:g> ممكّن بالفعل في إعدادات اللغات &amp؛ إعدادات الإدخال، لذا فقد تم الانتهاء من هذه الخطوة. إلى الخطوة التالية!\" "تفعيل في الإعدادات" - قم بالتبديل إلى%s + بدّل إلى %s بعد ذلك، اختر \\<<xliff:g id=\"APPLICATION_NAME\" مثال=\"لوحة مفاتيح أندرويد\">%s</xliff:g>” كطريقة إدخال النص النشط.“ "تبديل أساليب الإدخال" تهانينا ، لقد انتهيت من الإعداد! @@ -472,4 +472,8 @@ اللغات مع القواميس يمكنك العثور على المخططات ومشاركتها في %s. قسم المناقشة + نوع فرعي مخصّص + %s (Baishakhi) + أظهِر مفاتيح TLD المنبثقة + استبدل مفتاح الفترة المنبثقة مع مجالات المستوى الأعلى عند كتابة عناوين URL وعناوين البريد الإلكتروني diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 6397a7448..df4da739d 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -370,5 +370,64 @@ Пераключыць лічбавую клавіятуру Дадаць самыя распаўсюджаныя варыянты (па змаўчанні) Выдаліць лішнія ўсплывальныя вокны - Прыбраць усплывальныя клавішы, якія прысутнічаюць у базавай раскладцы + Прыбраць усплывальныя клавішы, якія ўжо прысутнічаюць у базавай раскладцы + Плаваючы прадпрагляд + Бачыць прапанаванае слова падчас набору жэстамі + Раздзельная клавіятура + Вібрацыя ў рэжыме «Не турбаваць» + Уключыць падзеленую клавіятуру (альбомная) + Адлегласць падзелу (альбомная) + Перамяшчаць прадпрагляд падчас набору жэстамі + Час жыцця следа жэста + Аўтакарэкцыя спалучэнняў клавіш + Калі ўключана, спалучэнні клавіш могуць быць пашыраны з дапамогай аўтакарэкцыі + Маштаб ніжняга водступу (альбомная) + Маштаб бакавога водступу + Паказваць падказкі ў шэрагу з лічбамі + Мовы са слоўнікамі + Карыстацкі падтып + Радок эмодзі ўнізе + Радок буфера абмену ўнізе + Папярэджанне: раскладка ў дадзены момант выкарыстоўваецца + Наладзіць значкі + Сапраўды скінуць усе настроеныя значкі? + Шэраг з лічбамі + Усталяваць фонавы малюнак (альбомная) + Перавызначыць версію эмодзі + Даргінскі (Урахі) + Урахінскі (%s) + Код клавішы + Сапраўды выдаліць %s? + Усталяваць карыстацкі шрыфт з файла + Калі не ўстаноўлена, будзе выкарыстоўвацца партрэтны малюнак + Раз\'яднальнік нулявой шырыні + Вы сапраўды хочаце выдаліць усе настроеныя коды клавіш? + Дадатковыя раскладкі + Функцыянальныя клавішы (вялікі экран) + Стыль значкоў + Злучальнік нулявой шырыні + Сметніца + Недапушчальнае імя + Выдаліць + Увод + Shift + Табуляцыя + Shift (націснута) + Маштаб шрыфта клавіятуры + Маштаб шрыфта адлюстравання эмодзі + Маштаб бакавога водступу (альбомная) + Код доўгага націску + Адлегласць змахвання для пераключэння мовы + Наладзіць коды клавіш панэлі інструментаў + Карыстацкі тэкст на клавішы прабела + Прабел (раскладка лічбаў) + Пераключыць бок рэжыму адной рукой + Знайсці і падзяліцца колерамі ў %s. + Знайсці і падзяліцца раскладкамі ў %s. + абмеркавання + Caps lock + Завяршыць рэжым адной рукой + Змяніць памер у рэжыме адной рукой + Галасавы ўвод адключаны + Паказаць / схаваць панэль інструментаў diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index db9082308..b95094304 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -467,4 +467,6 @@ Можете да намирате и споделяте цветове в %s. Персонализиран подтип %s (Байсахи) + Показване на TLD изскачащи клавиши + Заместване на изскачащите прозорци с клавиши за период с домейни от първо ниво при въвеждане на URL и имейл адреси diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index afb898f87..f6f1e06d0 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -70,9 +70,7 @@ বহুভাষী টাইপিং অঙ্গুলিহেলন টাইপিং লাইব্রেরি অধিযোগ অঙ্গুলিহেলনের মাধ্যমে টাইপিং সক্রিয় করার জন্য স্থানীয় লাইব্রেরি সরবরাহ - \'%s\' এর জন্য লাইব্রেরি প্রয়োজন। অসামঞ্জস্যপূর্ণ লাইব্রেরি ব্যবহার অঙ্গুলিহেলন টাইপিংয়ের সময় ক্রাশ করতে পারে। -\n -\nসতর্কতা: বাহ্যিক কোডের অধিযোজন নিরাপত্তা ঝুঁকির কারণ হতে পারে। বিশ্বস্ত উৎসের লাইব্রেরি ব্যবহার করুন। + \'%s\' এর জন্য লাইব্রেরি প্রয়োজন। অসামঞ্জস্যপূর্ণ লাইব্রেরি ব্যবহার অঙ্গুলিহেলন টাইপিংয়ের সময় ক্রাশ করতে পারে। \n\nসতর্কতা: বাহ্যিক কোডের অধিযোজন নিরাপত্তা ঝুঁকির কারণ হতে পারে। বিশ্বস্ত উৎসের লাইব্রেরি ব্যবহার করুন। লাইব্রেরি অধিযোগ লাইব্রেরি বিলোপ যতিচিহ্নের পরে স্বয়ংক্রিয় স্পেস @@ -99,7 +97,7 @@ অপরিদৃষ্ট হতে পারে এমন বৈশিষ্ট্যের বর্ণনা ডিভাইস সুরক্ষিত স্টোরেজ ► পিন করে রাখা টুলবার বোতামে দীর্ঘ চাপ দিলে তা অতিরিক্ত কাজ করবে: <br> \n\t• ক্লিপবোর্ড &#65515; পেস্ট <br> \n\t• বামে/ডানে স্থানান্তর &#65515; সম্পূর্ণ বামে/ডানে স্থানান্তর <br> \n\t• উপরে/নিচে স্থানান্তর &#65515; পৃষ্ঠার উপরে/নিচে <br> \n\t• শব্দের ডানে/বামে &#65515; লাইনের শুরু/শেষ <br> \n\t• পাতার উপরে/নিচে &#65515; পাতার শুরু/শেষ <br> \n\t• অনুলিপি &#65515; কর্তন <br> \n\t• শব্দ নির্বাচন &#8596; সমস্ত নির্বাচন <br> \n\t• পূর্বাবস্থা &#8596; পুনরাবৃত্তি <br> <br> \n► পরামর্শ ফলকের টুলবারের কোনো বোতামে দীর্ঘ চাপ দিলে তা পরামর্শ ফলকে আবদ্ধ হবে। <br> <br> \n► কমা বোতামে দীর্ঘ চাপ দিলে ক্লিপবোর্ড দর্শন, ইমোজি দর্শন, একক হাত মোড, সেটিংস অথবা ভাষা পরিবর্তন বোতাম উপলব্ধ হবে:<br> \n\t• সংশ্লিষ্ট বোতাম সক্ষম থাকলে ইমোজি দর্শন বা ভাষা পরিবর্তন বোতাম দৃশ্যমান থাকবে না; <br> \n\t• কিছু লেআউটের জন্য কমা বোতাম নয়, কিন্তু একই জায়গার বোতামটি, যেমন: Dvorak লেআউটে \'q\' বোতাম। <br> <br> \n► ছদ্মবেশী মোড সক্রিয় থাকলে শব্দ শিখন বন্ধ থাকবে, এবং সাম্প্রতিকে কোনো ইমোজি যুক্ত হবে না। <br> <br> \n► ছদ্মবেশী বোতামে চাপ দিলে টুলবার উপলব্ধ হবে। <br> <br> \n► স্লাইডিং কি ইনপুট: বড়ো হাতের অক্ষর লেখার জন্য শিফট বোতাম থেকে অন্য বোতামে অভিস্পর্শ করুন: <br> \n\t• সিম্বল কিবোর্ড থেকে সিম্বল এবং সম্পর্কিত অক্ষর লেখার জন্য \'?123\' বোতামেও এটি কাজ করে।<br> <br> \n► শিফট অথবা প্রতীক বোতাম চেপে ধরে এক বা একাধিক বোতাম চাপার পর শিফট অথবা প্রতীক বোতাম ছেড়ে দিলে তা পূর্ববর্তী কিবোর্ডে নিয়ে যাবে। <br> <br> \n► পরামর্শ ফলকে কোনো পরামর্শে দীর্ঘ চাপ দিলে আরও পরামর্শ, বিলোপ করার জন্য অপসারণ বোতাম প্রদর্শিত হবে। <br> <br> \n► আরও পরামর্শ খুলতে কোনো পরামর্শ থেকে উপরে অভিস্পর্শ করুন এবং নির্দিষ্ট পরামর্শ নির্বাচনের জন্য ছেড়ে দিন। <br> <br> \n► ক্লিপবোর্ড ইতিহাসে কোনো অন্তর্ভুক্তিতে দীর্ঘ চাপ দিয়ে তা পিন করা যাবে (আনপিন না করা পর্যন্ত তা ক্লিপবোর্ডে থাকবে) \n► ক্লিপবোর্ড দর্শনে বাম পাশে অভিস্পর্শ করলে অন্তর্ভুক্তি অপসারণ হবে (যদি না সেটি পিন করা থাকে)। <br> <br> \n► লেখা সিলেক্ট করে শিফট চাপলে তা বড়ো হাতের অক্ষর, ছোটো হাতের অক্ষর এবং সব অক্ষর বড়ো হাতের হবে। <br> <br> \n► আপনি ফাইল এক্সপ্লোরারে খোলার মাধ্যমে অভিধান সংযুক্ত করতে পারেন: <br> \n\t• এটি কেবল <i>content-uris</i> এর সাথে কাজ করে, <i>file-uris</i> এর সাথে নয়। অর্থাৎ কিছু ফাইল এক্সপ্লোরারের সাথে নাও কাজ করতে পারে। <br> <br> \n► রুট উপলব্ধতাসহ ম্যানুয়াল ব্যাকআপ করা ব্যবহারকারীদের জন্য: <br> \nঅ্যান্ড্রয়েড ৭ থেকে শেয়ারড্ প্রেফারেন্স ফাইল ডিফল্ট জায়গা নয়। কারণ অ্যাপ %s ব্যবহার করছে। ডিভাইস আনলকের আগে সেটিংস খোলার জন্য এটি প্রয়োজনীয়, যেমন: বুট করার সময়। <br> \nফাইলটি /data/user_de/0/package_id/shared_prefs/ থাকে। যদিও এটা ডিভাইস এবং অ্যান্ড্রয়েড সংস্করণের উপরে নির্ভর করে। <br> <br> \n<i><b>কেবল ডিবাগ এপিকে</b></i> <br> <br> \n► পরামর্শে দীর্ঘ চাপ দিলে তার উৎস-অভিধান দেখাবে। <br> <br> \n► ডিবাগ সেটিংস উচ্চতর সেটিংসে উপলব্ধ। যদিও লগ ফাইলে অভিধান অবমুক্ত করা ছাড়া এর ব্যবহারযোগ্যতা সীমিত। <br> \n\t• রিলিজ এপিকে এর জন্য <i>সম্পর্কে</i> এর সংস্করণে কয়েকবার চাপ দিতে হবে। তাহলে <i>উচ্চতর</i>-এ ডিবাগ সেটিংস উপলব্ধ হবে। <br> \n\t• <i>পরামর্শ তথ্য প্রদর্শন</i> চালু করলে পরামর্শের উপরে কিছু ছোটো নম্বর থাকবে যা অভ্যন্তরীণ হিসাব ও উৎস অভিধান নির্দেশ করে। <br> <br> \n► অ্যাপ্লিকেশন ক্র্যাশের পরে সেটিংস খুললে আপনি ক্র্যাশ লগ চান কি না তা জিজ্ঞেস করা হবে৷ <br> <br> \n► বহুভাষী টাইপিং ব্যবহারের সময় স্পেসবার বর্তমান ভাষা নির্ধারণের জন্য একটি দৃঢ়তা মান দেখাবে। <br> <br> \n► পরামর্শের উপরে কিছু ছোটো নম্বর থাকবে যা অভ্যন্তরীণ হিসাব ও উৎস অভিধান নির্দেশ করে (নিষ্ক্রিয় করা যেতে পারে)। - সার্বীয় (ল্যাটিন) + সার্বিয়ান (ল্যাটিন) ইংরেজি (ইউকে) (%s) ইংরেজি (ইউএস) (%s) স্প্যানিশ (ইউএস) (%s) @@ -110,15 +108,15 @@ %s (প্রভাত) %s (বৈশাখী) %s (সংক্ষিপ্ত) - %s (সেবালসিক 390) - %s (সেবালসিক Final) + %s (সেবালসিক ৩৯০) + %s (সেবালসিক চূড়ান্ত) ভাষাহীন (বর্ণমালা) - বর্ণমালা (QWERTY) + বর্ণমালা (কোয়ার্টি) বর্ণমালা (QWERTZ) বর্ণমালা (AZERTY) - বর্ণমালা (Dvorak) - বর্ণমালা (Colemak) - বর্ণমালা (Colemak Mod-DH) + বর্ণমালা (ডভোরাক) + বর্ণমালা (কোলেমাক) + বর্ণমালা (কোলেমাক Mod-DH) আলফাবেট (ওয়ার্কম্যান) বর্ণমালা (PC) ইমোজি @@ -133,17 +131,17 @@ ভৌত কিবোর্ডের জন্য ইমোজি ভৌত Alt বোতামে ইমোজি প্যালেট প্রদর্শন ডিফল্ট - %s এ স্বাগত\" + %s এ স্বাগত অঙ্গুলিহেলন টাইপিংয়ের সাথে শুরু করা যাক পরবর্তী পদক্ষেপ - %s সন্নিবেশিত হচ্ছে\" - %s সক্ষম করুন\" - "ভাষা ও ইনপুট সেটিংসে \"%s\" সক্রিয় করুন। ফলে এটি আপনার ডিভাইসে চলার অনুমোদন পাবে।" - "আপনার ভাষা ও ইনপুট সেটিংসে ইতোমধ্যে %s সক্ষম করা হয়েছে; তাই এই পদক্ষেপটি সমাপ্ত হয়েছে। পরবর্তীটিতে যান!" + %s সন্নিবেশিত হচ্ছে + %s সক্ষম করুন + ভাষা ও ইনপুট সেটিংসে \"%s\" সক্রিয় করুন। ফলে এটি আপনার ডিভাইসে চলার অনুমোদন পাবে। + আপনার ভাষা ও ইনপুট সেটিংসে ইতোমধ্যে %s সক্ষম করা হয়েছে; তাই এই পদক্ষেপটি সমাপ্ত হয়েছে। পরবর্তীটিতে যান! সেটিংসে সক্ষম করুন - %s এ পরিবর্তন করুন\" - এখন সক্রিয় লিখন-ইনপুট পদ্ধতি হিসেবে \\%s\" বেছে নিন।\" + %s এ পরিবর্তন করুন + এখন সক্রিয় লিখন-ইনপুট পদ্ধতি হিসেবে \"%s\" বেছে নিন। ইনপুট পদ্ধতি পরিবর্তন "অভিনন্দন, আপনি পুরোপুরি প্রস্তুত!" এখন %s দিয়ে আপনার সব পছন্দের অ্যাপে লিখতে পারবেন। @@ -156,24 +154,17 @@ অভ্যন্তরীণ মূল অভিধান "ফাইল থেকে অভিধান সংযুক্তি" ভাষা নির্বাচন - ব্যবহারকারী-যোগকৃত অভিধান \"%1$s\" প্রতিস্থাপন করতে নিশ্চিত? -\n -\nবর্তমান অভিধান: -\n%2$s -\n -\nনতুন অভিধান: -\n%3$s + ব্যবহারকারী-যোগকৃত অভিধান \"%1$s\" প্রতিস্থাপন করতে নিশ্চিত?\n বর্তমান অভিধান: %2$s\n নতুন অভিধান: %3$s "অভিধান প্রতিস্থাপন" ব্যবহারকারী-সংযুক্ত অভিধান \"%s\" অপসারণ করতে নিশ্চিত? - "অভিধান ব্যতীত কেবল পূর্বে সন্নিবেশিত শব্দের জন্য পরামর্শ পাওয়া যাবে।<br> - আপনি %1$s অভিধান ডাউনলোড করতে পারেন, অথবা \"%2$s\" এর জন্য অভিধান সরাসরি ডাউনলোড করা যায় কি না %3$s যাচাই করতে পারেন।" + অভিধান ব্যতীত কেবল পূর্বে সন্নিবেশিত শব্দের জন্য পরামর্শ পাওয়া যাবে।<br> আপনি %1$s অভিধান ডাউনলোড করতে পারেন, অথবা \"%2$s\" এর জন্য অভিধান সরাসরি ডাউনলোড করা যায় কি না %3$s যাচাই করতে পারেন। পুনরায় প্রদর্শিত হবে না অভিধান যোগ করার জন্য নির্বাচন করুন। %s .dict ফরম্যাটে অভিধান ডাউনলোড করা যেতে পারে। ত্রুটি: এই কিবোর্ডের সাথে সামঞ্জস্যপূর্ণ স্ক্রিপ্ট নয় এখানে "ত্রুটি: নির্বাচিত ফাইলটি বৈধ অভিধান ফাইল নয়" "নির্বাচিত ফাইলটি %1$s এর জন্য, %2$s এর জন্য ফাইল প্রয়োজন। তবুও %2$s এর জন্য ব্যবহৃত হবে?" - "তবুও ব্যবহার করুন" + তবুও ব্যবহৃত হবে অভিধান ফাইল অধিযোজন করতে ত্রুটি অভিধান উপলব্ধ কোনো অভিধান উপলব্ধ নয় @@ -437,7 +428,9 @@ অভিধানসহ ভাষা আলোচনা বিভাগ সতর্কতা: লেআউট বর্তমানে ব্যবহৃত হচ্ছে - আপনি %s-তে রং খোঁজা ও শেয়ার করতে পারেন। - আপনি %s-তে লেআউট খোঁজা ও শেয়ার করতে পারেন। + আপনি %s-তে রং সন্ধান ও শেয়ার করতে পারেন। + আপনি %s-তে লেআউট সন্ধান ও শেয়ার করতে পারেন। নিজস্বীকৃত সাবটাইপ + টিএলডি পপআপ বোতাম প্রদর্শন + ইউআরএল ও ইমেইল ঠিকানা লেখার জন্য দাঁড়ি বোতাম টপ লেভেল ডোমেইন দ্বারা প্রতিস্থাপন diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index a2ffde555..1320d1e67 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -430,4 +430,6 @@ Podeu trobar i compartir colors a %s. Podeu trobar i compartir disposicions a %s. secció de discussió + Substituir les finestres emergents de la tecla punt per dominis de primer nivell en escriure URLs i adreces de correu electrònic + Mostra tecles emergents de TLD diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e0092f3f8..9af19dee9 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -432,4 +432,7 @@ %s wirklich löschen? Ungültiger Name Benutzerdefinierter Subtyp + %s (Baisakhi) + Zeige TLD-Popup-Tasten + Ersetze Punkt-Tastenpopups mit Top-Level-Domains wenn URLs und Mailadressen eingegeben werden diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 544a0a0ee..ad1bf5242 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -467,4 +467,6 @@ Uusi värve võid leida ja jagada %s. Sinu loodud alamtüüp %s (Baishakhi) + Näita tippdomeenide hüpikklahve + Võrgu- ja e-posti aadresside kirjutamisel asenda punktuatsiooni hüpikaknad tipptaseme domeenide omadega diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 8e797e67c..2c32cf6f1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -437,4 +437,6 @@ Nouveau dictionnaire: Vous pouvez trouver et partager des couleurs dans le %s. Vous pouvez trouver et partager des dispositions dans le %s. Section de discussion + Afficher les suggestions de domaines (TLD) + Remplacer les suggestions de la touche point par des extensions de domaine (TLD) lors de la saisie d’URL ou d’adresses e-mail diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 6710cee0c..af8240d30 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -304,7 +304,7 @@ Il dizionario è stato creato per la lingua %1$s, ma lo stai aggiungendo a %2$s. Confermi? Chiudi Traccia dell\'input gestuale - Tocca la lingua per aprire le impostazioni + Lingua: tap → impostazioni Salva log Holo bianco Dizionario interno principale @@ -432,4 +432,11 @@ Scorciatoie correzione Nome non valido Distanza del trascinamento per il cambio lingua + Sotto-tipo personalizzato + %s (Baishakhi) + Attenzione: il layout è in uso + Lingue con dizionari + discussione dedicata + Scopri nuovi layout o condividi quelli che hai creato nella %s. + Scopri nuove combinazioni di colori o condividi le tue nella %s. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 71ac1c1b8..81ddbdbfc 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -476,4 +476,6 @@ Je kunt lay-outs zoeken en delen in de %s. discussiesectie %s (Baishakhi) + TLD-opties weergeven + Vervang pop-ups met interpunctie door topleveldomeinen bij het typen van URL\'s en e-mailadressen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 8c4746aad..53ee52e19 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -94,7 +94,7 @@ "Pokaż ikonę aplikacji" "Wyświetlaj ikonę aplikacji w programie uruchamiającym" "Słowniki dodatkowe" - "Słownik dostępny" + Dostępny słownik "Brak słowników" "Ostatnia aktualizacja" "Ustawienia" @@ -174,13 +174,13 @@ Błąd podczas przywracania kopii zapasowej: %s Kolory Tło klawiszy funkcyjnych - %s (Sebeolsik 390) + %s (Sebeolsik 390) Używaj słownika osobistego do przechowywania nauczonych słów To słowo znajduje się już w słowniku: %s. Wpisz inne. Zaokrąglony Kopia Czarne - %s (Sebeolsik Final) + %s (Sebeolsik Final) Czekoladowe Na pewno usunąć słownik \"%s\" dodany przez użytkownika? Pochmurne @@ -195,7 +195,7 @@ Różowe Języki i układy Nie można odczytać pliku - stąd + tutaj Błąd: wybrany plik nie jest prawidłowym plikiem słownika chronionej pamięci urządzenia Koloruj pasek nawigacyjny @@ -360,7 +360,7 @@ Spacja - przesuwanie pionowe Spacja - przesuwanie poziome Przesuń kursor - Brak przesuwania + Brak Odwróć kierunek po wybraniu układu klawiatury od prawej do lewej Zmienny kierunek paska narzędzi %s (Probhat) @@ -392,7 +392,7 @@ Emotikony Ustaw główny i do 6 drugorzędnych symboli waluty, oddzielonych spacją Dostosuj waluty - Załaduj + Dodaj Skopiuj do schowka Ładowanie spowoduje zastąpienie bieżącego motywu Zapisz do pliku @@ -471,9 +471,11 @@ Nieprawidłowa nazwa Języki ze słownikami Ostrzeżenie: ten układ jest aktualnie używany - Motywy możesz znaleźć i udostępnić w %s . - Układy możesz znaleźć i udostępnić w %s . + Motywy możesz znaleźć i udostępnić w %s. + Układy możesz znaleźć i udostępnić w %s. sekcji dyskusji - Własny podtyp + Własny układ %s (Baishakhi) + Pokaż wyskakujące okienka TLD + Zastąp wyskakujące okienka klawisza kropki domenami najwyższego poziomu podczas wpisywania adresów URL i adresów e-mail diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 1529f56b9..d3804bc19 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -439,4 +439,6 @@ seção de discussão Subtipo customizado %s (Baishakhi) + Mostrar teclas de TLD + Substituir os pop-ups da tecla de ponto com domínios de topo ao digitar URLs e endereços de e-mail diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 95df55569..e6c17c2e5 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -399,4 +399,35 @@ Introducerea vocală este dezactivată Afișează/ascunde bara de instrumente Resetezi cu adevărat toate pictogramele personalizate? + Subtip personalizat + Nume greșit + %s (Baishakhi) + Limbi cu dicționare + Tastatură împărțită + AVERTIZARE: Aspectul este utilizat în prezent + Setează imaginea de fundal (peisaj) + Dacă nu este setat, se va folosi imaginea portret + Poți găsi și împărtăși aspecte în %s. + Conectorul lățimii zero + Ștergi cu adevărat toate codurile cheie personalizate? + Distanța divizării (peisaj) + Activează tastatura divizată (peisaj) + Timp de restabilire a tastării rapide + Comenzi rapide corectare automată + Dacă este activat, comenzile rapide pot fi extinse prin corecție automată + Chiar ștergi %s? + Setează font personalizat din fișier + Suprimă tastele pop-up care sunt deja prezente pe aspectul de bază + Taste funcționale (ecran mare) + Aspecte secundare + Scală umplutură inferioară (peisaj) + Scală font la tastatură + Scală font vizualizare emoji + Coș de reciclare + Scală umplutură laterală (peisaj) + Scală umplutură laterală + Afișează indicii pe rândul cu numere + Distanța de deplasare pentru comutarea limbii + Poți găsi și împărtăși culori în %s. + secțiunea de discuții diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f20a02d33..d94f2353d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -285,7 +285,7 @@ Holo Белая Смена обоих Вверх - Удалить пользовательский словарь \"%s\"? + Удалить пользовательский словарь «%s»? Не получается прочитать файл здесь Выберите для добавления словаря. Словари в формате .dict можно скачать %s. @@ -307,7 +307,7 @@ Всё ещё используется Выбранный файл предназначен для %1$s, но ожидался %2$s. Всё ещё используете его для %2$s? Ошибка: выбранный файл не является корректным словарем - "Без словаря вы будете получать предложения только для введенного ранее текста.<br>\n Вы можете загрузить словари %1$s или проверить, можно ли загрузить словарь для \"%2$s\" напрямую %3$s." + "Без словаря вы будете получать предложения только для введенного ранее текста.<br>\n Вы можете загрузить словари %1$s или проверить, можно ли загрузить словарь для «%2$s» напрямую %3$s." %s (экспериментальный) Символы Символы (арабские) @@ -425,7 +425,7 @@ Shift Shift (нажат) Caps lock - Голосовой ввод отключен + Голосовой ввод отключён Показать / скрыть панель инструментов Соединитель нулевой ширины Настроить коды клавиш панели инструментов @@ -435,8 +435,8 @@ Разъединитель нулевой ширины Выход из режима работы одной рукой Действительно сбросить все настроенные иконки? - Bin - Вибрировать в режиме Не беспокоить + Корзина + Вибрация в режиме «Не беспокоить» %s (Фонетика) Автокоррекция сочетаний клавиш Установить пользовательский шрифт из файла diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 158233a9f..33e5840a7 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -433,4 +433,6 @@ 您可以在 %s 中查找和分享颜色。 自定义子类型 %s (Baishakhi) + 输入 URL 和电子邮件地址时,用顶级域替换句点键弹出 + 显示顶级域弹出键 diff --git a/fastlane/metadata/android/bn/full_description.txt b/fastlane/metadata/android/bn/full_description.txt index cd1f98e23..4912bc372 100644 --- a/fastlane/metadata/android/bn/full_description.txt +++ b/fastlane/metadata/android/bn/full_description.txt @@ -1,4 +1,4 @@ -হেলিবোর্ড গোপনীয়তা-সচেতন ওপেন সোর্স কিবোর্ড যার উৎস অ্যান্ড্রয়েড ওপেন সোর্স প্রজেক্ট এবং ওপেনবোর্ড। বাংলা (বাংলাদেশ) ভাষার জন্য এতে ইউনিজয় লেআউট যুক্ত আছে। +হেলিবোর্ড গোপনীয়তা-সচেতন ওপেন সোর্স কিবোর্ড যার উৎস অ্যান্ড্রয়েড ওপেন সোর্স প্রজেক্ট এবং ওপেনবোর্ড। বাংলা ভাষার জন্য এতে ইউনিজয়, প্রভাত, অক্ষর, ইনস্ক্রিপ্ট, বৈশাখী লেআউট যুক্ত আছে। এটি ইন্টারনেটের অনুমতি ব্যবহার করে না, তাই ১০০% অফলাইন। সুবিধা: From 7228fa06d18442274387d39ce6f9ad1881e4e613 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 22 Mar 2025 19:05:24 +0100 Subject: [PATCH 022/175] move "no limit" clipboard history retantion time to the right side sort of fixes GH-1425 (at least the unclarity about finding the setting) --- app/build.gradle.kts | 2 +- .../main/java/helium314/keyboard/latin/App.kt | 25 +++++++++++-------- .../keyboard/latin/ClipboardHistoryManager.kt | 2 +- .../settings/screens/PreferencesScreen.kt | 4 +-- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 27915d044..b4d2454be 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,7 +13,7 @@ android { applicationId = "helium314.keyboard" minSdk = 21 targetSdk = 34 - versionCode = 3001 + versionCode = 3002 versionName = "3.0-alpha2" ndk { abiFilters.clear() diff --git a/app/src/main/java/helium314/keyboard/latin/App.kt b/app/src/main/java/helium314/keyboard/latin/App.kt index c2d91df5f..13f45af1b 100644 --- a/app/src/main/java/helium314/keyboard/latin/App.kt +++ b/app/src/main/java/helium314/keyboard/latin/App.kt @@ -530,18 +530,21 @@ fun checkVersionUpgrade(context: Context) { prefs.edit().remove("auto_correction_confidence").putFloat(Settings.PREF_AUTO_CORRECT_THRESHOLD, value).apply() } } - if (oldVersion <= 2310) { - listOf( - Settings.PREF_ENABLED_SUBTYPES, - Settings.PREF_SELECTED_SUBTYPE, - Settings.PREF_ADDITIONAL_SUBTYPES - ).forEach { key -> - val value = prefs.getString(key, "")!! - if ("bengali," in value) { - prefs.edit().putString(key, value.replace("bengali,", "bengali_inscript,")).apply() - } + if (oldVersion <= 2310) { + listOf( + Settings.PREF_ENABLED_SUBTYPES, + Settings.PREF_SELECTED_SUBTYPE, + Settings.PREF_ADDITIONAL_SUBTYPES + ).forEach { key -> + val value = prefs.getString(key, "")!! + if ("bengali," in value) { + prefs.edit().putString(key, value.replace("bengali,", "bengali_inscript,")).apply() + } + } + } + if (oldVersion <= 3001 && prefs.getInt(Settings.PREF_CLIPBOARD_HISTORY_RETENTION_TIME, Defaults.PREF_CLIPBOARD_HISTORY_RETENTION_TIME) <= 0) { + prefs.edit().putInt(Settings.PREF_CLIPBOARD_HISTORY_RETENTION_TIME, 121).apply() } -} upgradeToolbarPrefs(prefs) LayoutUtilsCustom.onLayoutFileChanged() // just to be sure prefs.edit { putInt(Settings.PREF_VERSION_CODE, BuildConfig.VERSION_CODE) } diff --git a/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryManager.kt b/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryManager.kt index 3a279046a..b5d621881 100644 --- a/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryManager.kt +++ b/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryManager.kt @@ -120,7 +120,7 @@ class ClipboardHistoryManager( private fun checkClipRetentionElapsed() { val mins = latinIME.mSettings.current.mClipboardHistoryRetentionTime - if (mins <= 0) return // No retention limit + if (mins > 120) return // No retention limit, changed from <= 0 because we want it to be larger than all other choices val maxClipRetentionTime = mins * 60 * 1000L val now = System.currentTimeMillis() historyEntries.removeAll { !it.isPinned && (now - it.timeStamp) > maxClipRetentionTime } diff --git a/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt index d7e88c849..584ae858c 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt @@ -156,10 +156,10 @@ fun createPreferencesSettings(context: Context) = listOf( key = setting.key, default = Defaults.PREF_CLIPBOARD_HISTORY_RETENTION_TIME, description = { - if (it < 0) stringResource(R.string.settings_no_limit) + if (it > 120) stringResource(R.string.settings_no_limit) else stringResource(R.string.abbreviation_unit_minutes, it.toString()) }, - range = -1f..120f, + range = 1f..121f, ) }, Setting(context, Settings.PREF_VIBRATION_DURATION_SETTINGS, R.string.prefs_keypress_vibration_duration_settings) { setting -> From 9e91e7562b1e39140380088e57f2028b43bbf677 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 22 Mar 2025 19:27:38 +0100 Subject: [PATCH 023/175] add another setting to disable always show suggestions just for web edit fields, which seem fo frequenty cause issues with this setting --- .../java/helium314/keyboard/latin/settings/Defaults.kt | 1 + .../java/helium314/keyboard/latin/settings/Settings.java | 1 + .../helium314/keyboard/latin/settings/SettingsValues.java | 6 +++++- .../keyboard/settings/screens/TextCorrectionScreen.kt | 7 +++++++ app/src/main/res/values/strings.xml | 4 ++++ 5 files changed, 18 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt index 1a890fa22..58ef7939c 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt @@ -66,6 +66,7 @@ object Defaults { const val PREF_CENTER_SUGGESTION_TEXT_TO_ENTER = false const val PREF_SHOW_SUGGESTIONS = true const val PREF_ALWAYS_SHOW_SUGGESTIONS = false + const val PREF_ALWAYS_SHOW_SUGGESTIONS_EXCEPT_WEB_TEXT = true const val PREF_KEY_USE_PERSONALIZED_DICTS = true const val PREF_KEY_USE_DOUBLE_SPACE_PERIOD = true const val PREF_BLOCK_POTENTIALLY_OFFENSIVE = true diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java index 6d45548af..bad339e5e 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -74,6 +74,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_CENTER_SUGGESTION_TEXT_TO_ENTER = "center_suggestion_text_to_enter"; public static final String PREF_SHOW_SUGGESTIONS = "show_suggestions"; public static final String PREF_ALWAYS_SHOW_SUGGESTIONS = "always_show_suggestions"; + public static final String PREF_ALWAYS_SHOW_SUGGESTIONS_EXCEPT_WEB_TEXT = "always_show_suggestions_except_web_text"; public static final String PREF_KEY_USE_PERSONALIZED_DICTS = "use_personalized_dicts"; public static final String PREF_KEY_USE_DOUBLE_SPACE_PERIOD = "use_double_space_period"; public static final String PREF_BLOCK_POTENTIALLY_OFFENSIVE = "block_potentially_offensive"; diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java index 9a18fde2e..376c36680 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java @@ -11,6 +11,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; +import android.text.InputType; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodSubtype; @@ -221,7 +222,10 @@ public class SettingsValues { mGestureFastTypingCooldown = prefs.getInt(Settings.PREF_GESTURE_FAST_TYPING_COOLDOWN, Defaults.PREF_GESTURE_FAST_TYPING_COOLDOWN); mGestureTrailFadeoutDuration = prefs.getInt(Settings.PREF_GESTURE_TRAIL_FADEOUT_DURATION, Defaults.PREF_GESTURE_TRAIL_FADEOUT_DURATION); mAccount = null; // remove? or can it be useful somewhere? - mOverrideShowingSuggestions = mInputAttributes.mMayOverrideShowingSuggestions && prefs.getBoolean(Settings.PREF_ALWAYS_SHOW_SUGGESTIONS, Defaults.PREF_ALWAYS_SHOW_SUGGESTIONS); + mOverrideShowingSuggestions = mInputAttributes.mMayOverrideShowingSuggestions + && prefs.getBoolean(Settings.PREF_ALWAYS_SHOW_SUGGESTIONS, Defaults.PREF_ALWAYS_SHOW_SUGGESTIONS) + && ((inputAttributes.mInputType & InputType.TYPE_MASK_VARIATION) != InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT + || !prefs.getBoolean(Settings.PREF_ALWAYS_SHOW_SUGGESTIONS_EXCEPT_WEB_TEXT, Defaults.PREF_ALWAYS_SHOW_SUGGESTIONS_EXCEPT_WEB_TEXT)); final boolean suggestionsEnabled = prefs.getBoolean(Settings.PREF_SHOW_SUGGESTIONS, Defaults.PREF_SHOW_SUGGESTIONS); mSuggestionsEnabledPerUserSettings = (mInputAttributes.mShouldShowSuggestions && suggestionsEnabled) || mOverrideShowingSuggestions; diff --git a/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt index 97d641885..f2d570482 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt @@ -63,6 +63,8 @@ fun TextCorrectionScreen( R.string.settings_category_suggestions, Settings.PREF_SHOW_SUGGESTIONS, if (suggestionsEnabled) Settings.PREF_ALWAYS_SHOW_SUGGESTIONS else null, + if (suggestionsEnabled && prefs.getBoolean(Settings.PREF_ALWAYS_SHOW_SUGGESTIONS, Defaults.PREF_ALWAYS_SHOW_SUGGESTIONS)) + Settings.PREF_ALWAYS_SHOW_SUGGESTIONS_EXCEPT_WEB_TEXT else null, if (suggestionsEnabled) Settings.PREF_CENTER_SUGGESTION_TEXT_TO_ENTER else null, Settings.PREF_KEY_USE_PERSONALIZED_DICTS, Settings.PREF_BIGRAM_PREDICTIONS, @@ -139,6 +141,11 @@ fun createCorrectionSettings(context: Context) = listOf( ) { SwitchPreference(it, Defaults.PREF_ALWAYS_SHOW_SUGGESTIONS) }, + Setting(context, Settings.PREF_ALWAYS_SHOW_SUGGESTIONS_EXCEPT_WEB_TEXT, + R.string.prefs_always_show_suggestions_except_web_text, R.string.prefs_always_show_suggestions_except_web_text_summary + ) { + SwitchPreference(it, Defaults.PREF_ALWAYS_SHOW_SUGGESTIONS_EXCEPT_WEB_TEXT) + }, Setting(context, Settings.PREF_KEY_USE_PERSONALIZED_DICTS, R.string.use_personalized_dicts, R.string.use_personalized_dicts_summary ) { setting -> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e063b07c1..f683b1206 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -104,6 +104,10 @@ Always show suggestions Ignore other apps’ request to disable suggestions (may cause issues) + + Don’t always show suggestions for web edit fields + + Web edit fields (mostly found in browsers) are a very common cause for issues with the always show suggestions setting Block offensive words From efaddf6c5194e0b8f7afedf58d66d83432096bb4 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 22 Mar 2025 19:34:27 +0100 Subject: [PATCH 024/175] store clipboard history as strings, fixes GH-1430 --- .../keyboard/latin/ClipboardHistoryEntry.kt | 18 +----------------- .../keyboard/latin/ClipboardHistoryManager.kt | 6 +++--- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryEntry.kt b/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryEntry.kt index bb6cf5bf0..1990ee929 100644 --- a/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryEntry.kt +++ b/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryEntry.kt @@ -2,18 +2,12 @@ package helium314.keyboard.latin -import kotlinx.serialization.KSerializer import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder @Serializable data class ClipboardHistoryEntry ( var timeStamp: Long, - @Serializable(with = CharSequenceStringSerializer::class) - val content: CharSequence, + val content: String, var isPinned: Boolean = false ) : Comparable { override fun compareTo(other: ClipboardHistoryEntry): Int { @@ -21,13 +15,3 @@ data class ClipboardHistoryEntry ( return if (result != 0) result else other.timeStamp.compareTo(timeStamp) } } - -class CharSequenceStringSerializer : KSerializer { - override val descriptor = PrimitiveSerialDescriptor("CharSequence", PrimitiveKind.STRING) - - override fun serialize(encoder: Encoder, value: CharSequence) { - encoder.encodeString(value.toString()) - } - - override fun deserialize(decoder: Decoder) = decoder.decodeString() -} \ No newline at end of file diff --git a/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryManager.kt b/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryManager.kt index b5d621881..8d41cfb70 100644 --- a/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryManager.kt +++ b/app/src/main/java/helium314/keyboard/latin/ClipboardHistoryManager.kt @@ -61,7 +61,7 @@ class ClipboardHistoryManager( val content = clipItem.coerceToText(latinIME) if (TextUtils.isEmpty(content)) return - val duplicateEntryIndex = historyEntries.indexOfFirst { it.content.toString() == content.toString() } + val duplicateEntryIndex = historyEntries.indexOfFirst { it.content == content.toString() } if (duplicateEntryIndex != -1) { val existingEntry = historyEntries[duplicateEntryIndex] if (existingEntry.timeStamp == timeStamp) return // nothing to change (may occur frequently starting with API 30) @@ -74,9 +74,9 @@ class ClipboardHistoryManager( onHistoryChangeListener?.onClipboardHistoryEntryMoved(duplicateEntryIndex, newIndex) return } - if (historyEntries.any { it.content.toString() == content.toString() }) return + if (historyEntries.any { it.content == content.toString() }) return - val entry = ClipboardHistoryEntry(timeStamp, content) + val entry = ClipboardHistoryEntry(timeStamp, content.toString()) historyEntries.add(entry) sortHistoryEntries() val at = historyEntries.indexOf(entry) From 2fe0937ead59976fc17543c8db618a0ae30e8959 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 22 Mar 2025 20:05:51 +0100 Subject: [PATCH 025/175] apparently people want smaller icons --- .../java/helium314/keyboard/settings/preferences/Preference.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/Preference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/Preference.kt index 00a30c23a..a60e6298a 100644 --- a/app/src/main/java/helium314/keyboard/settings/preferences/Preference.kt +++ b/app/src/main/java/helium314/keyboard/settings/preferences/Preference.kt @@ -10,7 +10,6 @@ import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor @@ -70,7 +69,7 @@ fun Preference( verticalAlignment = Alignment.CenterVertically ) { if (icon != null) - IconOrImage(icon, name, 36f) + IconOrImage(icon, name, 32f) Column(modifier = Modifier.weight(1f)) { Text(text = name, style = MaterialTheme.typography.bodyLarge) if (description != null) { From 88a7f410381024a92b2c5d092d02f096309d482c Mon Sep 17 00:00:00 2001 From: EduRGB <25287542+EduRGB@users.noreply.github.com> Date: Sat, 22 Mar 2025 20:28:56 +0100 Subject: [PATCH 026/175] Layout for shift + long press on number row (#1400) Add full-featured number row layout and set it as default; set existing layout as basic. --- .../assets/layouts/number_row/number_row.json | 44 +++++++++++++++++++ .../{number_row.txt => number_row_basic.txt} | 2 +- app/src/main/res/values/strings.xml | 2 + 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 app/src/main/assets/layouts/number_row/number_row.json rename app/src/main/assets/layouts/number_row/{number_row.txt => number_row_basic.txt} (85%) diff --git a/app/src/main/assets/layouts/number_row/number_row.json b/app/src/main/assets/layouts/number_row/number_row.json new file mode 100644 index 000000000..3ad11861a --- /dev/null +++ b/app/src/main/assets/layouts/number_row/number_row.json @@ -0,0 +1,44 @@ +[ + [ + { "$": "shift_state_selector", + "manualOrLocked": { "label": "!" }, + "default": { "label": "1", "popup": { "relevant": [{ "label": "¹" }, { "label": "½" }, { "label": "⅓" }, { "label": "¼" }, { "label": "⅛" }] } } + }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "@" }, + "default": { "label": "2", "popup": { "relevant": [{ "label": "²" }, { "label": "⅔" }] } } + }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "#" }, + "default": { "label": "3", "popup": { "relevant": [{ "label": "³" }, { "label": "¾" }, { "label": "⅜" }] } } + }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "$" }, + "default": { "label": "4", "popup": { "relevant": [{ "label": "⁴" }] } } + }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "%" }, + "default": { "label": "5", "popup": { "relevant": [{ "label": "⁵" }, { "label": "⅝" }] } } + }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "^" }, + "default": { "label": "6", "popup": { "relevant": [{ "label": "⁶" }] } } + }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "&" }, + "default": { "label": "7", "popup": { "relevant": [{ "label": "⁷" }, { "label": "⅞" }] } } + }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "*" }, + "default": { "label": "8", "popup": { "relevant": [{ "label": "⁸" }] } } + }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "(" }, + "default": { "label": "9", "popup": { "relevant": [{ "label": "⁹" }] } } + }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": ")" }, + "default": { "label": "0", "popup": { "relevant": [{ "label": "⁰" }, { "label": "ⁿ" }, { "label": "∅" }] } } + } + ] + ] \ No newline at end of file diff --git a/app/src/main/assets/layouts/number_row/number_row.txt b/app/src/main/assets/layouts/number_row/number_row_basic.txt similarity index 85% rename from app/src/main/assets/layouts/number_row/number_row.txt rename to app/src/main/assets/layouts/number_row/number_row_basic.txt index a7fed81c6..709c30a8b 100644 --- a/app/src/main/assets/layouts/number_row/number_row.txt +++ b/app/src/main/assets/layouts/number_row/number_row_basic.txt @@ -7,4 +7,4 @@ 7 ⁷ ⅞ 8 ⁸ 9 ⁹ -0 ⁰ ⁿ ∅ +0 ⁰ ⁿ ∅ \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f683b1206..9873295b1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -563,6 +563,8 @@ disposition rather than other common dispositions for Latin languages. --> Numpad (landscape) Number row + + Number row (basic) Emoji bottom row From 66a07eb8d2844baca464705705a3942b6e85cad8 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 26 Mar 2025 18:05:00 +0100 Subject: [PATCH 027/175] Add more settings for autospace fixes GH-1348 fixes GH-876 --- .../keyboard/latin/WordComposer.java | 4 ++++ .../keyboard/latin/inputlogic/InputLogic.java | 19 +++++++++++-------- .../keyboard/latin/settings/Defaults.kt | 4 ++++ .../keyboard/latin/settings/Settings.java | 4 ++++ .../latin/settings/SettingsValues.java | 12 ++++++++++-- .../settings/screens/TextCorrectionScreen.kt | 19 +++++++++++++++++++ app/src/main/res/values/strings.xml | 16 ++++++++++++++-- 7 files changed, 66 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/WordComposer.java b/app/src/main/java/helium314/keyboard/latin/WordComposer.java index d67f50d7e..203eb205c 100644 --- a/app/src/main/java/helium314/keyboard/latin/WordComposer.java +++ b/app/src/main/java/helium314/keyboard/latin/WordComposer.java @@ -474,6 +474,10 @@ public final class WordComposer { return mIsBatchMode; } + public void unsetBatchMode() { + mIsBatchMode = false; + } + public void setRejectedBatchModeSuggestion(final String rejectedSuggestion) { mRejectedBatchModeSuggestion = rejectedSuggestion; } diff --git a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java index 83d008642..b98906ef3 100644 --- a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java @@ -323,7 +323,8 @@ public final class InputLogic { // Don't allow cancellation of manual pick mLastComposedWord.deactivate(); // Space state must be updated before calling updateShiftState - mSpaceState = SpaceState.PHANTOM; + if (settingsValues.mAutospaceAfterSuggestion) + mSpaceState = SpaceState.PHANTOM; inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); // If we're not showing the "Touch again to save", then update the suggestion strip. @@ -546,7 +547,8 @@ public final class InputLogic { || settingsValues.isUsuallyFollowedBySpace(codePointBeforeCursor)) { final boolean autoShiftHasBeenOverriden = keyboardSwitcher.getKeyboardShiftMode() != getCurrentAutoCapsState(settingsValues); - mSpaceState = SpaceState.PHANTOM; + if (settingsValues.mAutospaceBeforeGestureTyping) + mSpaceState = SpaceState.PHANTOM; if (!autoShiftHasBeenOverriden) { // When we change the space state, we need to update the shift state of the // keyboard unless it has been overridden manually. This is happening for example @@ -686,10 +688,7 @@ public final class InputLogic { if (mSuggestedWords.isPrediction()) { inputTransaction.setRequiresUpdateSuggestions(); } - // undo phantom space if it's because after punctuation - // users who want to start a sentence with a lowercase letter may not like it - if (mSpaceState == SpaceState.PHANTOM - && inputTransaction.getMSettingsValues().isUsuallyFollowedBySpace(mConnection.getCodePointBeforeCursor())) + if (mSpaceState == SpaceState.PHANTOM && inputTransaction.getMSettingsValues().mShiftRemovesAutospace) mSpaceState = SpaceState.NONE; break; case KeyCode.SETTINGS: @@ -930,6 +929,7 @@ public final class InputLogic { // handleNonSpecialCharacterEvent which has the same name as other handle* methods but is // not the same. boolean isComposingWord = mWordComposer.isComposingWord(); + mWordComposer.unsetBatchMode(); // relevant in case we continue a batch word with normal typing // if we continue directly after a sometimesWordConnector, restart suggestions for the whole word // (only with URL detection and suggestions enabled) @@ -1127,7 +1127,7 @@ public final class InputLogic { // A double quote behaves like it's usually followed by space if we're inside // a double quote. if (wasComposingWord - && settingsValues.mAutospaceAfterPunctuationEnabled + && settingsValues.mAutospaceAfterPunctuation && (settingsValues.isUsuallyFollowedBySpace(codePoint) || isInsideDoubleQuoteOrAfterDigit)) { mSpaceState = SpaceState.PHANTOM; } @@ -2168,6 +2168,7 @@ public final class InputLogic { && !(mConnection.getCodePointBeforeCursor() == Constants.CODE_PERIOD && mConnection.wordBeforeCursorMayBeEmail()) ) { mConnection.commitCodePoint(Constants.CODE_SPACE); + // todo: why not remove phantom space state? } } @@ -2202,12 +2203,14 @@ public final class InputLogic { mConnection.beginBatchEdit(); if (SpaceState.PHANTOM == mSpaceState) { insertAutomaticSpaceIfOptionsAndTextAllow(settingsValues); + mSpaceState = SpaceState.NONE; } mWordComposer.setBatchInputWord(batchInputText); setComposingTextInternal(batchInputText, 1); mConnection.endBatchEdit(); // Space state must be updated before calling updateShiftState - mSpaceState = SpaceState.PHANTOM; + if (settingsValues.mAutospaceAfterGestureTyping) + mSpaceState = SpaceState.PHANTOM; keyboardSwitcher.requestUpdatingShiftState(getCurrentAutoCapsState(settingsValues), getCurrentRecapitalizeState()); } diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt index 58ef7939c..08df4eac0 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt @@ -92,6 +92,10 @@ object Defaults { const val PREF_SPACE_VERTICAL_SWIPE = "none" const val PREF_DELETE_SWIPE = true const val PREF_AUTOSPACE_AFTER_PUNCTUATION = false + const val PREF_AUTOSPACE_AFTER_SUGGESTION = true + const val PREF_AUTOSPACE_AFTER_GESTURE_TYPING = true + const val PREF_AUTOSPACE_BEFORE_GESTURE_TYPING = true + const val PREF_SHIFT_REMOVES_AUTOSPACE = false const val PREF_ALWAYS_INCOGNITO_MODE = false const val PREF_BIGRAM_PREDICTIONS = true const val PREF_SUGGEST_CLIPBOARD_CONTENT = true diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java index bad339e5e..08bf53b3c 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -98,6 +98,10 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_SPACE_VERTICAL_SWIPE = "vertical_space_swipe"; public static final String PREF_DELETE_SWIPE = "delete_swipe"; public static final String PREF_AUTOSPACE_AFTER_PUNCTUATION = "autospace_after_punctuation"; + public static final String PREF_AUTOSPACE_AFTER_SUGGESTION = "autospace_after_suggestion"; + public static final String PREF_AUTOSPACE_AFTER_GESTURE_TYPING = "autospace_after_gesture_typing"; + public static final String PREF_AUTOSPACE_BEFORE_GESTURE_TYPING = "autospace_before_gesture_typing"; + public static final String PREF_SHIFT_REMOVES_AUTOSPACE = "shift_removes_autospace"; public static final String PREF_ALWAYS_INCOGNITO_MODE = "always_incognito_mode"; public static final String PREF_BIGRAM_PREDICTIONS = "next_word_prediction"; public static final String PREF_SUGGEST_CLIPBOARD_CONTENT = "suggest_clipboard_content"; diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java index 376c36680..3430ae042 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java @@ -77,7 +77,11 @@ public class SettingsValues { public final int mSpaceSwipeVertical; public final int mLanguageSwipeDistance; public final boolean mDeleteSwipeEnabled; - public final boolean mAutospaceAfterPunctuationEnabled; + public final boolean mAutospaceAfterPunctuation; + public final boolean mAutospaceAfterSuggestion; + public final boolean mAutospaceAfterGestureTyping; + public final boolean mAutospaceBeforeGestureTyping; + public final boolean mShiftRemovesAutospace; public final boolean mClipboardHistoryEnabled; public final long mClipboardHistoryRetentionTime; public final boolean mOneHandedModeEnabled; @@ -236,7 +240,11 @@ public class SettingsValues { mSpaceSwipeVertical = Settings.readVerticalSpaceSwipe(prefs); mLanguageSwipeDistance = prefs.getInt(Settings.PREF_LANGUAGE_SWIPE_DISTANCE, Defaults.PREF_LANGUAGE_SWIPE_DISTANCE); mDeleteSwipeEnabled = prefs.getBoolean(Settings.PREF_DELETE_SWIPE, Defaults.PREF_DELETE_SWIPE); - mAutospaceAfterPunctuationEnabled = prefs.getBoolean(Settings.PREF_AUTOSPACE_AFTER_PUNCTUATION, Defaults.PREF_AUTOSPACE_AFTER_PUNCTUATION); + mAutospaceAfterPunctuation = prefs.getBoolean(Settings.PREF_AUTOSPACE_AFTER_PUNCTUATION, Defaults.PREF_AUTOSPACE_AFTER_PUNCTUATION); + mAutospaceAfterSuggestion = prefs.getBoolean(Settings.PREF_AUTOSPACE_AFTER_SUGGESTION, Defaults.PREF_AUTOSPACE_AFTER_SUGGESTION); + mAutospaceAfterGestureTyping = prefs.getBoolean(Settings.PREF_AUTOSPACE_AFTER_GESTURE_TYPING, Defaults.PREF_AUTOSPACE_AFTER_GESTURE_TYPING); + mAutospaceBeforeGestureTyping = prefs.getBoolean(Settings.PREF_AUTOSPACE_BEFORE_GESTURE_TYPING, Defaults.PREF_AUTOSPACE_BEFORE_GESTURE_TYPING); + mShiftRemovesAutospace = prefs.getBoolean(Settings.PREF_SHIFT_REMOVES_AUTOSPACE, Defaults.PREF_SHIFT_REMOVES_AUTOSPACE); mClipboardHistoryEnabled = prefs.getBoolean(Settings.PREF_ENABLE_CLIPBOARD_HISTORY, Defaults.PREF_ENABLE_CLIPBOARD_HISTORY); mClipboardHistoryRetentionTime = prefs.getInt(Settings.PREF_CLIPBOARD_HISTORY_RETENTION_TIME, Defaults.PREF_CLIPBOARD_HISTORY_RETENTION_TIME); diff --git a/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt index f2d570482..f322e0f00 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt @@ -22,6 +22,7 @@ import helium314.keyboard.latin.R import helium314.keyboard.latin.permissions.PermissionsUtil import helium314.keyboard.latin.settings.Defaults import helium314.keyboard.latin.settings.Settings +import helium314.keyboard.latin.utils.JniUtils import helium314.keyboard.latin.utils.Log import helium314.keyboard.latin.utils.getActivity import helium314.keyboard.latin.utils.prefs @@ -49,6 +50,7 @@ fun TextCorrectionScreen( Log.v("irrelevant", "stupid way to trigger recomposition on preference change") val autocorrectEnabled = prefs.getBoolean(Settings.PREF_AUTO_CORRECTION, Defaults.PREF_AUTO_CORRECTION) val suggestionsEnabled = prefs.getBoolean(Settings.PREF_SHOW_SUGGESTIONS, Defaults.PREF_SHOW_SUGGESTIONS) + val gestureEnabled = JniUtils.sHaveGestureLib && prefs.getBoolean(Settings.PREF_GESTURE_INPUT, Defaults.PREF_GESTURE_INPUT) val items = listOf( SettingsWithoutKey.EDIT_PERSONAL_DICTIONARY, R.string.settings_category_correction, @@ -58,8 +60,13 @@ fun TextCorrectionScreen( if (autocorrectEnabled) Settings.PREF_AUTOCORRECT_SHORTCUTS else null, if (autocorrectEnabled) Settings.PREF_AUTO_CORRECT_THRESHOLD else null, Settings.PREF_AUTO_CAP, + R.string.settings_category_space, Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, Settings.PREF_AUTOSPACE_AFTER_PUNCTUATION, + Settings.PREF_AUTOSPACE_AFTER_SUGGESTION, + if (gestureEnabled) Settings.PREF_AUTOSPACE_BEFORE_GESTURE_TYPING else null, + if (gestureEnabled) Settings.PREF_AUTOSPACE_AFTER_GESTURE_TYPING else null, + Settings.PREF_SHIFT_REMOVES_AUTOSPACE, R.string.settings_category_suggestions, Settings.PREF_SHOW_SUGGESTIONS, if (suggestionsEnabled) Settings.PREF_ALWAYS_SHOW_SUGGESTIONS else null, @@ -131,6 +138,18 @@ fun createCorrectionSettings(context: Context) = listOf( ) { SwitchPreference(it, Defaults.PREF_AUTOSPACE_AFTER_PUNCTUATION) }, + Setting(context, Settings.PREF_AUTOSPACE_AFTER_SUGGESTION, R.string.autospace_after_suggestion) { + SwitchPreference(it, Defaults.PREF_AUTOSPACE_AFTER_SUGGESTION) + }, + Setting(context, Settings.PREF_AUTOSPACE_AFTER_GESTURE_TYPING, R.string.autospace_after_gesture_typing) { + SwitchPreference(it, Defaults.PREF_AUTOSPACE_AFTER_GESTURE_TYPING) + }, + Setting(context, Settings.PREF_AUTOSPACE_BEFORE_GESTURE_TYPING, R.string.autospace_before_gesture_typing) { + SwitchPreference(it, Defaults.PREF_AUTOSPACE_BEFORE_GESTURE_TYPING) + }, + Setting(context, Settings.PREF_SHIFT_REMOVES_AUTOSPACE, R.string.shift_removes_autospace, R.string.shift_removes_autospace_summary) { + SwitchPreference(it, Defaults.PREF_SHIFT_REMOVES_AUTOSPACE) + }, Setting(context, Settings.PREF_SHOW_SUGGESTIONS, R.string.prefs_show_suggestions, R.string.prefs_show_suggestions_summary ) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9873295b1..aecf63b66 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -38,6 +38,8 @@ Clipboard history Corrections + + Space Suggestions @@ -209,10 +211,20 @@ Load library Delete library - + Autospace after punctuation - + Automatically insert space after punctuation when typing a new word + + Autospace after picking a suggestion + + Autospace before gesture typing a word + + Autospace after gesture typing a word + + No autospace when pressing shift + + Shift removes pending autospace Show more letters with diacritics in popup From b600431af9cdd3166e3cd547b85f63d29956f6d5 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 26 Mar 2025 18:11:47 +0100 Subject: [PATCH 028/175] reduce vertical padding for preference --- .../java/helium314/keyboard/settings/preferences/Preference.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/Preference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/Preference.kt index a60e6298a..63fc46922 100644 --- a/app/src/main/java/helium314/keyboard/settings/preferences/Preference.kt +++ b/app/src/main/java/helium314/keyboard/settings/preferences/Preference.kt @@ -64,7 +64,7 @@ fun Preference( .fillMaxWidth() .clickable { onClick() } .heightIn(min = 44.dp) - .padding(12.dp), + .padding(vertical = 10.dp, horizontal = 12.dp), horizontalArrangement = Arrangement.spacedBy(12.dp), verticalAlignment = Alignment.CenterVertically ) { From c0b14635fdcc82bab55d4d13839ee5c0102fc0bd Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 26 Mar 2025 18:29:57 +0100 Subject: [PATCH 029/175] fix issue that could result in autospace being added before period --- .../helium314/keyboard/latin/inputlogic/InputLogic.java | 4 +++- .../test/java/helium314/keyboard/latin/InputLogicTest.kt | 7 +------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java index b98906ef3..cd545d4e1 100644 --- a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java @@ -949,7 +949,9 @@ public final class InputLogic { // TODO: remove isWordConnector() and use isUsuallyFollowedBySpace() instead. // See onStartBatchInput() to see how to do it. if (SpaceState.PHANTOM == inputTransaction.getMSpaceState() - && !settingsValues.isWordConnector(codePoint)) { + && !settingsValues.isWordConnector(codePoint) + && !settingsValues.isUsuallyFollowedBySpace(codePoint) // only relevant in rare cases + ) { if (isComposingWord) { // Sanity check throw new RuntimeException("Should not be composing here"); diff --git a/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt b/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt index 4a430ab5d..e6aa80953 100644 --- a/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt +++ b/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt @@ -203,13 +203,7 @@ class InputLogicTest { assertEquals("example.net", composingText) } - // fails because - // period is not handled with handleSeparatorEvent in this case - // pickSuggestion sets phantom space state - // insertAutomaticSpaceIfOptionsAndTextAllow allows the space - // todo: fix it either in some of those functions, or by finally improving URL detection in a reasonable (and performant) way @Test fun noAutospaceInUrlFieldWhenPickingSuggestion() { - if (BuildConfig.BUILD_TYPE == "runTests") return reset() setInputType(InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_URI) chainInput("exam") @@ -262,6 +256,7 @@ class InputLogicTest { reset() latinIME.prefs().edit { putBoolean(Settings.PREF_URL_DETECTION, true) } latinIME.prefs().edit { putBoolean(Settings.PREF_AUTOSPACE_AFTER_PUNCTUATION, true) } + latinIME.prefs().edit { putBoolean(Settings.PREF_SHIFT_REMOVES_AUTOSPACE, true) } input("bla") input('.') functionalKeyPress(KeyCode.SHIFT) // should remove the phantom space (in addition to normal effect) From f5bc89b91d4f46bfc224a758906b38479fea132a Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 26 Mar 2025 19:18:13 +0100 Subject: [PATCH 030/175] make reverting autocorrect on backspace optional fixes GH-210 --- .../keyboard/latin/inputlogic/InputLogic.java | 2 +- .../helium314/keyboard/latin/settings/Defaults.kt | 1 + .../helium314/keyboard/latin/settings/Settings.java | 1 + .../keyboard/latin/settings/SettingsValues.java | 2 ++ .../settings/screens/TextCorrectionScreen.kt | 4 ++++ app/src/main/res/values/strings.xml | 2 ++ .../java/helium314/keyboard/latin/InputLogicTest.kt | 13 ++++++++++--- 7 files changed, 21 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java index cd545d4e1..14d5aa3bb 100644 --- a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java @@ -1198,7 +1198,7 @@ public final class InputLogic { } inputTransaction.setRequiresUpdateSuggestions(); } else { - if (mLastComposedWord.canRevertCommit()) { + if (mLastComposedWord.canRevertCommit() && inputTransaction.getMSettingsValues().mBackspaceRevertsAutocorrect) { final String lastComposedWord = mLastComposedWord.mTypedWord; revertCommit(inputTransaction); StatsUtils.onRevertAutoCorrect(); diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt index 08df4eac0..09c0f88d3 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt @@ -63,6 +63,7 @@ object Defaults { const val PREF_MORE_AUTO_CORRECTION = false const val PREF_AUTO_CORRECT_THRESHOLD = 0.185f const val PREF_AUTOCORRECT_SHORTCUTS = true + const val PREF_BACKSPACE_REVERTS_AUTOCORRECT = true const val PREF_CENTER_SUGGESTION_TEXT_TO_ENTER = false const val PREF_SHOW_SUGGESTIONS = true const val PREF_ALWAYS_SHOW_SUGGESTIONS = false diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java index 08bf53b3c..55a80bd87 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -71,6 +71,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_MORE_AUTO_CORRECTION = "more_auto_correction"; public static final String PREF_AUTO_CORRECT_THRESHOLD = "auto_correct_threshold"; public static final String PREF_AUTOCORRECT_SHORTCUTS = "autocorrect_shortcuts"; + public static final String PREF_BACKSPACE_REVERTS_AUTOCORRECT = "backspace_reverts_autocorrect"; public static final String PREF_CENTER_SUGGESTION_TEXT_TO_ENTER = "center_suggestion_text_to_enter"; public static final String PREF_SHOW_SUGGESTIONS = "show_suggestions"; public static final String PREF_ALWAYS_SHOW_SUGGESTIONS = "always_show_suggestions"; diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java index 3430ae042..9fe0a3725 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java @@ -135,6 +135,7 @@ public class SettingsValues { public final boolean mAutoCorrectionEnabledPerUserSettings; public final boolean mAutoCorrectEnabled; public final float mAutoCorrectionThreshold; + public final boolean mBackspaceRevertsAutocorrect; public final int mScoreLimitForAutocorrect; public final boolean mAutoCorrectShortcuts; private final boolean mSuggestionsEnabledPerUserSettings; @@ -199,6 +200,7 @@ public class SettingsValues { mScoreLimitForAutocorrect = (mAutoCorrectionThreshold < 0) ? 600000 // very aggressive : (mAutoCorrectionThreshold < 0.07 ? 800000 : 950000); // aggressive or modest mAutoCorrectShortcuts = prefs.getBoolean(Settings.PREF_AUTOCORRECT_SHORTCUTS, Defaults.PREF_AUTOCORRECT_SHORTCUTS); + mBackspaceRevertsAutocorrect = prefs.getBoolean(Settings.PREF_BACKSPACE_REVERTS_AUTOCORRECT, Defaults.PREF_BACKSPACE_REVERTS_AUTOCORRECT); mBigramPredictionEnabled = prefs.getBoolean(Settings.PREF_BIGRAM_PREDICTIONS, Defaults.PREF_BIGRAM_PREDICTIONS); mSuggestClipboardContent = prefs.getBoolean(Settings.PREF_SUGGEST_CLIPBOARD_CONTENT, Defaults.PREF_SUGGEST_CLIPBOARD_CONTENT); mDoubleSpacePeriodTimeout = 1100; // ms diff --git a/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt index f322e0f00..eea74b919 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt @@ -59,6 +59,7 @@ fun TextCorrectionScreen( if (autocorrectEnabled) Settings.PREF_MORE_AUTO_CORRECTION else null, if (autocorrectEnabled) Settings.PREF_AUTOCORRECT_SHORTCUTS else null, if (autocorrectEnabled) Settings.PREF_AUTO_CORRECT_THRESHOLD else null, + if (autocorrectEnabled) Settings.PREF_BACKSPACE_REVERTS_AUTOCORRECT else null, Settings.PREF_AUTO_CAP, R.string.settings_category_space, Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, @@ -123,6 +124,9 @@ fun createCorrectionSettings(context: Context) = listOf( // todo: consider making it a slider, and maybe somehow adjust range so we can show % ListPreference(it, items, Defaults.PREF_AUTO_CORRECT_THRESHOLD) }, + Setting(context, Settings.PREF_BACKSPACE_REVERTS_AUTOCORRECT, R.string.backspace_reverts_autocorrect) { + SwitchPreference(it, Defaults.PREF_BACKSPACE_REVERTS_AUTOCORRECT) + }, Setting(context, Settings.PREF_AUTO_CAP, R.string.auto_cap, R.string.auto_cap_summary ) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aecf63b66..aa277977c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -128,6 +128,8 @@ Auto-correct shortcuts When enabled shortcuts might be expanded by autocorrect + + Backspace reverts autocorrect Off diff --git a/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt b/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt index e6aa80953..e8f2a5c34 100644 --- a/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt +++ b/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt @@ -639,13 +639,20 @@ class InputLogicTest { @Test fun `revert autocorrect on delete`() { reset() + setInputType(InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) chainInput("hullo") getAutocorrectedWithSpaceAfter("hello", "hullo") + assertEquals("hello ", text) functionalKeyPress(KeyCode.DELETE) assertEquals("hullo", text) - // todo: now we want some way to disable revert on backspace, either per setting or something else - // need to avoid getting into the mLastComposedWord.canRevertCommit() part of handleBackspaceEvent + reset() + setInputType(InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) + latinIME.prefs().edit { putBoolean(Settings.PREF_BACKSPACE_REVERTS_AUTOCORRECT, false) } + chainInput("hullo") + getAutocorrectedWithSpaceAfter("hello", "hullo") + functionalKeyPress(KeyCode.DELETE) + assertEquals("hello", text) } @Test fun `remove glide typing word on delete`() { @@ -803,7 +810,7 @@ class InputLogicTest { val info = SuggestedWordInfo(suggestion, "", 0, 0, null, 0, 0) val typedInfo = SuggestedWordInfo(typedWord, "", 0, 0, null, 0, 0) val sw = SuggestedWords(ArrayList(listOf(typedInfo, info)), null, typedInfo, false, true, false, 0, 0) - latinIME.mInputLogic.setSuggestedWords(sw) + latinIME.mInputLogic.setSuggestedWords(sw) // this prepares for autocorrect input(' ') checkConnectionConsistency() } From 0847bac3d55f9f683270dd73cd1f5670f81890b8 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 26 Mar 2025 19:56:46 +0100 Subject: [PATCH 031/175] upgrade target SDK to 35 might cause issues with hebrew and indonesian on Android 15 devices due to changed language codes --- app/build.gradle.kts | 8 ++++---- .../keyboard/internal/keyboard_parser/KeyboardParser.kt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b4d2454be..c5b12f2ef 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -6,13 +6,13 @@ plugins { } android { - compileSdk = 34 + compileSdk = 35 buildToolsVersion = "34.0.0" defaultConfig { applicationId = "helium314.keyboard" minSdk = 21 - targetSdk = 34 + targetSdk = 35 versionCode = 3002 versionName = "3.0-alpha2" ndk { @@ -96,8 +96,8 @@ android { dependencies { // androidx - implementation("androidx.core:core-ktx:1.13.1") - implementation("androidx.recyclerview:recyclerview:1.3.2") + implementation("androidx.core:core-ktx:1.15.0") + implementation("androidx.recyclerview:recyclerview:1.4.0") implementation("androidx.autofill:autofill:1.1.0") // kotlin diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/KeyboardParser.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/KeyboardParser.kt index 999716ac6..4cea8ac1e 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/KeyboardParser.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/KeyboardParser.kt @@ -237,7 +237,7 @@ class KeyboardParser(private val params: KeyboardParams, private val context: Co { it.label == KeyLabel.PERIOD || it.groupId == KeyData.GROUP_PERIOD}, { baseKeys.last()[1].copy(newGroupId = 2, newType = baseKeys.last()[1].type ?: it.type) } ) - baseKeys.removeLast() + baseKeys.removeAt(baseKeys.lastIndex) } // add zwnj key next to space if necessary val spaceIndex = functionalKeysBottom.indexOfFirst { it.label == KeyLabel.SPACE && it.width <= 0 } // width could be 0 or -1 From f06521c8ec026f776646752082692b4088cb1976 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 26 Mar 2025 20:07:47 +0100 Subject: [PATCH 032/175] make text fields follow content language direction --- app/src/main/java/helium314/keyboard/settings/Misc.kt | 4 ++++ app/src/main/java/helium314/keyboard/settings/SearchScreen.kt | 3 ++- .../keyboard/settings/dialogs/ColorThemePickerDialog.kt | 4 +++- .../helium314/keyboard/settings/dialogs/LayoutEditDialog.kt | 2 ++ .../helium314/keyboard/settings/dialogs/LayoutPickerDialog.kt | 4 +++- .../helium314/keyboard/settings/dialogs/TextInputDialog.kt | 4 +++- .../java/helium314/keyboard/settings/screens/ColorsScreen.kt | 2 ++ 7 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/Misc.kt b/app/src/main/java/helium314/keyboard/settings/Misc.kt index d295c2eb5..2ca4add2c 100644 --- a/app/src/main/java/helium314/keyboard/settings/Misc.kt +++ b/app/src/main/java/helium314/keyboard/settings/Misc.kt @@ -25,6 +25,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.style.TextDirection import androidx.compose.ui.unit.dp import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.toBitmap @@ -90,3 +92,5 @@ fun DropDownField( } } } + +val contentTextDirectionStyle = TextStyle(textDirection = TextDirection.Content) diff --git a/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt b/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt index 7184d981c..d6bf4081c 100644 --- a/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt @@ -227,7 +227,8 @@ fun ExpandableSearchField( else onSearchChange(TextFieldValue()) }) { CloseIcon(android.R.string.cancel) } }, singleLine = true, - colors = colors + colors = colors, + textStyle = contentTextDirectionStyle ) } } diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/ColorThemePickerDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/ColorThemePickerDialog.kt index ac97743f8..6c1f84893 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/ColorThemePickerDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/ColorThemePickerDialog.kt @@ -60,6 +60,7 @@ import helium314.keyboard.settings.Theme import helium314.keyboard.settings.filePicker import helium314.keyboard.settings.previewDark import helium314.keyboard.settings.screens.SaveThoseColors +import helium314.keyboard.settings.contentTextDirectionStyle import kotlinx.coroutines.launch import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json @@ -187,7 +188,8 @@ private fun AddColorRow(onDismissRequest: () -> Unit, userColors: Collection diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutPickerDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutPickerDialog.kt index 7355c7e41..e42631bb7 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutPickerDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutPickerDialog.kt @@ -50,6 +50,7 @@ import helium314.keyboard.settings.EditButton import helium314.keyboard.settings.Setting import helium314.keyboard.settings.SettingsActivity import helium314.keyboard.settings.Theme +import helium314.keyboard.settings.contentTextDirectionStyle import helium314.keyboard.settings.layoutFilePicker import helium314.keyboard.settings.layoutIntent import helium314.keyboard.settings.previewDark @@ -140,7 +141,8 @@ private fun AddLayoutRow(onNewLayout: (String) -> Unit, layoutType: LayoutType, value = textValue, onValueChange = { textValue = it }, modifier = Modifier.weight(1f), - singleLine = true + singleLine = true, + textStyle = contentTextDirectionStyle, ) EditButton(textValue.text.isNotEmpty() && LayoutUtilsCustom.getLayoutName(textValue.text, layoutType) !in userLayouts) { onNewLayout(textValue.text) diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/TextInputDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/TextInputDialog.kt index d23f76daa..fa9b8a105 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/TextInputDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/TextInputDialog.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.window.DialogProperties import helium314.keyboard.settings.Theme +import helium314.keyboard.settings.contentTextDirectionStyle import helium314.keyboard.settings.previewDark // mostly taken from StreetComplete / SCEE @@ -76,7 +77,8 @@ fun TextInputDialog( .focusRequester(focusRequester), label = textInputLabel, keyboardOptions = KeyboardOptions(keyboardType = keyboardType), - singleLine = singleLine + singleLine = singleLine, + textStyle = contentTextDirectionStyle, ) }, properties = properties, diff --git a/app/src/main/java/helium314/keyboard/settings/screens/ColorsScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/ColorsScreen.kt index 5d2a46f12..7f14843ac 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/ColorsScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/ColorsScreen.kt @@ -58,6 +58,7 @@ import helium314.keyboard.settings.CloseIcon import helium314.keyboard.settings.SearchScreen import helium314.keyboard.settings.SettingsActivity import helium314.keyboard.settings.Theme +import helium314.keyboard.settings.contentTextDirectionStyle import helium314.keyboard.settings.dialogs.ColorPickerDialog import helium314.keyboard.settings.previewDark import kotlinx.serialization.Serializable @@ -137,6 +138,7 @@ fun ColorsScreen( // supportingText = { if (!nameValid) Text(stringResource(R.string.name_invalid)) } // todo: this is cutting off bottom half of the actual text... trailingIcon = { if (!nameValid) CloseIcon(R.string.name_invalid) }, singleLine = true, + textStyle = contentTextDirectionStyle, ) }, menu = listOf( From 1b1dbd4006dba0f0881f69236ecbee9b336efa32 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 26 Mar 2025 20:38:06 +0100 Subject: [PATCH 033/175] upgrade robolectric version to make tests work again --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c5b12f2ef..5190c4bd4 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -117,7 +117,7 @@ dependencies { testImplementation(kotlin("test")) testImplementation("junit:junit:4.13.2") testImplementation("org.mockito:mockito-core:5.15.2") - testImplementation("org.robolectric:robolectric:4.12.1") + testImplementation("org.robolectric:robolectric:4.14.1") testImplementation("androidx.test:runner:1.6.2") testImplementation("androidx.test:core:1.6.1") } From b26ba76221fba2b48d86809b14457fde2029f454 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 26 Mar 2025 20:57:54 +0100 Subject: [PATCH 034/175] add test related to GH-1408 --- .../keyboard/latin/StringUtilsTest.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/src/test/java/helium314/keyboard/latin/StringUtilsTest.kt b/app/src/test/java/helium314/keyboard/latin/StringUtilsTest.kt index e2bf6adbf..c7339d047 100644 --- a/app/src/test/java/helium314/keyboard/latin/StringUtilsTest.kt +++ b/app/src/test/java/helium314/keyboard/latin/StringUtilsTest.kt @@ -1,12 +1,23 @@ // SPDX-License-Identifier: GPL-3.0-only package helium314.keyboard.latin +import androidx.test.core.app.ApplicationProvider +import helium314.keyboard.ShadowInputMethodManager2 import helium314.keyboard.latin.common.StringUtils import helium314.keyboard.latin.common.getFullEmojiAtEnd +import helium314.keyboard.latin.common.nonWordCodePointAndNoSpaceBeforeCursor +import helium314.keyboard.latin.settings.SpacingAndPunctuations +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config import kotlin.test.Test import kotlin.test.assertEquals // todo: actually this test could/should be significantly expanded... +@RunWith(RobolectricTestRunner::class) +@Config(shadows = [ + ShadowInputMethodManager2::class, +]) class StringUtilsTest { @Test fun `not inside double quotes without quotes`() { assert(!StringUtils.isInsideDoubleQuoteOrAfterDigit("hello yes")) @@ -41,6 +52,14 @@ class StringUtilsTest { assert(StringUtils.isInsideDoubleQuoteOrAfterDigit("hello \"yes\", \"h")) } + @Test fun `non-word codepoints and no space`() { + val sp = SpacingAndPunctuations(ApplicationProvider.getApplicationContext().resources, false) + assert(!nonWordCodePointAndNoSpaceBeforeCursor("this is", sp)) + assert(!nonWordCodePointAndNoSpaceBeforeCursor("this ", sp)) + assert(!nonWordCodePointAndNoSpaceBeforeCursor("th.is ", sp)) + assert(nonWordCodePointAndNoSpaceBeforeCursor("th.is", sp)) + } + @Test fun detectEmojisAtEnd() { assertEquals("", getFullEmojiAtEnd("\uD83C\uDF83 ")) assertEquals("", getFullEmojiAtEnd("a")) From a745c92e05d8c71ebb67852e508630a95c9a6a83 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 26 Mar 2025 21:26:05 +0100 Subject: [PATCH 035/175] update ndk and translations --- app/build.gradle.kts | 4 ++-- app/src/main/res/values-ar/strings.xml | 5 +++-- app/src/main/res/values-bg/strings.xml | 4 ++++ app/src/main/res/values-bn/strings.xml | 4 ++++ app/src/main/res/values-ca/strings.xml | 4 ++++ app/src/main/res/values-de/strings.xml | 4 ++++ app/src/main/res/values-et/strings.xml | 4 ++++ app/src/main/res/values-fr/strings.xml | 4 ++++ app/src/main/res/values-gl/strings.xml | 12 ++++++++++++ app/src/main/res/values-it/strings.xml | 8 +++++++- app/src/main/res/values-iw/strings.xml | 8 +++++++- app/src/main/res/values-nl/strings.xml | 4 ++++ app/src/main/res/values-pl/strings.xml | 2 ++ app/src/main/res/values-pt-rBR/strings.xml | 4 ++++ app/src/main/res/values-ru/strings.xml | 8 +++++++- app/src/main/res/values-zh-rCN/strings.xml | 6 +++++- 16 files changed, 77 insertions(+), 8 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5190c4bd4..2f338a1c0 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,7 +14,7 @@ android { minSdk = 21 targetSdk = 35 versionCode = 3002 - versionName = "3.0-alpha2" + versionName = "3.0-alpha3" ndk { abiFilters.clear() abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) @@ -58,7 +58,7 @@ android { path = File("src/main/jni/Android.mk") } } - ndkVersion = "26.2.11394342" + ndkVersion = "28.0.13004108" packagingOptions { jniLibs { diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 36b7b516e..8ef08d987 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -247,10 +247,10 @@ الرموز الرموز(العربية) ارقام - لوحة ارقام + لوحة الأرقام الهاتف رموز الهاتف - لوحة رقمية (أفقي) + لوحة الأرقام (أفقي) هل تريد حقًا إزالة القاموس الذي أضافه المستخدم \"%s\"؟ خطأ: الملف المحدد ليس ملف قاموس صالح اسود @@ -476,4 +476,5 @@ %s (Baishakhi) أظهِر مفاتيح TLD المنبثقة استبدل مفتاح الفترة المنبثقة مع مجالات المستوى الأعلى عند كتابة عناوين URL وعناوين البريد الإلكتروني + الضغط على إدخال أو مساحة بعد مفاتيح أخرى في لوحة الأرقام diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index b95094304..19cc16c4e 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -469,4 +469,8 @@ %s (Байсахи) Показване на TLD изскачащи клавиши Заместване на изскачащите прозорци с клавиши за период с домейни от първо ниво при въвеждане на URL и имейл адреси + Натискане на въвеждане или интервал след други клавиши в цифровата клавиатура + Не винаги показвай предложения за полета за уеб редактиране + Полетата за уеб редактиране (най-вече в браузърите) са много честа причина за проблеми с настройката за винаги показване на предложения + Числов ред (основен) diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index f6f1e06d0..13fffa34c 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -433,4 +433,8 @@ নিজস্বীকৃত সাবটাইপ টিএলডি পপআপ বোতাম প্রদর্শন ইউআরএল ও ইমেইল ঠিকানা লেখার জন্য দাঁড়ি বোতাম টপ লেভেল ডোমেইন দ্বারা প্রতিস্থাপন + নম্বর প্যাডে অন্য বোতামের পরে এন্টার বা স্পেস চাপ + নম্বর সারি (প্রাথমিক) + ওয়েব সম্পাদনা ফিল্ডে সর্বদা পরামর্শ প্রদর্শন করবে না + ওয়েব সম্পাদনা ফিল্ড (প্রধানত ব্রাউজারে উপলভ্য) সর্বদা পরামর্শ প্রদর্শন সেটিংসে সমস্যার একটি সাধারণ কারণ diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 1320d1e67..821d7e6b3 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -432,4 +432,8 @@ secció de discussió Substituir les finestres emergents de la tecla punt per dominis de primer nivell en escriure URLs i adreces de correu electrònic Mostra tecles emergents de TLD + Prement Intro o espai després d\'altres tecles del teclat numèric + Els camps d\'edició web (sobretot que es troben als navegadors) són una causa molt freqüent de problemes amb la configuració Mostrar sempre suggeriments + Fila de nombres (bàsic) + No mostrar sempre suggeriments per als camps d\'edició web diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 9af19dee9..30385268c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -435,4 +435,8 @@ %s (Baisakhi) Zeige TLD-Popup-Tasten Ersetze Punkt-Tastenpopups mit Top-Level-Domains wenn URLs und Mailadressen eingegeben werden + Nicht immer Vorschläge für Web-Editierfelder anzeigen + Zahlenreihe (Basis) + Web-Eingabefelder (meist in Browsern) sind eine häufige Ursache für Probleme mit der Einstellung \"Immer Vorschläge anzeigen\" + Drücken der Eingabetaste oder der Leertaste nach anderen Tasten im Ziffernblock diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index ad1bf5242..186a56152 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -469,4 +469,8 @@ %s (Baishakhi) Näita tippdomeenide hüpikklahve Võrgu- ja e-posti aadresside kirjutamisel asenda punktuatsiooni hüpikaknad tipptaseme domeenide omadega + Vajutades numbriklahvistikus peale muud sisestust tühiku- või sisestusklahvi + Numbririda (lihtne) + Ära alati näita sisestuse soovitusi täites veebivormide välju + Kui alati näitad sisestuse soovitusi veebivormide väljadel (nii nagu sa neid veebibrauseris näed), siis võib sellest tekkida probleeme diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 2c32cf6f1..b94819745 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -439,4 +439,8 @@ Nouveau dictionnaire: Section de discussion Afficher les suggestions de domaines (TLD) Remplacer les suggestions de la touche point par des extensions de domaine (TLD) lors de la saisie d’URL ou d’adresses e-mail + Appuyer sur Entrée ou sur la barre d\'espace après d\'autres touches du pavé numérique + Les champs d\'édition Web (principalement présents dans les navigateurs) sont une cause très courante de problèmes avec le paramètre « Toujours afficher les suggestions » + Rangée numérique (standard) + Ne pas forcer l\'affichage des suggestions pour les champs de saisie web diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index c2fa7a993..d78aab27d 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -434,4 +434,16 @@ zona de conversa Podes atopar e compartir disposicións na %s. %s (Baishakhi) + Subtipo personalizado + Non mostrar sempre suxestións para os campos texto nas webs + Os campos de texto nas webs (principalmente no navegador) son causa frecuente de problemas coas suxestións automáticas + Fila de números (básica) + Substitúe na emerxente da tecla do punto con dominios de alto nivel ao escribir URL e enderezos de correo + Mostrar teclas emerxentes TLD + Ao premer enter ou espazo após escribir no teclado numérico + caracter separador ancho cero + Eliminar %s? + Tes certeza de querer limpar todos os códigos personalizados? + Nome non válido + Distancia de desprazamento cambio de idioma diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index af8240d30..88405dcaf 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -104,7 +104,7 @@ "Scorciatoia:" "Lingua:" "Digita una parola" - "Scorciatoia facoltativa" + Scorciatoia (opzionale) "Modifica parola" Il dizionario utente è vuoto. Premi \'Aggiungi\' (+) per aggiungere manualmente una parola. "Per tutte le lingue" @@ -439,4 +439,10 @@ discussione dedicata Scopri nuovi layout o condividi quelli che hai creato nella %s. Scopri nuove combinazioni di colori o condividi le tue nella %s. + Mostra popup con TLD + Sostituisce il popup standard del tasto . (punto) con desinenze TLD internazionali durante la digitazione di URL e email + Dopo uno spazio o la pressione di ⏎ (invio) dal tastierino numerico + Non forzare i suggerimenti in tutti i campi di testo + I campi di testo Web (specie all\'interno dei browser) sono una causa ricorrente di problemi con i suggerimenti sempre attivi + Barra dei numeri (base) diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 04bf34fba..d29ee5205 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -208,7 +208,7 @@ בחירת כפתורי סרגל הכלים מרווחי קלידים צרים תרגום number row - שורת המספרים + שורת מספרים שפה שפה (עדיפות) פריסה @@ -439,4 +439,10 @@ באפשרותך למצוא ולשתף צבעים ב %s. באפשרותך למצוא ולשתף פריסות ב %s. מקטע הדיונים + הצגת חלון צץ של סיומות אינטרנט + החלפת חלון צץ של מקש נקודה ברשימת סיומות אינטרנט נפוצות בעת הקלדת כתובות אינטרנט ודוא\"ל + לאחר לחיצת Enter או רווח לאחר מקשים אחרים במקלדת המספרים + לא תמיד להציג הצעות לשדות עריכה ב-Web + שדות עריכה ב-Web (בדר\"כ יוצגו בדפדפן) הם גורם נפוץ מאד לבעיות בהגדרה \'הצגת הצעות תמיד\' + שורת המספרים (פריסת בסיס) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 81ddbdbfc..a3e316db4 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -478,4 +478,8 @@ %s (Baishakhi) TLD-opties weergeven Vervang pop-ups met interpunctie door topleveldomeinen bij het typen van URL\'s en e-mailadressen + Druk op enter of spatie na andere toetsen in het numpad + Cijferregel (basis) + Suggesties voor webbewerkingsvelden niet altijd weergeven + Webbewerkingsvelden (meestal te vinden in browsers) zijn een veel voorkomende oorzaak van problemen met de instelling Altijd suggesties weergeven diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 53ee52e19..74cf935b4 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -478,4 +478,6 @@ %s (Baishakhi) Pokaż wyskakujące okienka TLD Zastąp wyskakujące okienka klawisza kropki domenami najwyższego poziomu podczas wpisywania adresów URL i adresów e-mail + Naciśnięciu enter lub spacji po innych klawiszach w klawiaturze numerycznej + Rząd numeryczny (podstawowy) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index d3804bc19..127df316d 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -441,4 +441,8 @@ %s (Baishakhi) Mostrar teclas de TLD Substituir os pop-ups da tecla de ponto com domínios de topo ao digitar URLs e endereços de e-mail + Pressionando enter ou espaço após outras teclas no teclado de números + Linha de números (básica) + Não mostrar sugestões para campos de edição da web sempre + Campos de edição da web (encontrados normalmente em navegadores) são uma causa comum de problemas com a configuração de sempre mostrar sugestões diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index d94f2353d..472bfae17 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -450,7 +450,7 @@ Переопределить версию эмодзи Если не установлено, будет использоваться портретное изображение Установить фоновое изображение (ландшафт) - Показывать подсказки в ряде с цифрами + Показывать подсказки в ряду с цифрами Расстояние смахивания для переключения языка Расстояние разделения (ландшафт) Включить разделение клавиатуры (ландшафт) @@ -466,4 +466,10 @@ Найти и поделиться раскладками в %s. обсуждения Недопустимое имя + Показать всплывающие клавиши TLD + При вводе URL и адресов электронной почты отображать домены верхнего уровня вместо всплывающих меню клавиши точки + Нажатие Enter или пробела после других клавиш на цифровой клавиатуре + Поля ввода на веб-страницах (в основном в браузерах) часто вызывают проблемы с настройкой постоянного отображения подсказок + Ряд с цифрами (основной) + Не всегда показывать подсказки для полей ввода на веб-страницах diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 33e5840a7..f02abe6ac 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -320,7 +320,7 @@ 切换到主键盘后… 在表情符号视图中选择表情符号 选择剪贴板历史条目 - 在符号视图中按回车键或空格键 + 在符号视图输入内容后按回车键或空格键 从文件添加词典 这将禁用未固定工具栏键的其他长按操作 添加非常常见的变体(默认) @@ -435,4 +435,8 @@ %s (Baishakhi) 输入 URL 和电子邮件地址时,用顶级域替换句点键弹出 显示顶级域弹出键 + 在数字键盘输入内容后按回车键或空格键 + 数字行(基本) + Web 编辑字段(主要存在于浏览器中)是导致“始终显示建议”设置出现问题的一个非常常见的原因 + 不要总是显示对 Web 编辑字段的建议 From 10af5def2b8c4bbb80a3be053a91dfc4874cdb8e Mon Sep 17 00:00:00 2001 From: Helium314 Date: Thu, 27 Mar 2025 21:04:42 +0100 Subject: [PATCH 036/175] deal with some very bad behavior of firefox, fixes #1139 --- .../keyboard/KeyboardActionListenerImpl.kt | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt b/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt index 89fdcecb4..759a0c403 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt @@ -1,5 +1,6 @@ package helium314.keyboard.keyboard +import android.text.InputType import android.view.KeyEvent import android.view.inputmethod.InputMethodSubtype import helium314.keyboard.keyboard.internal.keyboard_parser.floris.KeyCode @@ -211,13 +212,24 @@ class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inp return true } } - if (inputLogic.moveCursorByAndReturnIfInsideComposingWord(moveSteps)) { + + // the shortcut below causes issues due to horrible handling of text fields by Firefox and forks + // issues: + // * setSelection "will cause the editor to call onUpdateSelection", see: https://developer.android.com/reference/android/view/inputmethod/InputConnection#setSelection(int,%20int) + // but Firefox is simply not doing this within the same word... WTF? + // https://github.com/Helium314/HeliBoard/issues/1139#issuecomment-2588169384 + // * inputType is NOT if variant InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT (variant appears to always be 0) + // so we can't even only do it for browsers (identifying by app name will break for forks) + // best "solution" is not doing this for InputType variation 0 but this applies to the majority of text fields... + val variation = InputType.TYPE_MASK_VARIATION and Settings.getValues().mInputAttributes.mInputType + if (variation != 0 && inputLogic.moveCursorByAndReturnIfInsideComposingWord(moveSteps)) { // no need to finish input and restart suggestions if we're still in the word - // this is a noticeable performance improvement + // this is a noticeable performance improvement when moving through long words val newPosition = inputLogic.mConnection.expectedSelectionStart + moveSteps inputLogic.mConnection.setSelection(newPosition, newPosition) return true } + inputLogic.finishInput() val newPosition = inputLogic.mConnection.expectedSelectionStart + moveSteps inputLogic.mConnection.setSelection(newPosition, newPosition) From a1f991088df35d85eaa17a558afe99aa94c84d4c Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 29 Mar 2025 07:19:17 +0100 Subject: [PATCH 037/175] reduce font size for multilibgual typing in settings --- .../java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt index 33d4d850b..5ddf7a1e2 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt @@ -145,7 +145,7 @@ fun SubtypeDialog( val text = getSecondaryLocales(currentSubtype.extraValues).joinToString(", ") { it.localizedDisplayName(ctx) }.ifEmpty { stringResource(R.string.action_none) } - Text(text, Modifier.fillMaxWidth(), style = MaterialTheme.typography.bodyLarge) + Text(text, Modifier.fillMaxWidth()) } } } From fbfff03541a8335013180217c9f8d1b923f44f09 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 29 Mar 2025 10:18:27 +0100 Subject: [PATCH 038/175] add all_colors color for key text in emoji keyboard, fixes #1058 --- .../java/helium314/keyboard/keyboard/KeyboardView.java | 7 +++++-- .../main/java/helium314/keyboard/latin/common/Colors.kt | 5 +++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java index 2226e3600..33c7dcc88 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java @@ -27,6 +27,7 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import helium314.keyboard.keyboard.emoji.EmojiPageKeyboardView; import helium314.keyboard.keyboard.internal.KeyDrawParams; import helium314.keyboard.keyboard.internal.KeyVisualAttributes; import helium314.keyboard.keyboard.internal.keyboard_parser.floris.KeyCode; @@ -34,7 +35,7 @@ import helium314.keyboard.latin.R; import helium314.keyboard.latin.common.ColorType; import helium314.keyboard.latin.common.Colors; import helium314.keyboard.latin.common.Constants; -import helium314.keyboard.latin.common.StringUtils; +import helium314.keyboard.latin.common.StringUtilsKt; import helium314.keyboard.latin.settings.Settings; import helium314.keyboard.latin.suggestions.MoreSuggestions; import helium314.keyboard.latin.suggestions.PopupSuggestionsView; @@ -423,10 +424,12 @@ public class KeyboardView extends View { } if (key.isEnabled()) { - if (StringUtils.mightBeEmoji(label)) + if (StringUtilsKt.isEmoji(label)) paint.setColor(key.selectTextColor(params) | 0xFF000000); // ignore alpha for emojis (though actually color isn't applied anyway and we could just set white) else if (key.hasActionKeyBackground()) paint.setColor(mColors.get(ColorType.ACTION_KEY_ICON)); + else if (this instanceof EmojiPageKeyboardView) + paint.setColor(mColors.get(ColorType.EMOJI_KEY_TEXT)); else paint.setColor(key.selectTextColor(params)); // Set a drop shadow for the text if the shadow radius is positive value. diff --git a/app/src/main/java/helium314/keyboard/latin/common/Colors.kt b/app/src/main/java/helium314/keyboard/latin/common/Colors.kt index ffbc13d62..6bc71d46a 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/Colors.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/Colors.kt @@ -277,7 +277,7 @@ class DynamicColors(context: Context, override val themeStyle: String, override AUTOFILL_BACKGROUND_CHIP, GESTURE_PREVIEW, POPUP_KEYS_BACKGROUND, MORE_SUGGESTIONS_BACKGROUND, KEY_PREVIEW -> adjustedBackground TOOL_BAR_EXPAND_KEY_BACKGROUND -> if (!isNight) accent else doubleAdjustedBackground GESTURE_TRAIL -> gesture - KEY_TEXT, SUGGESTION_AUTO_CORRECT, REMOVE_SUGGESTION_ICON, + KEY_TEXT, SUGGESTION_AUTO_CORRECT, REMOVE_SUGGESTION_ICON, EMOJI_KEY_TEXT, KEY_ICON, ONE_HANDED_MODE_BUTTON, EMOJI_CATEGORY, TOOL_BAR_KEY, FUNCTIONAL_KEY_TEXT -> keyText KEY_HINT_TEXT -> keyHintText SPACE_BAR_TEXT -> spaceBarText @@ -475,7 +475,7 @@ class DefaultColors ( GESTURE_PREVIEW, POPUP_KEYS_BACKGROUND, MORE_SUGGESTIONS_BACKGROUND, KEY_PREVIEW -> adjustedBackground TOOL_BAR_EXPAND_KEY_BACKGROUND, CLIPBOARD_SUGGESTION_BACKGROUND -> doubleAdjustedBackground GESTURE_TRAIL -> gesture - KEY_TEXT, REMOVE_SUGGESTION_ICON, FUNCTIONAL_KEY_TEXT, KEY_ICON -> keyText + KEY_TEXT, REMOVE_SUGGESTION_ICON, FUNCTIONAL_KEY_TEXT, KEY_ICON, EMOJI_KEY_TEXT -> keyText KEY_HINT_TEXT -> keyHintText SPACE_BAR_TEXT -> spaceBarText FUNCTIONAL_KEY_BACKGROUND -> functionalKey @@ -620,6 +620,7 @@ enum class ColorType { CLIPBOARD_PIN, EMOJI_CATEGORY, EMOJI_CATEGORY_SELECTED, + EMOJI_KEY_TEXT, FUNCTIONAL_KEY_TEXT, FUNCTIONAL_KEY_BACKGROUND, GESTURE_TRAIL, From 58778b1f231bd7758ff3ba39c9c55d983d2c9f67 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 29 Mar 2025 10:38:43 +0100 Subject: [PATCH 039/175] add all_colors color for key preview text, fixes #1434 --- app/build.gradle.kts | 2 +- .../internal/KeyPreviewChoreographer.java | 2 +- .../internal/KeyVisualAttributes.java | 2 +- .../main/java/helium314/keyboard/latin/App.kt | 8 ++++++++ .../helium314/keyboard/latin/common/Colors.kt | 19 ++++++++++--------- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2f338a1c0..12d9b8a40 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,7 +13,7 @@ android { applicationId = "helium314.keyboard" minSdk = 21 targetSdk = 35 - versionCode = 3002 + versionCode = 3003 versionName = "3.0-alpha3" ndk { abiFilters.clear() diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyPreviewChoreographer.java b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyPreviewChoreographer.java index 718d1f8c4..6dcfef34c 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyPreviewChoreographer.java +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyPreviewChoreographer.java @@ -108,7 +108,7 @@ public final class KeyPreviewChoreographer { final boolean hasPopupKeys = (key.getPopupKeys() != null); keyPreviewView.setPreviewBackground(hasPopupKeys, keyPreviewPosition); final Colors colors = Settings.getValues().mColors; - colors.setBackground(keyPreviewView, ColorType.KEY_PREVIEW); + colors.setBackground(keyPreviewView, ColorType.KEY_PREVIEW_BACKGROUND); // The key preview is placed vertically above the top edge of the parent key with an // arbitrary offset. diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyVisualAttributes.java b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyVisualAttributes.java index ee76f94ee..2e8b172cd 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyVisualAttributes.java +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyVisualAttributes.java @@ -129,7 +129,7 @@ public final class KeyVisualAttributes { // when? -> hasShiftedLetterHint and isShiftedLetterActivated -> both are label flags mShiftedLetterHintActivatedColor = keyAttr.getColor( R.styleable.Keyboard_Key_keyShiftedLetterHintActivatedColor, 0); - mPreviewTextColor = colors.get(ColorType.KEY_TEXT); + mPreviewTextColor = colors.get(ColorType.KEY_PREVIEW_TEXT); mHintLabelVerticalAdjustment = ResourceUtils.getFraction(keyAttr, R.styleable.Keyboard_Key_keyHintLabelVerticalAdjustment, 0.0f); diff --git a/app/src/main/java/helium314/keyboard/latin/App.kt b/app/src/main/java/helium314/keyboard/latin/App.kt index 13f45af1b..2ed0765c3 100644 --- a/app/src/main/java/helium314/keyboard/latin/App.kt +++ b/app/src/main/java/helium314/keyboard/latin/App.kt @@ -545,6 +545,14 @@ fun checkVersionUpgrade(context: Context) { if (oldVersion <= 3001 && prefs.getInt(Settings.PREF_CLIPBOARD_HISTORY_RETENTION_TIME, Defaults.PREF_CLIPBOARD_HISTORY_RETENTION_TIME) <= 0) { prefs.edit().putInt(Settings.PREF_CLIPBOARD_HISTORY_RETENTION_TIME, 121).apply() } + if (oldVersion <= 3002) { + prefs.all.filterKeys { it.startsWith(Settings.PREF_USER_ALL_COLORS_PREFIX) }.forEach { + val oldValue = prefs.getString(it.key, "")!! + if ("KEY_PREVIEW" !in oldValue) return@forEach + val newValue = oldValue.replace("KEY_PREVIEW", "KEY_PREVIEW_BACKGROUND") + prefs.edit().putString(it.key, newValue).apply() + } + } upgradeToolbarPrefs(prefs) LayoutUtilsCustom.onLayoutFileChanged() // just to be sure prefs.edit { putInt(Settings.PREF_VERSION_CODE, BuildConfig.VERSION_CODE) } diff --git a/app/src/main/java/helium314/keyboard/latin/common/Colors.kt b/app/src/main/java/helium314/keyboard/latin/common/Colors.kt index 6bc71d46a..15af33d81 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/Colors.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/Colors.kt @@ -274,10 +274,10 @@ class DynamicColors(context: Context, override val themeStyle: String, override override fun get(color: ColorType): Int = when (color) { TOOL_BAR_KEY_ENABLED_BACKGROUND, EMOJI_CATEGORY_SELECTED, ACTION_KEY_BACKGROUND, CLIPBOARD_PIN, SHIFT_KEY_ICON -> accent - AUTOFILL_BACKGROUND_CHIP, GESTURE_PREVIEW, POPUP_KEYS_BACKGROUND, MORE_SUGGESTIONS_BACKGROUND, KEY_PREVIEW -> adjustedBackground + AUTOFILL_BACKGROUND_CHIP, GESTURE_PREVIEW, POPUP_KEYS_BACKGROUND, MORE_SUGGESTIONS_BACKGROUND, KEY_PREVIEW_BACKGROUND -> adjustedBackground TOOL_BAR_EXPAND_KEY_BACKGROUND -> if (!isNight) accent else doubleAdjustedBackground GESTURE_TRAIL -> gesture - KEY_TEXT, SUGGESTION_AUTO_CORRECT, REMOVE_SUGGESTION_ICON, EMOJI_KEY_TEXT, + KEY_TEXT, SUGGESTION_AUTO_CORRECT, REMOVE_SUGGESTION_ICON, EMOJI_KEY_TEXT, KEY_PREVIEW_TEXT, KEY_ICON, ONE_HANDED_MODE_BUTTON, EMOJI_CATEGORY, TOOL_BAR_KEY, FUNCTIONAL_KEY_TEXT -> keyText KEY_HINT_TEXT -> keyHintText SPACE_BAR_TEXT -> spaceBarText @@ -327,7 +327,7 @@ class DynamicColors(context: Context, override val themeStyle: String, override EMOJI_CATEGORY_SELECTED, CLIPBOARD_PIN, SHIFT_KEY_ICON -> accentColorFilter REMOVE_SUGGESTION_ICON, EMOJI_CATEGORY, KEY_TEXT, KEY_ICON, ONE_HANDED_MODE_BUTTON, TOOL_BAR_KEY, TOOL_BAR_EXPAND_KEY -> keyTextFilter - KEY_PREVIEW -> adjustedBackgroundFilter + KEY_PREVIEW_BACKGROUND -> adjustedBackgroundFilter ACTION_KEY_ICON -> actionKeyIconColorFilter else -> colorFilter(get(color)) } @@ -336,7 +336,7 @@ class DynamicColors(context: Context, override val themeStyle: String, override if (view.background == null) view.setBackgroundColor(Color.WHITE) // set white to make the color filters work when (color) { - KEY_PREVIEW -> view.background.colorFilter = adjustedBackgroundFilter + KEY_PREVIEW_BACKGROUND -> view.background.colorFilter = adjustedBackgroundFilter FUNCTIONAL_KEY_BACKGROUND, KEY_BACKGROUND, MORE_SUGGESTIONS_WORD_BACKGROUND, SPACE_BAR_BACKGROUND, STRIP_BACKGROUND -> setColor(view.background, color) ONE_HANDED_MODE_BUTTON -> setColor(view.background, if (keyboardBackground == null) MAIN_BACKGROUND else STRIP_BACKGROUND) MORE_SUGGESTIONS_BACKGROUND -> view.background.colorFilter = backgroundFilter @@ -472,10 +472,10 @@ class DefaultColors ( TOOL_BAR_KEY_ENABLED_BACKGROUND, EMOJI_CATEGORY_SELECTED, ACTION_KEY_BACKGROUND, CLIPBOARD_PIN, SHIFT_KEY_ICON -> accent AUTOFILL_BACKGROUND_CHIP -> if (themeStyle == STYLE_MATERIAL && !hasKeyBorders) background else adjustedBackground - GESTURE_PREVIEW, POPUP_KEYS_BACKGROUND, MORE_SUGGESTIONS_BACKGROUND, KEY_PREVIEW -> adjustedBackground + GESTURE_PREVIEW, POPUP_KEYS_BACKGROUND, MORE_SUGGESTIONS_BACKGROUND, KEY_PREVIEW_BACKGROUND -> adjustedBackground TOOL_BAR_EXPAND_KEY_BACKGROUND, CLIPBOARD_SUGGESTION_BACKGROUND -> doubleAdjustedBackground GESTURE_TRAIL -> gesture - KEY_TEXT, REMOVE_SUGGESTION_ICON, FUNCTIONAL_KEY_TEXT, KEY_ICON, EMOJI_KEY_TEXT -> keyText + KEY_TEXT, REMOVE_SUGGESTION_ICON, FUNCTIONAL_KEY_TEXT, KEY_ICON, EMOJI_KEY_TEXT, KEY_PREVIEW_TEXT -> keyText KEY_HINT_TEXT -> keyHintText SPACE_BAR_TEXT -> spaceBarText FUNCTIONAL_KEY_BACKGROUND -> functionalKey @@ -524,7 +524,7 @@ class DefaultColors ( if (view.background == null) view.setBackgroundColor(Color.WHITE) // set white to make the color filters work when (color) { - KEY_PREVIEW, POPUP_KEYS_BACKGROUND -> view.background.colorFilter = adjustedBackgroundFilter + KEY_PREVIEW_BACKGROUND, POPUP_KEYS_BACKGROUND -> view.background.colorFilter = adjustedBackgroundFilter FUNCTIONAL_KEY_BACKGROUND, KEY_BACKGROUND, MORE_SUGGESTIONS_WORD_BACKGROUND, SPACE_BAR_BACKGROUND, STRIP_BACKGROUND, CLIPBOARD_SUGGESTION_BACKGROUND -> setColor(view.background, color) ONE_HANDED_MODE_BUTTON -> setColor(view.background, if (keyboardBackground == null) MAIN_BACKGROUND else STRIP_BACKGROUND) MORE_SUGGESTIONS_BACKGROUND -> view.background.colorFilter = backgroundFilter @@ -547,7 +547,7 @@ class DefaultColors ( EMOJI_CATEGORY_SELECTED, CLIPBOARD_PIN, SHIFT_KEY_ICON -> accentColorFilter KEY_TEXT, KEY_ICON -> keyTextFilter REMOVE_SUGGESTION_ICON, EMOJI_CATEGORY, ONE_HANDED_MODE_BUTTON, TOOL_BAR_KEY, TOOL_BAR_EXPAND_KEY -> suggestionTextFilter - KEY_PREVIEW -> adjustedBackgroundFilter + KEY_PREVIEW_BACKGROUND -> adjustedBackgroundFilter ACTION_KEY_ICON -> actionKeyIconColorFilter else -> colorFilter(get(color)) // create color filter (not great for performance, so the frequently used filters should be stored) } @@ -629,7 +629,8 @@ enum class ColorType { KEY_ICON, KEY_TEXT, KEY_HINT_TEXT, - KEY_PREVIEW, + KEY_PREVIEW_BACKGROUND, + KEY_PREVIEW_TEXT, MORE_SUGGESTIONS_HINT, MORE_SUGGESTIONS_BACKGROUND, MORE_SUGGESTIONS_WORD_BACKGROUND, From a3fcce26a77de0da59567adef7c939ba51c713f0 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 29 Mar 2025 10:48:14 +0100 Subject: [PATCH 040/175] add all_colors color for popup key text, fixes #1297 --- .../main/java/helium314/keyboard/keyboard/KeyboardView.java | 2 ++ app/src/main/java/helium314/keyboard/latin/common/Colors.kt | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java index 33c7dcc88..6fbf8238b 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java @@ -430,6 +430,8 @@ public class KeyboardView extends View { paint.setColor(mColors.get(ColorType.ACTION_KEY_ICON)); else if (this instanceof EmojiPageKeyboardView) paint.setColor(mColors.get(ColorType.EMOJI_KEY_TEXT)); + else if (this instanceof PopupKeysKeyboardView) + paint.setColor(mColors.get(ColorType.POPUP_KEY_TEXT)); else paint.setColor(key.selectTextColor(params)); // Set a drop shadow for the text if the shadow radius is positive value. diff --git a/app/src/main/java/helium314/keyboard/latin/common/Colors.kt b/app/src/main/java/helium314/keyboard/latin/common/Colors.kt index 15af33d81..f8a57a476 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/Colors.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/Colors.kt @@ -277,7 +277,7 @@ class DynamicColors(context: Context, override val themeStyle: String, override AUTOFILL_BACKGROUND_CHIP, GESTURE_PREVIEW, POPUP_KEYS_BACKGROUND, MORE_SUGGESTIONS_BACKGROUND, KEY_PREVIEW_BACKGROUND -> adjustedBackground TOOL_BAR_EXPAND_KEY_BACKGROUND -> if (!isNight) accent else doubleAdjustedBackground GESTURE_TRAIL -> gesture - KEY_TEXT, SUGGESTION_AUTO_CORRECT, REMOVE_SUGGESTION_ICON, EMOJI_KEY_TEXT, KEY_PREVIEW_TEXT, + KEY_TEXT, SUGGESTION_AUTO_CORRECT, REMOVE_SUGGESTION_ICON, EMOJI_KEY_TEXT, KEY_PREVIEW_TEXT, POPUP_KEY_TEXT, KEY_ICON, ONE_HANDED_MODE_BUTTON, EMOJI_CATEGORY, TOOL_BAR_KEY, FUNCTIONAL_KEY_TEXT -> keyText KEY_HINT_TEXT -> keyHintText SPACE_BAR_TEXT -> spaceBarText @@ -475,7 +475,8 @@ class DefaultColors ( GESTURE_PREVIEW, POPUP_KEYS_BACKGROUND, MORE_SUGGESTIONS_BACKGROUND, KEY_PREVIEW_BACKGROUND -> adjustedBackground TOOL_BAR_EXPAND_KEY_BACKGROUND, CLIPBOARD_SUGGESTION_BACKGROUND -> doubleAdjustedBackground GESTURE_TRAIL -> gesture - KEY_TEXT, REMOVE_SUGGESTION_ICON, FUNCTIONAL_KEY_TEXT, KEY_ICON, EMOJI_KEY_TEXT, KEY_PREVIEW_TEXT -> keyText + KEY_TEXT, REMOVE_SUGGESTION_ICON, FUNCTIONAL_KEY_TEXT, KEY_ICON, EMOJI_KEY_TEXT, + POPUP_KEY_TEXT, KEY_PREVIEW_TEXT -> keyText KEY_HINT_TEXT -> keyHintText SPACE_BAR_TEXT -> spaceBarText FUNCTIONAL_KEY_BACKGROUND -> functionalKey @@ -635,6 +636,7 @@ enum class ColorType { MORE_SUGGESTIONS_BACKGROUND, MORE_SUGGESTIONS_WORD_BACKGROUND, POPUP_KEYS_BACKGROUND, + POPUP_KEY_TEXT, NAVIGATION_BAR, SHIFT_KEY_ICON, SPACE_BAR_BACKGROUND, From 525c4e59b6316d26b05ef2e4813524796eefbd38 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 29 Mar 2025 11:47:06 +0100 Subject: [PATCH 041/175] confirm color in color picker dialog on done, fixes GH-1443 --- .../keyboard/settings/dialogs/ColorPickerDialog.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/ColorPickerDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/ColorPickerDialog.kt index 15e926acb..d1771b61b 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/ColorPickerDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/ColorPickerDialog.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -24,6 +25,7 @@ import androidx.compose.ui.graphics.PaintingStyle import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview @@ -109,8 +111,12 @@ fun ColorPickerDialog( ) TextField( value = textValue, - // todo: KeyboardType.Password is a crappy way of avoiding suggestions... is there really no way in compose? - keyboardOptions = KeyboardOptions(autoCorrectEnabled = false, keyboardType = KeyboardType.Password), + keyboardOptions = KeyboardOptions( + autoCorrectEnabled = false, + keyboardType = KeyboardType.Password, // todo: KeyboardType.Password is a crappy way of avoiding suggestions... is there really no way in compose? + imeAction = ImeAction.Done, + ), + keyboardActions = KeyboardActions(onDone = { onDismissRequest(); onConfirmed(controller.selectedColor.value.toArgb()) }), onValueChange = { textValue = it val androidColor = runCatching { android.graphics.Color.parseColor("#${it.text}") }.getOrNull() From 8932fc84e130e44421eaefdb7e2ffe2e077ce144 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 29 Mar 2025 12:36:07 +0100 Subject: [PATCH 042/175] add timestamp keycode and setting for adjusting format, fixes GH-846 --- .../keyboard_parser/floris/KeyCode.kt | 12 ++++-- .../keyboard/latin/inputlogic/InputLogic.java | 4 ++ .../keyboard/latin/settings/Defaults.kt | 1 + .../keyboard/latin/settings/Settings.java | 1 + .../keyboard/latin/utils/Timestamp.kt | 17 +++++++++ .../preferences/TextInputPreference.kt | 37 +++++++++++++++++++ .../settings/screens/AdvancedScreen.kt | 6 +++ .../settings/screens/AppearanceScreen.kt | 24 ++---------- app/src/main/res/values/strings.xml | 2 + .../keyboard/latin/InputLogicTest.kt | 8 ++++ layouts.md | 2 +- 11 files changed, 90 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/helium314/keyboard/latin/utils/Timestamp.kt create mode 100644 app/src/main/java/helium314/keyboard/settings/preferences/TextInputPreference.kt diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt index bf5c65f04..e47942501 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt @@ -167,6 +167,7 @@ object KeyCode { const val BACK = -10040 const val SELECT_LEFT = -10041 const val SELECT_RIGHT = -10042 + const val TIMESTAMP = -10043 /** to make sure a FlorisBoard code works when reading a JSON layout */ fun Int.checkAndConvertCode(): Int = if (this > 0) this else when (this) { @@ -182,7 +183,8 @@ object KeyCode { SYMBOL_ALPHA, TOGGLE_ONE_HANDED_MODE, SWITCH_ONE_HANDED_MODE, SPLIT_LAYOUT, SHIFT_ENTER, ACTION_NEXT, ACTION_PREVIOUS, NOT_SPECIFIED, CLIPBOARD_COPY_ALL, WORD_LEFT, WORD_RIGHT, PAGE_UP, PAGE_DOWN, META, TAB, ESCAPE, INSERT, SLEEP, MEDIA_PLAY, MEDIA_PAUSE, MEDIA_PLAY_PAUSE, MEDIA_NEXT, - MEDIA_PREVIOUS, VOL_UP, VOL_DOWN, MUTE, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, BACK + MEDIA_PREVIOUS, VOL_UP, VOL_DOWN, MUTE, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, BACK, + TIMESTAMP -> this // conversion @@ -194,8 +196,12 @@ object KeyCode { else -> throw IllegalStateException("key code $this not yet supported") } - // todo: three are many more keys, see near https://developer.android.com/reference/android/view/KeyEvent#KEYCODE_0 - /** convert a keyCode / codePoint to a KeyEvent.KEYCODE_, fallback to KeyEvent.KEYCODE_UNKNOWN */ + // todo: there are many more keys, see near https://developer.android.com/reference/android/view/KeyEvent#KEYCODE_0 + /** + * Convert a keyCode / codePoint to a KeyEvent.KEYCODE_. + * Fallback to KeyEvent.KEYCODE_UNKNOWN. + * To be uses for fake hardware key press. + * */ fun Int.toKeyEventCode(): Int = if (this > 0) when (this.toChar().uppercaseChar()) { '/' -> KeyEvent.KEYCODE_SLASH diff --git a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java index 14d5aa3bb..79464dee3 100644 --- a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java @@ -54,6 +54,7 @@ import helium314.keyboard.latin.utils.RecapitalizeStatus; import helium314.keyboard.latin.utils.ScriptUtils; import helium314.keyboard.latin.utils.StatsUtils; import helium314.keyboard.latin.utils.TextRange; +import helium314.keyboard.latin.utils.TimestampKt; import java.util.ArrayList; import java.util.Locale; @@ -775,6 +776,9 @@ public final class InputLogic { case KeyCode.SPLIT_LAYOUT: KeyboardSwitcher.getInstance().toggleSplitKeyboardMode(); break; + case KeyCode.TIMESTAMP: + mLatinIME.onTextInput(TimestampKt.getTimestamp(mLatinIME)); + break; case KeyCode.VOICE_INPUT: // switching to shortcut IME, shift state, keyboard,... is handled by LatinIME, // {@link KeyboardSwitcher#onEvent(Event)}, or {@link #onPressKey(int,int,boolean)} and {@link #onReleaseKey(int,boolean)}. diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt index 09c0f88d3..377e19899 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt @@ -154,6 +154,7 @@ object Defaults { const val PREF_ABC_AFTER_NUMPAD_SPACE = false const val PREF_REMOVE_REDUNDANT_POPUPS = false const val PREF_SPACE_BAR_TEXT = "" + const val PREF_TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss" @JvmField val PREF_EMOJI_MAX_SDK = Build.VERSION.SDK_INT const val PREF_EMOJI_RECENT_KEYS = "" diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java index 55a80bd87..098b51b0d 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -164,6 +164,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_ABC_AFTER_NUMPAD_SPACE = "abc_after_numpad_space"; public static final String PREF_REMOVE_REDUNDANT_POPUPS = "remove_redundant_popups"; public static final String PREF_SPACE_BAR_TEXT = "space_bar_text"; + public static final String PREF_TIMESTAMP_FORMAT = "timestamp_format"; // Emoji public static final String PREF_EMOJI_MAX_SDK = "emoji_max_sdk"; diff --git a/app/src/main/java/helium314/keyboard/latin/utils/Timestamp.kt b/app/src/main/java/helium314/keyboard/latin/utils/Timestamp.kt new file mode 100644 index 000000000..ebe2bd0e8 --- /dev/null +++ b/app/src/main/java/helium314/keyboard/latin/utils/Timestamp.kt @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-3.0-only +package helium314.keyboard.latin.utils + +import android.content.Context +import helium314.keyboard.latin.settings.Defaults +import helium314.keyboard.latin.settings.Settings +import java.text.SimpleDateFormat +import java.util.Calendar + +fun getTimestamp(context: Context): String { + val format = context.prefs().getString(Settings.PREF_TIMESTAMP_FORMAT, Defaults.PREF_TIMESTAMP_FORMAT) + val formatter = runCatching { SimpleDateFormat(format, Settings.getValues().mLocale) }.getOrNull() + ?: SimpleDateFormat(Defaults.PREF_TIMESTAMP_FORMAT, Settings.getValues().mLocale) + return formatter.format(Calendar.getInstance().time) +} + +fun checkTimestampFormat(format: String) = runCatching { SimpleDateFormat(format, Settings.getValues().mLocale) }.isSuccess diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/TextInputPreference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/TextInputPreference.kt new file mode 100644 index 000000000..3bf2ce8e9 --- /dev/null +++ b/app/src/main/java/helium314/keyboard/settings/preferences/TextInputPreference.kt @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-3.0-only +package helium314.keyboard.settings.preferences + +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.platform.LocalContext +import helium314.keyboard.keyboard.KeyboardSwitcher +import helium314.keyboard.latin.utils.prefs +import helium314.keyboard.settings.Setting +import helium314.keyboard.settings.dialogs.TextInputDialog + +@Composable +fun TextInputPreference(setting: Setting, default: String, checkTextValid: (String) -> Boolean = { true }) { + var showDialog by rememberSaveable { mutableStateOf(false) } + val prefs = LocalContext.current.prefs() + Preference( + name = setting.title, + onClick = { showDialog = true }, + description = prefs.getString(setting.key, default)?.takeIf { it.isNotEmpty() } + ) + if (showDialog) { + TextInputDialog( + onDismissRequest = { showDialog = false }, + onConfirmed = { + prefs.edit().putString(setting.key, it).apply() + KeyboardSwitcher.getInstance().setThemeNeedsReload() + }, + initialText = prefs.getString(setting.key, default) ?: "", + title = { Text(setting.title) }, + checkTextValid = checkTextValid + ) + } +} diff --git a/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt index c81f3025f..badc404d3 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt @@ -29,6 +29,7 @@ import helium314.keyboard.latin.common.splitOnWhitespace import helium314.keyboard.latin.settings.DebugSettings import helium314.keyboard.latin.settings.Defaults import helium314.keyboard.latin.settings.Settings +import helium314.keyboard.latin.utils.checkTimestampFormat import helium314.keyboard.latin.utils.prefs import helium314.keyboard.settings.NextScreenIcon import helium314.keyboard.settings.SettingsContainer @@ -45,6 +46,7 @@ import helium314.keyboard.settings.Theme import helium314.keyboard.settings.dialogs.TextInputDialog import helium314.keyboard.settings.preferences.BackupRestorePreference import helium314.keyboard.settings.preferences.LoadGestureLibPreference +import helium314.keyboard.settings.preferences.TextInputPreference import helium314.keyboard.settings.previewDark @Composable @@ -71,6 +73,7 @@ fun AdvancedSettingsScreen( Settings.PREF_ABC_AFTER_CLIP, Settings.PREF_CUSTOM_CURRENCY_KEY, Settings.PREF_MORE_POPUP_KEYS, + Settings.PREF_TIMESTAMP_FORMAT, SettingsWithoutKey.BACKUP_RESTORE, if (BuildConfig.DEBUG || prefs.getBoolean(DebugSettings.PREF_SHOW_DEBUG_SETTINGS, Defaults.PREF_SHOW_DEBUG_SETTINGS)) SettingsWithoutKey.DEBUG_SETTINGS else null, @@ -195,6 +198,9 @@ fun createAdvancedSettings(context: Context) = listOf( Setting(context, SettingsWithoutKey.BACKUP_RESTORE, R.string.backup_restore_title) { BackupRestorePreference(it) }, + Setting(context, Settings.PREF_TIMESTAMP_FORMAT, R.string.timestamp_format_title) { + TextInputPreference(it, Defaults.PREF_TIMESTAMP_FORMAT) { checkTimestampFormat(it) } + }, Setting(context, SettingsWithoutKey.DEBUG_SETTINGS, R.string.debug_settings_title) { Preference( name = it.title, diff --git a/app/src/main/java/helium314/keyboard/settings/screens/AppearanceScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/AppearanceScreen.kt index f8a43ca25..2a53c22c0 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/AppearanceScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/AppearanceScreen.kt @@ -21,6 +21,7 @@ import helium314.keyboard.latin.R import helium314.keyboard.latin.settings.Defaults import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.utils.Log +import helium314.keyboard.latin.utils.checkTimestampFormat import helium314.keyboard.latin.utils.getActivity import helium314.keyboard.latin.utils.getStringResourceOrName import helium314.keyboard.latin.utils.prefs @@ -39,6 +40,7 @@ import helium314.keyboard.settings.dialogs.TextInputDialog import helium314.keyboard.settings.initPreview import helium314.keyboard.settings.preferences.BackgroundImagePref import helium314.keyboard.settings.preferences.CustomFontPreference +import helium314.keyboard.settings.preferences.TextInputPreference import helium314.keyboard.settings.previewDark @Composable @@ -263,26 +265,8 @@ fun createAppearanceSettings(context: Context) = listOf( description = { "${(100 * it).toInt()}%" } ) { KeyboardSwitcher.getInstance().setThemeNeedsReload() } }, - Setting(context, Settings.PREF_SPACE_BAR_TEXT, R.string.prefs_space_bar_text) { setting -> - var showDialog by rememberSaveable { mutableStateOf(false) } - val prefs = LocalContext.current.prefs() - Preference( - name = setting.title, - onClick = { showDialog = true }, - description = prefs.getString(setting.key, Defaults.PREF_SPACE_BAR_TEXT)?.takeIf { it.isNotEmpty() } - ) - if (showDialog) { - TextInputDialog( - onDismissRequest = { showDialog = false }, - onConfirmed = { - prefs.edit().putString(setting.key, it).apply() - KeyboardSwitcher.getInstance().setThemeNeedsReload() - }, - initialText = prefs.getString(setting.key, Defaults.PREF_SPACE_BAR_TEXT) ?: "", - title = { Text(setting.title) }, - checkTextValid = { true } - ) - } + Setting(context, Settings.PREF_SPACE_BAR_TEXT, R.string.prefs_space_bar_text) { + TextInputPreference(it, Defaults.PREF_SPACE_BAR_TEXT) }, Setting(context, SettingsWithoutKey.CUSTOM_FONT, R.string.custom_font) { CustomFontPreference(it) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aa277977c..03e7bcff3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -196,6 +196,8 @@ Backup Restore + + Format for timestamp key Multilingual typing diff --git a/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt b/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt index e8f2a5c34..bebee9236 100644 --- a/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt +++ b/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt @@ -23,6 +23,7 @@ import helium314.keyboard.latin.inputlogic.InputLogic import helium314.keyboard.latin.inputlogic.SpaceState import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.utils.ScriptUtils +import helium314.keyboard.latin.utils.getTimestamp import helium314.keyboard.latin.utils.prefs import org.junit.runner.RunWith import org.mockito.Mockito @@ -666,6 +667,13 @@ class InputLogicTest { // need to avoid getting into the mWordComposer.isBatchMode() part of handleBackspaceEvent } + @Test fun timestamp() { + reset() + chainInput("hello") + functionalKeyPress(KeyCode.TIMESTAMP) + assertEquals("hello" + getTimestamp(latinIME), text) + } + // ------- helper functions --------- // should be called before every test, so the same state is guaranteed diff --git a/layouts.md b/layouts.md index b442e934b..9464abea6 100644 --- a/layouts.md +++ b/layouts.md @@ -103,7 +103,7 @@ Usually the label is what is displayed on the key. However, there are some speci * In case a label clashes with text you want to add, put a `\` in front of the text you want, e.g. `\space` will write the label `space` instead of adding a space bar. * Note that you need to escape the `\` in json files by adding a second `\`. * If you want different key label and input text, set the label to [label]|[text], e.g. `aa|bb` will show `aa`, but pressing the key will input `bb`. -You can also specify special key codes like `a|!code/key_action_previous`, but it's cleaner to use a json layout and specify the code explicitly. Note that when specifying a code in the label, and a code in a json layout, the code in the label will be ignored. +You can also specify special key codes like `a|!code/key_action_previous` or `abc|!code/-10043`, but it's cleaner to use a json layout and specify the code explicitly. Note that when specifying a code in the label, and a code in a json layout, the code in the label will be ignored. * It's also possible to specify an icon, like `!icon/previous_key|!code/key_action_previous`. * You can find available icon names in [KeyboardIconsSet](/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardIconsSet.kt). You can also use toolbar key icons using the uppercase name of the [toolbar key](/app/src/main/java/helium314/keyboard/latin/utils/ToolbarUtils.kt#L109), e.g. `!icon/redo` From ac805a9286eb58fee173b9efd2be5934873c38cc Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 30 Mar 2025 12:03:21 +0200 Subject: [PATCH 043/175] fix some issues with renaming color schemes fixes GH-1449 and some more unreported bugs --- .../keyboard/keyboard/KeyboardTheme.kt | 22 +++----- .../keyboard/settings/screens/ColorsScreen.kt | 56 ++++++++++--------- 2 files changed, 38 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardTheme.kt b/app/src/main/java/helium314/keyboard/keyboard/KeyboardTheme.kt index 9a51bafa6..73d03ef00 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardTheme.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardTheme.kt @@ -405,14 +405,7 @@ private constructor(val themeId: Int, @JvmField val mStyleId: Int) { } fun getUnusedThemeName(initialName: String, prefs: SharedPreferences): String { - val existingNames = prefs.all.keys.mapNotNull { - when { - it.startsWith(Settings.PREF_USER_COLORS_PREFIX) -> it.substringAfter(Settings.PREF_USER_COLORS_PREFIX) - it.startsWith(Settings.PREF_USER_ALL_COLORS_PREFIX) -> it.substringAfter(Settings.PREF_USER_ALL_COLORS_PREFIX) - it.startsWith(Settings.PREF_USER_MORE_COLORS_PREFIX) -> it.substringAfter(Settings.PREF_USER_MORE_COLORS_PREFIX) - else -> null - } - }.toSortedSet() + val existingNames = getExistingThemeNames(prefs) if (initialName !in existingNames) return initialName var i = 1 while ("$initialName$i" in existingNames) @@ -420,11 +413,8 @@ private constructor(val themeId: Int, @JvmField val mStyleId: Int) { return "$initialName$i" } - // returns false if not renamed due to invalid name or collision - fun renameUserColors(from: String, to: String, prefs: SharedPreferences): Boolean { - if (to.isBlank()) return false // don't want that - if (to == from) return true // nothing to do - val existingNames = prefs.all.keys.mapNotNull { + private fun getExistingThemeNames(prefs: SharedPreferences) = + prefs.all.keys.mapNotNull { when { it.startsWith(Settings.PREF_USER_COLORS_PREFIX) -> it.substringAfter(Settings.PREF_USER_COLORS_PREFIX) it.startsWith(Settings.PREF_USER_ALL_COLORS_PREFIX) -> it.substringAfter(Settings.PREF_USER_ALL_COLORS_PREFIX) @@ -432,6 +422,12 @@ private constructor(val themeId: Int, @JvmField val mStyleId: Int) { else -> null } }.toSortedSet() + + // returns false if not renamed due to invalid name or collision + fun renameUserColors(from: String, to: String, prefs: SharedPreferences): Boolean { + if (to.isBlank()) return false // don't want that + if (to == from) return true // nothing to do + val existingNames = getExistingThemeNames(prefs) if (to in existingNames) return false // all good, now rename prefs.edit { diff --git a/app/src/main/java/helium314/keyboard/settings/screens/ColorsScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/ColorsScreen.kt index 7f14843ac..976a17800 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/ColorsScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/ColorsScreen.kt @@ -71,6 +71,14 @@ fun ColorsScreen( onClickBack: () -> Unit ) { val ctx = LocalContext.current + val prefs = ctx.prefs() + val b = (ctx.getActivity() as? SettingsActivity)?.prefChanged?.collectAsState() + if ((b?.value ?: 0) < 0) + Log.v("irrelevant", "stupid way to trigger recomposition on preference change") + + val themeName = theme ?: if (isNight) prefs.getString(Settings.PREF_THEME_COLORS_NIGHT, Defaults.PREF_THEME_COLORS_NIGHT)!! + else prefs.getString(Settings.PREF_THEME_COLORS, Defaults.PREF_THEME_COLORS)!! + var newThemeName by rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue(themeName)) } // is there really no better way of only setting forceOpposite while the screen is shown (and not paused)? // lifecycle stuff is weird, there is no pause and similar when activity is paused @@ -83,21 +91,14 @@ fun ColorsScreen( val lifecycleState by lifecycleOwner.lifecycle.currentStateFlow.collectAsState() LaunchedEffect(lifecycleState) { if (lifecycleState == Lifecycle.State.RESUMED) { - (ctx.getActivity() as? SettingsActivity)?.setForceTheme(theme, isNight) + (ctx.getActivity() as? SettingsActivity)?.setForceTheme(newThemeName.text, isNight) } } - val prefs = ctx.prefs() - val b = (ctx.getActivity() as? SettingsActivity)?.prefChanged?.collectAsState() - if ((b?.value ?: 0) < 0) - Log.v("irrelevant", "stupid way to trigger recomposition on preference change") - - val themeName = theme ?: if (isNight) prefs.getString(Settings.PREF_THEME_COLORS_NIGHT, Defaults.PREF_THEME_COLORS_NIGHT)!! - else prefs.getString(Settings.PREF_THEME_COLORS, Defaults.PREF_THEME_COLORS)!! - val moreColors = KeyboardTheme.readUserMoreColors(prefs, themeName) - val userColors = KeyboardTheme.readUserColors(prefs, themeName) + val moreColors = KeyboardTheme.readUserMoreColors(prefs, newThemeName.text) + val userColors = KeyboardTheme.readUserColors(prefs, newThemeName.text) val shownColors = if (moreColors == 2) { - val allColors = KeyboardTheme.readUserAllColors(prefs, themeName) + val allColors = KeyboardTheme.readUserAllColors(prefs, newThemeName.text) ColorType.entries.map { ColorSetting(it.name, null, allColors[it] ?: it.default()) } @@ -114,12 +115,11 @@ fun ColorsScreen( fun ColorSetting.displayColor() = if (auto == true) KeyboardTheme.determineUserColor(userColors, ctx, name, isNight) else color ?: KeyboardTheme.determineUserColor(userColors, ctx, name, isNight) - var newThemeName by rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue(themeName)) } var chosenColorString: String by rememberSaveable { mutableStateOf("") } val chosenColor = runCatching { Json.decodeFromString(chosenColorString) }.getOrNull() - val saveLauncher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode != Activity.RESULT_OK) return@rememberLauncherForActivityResult - val uri = it.data?.data ?: return@rememberLauncherForActivityResult + val saveLauncher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode != Activity.RESULT_OK) return@rememberLauncherForActivityResult + val uri = result.data?.data ?: return@rememberLauncherForActivityResult ctx.getActivity()?.contentResolver?.openOutputStream(uri)?.writer()?.use { it.write(getColorString(prefs, newThemeName.text)) } } SearchScreen( @@ -130,8 +130,10 @@ fun ColorsScreen( value = nameField, onValueChange = { nameValid = KeyboardTheme.renameUserColors(newThemeName.text, it.text, prefs) - if (nameValid) + if (nameValid) { newThemeName = it + SettingsActivity.forceTheme = newThemeName.text + } nameField = it }, isError = !nameValid, @@ -195,11 +197,11 @@ fun ColorsScreen( } } if (colorSetting.auto != null) - Switch(colorSetting.auto, onCheckedChange = { - val oldUserColors = KeyboardTheme.readUserColors(prefs, themeName) - val newUserColors = (oldUserColors + ColorSetting(colorSetting.name, it, colorSetting.color)) + Switch(colorSetting.auto, onCheckedChange = { checked -> + val oldUserColors = KeyboardTheme.readUserColors(prefs, newThemeName.text) + val newUserColors = (oldUserColors + ColorSetting(colorSetting.name, checked, colorSetting.color)) .reversed().distinctBy { it.displayName } - KeyboardTheme.writeUserColors(prefs, themeName, newUserColors) + KeyboardTheme.writeUserColors(prefs, newThemeName.text, newUserColors) }) } } @@ -209,16 +211,16 @@ fun ColorsScreen( onDismissRequest = { chosenColorString = "" }, initialColor = chosenColor.displayColor(), title = chosenColor.displayName, - ) { + ) { color -> if (moreColors == 2) { - val oldColors = KeyboardTheme.readUserAllColors(prefs, themeName) - oldColors[ColorType.valueOf(chosenColor.name)] = it - KeyboardTheme.writeUserAllColors(prefs, themeName, oldColors) + val oldColors = KeyboardTheme.readUserAllColors(prefs, newThemeName.text) + oldColors[ColorType.valueOf(chosenColor.name)] = color + KeyboardTheme.writeUserAllColors(prefs, newThemeName.text, oldColors) } else { - val oldUserColors = KeyboardTheme.readUserColors(prefs, themeName) - val newUserColors = (oldUserColors + ColorSetting(chosenColor.name, false, it)) + val oldUserColors = KeyboardTheme.readUserColors(prefs, newThemeName.text) + val newUserColors = (oldUserColors + ColorSetting(chosenColor.name, false, color)) .reversed().distinctBy { it.displayName } - KeyboardTheme.writeUserColors(prefs, themeName, newUserColors) + KeyboardTheme.writeUserColors(prefs, newThemeName.text, newUserColors) } } } From 6bbce0b5ca12f4090d1849542be8e4306458d270 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 30 Mar 2025 12:40:06 +0200 Subject: [PATCH 044/175] change subtype dialog to screen mostly just moved the content and adjusted necessary calls still needs some minor tweaking --- .../keyboard/settings/SearchScreen.kt | 7 +- .../keyboard/settings/SettingsNavHost.kt | 6 + .../settings/screens/LanguageScreen.kt | 24 +- .../SubtypeScreen.kt} | 243 ++++++++++-------- 4 files changed, 145 insertions(+), 135 deletions(-) rename app/src/main/java/helium314/keyboard/settings/{dialogs/SubtypeDialog.kt => screens/SubtypeScreen.kt} (70%) diff --git a/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt b/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt index d6bf4081c..1d7608e98 100644 --- a/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt @@ -103,6 +103,7 @@ fun SearchScreen( title: @Composable () -> Unit, filteredItems: (String) -> List, itemContent: @Composable (T) -> Unit, + icon: @Composable (() -> Unit)? = null, menu: List Unit>>? = null, content: @Composable (ColumnScope.() -> Unit)? = null, ) { @@ -137,8 +138,10 @@ fun SearchScreen( } }, actions = { - IconButton(onClick = { setShowSearch(!showSearch) }) - { SearchIcon() } + if (icon == null) + IconButton(onClick = { setShowSearch(!showSearch) }) { SearchIcon() } + else + icon() if (menu != null) Box { var showMenu by remember { mutableStateOf(false) } diff --git a/app/src/main/java/helium314/keyboard/settings/SettingsNavHost.kt b/app/src/main/java/helium314/keyboard/settings/SettingsNavHost.kt index 761610a5c..7a694070f 100644 --- a/app/src/main/java/helium314/keyboard/settings/SettingsNavHost.kt +++ b/app/src/main/java/helium314/keyboard/settings/SettingsNavHost.kt @@ -16,6 +16,7 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import helium314.keyboard.latin.common.LocaleUtils.constructLocale +import helium314.keyboard.latin.settings.SettingsSubtype.Companion.toSettingsSubtype import helium314.keyboard.settings.screens.AboutScreen import helium314.keyboard.settings.screens.AdvancedSettingsScreen import helium314.keyboard.settings.screens.AppearanceScreen @@ -29,6 +30,7 @@ import helium314.keyboard.settings.screens.PersonalDictionariesScreen import helium314.keyboard.settings.screens.PersonalDictionaryScreen import helium314.keyboard.settings.screens.PreferencesScreen import helium314.keyboard.settings.screens.SecondaryLayoutScreen +import helium314.keyboard.settings.screens.SubtypeScreen import helium314.keyboard.settings.screens.TextCorrectionScreen import helium314.keyboard.settings.screens.ToolbarScreen import kotlinx.coroutines.CoroutineScope @@ -126,6 +128,9 @@ fun SettingsNavHost( composable(SettingsDestination.ColorsNight + "{theme}") { ColorsScreen(isNight = true, theme = it.arguments?.getString("theme"), onClickBack = ::goBack) } + composable(SettingsDestination.Subtype + "{subtype}") { + SubtypeScreen(initialSubtype = it.arguments?.getString("subtype")!!.toSettingsSubtype(), onClickBack = ::goBack) + } } if (target.value != SettingsDestination.Settings/* && target.value != navController.currentBackStackEntry?.destination?.route*/) navController.navigate(route = target.value) @@ -146,6 +151,7 @@ object SettingsDestination { const val PersonalDictionaries = "personal_dictionaries" const val PersonalDictionary = "personal_dictionary/" const val Languages = "languages" + const val Subtype = "subtype/" const val Layouts = "layouts" const val Dictionaries = "dictionaries" val navTarget = MutableStateFlow(Settings) diff --git a/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt index 3c7156460..f4e2d5ae1 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt @@ -18,7 +18,6 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -39,15 +38,14 @@ import helium314.keyboard.latin.utils.Log import helium314.keyboard.latin.utils.MissingDictionaryDialog import helium314.keyboard.latin.utils.SubtypeLocaleUtils import helium314.keyboard.latin.utils.SubtypeSettings -import helium314.keyboard.latin.utils.SubtypeUtilsAdditional import helium314.keyboard.latin.utils.displayName import helium314.keyboard.latin.utils.getActivity import helium314.keyboard.latin.utils.locale import helium314.keyboard.latin.utils.prefs import helium314.keyboard.settings.SearchScreen import helium314.keyboard.settings.SettingsActivity +import helium314.keyboard.settings.SettingsDestination import helium314.keyboard.settings.Theme -import helium314.keyboard.settings.dialogs.SubtypeDialog import helium314.keyboard.settings.initPreview import helium314.keyboard.settings.previewDark import java.util.Locale @@ -57,12 +55,11 @@ fun LanguageScreen( onClickBack: () -> Unit, ) { val ctx = LocalContext.current - var sortedSubtypes by remember { mutableStateOf(getSortedSubtypes(ctx)) } + val sortedSubtypes by remember { mutableStateOf(getSortedSubtypes(ctx)) } val prefs = ctx.prefs() val b = (LocalContext.current.getActivity() as? SettingsActivity)?.prefChanged?.collectAsState() if ((b?.value ?: 0) < 0) Log.v("irrelevant", "stupid way to trigger recomposition on preference change") - var selectedSubtype: String? by rememberSaveable { mutableStateOf(null) } val enabledSubtypes = SubtypeSettings.getEnabledSubtypes() SearchScreen( onClickBack = onClickBack, @@ -87,7 +84,9 @@ fun LanguageScreen( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .fillMaxWidth() - .clickable { selectedSubtype = item.toSettingsSubtype().toPref() } + .clickable { + SettingsDestination.navigateTo(SettingsDestination.Subtype + item.toSettingsSubtype().toPref()) + } .padding(vertical = 6.dp, horizontal = 16.dp) ) { var showNoDictDialog by remember { mutableStateOf(false) } @@ -119,19 +118,6 @@ fun LanguageScreen( } } ) - if (selectedSubtype != null) { - val oldSubtype = selectedSubtype!!.toSettingsSubtype() - SubtypeDialog( - onDismissRequest = { - selectedSubtype = null - sortedSubtypes = getSortedSubtypes(ctx) - }, - onConfirmed = { - SubtypeUtilsAdditional.changeAdditionalSubtype(oldSubtype, it, ctx) - }, - initialSubtype = oldSubtype - ) - } } private fun dictsAvailable(locale: Locale, context: Context): Boolean { diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt similarity index 70% rename from app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt rename to app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt index 5ddf7a1e2..be938921e 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/SubtypeDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt @@ -1,5 +1,4 @@ -// SPDX-License-Identifier: GPL-3.0-only -package helium314.keyboard.settings.dialogs +package helium314.keyboard.settings.screens import android.content.Context import androidx.compose.foundation.clickable @@ -14,6 +13,7 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.TextButton @@ -68,22 +68,32 @@ import helium314.keyboard.latin.utils.getStringResourceOrName import helium314.keyboard.latin.utils.mainLayoutName import helium314.keyboard.latin.utils.prefs import helium314.keyboard.settings.DefaultButton +import helium314.keyboard.settings.DeleteButton import helium314.keyboard.settings.DropDownField +import helium314.keyboard.settings.SearchScreen import helium314.keyboard.settings.SettingsActivity import helium314.keyboard.settings.Theme import helium314.keyboard.settings.WithSmallTitle +import helium314.keyboard.settings.dialogs.ConfirmationDialog +import helium314.keyboard.settings.dialogs.LayoutEditDialog +import helium314.keyboard.settings.dialogs.ListPickerDialog +import helium314.keyboard.settings.dialogs.MultiListPickerDialog +import helium314.keyboard.settings.dialogs.ReorderDialog import helium314.keyboard.settings.initPreview import helium314.keyboard.settings.layoutFilePicker import helium314.keyboard.settings.layoutIntent import helium314.keyboard.settings.previewDark -import helium314.keyboard.settings.screens.GetIcon import java.util.Locale +// todo: +// dropdowns are weird +// at very least too wide and too high +// also too wide left (anchor should be icon) +// title shows only the layout name @Composable -fun SubtypeDialog( - onDismissRequest: () -> Unit, +fun SubtypeScreen( initialSubtype: SettingsSubtype, - onConfirmed: (SettingsSubtype) -> Unit, + onClickBack: () -> Unit, ) { val ctx = LocalContext.current val prefs = ctx.prefs() @@ -92,7 +102,10 @@ fun SubtypeDialog( Log.v("irrelevant", "stupid way to trigger recomposition on preference change") var currentSubtypeString by rememberSaveable { mutableStateOf(initialSubtype.toPref()) } val currentSubtype = currentSubtypeString.toSettingsSubtype() - fun setCurrentSubtype(subtype: SettingsSubtype) { currentSubtypeString = subtype.toPref() } + fun setCurrentSubtype(subtype: SettingsSubtype) { + SubtypeUtilsAdditional.changeAdditionalSubtype(currentSubtype, subtype, ctx) + currentSubtypeString = subtype.toPref() + } LaunchedEffect(currentSubtypeString) { if (ScriptUtils.scriptSupportsUppercase(currentSubtype.locale)) return@LaunchedEffect // update the noShiftKey extra value @@ -120,120 +133,119 @@ fun SubtypeDialog( var showMorePopupsDialog by remember { mutableStateOf(false) } val scrollState = rememberScrollState() val customMainLayouts = LayoutUtilsCustom.getLayoutFiles(LayoutType.MAIN, ctx, currentSubtype.locale).map { it.name } - ThreeButtonAlertDialog( - onDismissRequest = onDismissRequest, - onConfirmed = { onConfirmed(currentSubtype) }, - neutralButtonText = if (initialSubtype.isAdditionalSubtype(prefs)) stringResource(R.string.delete) else null, - onNeutral = { - SubtypeUtilsAdditional.removeAdditionalSubtype(ctx, initialSubtype.toAdditionalSubtype()) - SubtypeSettings.removeEnabledSubtype(ctx, initialSubtype.toAdditionalSubtype()) - onDismissRequest() - }, + SearchScreen( + onClickBack = onClickBack, + icon = { if (currentSubtype.isAdditionalSubtype(prefs)) DeleteButton { + SubtypeUtilsAdditional.removeAdditionalSubtype(ctx, currentSubtype.toAdditionalSubtype()) + SubtypeSettings.removeEnabledSubtype(ctx, currentSubtype.toAdditionalSubtype()) + onClickBack() + } }, title = { - val mainLayout = initialSubtype.mainLayoutName() ?: SubtypeLocaleUtils.QWERTY - Text(SubtypeLocaleUtils.getDisplayNameInSystemLocale(mainLayout, initialSubtype.locale)) + val mainLayout = currentSubtype.mainLayoutName() ?: SubtypeLocaleUtils.QWERTY + Text(SubtypeLocaleUtils.getDisplayNameInSystemLocale(mainLayout, currentSubtype.locale)) }, - content = { - Column( - modifier = Modifier.verticalScroll(scrollState), - verticalArrangement = Arrangement.spacedBy(8.dp), - ) { - MainLayoutRow(initialSubtype, currentSubtype, customMainLayouts) { setCurrentSubtype(it) } - if (availableLocalesForScript.size > 1) { - WithSmallTitle(stringResource(R.string.secondary_locale)) { - TextButton(onClick = { showSecondaryLocaleDialog = true }) { - val text = getSecondaryLocales(currentSubtype.extraValues).joinToString(", ") { - it.localizedDisplayName(ctx) - }.ifEmpty { stringResource(R.string.action_none) } - Text(text, Modifier.fillMaxWidth()) - } + itemContent = { }, + filteredItems = { emptyList() } + ) { + Column( + modifier = Modifier.verticalScroll(scrollState).padding(horizontal = 12.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + MainLayoutRow(currentSubtype, customMainLayouts) { setCurrentSubtype(it) } + if (availableLocalesForScript.size > 1) { + WithSmallTitle(stringResource(R.string.secondary_locale)) { + TextButton(onClick = { showSecondaryLocaleDialog = true }) { + val text = getSecondaryLocales(currentSubtype.extraValues).joinToString(", ") { + it.localizedDisplayName(ctx) + }.ifEmpty { stringResource(R.string.action_none) } + Text(text, Modifier.fillMaxWidth()) } } - Row { - TextButton(onClick = { showKeyOrderDialog = true }, Modifier.weight(1f)) - { Text(stringResource(R.string.popup_order)) } - DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) == null) { - setCurrentSubtype(currentSubtype.without(ExtraValue.POPUP_ORDER)) - } + } + Row { + TextButton(onClick = { showKeyOrderDialog = true }, Modifier.weight(1f)) + { Text(stringResource(R.string.popup_order)) } + DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) == null) { + setCurrentSubtype(currentSubtype.without(ExtraValue.POPUP_ORDER)) } - Row { - TextButton(onClick = { showHintOrderDialog = true }, Modifier.weight(1f)) - { Text(stringResource(R.string.hint_source)) } - DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.HINT_ORDER) == null) { - setCurrentSubtype(currentSubtype.without(ExtraValue.HINT_ORDER)) - } + } + Row { + TextButton(onClick = { showHintOrderDialog = true }, Modifier.weight(1f)) + { Text(stringResource(R.string.hint_source)) } + DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.HINT_ORDER) == null) { + setCurrentSubtype(currentSubtype.without(ExtraValue.HINT_ORDER)) } - if (currentSubtype.locale.script() == ScriptUtils.SCRIPT_LATIN) { - WithSmallTitle(stringResource(R.string.show_popup_keys_title)) { - val explicitValue = currentSubtype.getExtraValueOf(ExtraValue.MORE_POPUPS) - val value = explicitValue ?: prefs.getString(Settings.PREF_MORE_POPUP_KEYS, Defaults.PREF_MORE_POPUP_KEYS)!! - Row { - TextButton(onClick = { showMorePopupsDialog = true }, Modifier.weight(1f)) - { Text(stringResource(morePopupKeysResId(value))) } - DefaultButton(explicitValue == null) { - setCurrentSubtype(currentSubtype.without(ExtraValue.MORE_POPUPS)) - } - } - } - } - if (hasLocalizedNumberRow(currentSubtype.locale, ctx)) { - Row(verticalAlignment = Alignment.CenterVertically) { - val checked = currentSubtype.getExtraValueOf(ExtraValue.LOCALIZED_NUMBER_ROW)?.toBoolean() - Text(stringResource(R.string.localized_number_row), Modifier.weight(1f)) - Switch( - checked = checked ?: prefs.getBoolean(Settings.PREF_LOCALIZED_NUMBER_ROW, Defaults.PREF_LOCALIZED_NUMBER_ROW), - onCheckedChange = { - setCurrentSubtype(currentSubtype.with(ExtraValue.LOCALIZED_NUMBER_ROW, it.toString())) - } - ) - DefaultButton(checked == null) { - setCurrentSubtype(currentSubtype.without(ExtraValue.LOCALIZED_NUMBER_ROW)) - } - } - } - HorizontalDivider() - Text(stringResource(R.string.settings_screen_secondary_layouts), style = MaterialTheme.typography.titleMedium) - LayoutType.entries.forEach { type -> - if (type == LayoutType.MAIN) return@forEach - WithSmallTitle(stringResource(type.displayNameId)) { - val explicitLayout = currentSubtype.layoutName(type) - val layout = explicitLayout ?: Settings.readDefaultLayoutName(type, prefs) - val defaultLayouts = LayoutUtils.getAvailableLayouts(type, ctx) - val customLayouts = LayoutUtilsCustom.getLayoutFiles(type, ctx).map { it.name } - DropDownField( - items = defaultLayouts + customLayouts, - selectedItem = layout, - onSelected = { - setCurrentSubtype(currentSubtype.withLayout(type, it)) - }, - extraButton = { DefaultButton(explicitLayout == null) { - setCurrentSubtype(currentSubtype.withoutLayout(type)) - } }, - ) { - val displayName = if (LayoutUtilsCustom.isCustomLayout(it)) LayoutUtilsCustom.getDisplayName(it) - else it.getStringResourceOrName("layout_", ctx) - var showLayoutEditDialog by remember { mutableStateOf(false) } - Row( - horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxWidth() - ) { - Text(displayName, Modifier.padding(end = 8.dp)) - if (LayoutUtilsCustom.isCustomLayout(it)) - Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout), Modifier.clickable { showLayoutEditDialog = true }) - } - if (showLayoutEditDialog) - LayoutEditDialog( - onDismissRequest = { showLayoutEditDialog = false }, - layoutType = type, - initialLayoutName = it, - isNameValid = null - ) + } + if (currentSubtype.locale.script() == ScriptUtils.SCRIPT_LATIN) { + WithSmallTitle(stringResource(R.string.show_popup_keys_title)) { + val explicitValue = currentSubtype.getExtraValueOf(ExtraValue.MORE_POPUPS) + val value = explicitValue ?: prefs.getString(Settings.PREF_MORE_POPUP_KEYS, Defaults.PREF_MORE_POPUP_KEYS)!! + Row { + TextButton(onClick = { showMorePopupsDialog = true }, Modifier.weight(1f)) + { Text(stringResource(morePopupKeysResId(value))) } + DefaultButton(explicitValue == null) { + setCurrentSubtype(currentSubtype.without(ExtraValue.MORE_POPUPS)) } } } } + if (hasLocalizedNumberRow(currentSubtype.locale, ctx)) { + Row(verticalAlignment = Alignment.CenterVertically) { + val checked = currentSubtype.getExtraValueOf(ExtraValue.LOCALIZED_NUMBER_ROW)?.toBoolean() + Text(stringResource(R.string.localized_number_row), Modifier.weight(1f)) + Switch( + checked = checked ?: prefs.getBoolean(Settings.PREF_LOCALIZED_NUMBER_ROW, Defaults.PREF_LOCALIZED_NUMBER_ROW), + onCheckedChange = { + setCurrentSubtype(currentSubtype.with(ExtraValue.LOCALIZED_NUMBER_ROW, it.toString())) + } + ) + DefaultButton(checked == null) { + setCurrentSubtype(currentSubtype.without(ExtraValue.LOCALIZED_NUMBER_ROW)) + } + } + } + HorizontalDivider() + Text(stringResource(R.string.settings_screen_secondary_layouts), style = MaterialTheme.typography.titleMedium) + LayoutType.entries.forEach { type -> + if (type == LayoutType.MAIN) return@forEach + WithSmallTitle(stringResource(type.displayNameId)) { + val explicitLayout = currentSubtype.layoutName(type) + val layout = explicitLayout ?: Settings.readDefaultLayoutName(type, prefs) + val defaultLayouts = LayoutUtils.getAvailableLayouts(type, ctx) + val customLayouts = LayoutUtilsCustom.getLayoutFiles(type, ctx).map { it.name } + DropDownField( + items = defaultLayouts + customLayouts, + selectedItem = layout, + onSelected = { + setCurrentSubtype(currentSubtype.withLayout(type, it)) + }, + extraButton = { DefaultButton(explicitLayout == null) { + setCurrentSubtype(currentSubtype.withoutLayout(type)) + } }, + ) { + val displayName = if (LayoutUtilsCustom.isCustomLayout(it)) LayoutUtilsCustom.getDisplayName(it) + else it.getStringResourceOrName("layout_", ctx) + var showLayoutEditDialog by remember { mutableStateOf(false) } + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth() + ) { + Text(displayName, Modifier.padding(end = 8.dp)) + if (LayoutUtilsCustom.isCustomLayout(it)) + Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout), Modifier.clickable { showLayoutEditDialog = true }) + } + if (showLayoutEditDialog) + LayoutEditDialog( + onDismissRequest = { showLayoutEditDialog = false }, + layoutType = type, + initialLayoutName = it, + isNameValid = null + ) + } + } + } } - ) + } if (showSecondaryLocaleDialog) MultiListPickerDialog( onDismissRequest = { showSecondaryLocaleDialog = false }, @@ -294,6 +306,7 @@ fun SubtypeDialog( } } + // from ReorderSwitchPreference @Composable private fun PopupOrderDialog( @@ -336,7 +349,6 @@ private fun PopupOrderDialog( @Composable private fun MainLayoutRow( - initialSubtype: SettingsSubtype, currentSubtype: SettingsSubtype, customLayouts: List, setCurrentSubtype: (SettingsSubtype) -> Unit, @@ -369,13 +381,13 @@ private fun MainLayoutRow( Text(SubtypeLocaleUtils.getDisplayNameInSystemLocale(it, currentSubtype.locale)) Row (verticalAlignment = Alignment.CenterVertically) { Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout), Modifier.clickable { showLayoutEditDialog = it to null }) - if (it in customLayouts && initialSubtype.mainLayoutName() != it) // don't allow current main layout + if (it in customLayouts && currentSubtype.mainLayoutName() != it) // don't allow current main layout // todo: this was initialSubtype, maybe needs adjustment now Icon(painterResource(R.drawable.ic_bin), stringResource(R.string.delete), Modifier.clickable { showLayoutDeleteDialog = true }) } } if (showLayoutDeleteDialog) { val others = SubtypeSettings.getAdditionalSubtypes().filter { st -> st.mainLayoutName() == it } - .any { it.toSettingsSubtype() != initialSubtype } + .any { it.toSettingsSubtype() != currentSubtype } // todo: this was initialSubtype, maybe needs adjustment now ConfirmationDialog( onDismissRequest = { showLayoutDeleteDialog = false }, confirmButtonText = stringResource(R.string.delete), @@ -442,11 +454,14 @@ private fun MainLayoutRow( private fun getAvailableSecondaryLocales(context: Context, mainLocale: Locale): List = getDictionaryLocales(context).filter { it != mainLocale && it.script() == mainLocale.script() } + @Preview @Composable private fun Preview() { initPreview(LocalContext.current) Theme(previewDark) { - SubtypeDialog({}, SettingsSubtype(Locale.ENGLISH, "")) { } + Surface { + SubtypeScreen(SettingsSubtype(Locale.ENGLISH, "")) { } + } } } From 3dbd9c6ed946bf1ccbbb87d5d7d0828c2bbd609d Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 31 Mar 2025 01:27:06 +0200 Subject: [PATCH 045/175] slightly adjust behavior and layouts of subtype screen --- .../settings/screens/SubtypeScreen.kt | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt index be938921e..e2489d9da 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt @@ -1,12 +1,12 @@ package helium314.keyboard.settings.screens import android.content.Context -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.HorizontalDivider @@ -61,6 +61,7 @@ import helium314.keyboard.latin.utils.SubtypeLocaleUtils import helium314.keyboard.latin.utils.SubtypeSettings import helium314.keyboard.latin.utils.SubtypeUtilsAdditional import helium314.keyboard.latin.utils.appendLink +import helium314.keyboard.latin.utils.displayName import helium314.keyboard.latin.utils.getActivity import helium314.keyboard.latin.utils.getDictionaryLocales import helium314.keyboard.latin.utils.getSecondaryLocales @@ -85,11 +86,6 @@ import helium314.keyboard.settings.layoutIntent import helium314.keyboard.settings.previewDark import java.util.Locale -// todo: -// dropdowns are weird -// at very least too wide and too high -// also too wide left (anchor should be icon) -// title shows only the layout name @Composable fun SubtypeScreen( initialSubtype: SettingsSubtype, @@ -140,10 +136,7 @@ fun SubtypeScreen( SubtypeSettings.removeEnabledSubtype(ctx, currentSubtype.toAdditionalSubtype()) onClickBack() } }, - title = { - val mainLayout = currentSubtype.mainLayoutName() ?: SubtypeLocaleUtils.QWERTY - Text(SubtypeLocaleUtils.getDisplayNameInSystemLocale(mainLayout, currentSubtype.locale)) - }, + title = { Text(currentSubtype.toAdditionalSubtype().displayName(ctx)) }, itemContent = { }, filteredItems = { emptyList() } ) { @@ -228,11 +221,12 @@ fun SubtypeScreen( var showLayoutEditDialog by remember { mutableStateOf(false) } Row( horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth() ) { - Text(displayName, Modifier.padding(end = 8.dp)) + Text(displayName) if (LayoutUtilsCustom.isCustomLayout(it)) - Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout), Modifier.clickable { showLayoutEditDialog = true }) + IconButton({ showLayoutEditDialog = true }) { Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout)) } } if (showLayoutEditDialog) LayoutEditDialog( @@ -376,18 +370,18 @@ private fun MainLayoutRow( Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, - modifier = Modifier.fillMaxWidth() + modifier = Modifier.widthIn(min = 200.dp).fillMaxWidth() ) { Text(SubtypeLocaleUtils.getDisplayNameInSystemLocale(it, currentSubtype.locale)) Row (verticalAlignment = Alignment.CenterVertically) { - Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout), Modifier.clickable { showLayoutEditDialog = it to null }) - if (it in customLayouts && currentSubtype.mainLayoutName() != it) // don't allow current main layout // todo: this was initialSubtype, maybe needs adjustment now - Icon(painterResource(R.drawable.ic_bin), stringResource(R.string.delete), Modifier.clickable { showLayoutDeleteDialog = true }) + IconButton({ showLayoutEditDialog = it to null }) { Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout)) } + if (it in customLayouts) + IconButton({ showLayoutDeleteDialog = true }) { Icon(painterResource(R.drawable.ic_bin), stringResource(R.string.delete)) } } } if (showLayoutDeleteDialog) { val others = SubtypeSettings.getAdditionalSubtypes().filter { st -> st.mainLayoutName() == it } - .any { it.toSettingsSubtype() != currentSubtype } // todo: this was initialSubtype, maybe needs adjustment now + .any { it.toSettingsSubtype() != currentSubtype } ConfirmationDialog( onDismissRequest = { showLayoutDeleteDialog = false }, confirmButtonText = stringResource(R.string.delete), @@ -454,7 +448,6 @@ private fun MainLayoutRow( private fun getAvailableSecondaryLocales(context: Context, mainLocale: Locale): List = getDictionaryLocales(context).filter { it != mainLocale && it.script() == mainLocale.script() } - @Preview @Composable private fun Preview() { From 8247366bdd0a7d4fca7e0ae2381c63212b3670a5 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 31 Mar 2025 16:27:16 +0200 Subject: [PATCH 046/175] avoid issues with prefChanged not changing --- .../main/java/helium314/keyboard/settings/SettingsActivity.kt | 3 ++- .../helium314/keyboard/settings/dialogs/LayoutEditDialog.kt | 2 +- .../keyboard/settings/preferences/BackupRestorePreference.kt | 2 +- .../java/helium314/keyboard/settings/screens/SubtypeScreen.kt | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt index 498b7293c..acb74220a 100644 --- a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt +++ b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt @@ -53,6 +53,7 @@ import java.util.zip.ZipOutputStream class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferenceChangeListener { private val prefs by lazy { this.prefs() } val prefChanged = MutableStateFlow(0) // simple counter, as the only relevant information is that something changed + fun prefChanged() = prefChanged.value++ private val dictUriFlow = MutableStateFlow(null) private val cachedDictionaryFile by lazy { File(this.cacheDir.path + File.separator + "temp_dict") } private val crashReportFiles = MutableStateFlow>(emptyList()) @@ -236,6 +237,6 @@ class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferen } override fun onSharedPreferenceChanged(prefereces: SharedPreferences?, key: String?) { - prefChanged.value++ + prefChanged() } } diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutEditDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutEditDialog.kt index 2c561ab6b..81a3c0451 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutEditDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutEditDialog.kt @@ -77,7 +77,7 @@ fun LayoutEditDialog( LayoutUtilsCustom.getLayoutFile(newLayoutName, layoutType, ctx).writeText(it) LayoutUtilsCustom.onLayoutFileChanged() onEdited(newLayoutName) - (ctx.getActivity() as? SettingsActivity)?.prefChanged?.value = 555 + (ctx.getActivity() as? SettingsActivity)?.prefChanged() KeyboardSwitcher.getInstance().setThemeNeedsReload() }, confirmButtonText = stringResource(R.string.save), diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt index 675dc2c9d..ee771d5bf 100644 --- a/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt +++ b/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt @@ -168,7 +168,7 @@ fun BackupRestorePreference(setting: Setting) { val newDictBroadcast = Intent(DictionaryPackConstants.NEW_DICTIONARY_INTENT_ACTION) ctx.getActivity()?.sendBroadcast(newDictBroadcast) LayoutUtilsCustom.onLayoutFileChanged() - (ctx.getActivity() as? SettingsActivity)?.prefChanged?.value = 210 // for settings reload + (ctx.getActivity() as? SettingsActivity)?.prefChanged() KeyboardSwitcher.getInstance().setThemeNeedsReload() } Preference(name = setting.title, onClick = { showDialog = true }) diff --git a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt index e2489d9da..a06ab1e29 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt @@ -391,7 +391,7 @@ private fun MainLayoutRow( if (it == currentSubtype.mainLayoutName()) setCurrentSubtype(currentSubtype.withoutLayout(LayoutType.MAIN)) LayoutUtilsCustom.deleteLayout(it, LayoutType.MAIN, ctx) - (ctx.getActivity() as? SettingsActivity)?.prefChanged?.value = 1234 + (ctx.getActivity() as? SettingsActivity)?.prefChanged() } ) } From 452770566c1b6c5ec04ba9139d153dd038b49f79 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 31 Mar 2025 16:31:52 +0200 Subject: [PATCH 047/175] avoid creating additional subtypes that are the same as a resource subtype --- .../keyboard/latin/settings/SettingsSubtype.kt | 4 ++++ .../keyboard/latin/utils/SubtypeSettings.kt | 17 +++++++++++++++-- .../latin/utils/SubtypeUtilsAdditional.kt | 2 +- .../keyboard/settings/screens/SubtypeScreen.kt | 9 +++++++-- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsSubtype.kt b/app/src/main/java/helium314/keyboard/latin/settings/SettingsSubtype.kt index ca18b7fda..b966d92d8 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsSubtype.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsSubtype.kt @@ -14,11 +14,13 @@ import helium314.keyboard.latin.utils.LayoutType.Companion.toExtraValue import helium314.keyboard.latin.utils.Log import helium314.keyboard.latin.utils.ScriptUtils import helium314.keyboard.latin.utils.ScriptUtils.script +import helium314.keyboard.latin.utils.SubtypeSettings import helium314.keyboard.latin.utils.SubtypeUtilsAdditional import helium314.keyboard.latin.utils.locale import java.util.Locale // some kind of intermediate between the string stored in preferences and an InputMethodSubtype +// todo: consider using a hashMap or sortedMap instead of a string if we run into comparison issues once again data class SettingsSubtype(val locale: Locale, val extraValues: String) { fun toPref() = locale.toLanguageTag() + Separators.SET + extraValues @@ -70,6 +72,8 @@ data class SettingsSubtype(val locale: Locale, val extraValues: String) { prefs.getString(Settings.PREF_ADDITIONAL_SUBTYPES, Defaults.PREF_ADDITIONAL_SUBTYPES)!! .split(Separators.SETS).contains(toPref()) + fun isSameAsDefault() = SubtypeSettings.getResourceSubtypesForLocale(locale).any { it.toSettingsSubtype() == this.toPref().toSettingsSubtype() } + companion object { fun String.toSettingsSubtype(): SettingsSubtype = SettingsSubtype( diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt index f533223ec..757ff2faf 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt @@ -124,6 +124,10 @@ object SubtypeSettings { fun getAvailableSubtypeLocales(): List = resourceSubtypesByLocale.keys.toList() + /** + * Update subtypes that contain the layout. If new name is null (layout deleted) and the + * subtype is now identical to a resource subtype, remove the subtype from additional subtypes. + */ fun onRenameLayout(type: LayoutType, from: String, to: String?, context: Context) { val prefs = context.prefs() listOf( @@ -131,10 +135,19 @@ object SubtypeSettings { Settings.PREF_ENABLED_SUBTYPES to Defaults.PREF_ENABLED_SUBTYPES, Settings.PREF_SELECTED_SUBTYPE to Defaults.PREF_SELECTED_SUBTYPE ).forEach { (key, default) -> - val new = prefs.getString(key, default)!!.split(Separators.SETS).mapTo(mutableSetOf()) { + val new = prefs.getString(key, default)!!.split(Separators.SETS).mapNotNullTo(mutableSetOf()) { val subtype = it.toSettingsSubtype() if (subtype.layoutName(type) == from) { - if (to == null) subtype.withoutLayout(type).toPref() + if (to == null) { + val defaultLayout = if (type !== LayoutType.MAIN) null + // if we just delete a main layout, we may end up with something like Hindi (QWERTY) + // so better replace it with a default layout for that locale + else resourceSubtypesByLocale[subtype.locale]?.first()?.mainLayoutName() + val newSubtype = if (defaultLayout == null) subtype.withoutLayout(type) + else subtype.withLayout(type, defaultLayout) + if (newSubtype.isSameAsDefault() && key == Settings.PREF_ADDITIONAL_SUBTYPES) null + else subtype.withoutLayout(type).toPref() + } else subtype.withLayout(type, to).toPref() } else subtype.toPref() diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt index b9bce10a9..95875bac2 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt @@ -70,7 +70,7 @@ object SubtypeUtilsAdditional { val additionalSubtypes = SubtypeSettings.createSettingsSubtypes(prefs.getString(Settings.PREF_ADDITIONAL_SUBTYPES, Defaults.PREF_ADDITIONAL_SUBTYPES)!!) .toMutableList() additionalSubtypes.remove(from) - if (SubtypeSettings.getResourceSubtypesForLocale(to.locale).none { it.toSettingsSubtype() == to }) { + if (!to.isSameAsDefault()) { // We only add the "to" subtype if it's not equal to a resource subtype. // This means we make additional subtype disappear as magically as it was added if all settings are default. // If we don't do this, enabling the base subtype will result in the additional subtype being enabled, diff --git a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt index a06ab1e29..4a96d73fc 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt @@ -388,8 +388,13 @@ private fun MainLayoutRow( title = { Text(stringResource(R.string.delete_layout, LayoutUtilsCustom.getDisplayName(it))) }, content = { if (others) Text(stringResource(R.string.layout_in_use)) }, onConfirmed = { - if (it == currentSubtype.mainLayoutName()) - setCurrentSubtype(currentSubtype.withoutLayout(LayoutType.MAIN)) + if (it == currentSubtype.mainLayoutName()) { + // similar to what is done in SubtypeSettings.onRenameLayout + val defaultLayout = SubtypeSettings.getResourceSubtypesForLocale(currentSubtype.locale).firstOrNull()?.mainLayoutName() + val newSubtype = if (defaultLayout == null) currentSubtype.withoutLayout(LayoutType.MAIN) + else currentSubtype.withLayout(LayoutType.MAIN, defaultLayout) + setCurrentSubtype(newSubtype) + } LayoutUtilsCustom.deleteLayout(it, LayoutType.MAIN, ctx) (ctx.getActivity() as? SettingsActivity)?.prefChanged() } From 7a57f5a24fd9185f514812b0877b9703db7d7a1c Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 31 Mar 2025 20:12:52 +0200 Subject: [PATCH 048/175] make searchText non-saveable and add a comment --- .../main/java/helium314/keyboard/settings/SearchScreen.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt b/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt index 1d7608e98..8fd287bf7 100644 --- a/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt @@ -33,7 +33,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.rotate @@ -107,9 +106,12 @@ fun SearchScreen( menu: List Unit>>? = null, content: @Composable (ColumnScope.() -> Unit)? = null, ) { - var searchText by rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue()) } + // searchText and showSearch should have the same remember or rememberSaveable + // saveable survives orientation changes and switching between screens, but shows the + // keyboard in unexpected situations such as going back from another screen, which is rather annoying + var searchText by remember { mutableStateOf(TextFieldValue()) } + var showSearch by remember { mutableStateOf(false) } Column(Modifier.fillMaxSize()) { - var showSearch by remember { mutableStateOf(false) } fun setShowSearch(value: Boolean) { showSearch = value From 57deb82ca7f451f334243430d6c000c308845102 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 31 Mar 2025 20:13:28 +0200 Subject: [PATCH 049/175] remove todo section from readme --- README.md | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/README.md b/README.md index 113f49dce..b1e6a3abe 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,6 @@ Does not use internet permission, and thus is 100% offline. * [Translations](#translations) * [To Community Creation](#to-community) * [Code Contribution](CONTRIBUTING.md) -- [To-do](#to-do) - [License](#license) - [Credits](#credits) @@ -41,7 +40,7 @@ Does not use internet permission, and thus is 100% offline.
  • Clipboard history
  • One-handed mode
  • -
  • Split keyboard (only available if the screen is large enough)
  • +
  • Split keyboard
  • Number pad
  • Backup and restore your settings and learned word / history data
  • @@ -88,24 +87,6 @@ You can share your themes, layouts and dictionaries with other people: ## Code Contribution See [Contribution Guidelines](CONTRIBUTING.md) -# To-do -__Planned features and improvements:__ -* Improve support for modifier keys (_alt_, _ctrl_, _meta_ and _fn_), some ideas: - * keep modifier keys on with long press - * keep modifier keys on until the next key press - * use sliding input -* Less complicated addition of new keyboard languages (e.g. #519) -* Additional and customizable key swipe functionality - * Some functionality will not be possible when using glide typing -* Add and enable emoji dictionaries by default (if available for language) -* Clearer / more intuitive arrangement of settings - * Maybe hide some less used settings by default (similar to color customization) -* [Bug fixes](https://github.com/Helium314/HeliBoard/issues?q=is%3Aissue+is%3Aopen+label%3Abug) - -__What will _not_ be added:__ -* Dictionaries for more languages (you can still download them) -* Anything that requires additional permissions, unless there is a _very_ good reason - # License HeliBoard (as a fork of OpenBoard) is licensed under GNU General Public License v3.0. From d79c84d7df71aba5c2808236e89e9bb0d2513d2b Mon Sep 17 00:00:00 2001 From: Helium314 Date: Thu, 3 Apr 2025 17:09:15 +0200 Subject: [PATCH 050/175] fix issues when renaming or deleting layouts --- .../java/helium314/keyboard/latin/utils/SubtypeSettings.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt index 757ff2faf..88a5d9450 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt @@ -130,12 +130,14 @@ object SubtypeSettings { */ fun onRenameLayout(type: LayoutType, from: String, to: String?, context: Context) { val prefs = context.prefs() + val editor = prefs.edit() // calling apply for each separate setting would result in an invalid intermediate state listOf( Settings.PREF_ADDITIONAL_SUBTYPES to Defaults.PREF_ADDITIONAL_SUBTYPES, Settings.PREF_ENABLED_SUBTYPES to Defaults.PREF_ENABLED_SUBTYPES, Settings.PREF_SELECTED_SUBTYPE to Defaults.PREF_SELECTED_SUBTYPE ).forEach { (key, default) -> val new = prefs.getString(key, default)!!.split(Separators.SETS).mapNotNullTo(mutableSetOf()) { + if (it.isEmpty()) return@mapNotNullTo null val subtype = it.toSettingsSubtype() if (subtype.layoutName(type) == from) { if (to == null) { @@ -146,7 +148,7 @@ object SubtypeSettings { val newSubtype = if (defaultLayout == null) subtype.withoutLayout(type) else subtype.withLayout(type, defaultLayout) if (newSubtype.isSameAsDefault() && key == Settings.PREF_ADDITIONAL_SUBTYPES) null - else subtype.withoutLayout(type).toPref() + else newSubtype.toPref() } else subtype.withLayout(type, to).toPref() } @@ -154,6 +156,7 @@ object SubtypeSettings { }.joinToString(Separators.SETS) prefs.edit().putString(key, new).apply() } + editor.apply() if (Settings.readDefaultLayoutName(type, prefs) == from) Settings.writeDefaultLayoutName(to, type, prefs) reloadEnabledSubtypes(context) From 8edea4f7c57f15adfe9756b4d3115d5ce7103a59 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Thu, 3 Apr 2025 17:09:27 +0200 Subject: [PATCH 051/175] allow renaming main layouts in subtypeScreen --- .../helium314/keyboard/settings/screens/SubtypeScreen.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt index 4a96d73fc..6dd6cbef3 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt @@ -412,10 +412,11 @@ private fun MainLayoutRow( initialLayoutName = layoutName, startContent = startContent, locale = currentSubtype.locale, - // only can edit name for new custom layout - isNameValid = if (layoutName in customLayouts) null else ({ it !in customLayouts }), + isNameValid = { it !in customLayouts }, onEdited = { - if (layoutName !in customLayouts) + if (layoutName !in customLayouts // edited a built-in layout, set new one as current + || layoutName != it && layoutName == currentSubtype.mainLayoutName() // layout name for current subtype changed + ) setCurrentSubtype(currentSubtype.withLayout(LayoutType.MAIN, it)) } ) From 087f87e95c7fd4304b9abbe0e5ffa0c28856747d Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:43:24 +0300 Subject: [PATCH 052/175] Optimize debug build (#1411) --- app/build.gradle.kts | 7 +++++++ app/src/debugNoMinify/res/values/strings.xml | 9 +++++++++ gradle.properties | 3 ++- 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 app/src/debugNoMinify/res/values/strings.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 12d9b8a40..43b51819a 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -44,6 +44,13 @@ android { isMinifyEnabled = true isJniDebuggable = false } + create("debugNoMinify") { + isDebuggable = true + isMinifyEnabled = false + isJniDebuggable = false + signingConfig = signingConfigs.getByName("debug") + applicationIdSuffix = ".debug" + } base.archivesBaseName = "HeliBoard_" + defaultConfig.versionName } diff --git a/app/src/debugNoMinify/res/values/strings.xml b/app/src/debugNoMinify/res/values/strings.xml new file mode 100644 index 000000000..73f1a95de --- /dev/null +++ b/app/src/debugNoMinify/res/values/strings.xml @@ -0,0 +1,9 @@ + + + + HeliBoard debug + HeliBoard debug Spell Checker + HeliBoard debug Settings + diff --git a/gradle.properties b/gradle.properties index 0a59d79e3..11b104c21 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,3 @@ android.useAndroidX=true -org.gradle.jvmargs=-Xmx1024m \ No newline at end of file +org.gradle.configuration-cache=true +org.gradle.jvmargs=-Xmx1024m From 6995266bd10229a5443ca5436bdabc3339020d1e Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 5 Apr 2025 10:24:24 +0200 Subject: [PATCH 053/175] treat default button as value change for SliderPreference --- .../keyboard/settings/preferences/SliderPreference.kt | 4 ++-- .../helium314/keyboard/settings/screens/PreferencesScreen.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/SliderPreference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/SliderPreference.kt index 1eae33b41..8a52a914d 100644 --- a/app/src/main/java/helium314/keyboard/settings/preferences/SliderPreference.kt +++ b/app/src/main/java/helium314/keyboard/settings/preferences/SliderPreference.kt @@ -26,7 +26,7 @@ fun SliderPreference( default: T, range: ClosedFloatingPointRange, stepSize: Int? = null, - onValueChanged: (Float) -> Unit = { }, + onValueChanged: (Float?) -> Unit = { }, ) { val ctx = LocalContext.current val prefs = ctx.prefs() @@ -59,7 +59,7 @@ fun SliderPreference( }, onValueChanged = onValueChanged, showDefault = true, - onDefault = { prefs.edit().remove(key).apply() }, + onDefault = { prefs.edit().remove(key).apply(); onValueChanged(null) }, intermediateSteps = stepSize?.let { // this is not nice, but slider wants it like this... ((range.endInclusive - range.start) / it - 1).toInt() diff --git a/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt index 584ae858c..70f29767c 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt @@ -172,7 +172,7 @@ fun createPreferencesSettings(context: Context) = listOf( else stringResource(R.string.abbreviation_unit_milliseconds, it.toString()) }, range = -1f..100f, - onValueChanged = { AudioAndHapticFeedbackManager.getInstance().vibrate(it.toLong()) } + onValueChanged = { it?.let { AudioAndHapticFeedbackManager.getInstance().vibrate(it.toLong()) } } ) }, Setting(context, Settings.PREF_KEYPRESS_SOUND_VOLUME, R.string.prefs_keypress_sound_volume_settings) { setting -> @@ -186,7 +186,7 @@ fun createPreferencesSettings(context: Context) = listOf( else (it * 100).toInt().toString() }, range = -0.01f..1f, - onValueChanged = { audioManager.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD, it) } + onValueChanged = { it?.let { audioManager.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD, it) } } ) }, ) From 22eb48ff91d34c1c9f9c923667ff07bbe694f741 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 6 Apr 2025 10:50:10 +0200 Subject: [PATCH 054/175] add comments about build variants --- app/build.gradle.kts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 43b51819a..07ee80928 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -36,6 +36,8 @@ android { isJniDebuggable = false } debug { + // "normal" debug has minify for smaller APK to fit the GitHub 25 MB limit when zipped + // and for better performance in case users want to install a debug APK isMinifyEnabled = true isJniDebuggable = false applicationIdSuffix = ".debug" @@ -44,7 +46,7 @@ android { isMinifyEnabled = true isJniDebuggable = false } - create("debugNoMinify") { + create("debugNoMinify") { // for faster builds in IDE isDebuggable = true isMinifyEnabled = false isJniDebuggable = false From d4960c73dcf746cc71412034cb907d22e5ab60a3 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 6 Apr 2025 10:52:24 +0200 Subject: [PATCH 055/175] fix tests after recent changes --- app/src/test/java/helium314/keyboard/Shadows.kt | 2 +- .../test/java/helium314/keyboard/latin/InputLogicTest.kt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/test/java/helium314/keyboard/Shadows.kt b/app/src/test/java/helium314/keyboard/Shadows.kt index 6d5295fdb..532a20f57 100644 --- a/app/src/test/java/helium314/keyboard/Shadows.kt +++ b/app/src/test/java/helium314/keyboard/Shadows.kt @@ -28,7 +28,7 @@ object ShadowLocaleManagerCompat { class ShadowInputMethodManager2 : ShadowInputMethodManager() { @Implementation override fun getInputMethodList() = listOf( - if (BuildConfig.BUILD_TYPE == "debug") + if (BuildConfig.BUILD_TYPE == "debug" || BuildConfig.BUILD_TYPE == "debugNoMinify") InputMethodInfo("helium314.keyboard.debug", "LatinIME", "HeliBoard debug", null) else InputMethodInfo("helium314.keyboard", "LatinIME", "HeliBoard", null), ) diff --git a/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt b/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt index bebee9236..4f75173e5 100644 --- a/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt +++ b/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt @@ -861,17 +861,17 @@ class InputLogicTest { private fun handleMessages() { while (messages.isNotEmpty()) { latinIME.mHandler.handleMessage(messages.first()) - messages.removeFirst() + messages.removeAt(0) } while (delayedMessages.isNotEmpty()) { val msg = delayedMessages.first() if (msg.what != 2) // MSG_UPDATE_SUGGESTION_STRIP, we want to ignore it because it's irrelevant and has a 500 ms timeout latinIME.mHandler.handleMessage(delayedMessages.first()) - delayedMessages.removeFirst() + delayedMessages.removeAt(0) // delayed messages may post further messages, handle before next delayed message while (messages.isNotEmpty()) { latinIME.mHandler.handleMessage(messages.first()) - messages.removeFirst() + messages.removeAt(0) } } assertEquals(0, messages.size) From f4b4705e818182829d0a49308a9575507d4535f8 Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Sun, 6 Apr 2025 11:54:39 +0300 Subject: [PATCH 056/175] Add bottom inset padding on Android15+ (#1457) --- .../keyboard/internal/KeyboardParams.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardParams.java b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardParams.java index 56e3ebe65..50ba0dad6 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardParams.java +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardParams.java @@ -8,9 +8,14 @@ package helium314.keyboard.keyboard.internal; import android.content.Context; import android.content.res.TypedArray; +import android.graphics.Insets; +import android.os.Build; import android.util.AttributeSet; import android.util.SparseIntArray; +import android.view.WindowInsets; +import android.view.WindowManager; +import android.view.WindowMetrics; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -225,6 +230,16 @@ public class KeyboardParams { mBottomPadding = (int) (keyboardAttr.getFraction( R.styleable.Keyboard_keyboardBottomPadding, height, height, 0) * Settings.getValues().mBottomPaddingScale); + + if (Build.VERSION.SDK_INT >= 35) { + WindowManager wm = context.getSystemService(WindowManager.class); + WindowMetrics windowMetrics = wm.getCurrentWindowMetrics(); + WindowInsets windowInsets = windowMetrics.getWindowInsets(); + int insetTypes = WindowInsets.Type.systemBars() | WindowInsets.Type.displayCutout(); + Insets insets = windowInsets.getInsetsIgnoringVisibility(insetTypes); + mBottomPadding += insets.bottom; + } + mLeftPadding = (int) (keyboardAttr.getFraction( R.styleable.Keyboard_keyboardLeftPadding, width, width, 0) * Settings.getValues().mSidePaddingScale); From e4cd58a7224911ff9cf90fdf81d68083f76b1cd7 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 6 Apr 2025 18:32:23 +0200 Subject: [PATCH 057/175] update translations --- .../main/assets/dictionaries_in_dict_repo.csv | 1 + app/src/main/res/values-ar/strings.xml | 13 ++++++- app/src/main/res/values-bg/strings.xml | 8 +++++ app/src/main/res/values-bn/strings.xml | 10 +++++- app/src/main/res/values-ca/strings.xml | 8 +++++ app/src/main/res/values-cs/strings.xml | 23 +++++++----- app/src/main/res/values-es/strings.xml | 36 +++++++++++++++++-- app/src/main/res/values-et/strings.xml | 8 +++++ app/src/main/res/values-fr/strings.xml | 8 +++++ app/src/main/res/values-it/strings.xml | 10 +++++- app/src/main/res/values-iw/strings.xml | 8 +++++ app/src/main/res/values-nl/strings.xml | 8 +++++ app/src/main/res/values-pl/strings.xml | 10 ++++++ app/src/main/res/values-pt-rBR/strings.xml | 8 +++++ app/src/main/res/values-ru/strings.xml | 12 +++++-- app/src/main/res/values-zh-rCN/strings.xml | 8 +++++ .../android/cs-CZ/changelogs/1001.txt | 27 ++++---------- .../android/cs-CZ/changelogs/1003.txt | 18 +++++----- .../android/ru-RU/full_description.txt | 3 +- 19 files changed, 180 insertions(+), 47 deletions(-) diff --git a/app/src/main/assets/dictionaries_in_dict_repo.csv b/app/src/main/assets/dictionaries_in_dict_repo.csv index 4cfdd146f..8b38e33cc 100644 --- a/app/src/main/assets/dictionaries_in_dict_repo.csv +++ b/app/src/main/assets/dictionaries_in_dict_repo.csv @@ -77,6 +77,7 @@ main,hr,exp main,cs,exp main,da,exp main,nl,exp +main,en_CA,exp main,en_GB,exp main,en_US,exp symbols,en,exp diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 8ef08d987..7d5516ec0 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -425,7 +425,7 @@ تبويب حذف تحويل - تحويل(معكوس) + تحويل (تحول) حرف كبير إنهاء وضع اليد الواحدة تحجيم وضع اليد الواحدة @@ -477,4 +477,15 @@ أظهِر مفاتيح TLD المنبثقة استبدل مفتاح الفترة المنبثقة مع مجالات المستوى الأعلى عند كتابة عناوين URL وعناوين البريد الإلكتروني الضغط على إدخال أو مساحة بعد مفاتيح أخرى في لوحة الأرقام + لا تعرض دائمًا اقتراحات لحقول تحرير الويب + صف الرقم (أساسي) + المسافة + تعتبر حقول تحرير الويب (الموجودة في غالب المتصفحات) سببًا شائعًا جدًا للمشكلات المتعلقة بإعداد اقتراحات العرض دائمًا + مسافة تلقائية قبل إيماءة كتابة كلمة + مسافة تلقائية بعد إيماءة كتابة كلمة + يقوم التحويل بإزالة المسافة تلقائية المعلقة + مسافة تلقائية بعد اختيار اقتراح + يعود المسافة الخلفية إلى التصحيح التلقائي + لا مسافة تلقائية عند الضغط على تحويل + تنسيق لمفتاح الطابع الزمني diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 19cc16c4e..5b4e1fb84 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -473,4 +473,12 @@ Не винаги показвай предложения за полета за уеб редактиране Полетата за уеб редактиране (най-вече в браузърите) са много честа причина за проблеми с настройката за винаги показване на предложения Числов ред (основен) + Интервал + Автоматичен интервал преди въвеждане на дума с жест + Автоматичен интервал след избиране на предложение + Автоматичен интервал след въвеждане на дума с жест + Без автоматичен интервал при натискане на Shift + Обратен интервал връща автоматичното коригиране + Shift премахва чакащия автоматичен интервал + Формат на клавиша за времево клеймо diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 13fffa34c..c679923ee 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -66,7 +66,7 @@ বন্ধ থাকলে ক্লিপবোর্ড বোতাম ক্লিপবোর্ডে থাকা আধেয় পেস্ট করবে ইতিহাস স্থিতির সময়কাল বিলোপ অভিস্পর্শ - লেখার বড়ো অংশ একসাথে সিলেক্ট করে বিলোপ করার জন্য অভিস্পর্শ করুন + লেখার বড়ো অংশ একসাথে সিলেক্ট করে অপসারণ করার জন্য অভিস্পর্শ করুন বহুভাষী টাইপিং অঙ্গুলিহেলন টাইপিং লাইব্রেরি অধিযোগ অঙ্গুলিহেলনের মাধ্যমে টাইপিং সক্রিয় করার জন্য স্থানীয় লাইব্রেরি সরবরাহ @@ -437,4 +437,12 @@ নম্বর সারি (প্রাথমিক) ওয়েব সম্পাদনা ফিল্ডে সর্বদা পরামর্শ প্রদর্শন করবে না ওয়েব সম্পাদনা ফিল্ড (প্রধানত ব্রাউজারে উপলভ্য) সর্বদা পরামর্শ প্রদর্শন সেটিংসে সমস্যার একটি সাধারণ কারণ + স্পেস + অঙ্গুলিহেলন টাইপিংয়ের শব্দের পরে স্বয়ংক্রিয় স্পেস + অঙ্গুলিহেলন টাইপিংয়ের শব্দের পূর্বে স্বয়ংক্রিয় স্পেস + শিফট চাপের পরে স্বয়ংক্রিয় স্পেস নয় + ব্যাকস্পেস দ্বারা স্বতঃসংশোধন প্রত্যাবর্তন + পরামর্শ বাছাইয়ের পরে স্বয়ংক্রিয় স্পেস + শিফট অনিষ্পাদিত স্বয়ংক্রিয় স্পেস অপসারণ করবে + টাইমস্ট্যাম্প বোতামের ফরম্যাট diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 821d7e6b3..6f2970007 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -436,4 +436,12 @@ Els camps d\'edició web (sobretot que es troben als navegadors) són una causa molt freqüent de problemes amb la configuració Mostrar sempre suggeriments Fila de nombres (bàsic) No mostrar sempre suggeriments per als camps d\'edició web + Espai + Espai automàtic abans d\'escriure una paraula amb gest + Cap espai automàtic en prémer la majúscula + Espai automàtic després d\'escriure una paraula amb gest + Shift elimina l\'espai automàtic pendent + Retrocès reverteix l\'auto-correcció + Espai automàtic després de triar suggeriment + Format de la clau de marca de temps diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index cec8a5419..679087598 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -82,14 +82,14 @@ "Další krok" "Nastavení aplikace %s" "Zapnutí aplikace %s" - Zaškrtněte aplikaci%s v nastavení Jazyky a zadávání, povolíte tak její spuštění.\" - Aplikace %s je již v nastavení Jazyky a zadávání zapnuta, tento krok je tedy již proveden. Pokračujte dalším! + Zaškrtněte aplikaci \\%s\" v nastavení Jazyky a zadávání. Tím povolíte její spuštění ve vašem zařízení.\" + Aplikace %s je již v nastavení Jazyky a zadávání zapnuta, tento krok je tedy již proveden. Pokračujte dalším!\" "Aktivovat v nastavení" "Přepnutí na aplikaci %s" - Poté vyberte jako aktivní metodu zadávání textu možnost%s.\" + Poté vyberte jako aktivní metodu zadávání textu možnost \\%s\".\" "Přepnout metody zadávání" Gratulujeme, vše je připraveno! - "Nyní můžete ve všech svých oblíbených aplikacích psát pomocí aplikace %s." + Nyní můžete ve všech svých oblíbených aplikacích psát pomocí aplikace %s. "Hotovo" "Zobrazit ikonu aplikace" "Zobrazí ikonu aplikace ve spouštěči" @@ -117,7 +117,7 @@ "Vybrat metodu zadávání" Experimentální Různé - %smin. + %s min. Bez limitu Povolit historii schránky Doba zachování historie @@ -177,7 +177,7 @@ Načíst knihovnu Odstranit knihovnu Zobrazit další písmena s diakritikou ve vyskakovacím okně - Zobrazit varianty definované v jazycích klávesnice (výchozí) + Zobrazit varianty definované v jazycích klávesnice Přidat společné varianty Přidat všechny dostupné varianty Detekce URL @@ -245,7 +245,7 @@ Přesun kurzoru Svislé gesto přejetí mezerníku Ignorovat požadavek jiných aplikací na zakázání návrhů (může způsobit problémy) - "Bez slovníku se zobrazí pouze návrhy textu, který jste zadali dříve.<br>\n\n Můžete si stáhnout slovníky %1$s nebo zkontrolovat, zda lze slovník pro „%2$s“ stáhnout přímo %3$s." + "Bez slovníku se zobrazí pouze návrhy textu, který jste zadali dříve.<br>\n Můžete si stáhnout slovníky %1$s nebo zkontrolovat, zda lze slovník pro „%2$s“ stáhnout přímo %3$s." zde Vybrat slovník, který chcete přidat. Slovníky ve formátu .dict lze stáhnout %s. %s (experimentální) @@ -308,12 +308,12 @@ \nVarování: načítání externího kódu může představovat bezpečnostní riziko. Používejte pouze knihovnu ze zdroje, kterému důvěřujete.
    Popis skrytých funkcí %s (Rozšířené) - ► Dlouhým stisknutím klávesy schránky (volitelná v pruhu návrhů) vložíte obsah systémové schránky. <br> <br> ► Dlouhé stisknutí kláves na panelu nástrojů pruhu návrhů je připne na pruh návrhů. <br> <br> ► Dlouhým stisknutím klávesy čárka otevřete zobrazení schránky, zobrazení emodži, režim jedné ruky, nastavení nebo přepnutí jazyka: <br> • Zobrazení emodži a přepínání jazyků zmizí, pokud máte odpovídající klávesu povoleno; <br> • U některých rozvržení to není klávesa Comma, ale klávesa na stejné pozici (např. je to \'q\' pro rozvržení Dvorak). <br> <br> ► Když je povolen režim inkognito, nebudou se učit žádná slova a nebudou přidány žádné emotikony. <br> <br> ► Stisknutím ikony inkognito otevřete panel nástrojů. <br> <br> ► Zadávání pomocí posuvné klávesy: Přejetím z Shift na jinou klávesu zadejte jednu klávesu velkých písmen: <br> • Toto funguje také pro klávesu „?123“ pro psaní jediného symbolu z klávesnice se symboly a pro související klíče. <br> <br> ► Dlouhým stisknutím návrhu v pruhu návrhů zobrazíte další návrhy a stisknutím tlačítka Smazat tento návrh odstraníte. <br> <br> ► Přejetím prstem nahoru z návrhu otevřete další návrhy a uvolněním návrh jej vyberte. <br> <br> ► Dlouhým stisknutím položky v historii schránky ji připnete (uchovávejte ji ve schránce, dokud ji neuvolníte). <br> <br> ► Slovníky můžete přidávat tak, že je otevřete v průzkumníku souborů: <br> • Toto funguje pouze s <i>content-uris</i> a nikoli s <i>file-uris</i> , což znamená, že nemusí fungovat s některými průzkumníky souborů. <br> <br> <i>Režim ladění / ladění APK</i> <br> <br> • Dlouhým stisknutím návrhu zobrazíte zdrojový slovník.<br> <br> • Při použití ladícího souboru APK můžete najděte Nastavení ladění v Pokročilých předvolbách, i když užitečnost je omezená s výjimkou ukládání slovníků do protokolu. <br> <br> • V případě pádu aplikace budete při otevření Nastavení dotázáni, zda chcete protokoly o selhání. <br> <br> • Při použití vícejazyčného psaní bude mezerník zobrazovat hodnotu spolehlivosti používanou k určení aktuálně používaného jazyka. <br> <br> • Návrhy budou mít navrchu malá čísla zobrazující nějaké interní skóre a zdrojový slovník (lze vypnout). <br> <br> ► Pro uživatele, kteří provádějí ruční zálohování s přístupem root: Počínaje Androidem 7 není soubor sdílených předvoleb ve výchozím umístění, protože aplikace používá %s. <br> To je nezbytné, aby bylo možné načíst nastavení před odemknutím zařízení, např. při startu. <br> Soubor se nachází v /data/user_de/0/package_id/shared_prefs/, i když to může záviset na zařízení a verzi Androidu. + ► Dlouhý stisk kláves na připnuté liště nástrojů vyvolá další funkce: <br> \n\t• schránka &#65515; vložit <br> \n\t• pohyb doleva/doprava &#65515; slovo doleva/doprava <br> \n\t• pohyb nahoru/dolů &#65515; stránka nahoru/dolů <br> \n\t• slovo doleva/doprava &#65515; začátek/konec řádku <br> \n\t• stránka nahoru/dolů &#65515; začátek/konec stránky <br> \n\t• kopírovat &#65515; vystřihnout <br> \n\t• vybrat slovo &#8596; vybrat vše <br> \n\t• zrušit &#8596; opakovat <br> <br> \n► Dlouhý stisk kláves v liště s návrhy je připne. <br> <br> \n► Dlouhý stisk klávesy čárky pro přístup k zobrazení schránky, zobrazení emoji, režimu pro jedno ruce, nastavení nebo přepnutí jazyka: <br> \n\t• Zobrazení emoji a přepnutí jazyka zmizí, pokud máte odpovídající klávesu povolenou; <br> \n\t• U některých rozložení to není klávesa čárky, ale klávesa na stejné pozici (např. u Dvorak rozložení je to klávesa \'q\'). <br> <br> \n► Při zapnutém inkognito režimu se nebudou učit žádná slova a žádná emoji nebudou přidána do historie. <br> <br> \n► Stiskněte ikonu inkognito pro přístup k liště nástrojů. <br> <br> \n► Posuvný vstup klávesy: Přejeďte od klávesy Shift na jinou klávesu pro napsání jednoho velkého písmene: <br> \n\t• Toto také funguje pro klávesu \'?123\' pro napsání jednoho symbolu z klávesnice symbolů a pro související klávesy. <br> <br> \n► Držte klávesu Shift nebo symbolu, stiskněte jednu nebo více kláves a pak uvolněte Shift nebo symbolovou klávesu pro návrat na předchozí klávesnici. <br> <br> \n► Dlouhý stisk návrhu v liště návrhů pro zobrazení více návrhů a tlačítko pro smazání tohoto návrhu. <br> <br> \n► Přejeďte prstem nahoru z návrhu pro otevření více návrhů a uvolněte prst na návrhu pro jeho výběr. <br> <br> \n► Dlouhý stisk položky v historii schránky pro její připnutí (udržení v schránce, dokud ji neodpinete). <br> <br> \n► Přejeďte prstem doleva ve zobrazení schránky pro odstranění položky (kromě případů, kdy je připnuta). <br> <br> \n► Vyberte text a stiskněte Shift pro přepínání mezi velkými písmeny, malými písmeny a velkými prvními písmeny slov. <br> <br> \n► Můžete přidat slovníky otevřením v průzkumníku souborů: <br> \n\t• Toto funguje pouze s <i>content-uris</i>, nikoliv s <i>file-uris</i>, což znamená, že to nemusí fungovat u některých průzkumníků souborů. <br> <br> \n► Pro uživatele provádějící manuální zálohy s root přístupem: <br> \n\t• Začínaje Androidem 7, soubor sdílených preferencí není na výchozím místě, protože aplikace používá %s. To je nutné, aby nastavení mohla být přečtena před odemknutím zařízení, např. při spuštění; <br> \n\t• Soubor se nachází v /data/user_de/0/package_id/shared_prefs/, i když to může záviset na zařízení a verzi Androidu. <br> <br> \n<i><b>Režim ladění / ladící APK</b></i> <br> <br> \n► Dlouhý stisk návrhu pro zobrazení zdrojového slovníku. <br> <br> \n► Při používání ladícího APK najdete Nastavení ladění v pokročilých preferencích, i když jejich užitečnost je omezená, kromě dumpování slovníků do logu. <br> \n\t• Pro vydané APK je nutné několikrát stisknout verzi v <i>O aplikaci</i>, poté najdete nastavení ladění v <i>Pokročilých preferencích</i>. <br> \n\t• Při povolení <i>Zobrazit informace o návrzích</i> budou návrhy mít malá čísla nahoře ukazující interní skóre a zdrojový slovník. <br> <br> \n► Při pádu aplikace budete vyzváni, zda chcete získat záznamy o pádu, když otevřete Nastavení. <br> <br> \n► Při používání vícejazyčného psaní bude klávesa mezerníku zobrazovat hodnotu důvěry, která se používá k určení aktuálně používaného jazyka. <br> <br> \n► Návrhy budou mít malá čísla nahoře ukazující interní skóre a zdrojový slovník (může být vypnuto). Nelze přečíst soubor Další symboly Telefon Telefonní symboly - Opravdu nahradit uživatelem přidaný slovník „%1$s“? \n \nAktuální slovník: \n%2$s \n \nNový slovník: \n%3$s + Opravdu chcete nahradit uživatelem přidaný slovník „%1$s“?\n\nAktuální slovník:\n%2$s\n\nNový slovník:\n%3$s Nahradit slovník Opravdu odstranit slovník „%s“ přidaný uživatelem? Open-source licence @@ -330,4 +330,9 @@ Zobrazit všechny barvy Klikněte pro náhled %s (Student) + Chování klávesy pro přepínání jazyků + Vibrace v režimu nerušit + Mezerník + Vzdálenost rozdělení (na šířku) + Povolit rozdělenou klávesnici (na šířku) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c3130ca58..cb86504cf 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -75,12 +75,12 @@ "Emojis para teclado físico" "La tecla Alt física muestra la lista de emojis" "Predeterminado" - Bienvenido a%s + Bienvenido a %s "con escritura gestual" "Empezar" "Siguiente paso" - Configurando%s - Activar%s + Configurando %s + Activar %s Por favor, compruebe \"%s\" en sus ajustes de entrada de Idiomas. Esto lo autorizará a ejecutarse en su dispositivo.\" %s ya está habilitado en sus idiomas & configuración de entrada, por lo que este paso está hecho. ¡En el siguiente! "Habilitar en Ajustes" @@ -423,4 +423,34 @@ Tamaño de fuente de la vista Emoji Escala de relleno lateral (apaisado) Escala de relleno lateral + Subtipo personalizado + Los campos de edición web (que se encuentran sobre todo en los navegadores) son una causa muy común de problemas con la configuración de mostrar siempre sugerencias + No mostrar siempre las sugerencias para los campos de edición web + Fila de números (básica) + %s (Baishakhi) + Nombre inválido + Distancia de dividido (paisaje) + Habilitar teclado dividido (paisaje) + Espacio + Retroceso revierte la autocorrección + Mostrar teclas emergentes TLD + Auto espacio después de utilizar una sugerencia + Auto espacio después de escribir una palabra gestualmente + No auto espacio cuando se presiona shift + Shift elimina el autoespacio pendiente + sección de discusión + Auto espacio antes de escribir gestualmente una palabra + Sustituir las ventanas emergentes por dominios de nivel superior al escribir URL y direcciones de correo electrónico + Formato de la fecha y hora + Pulsar intro o espacio después de otras teclas en el teclado numérico + ¿Borrar %s realmente? + Diseños secundarios + Teclas funcionales (pantalla grande) + Mostrar pistas en la fila de números + Distancia de deslizamiento para cambiar de idioma + Idiomas con diccionarios + Teclado dividido + Advertencia: el diseño está en uso actualmente + Puedes encontrar y compartir colores en %s. + Puedes encontrar y compartir diseños en %s. diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 186a56152..0eb962d78 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -473,4 +473,12 @@ Numbririda (lihtne) Ära alati näita sisestuse soovitusi täites veebivormide välju Kui alati näitad sisestuse soovitusi veebivormide väljadel (nii nagu sa neid veebibrauseris näed), siis võib sellest tekkida probleeme + Tühik + Tagasivõtuklahv muudab autokorrektsiooni tagasi + Automaatne tühik peale soovituse valimist + Automaatne tühik enne viipamisega sõna kirjutamist + Automaatse tühiku keelamine shift-klahviga + Shift-klahvi vajutus välistab lisatava automaatse tühiku + Automaatne tühik peale viipamisega sõna kirjutamist + Ajatempli klahvi vorming diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b94819745..6b675bb74 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -443,4 +443,12 @@ Nouveau dictionnaire: Les champs d\'édition Web (principalement présents dans les navigateurs) sont une cause très courante de problèmes avec le paramètre « Toujours afficher les suggestions » Rangée numérique (standard) Ne pas forcer l\'affichage des suggestions pour les champs de saisie web + Espace + Espace automatique avant de saisir un mot par geste + Espace automatique après la saisie gestuelle d\'un mot + Shift supprime l\'espace automatique en attente + Espace automatique après avoir sélectionné une suggestion + La touche Retour arrière annule la correction automatique + Pas d\'espace automatique lors de l\'appui sur Maj + Format de la clé d\'horodatage diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 88405dcaf..0b6722c51 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -304,7 +304,7 @@ Il dizionario è stato creato per la lingua %1$s, ma lo stai aggiungendo a %2$s. Confermi? Chiudi Traccia dell\'input gestuale - Lingua: tap → impostazioni + Tocca una lingua → Impostazioni Salva log Holo bianco Dizionario interno principale @@ -445,4 +445,12 @@ Non forzare i suggerimenti in tutti i campi di testo I campi di testo Web (specie all\'interno dei browser) sono una causa ricorrente di problemi con i suggerimenti sempre attivi Barra dei numeri (base) + Spazio + Nessuno spazio finale con ⇧ (maiuscolo) attivo + Spazio automatico dopo la scelta di una parola suggerita + Spazio automatico dopo una parola aggiunta con l\'inserimento gestuale + Nessuno spazio automatico con ⇧ (maiuscolo) attivo + Usa Backspace per annullare l\'autocorrezione + Spazio automatico prima di una parola aggiunta con l\'inserimento gestuale + Formato per il tasto data/ora diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index d29ee5205..e381895bb 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -445,4 +445,12 @@ לא תמיד להציג הצעות לשדות עריכה ב-Web שדות עריכה ב-Web (בדר\"כ יוצגו בדפדפן) הם גורם נפוץ מאד לבעיות בהגדרה \'הצגת הצעות תמיד\' שורת המספרים (פריסת בסיס) + רווח + הוספת רווח אוטומטית אחרי בחירת הצעה + הוספת רווח אוטומטית לפני הקלדת מילה במחווה + הוספת רווח אוטומטית לאחר הקלדת מילה במחווה + ביטול הצעת התיקון האוטומטי במחיקה לאחור + ללא רווח אוטומטי בעת לחיצת Shift + Shift מבטל את הרווח האוטומטי המיועד + פורמט למקש חתימת הזמן diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index a3e316db4..1b2c9fa21 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -482,4 +482,12 @@ Cijferregel (basis) Suggesties voor webbewerkingsvelden niet altijd weergeven Webbewerkingsvelden (meestal te vinden in browsers) zijn een veel voorkomende oorzaak van problemen met de instelling Altijd suggesties weergeven + Spatie + Autom. spatie na keuze van suggestie + Autom. spatie voor typen van woord met gebaren + Autom. spatie na typen van woord met gebaren + Geen autom. spatie bij indrukken van shift + Shift verwijdert autom. spatie in afwachting + Backspace draait autocorrectie terug + Formaat voor tijdstempeltoetd diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 74cf935b4..3970f6192 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -480,4 +480,14 @@ Zastąp wyskakujące okienka klawisza kropki domenami najwyższego poziomu podczas wpisywania adresów URL i adresów e-mail Naciśnięciu enter lub spacji po innych klawiszach w klawiaturze numerycznej Rząd numeryczny (podstawowy) + Nie zawsze pokazuj sugestie dla pól edycji w sieci + Pola edycji w sieci (zwykle znajdujące się w przeglądarkach) są bardzo częstą przyczyną problemów z ustawieniem \"zawsze pokazuj sugestie\" + Spacja + Automatyczna spacja po wybraniu sugestii + Automatyczna spacja po wpisaniu słowa gestem + Brak automatycznej spacji po wciśnięciu shift + Shift usuwa automatyczną spację + Backspace cofa autokorektę + Automatyczna spacja przed wpisaniem słowa gestem + Format klawisza znacznika czasu diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 127df316d..d98a55512 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -445,4 +445,12 @@ Linha de números (básica) Não mostrar sugestões para campos de edição da web sempre Campos de edição da web (encontrados normalmente em navegadores) são uma causa comum de problemas com a configuração de sempre mostrar sugestões + Espaço + Espaço automático após escolher uma sugestão + Espaço automática após digitar uma palavra com gestos + Sem espaço automático ao pressionar shift + O shift remove o espaço automático pendente + O backspace reverte a autocorreção + Espaço automático antes de digitar uma palavra com gestos + Formato da tecla de horário diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 472bfae17..b7711d8f4 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -293,10 +293,10 @@ Ошибка загрузки файла словаря Больше символов Вниз - В левый конец + Полностью влево Влево Заменить пользовательский словарь \"%1$s\"?\n\nТекущий словарь:\n%2$s\n\nНовый словарь:\n%3$s - В правый конец + Полностью вправо Вес: Задать имя раскладки Загрузить файл @@ -472,4 +472,12 @@ Поля ввода на веб-страницах (в основном в браузерах) часто вызывают проблемы с настройкой постоянного отображения подсказок Ряд с цифрами (основной) Не всегда показывать подсказки для полей ввода на веб-страницах + Пробел + Автопробел после ручного выбора предложения + Автопробел после набора слова жестами + Автопробел отключается при нажатии Shift + Нажатие Shift убирает запланированный автопробел + Автопробел перед набором слова жестами + Нажатие Backspace отменяет автокоррекцию + Формат ключа временной метки diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index f02abe6ac..c8acbb6c0 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -439,4 +439,12 @@ 数字行(基本) Web 编辑字段(主要存在于浏览器中)是导致“始终显示建议”设置出现问题的一个非常常见的原因 不要总是显示对 Web 编辑字段的建议 + 空格 + 手势输入单词前自动插入空格 + 手势输入单词后自动插入空格 + 按下 Shift 键不自动插入空格 + 按 Shift 键移除待插入的自动空格 + 退格键恢复自动更正 + 选择建议后自动插入空格 + 时间戳键的格式 diff --git a/fastlane/metadata/android/cs-CZ/changelogs/1001.txt b/fastlane/metadata/android/cs-CZ/changelogs/1001.txt index 77ee5b7e7..5d370b14a 100644 --- a/fastlane/metadata/android/cs-CZ/changelogs/1001.txt +++ b/fastlane/metadata/android/cs-CZ/changelogs/1001.txt @@ -1,20 +1,7 @@ -* nová ikona od @FabianOvrWrt s přispěním @the-eclectic-dyslexic (#517, #592) -* více přizpůsobitelný trackpad s mezerníkem a přepínačem jazyků od @arcarum (#486) -* přidání % do rozložení symbolů pro posun (#568, #428) -* zlepšení chování, když je klávesa přepínače jazyka nastavena na přepínání jazyka i klávesnice -* při přidávání slovníku zobrazit odkazy na existující slovníky -* přidat rozložení Kaitag od @alkaitagi (#519) -* přidat rozložení Probhat od @fahimscirex (#489) -* volitelné obrácení pořadí panelu nástrojů pro jazyky RTL od @codokie (#557, #574) -* umožnit přizpůsobení speciálních rozvržení (numpad, telefon, ...) -* stále experimentální, protože základní rozvržení se mohou změnit -* aktualizován spellchecker.xml tak, aby zahrnoval lokality, kde jsou k dispozici slovníky, ale nejsou součástí aplikace -* aktualizace překladů (děkujeme všem překladatelům!) -* aktualizace ndk podle @Syphyr (#560) -* aktualizace kódu automatického doplňování inline od @arcarum (#595) -* oprava problému s dialogovým oknem s klíčem na panelu nástrojů (#505) -* oprava problému s tureckým rozložením (#508) -* oprava špatných stavů přepínačů při otáčení na obrazovce přizpůsobení barev (#563) -* oprava problému s nenačítáním posledních emotikonů (#527) -* oprava problému s nezobrazováním čísel v některých polích (#585) -* některé drobné opravy +* new icon by @FabianOvrWrt with contributions from @the-eclectic-dyslexic (#517, #592) +* more customizable space bar trackpad and language switch by @arcarum (#486) +* add % to shift symbols layout (#568, #428) +* improve behavior when language switch key is set to switch both language and keyboard +* show links to existing dictionaries when adding a dictionary +* add Kaitag layout by @alkaitagi (#519) +* add Probhat layout by @fahimscirex (#489) diff --git a/fastlane/metadata/android/cs-CZ/changelogs/1003.txt b/fastlane/metadata/android/cs-CZ/changelogs/1003.txt index 29569aee4..b6ad64140 100644 --- a/fastlane/metadata/android/cs-CZ/changelogs/1003.txt +++ b/fastlane/metadata/android/cs-CZ/changelogs/1003.txt @@ -1,9 +1,9 @@ -* změna ikon pro automatickou opravu a výběr všech kláves na panelu nástrojů od @codokie (#524, #651) -* přidání čuvašského rozložení od @tenextractor (#677) -* přidání klávesy pro řezání na panelu nástrojů od @codokie (#678) -* aktualizovat rozložení Probhat od @fahimscirex (#628) -* zobrazit ikony panelu nástrojů v dialogovém okně klíče panelu nástrojů -* přidat tlačítko zavřít v historii schránky od @codokie (#403, #649) -* přidat ruské (studentské) rozložení od @Zolax9 (#640) -* volitelný numerický blok při dlouhém stisku klávesy se symboly (#588) -* drobné opravy a vylepšení, včetně #632, #637, #638 od @RHJihan +* change icons for autocorrect and select all toolbar keys by @codokie (#524, #651) +* add Chuvash layout by @tenextractor (#677) +* add cut toolbar key by @codokie (#678) +* update Probhat layout by @fahimscirex (#628) +* show toolbar icons in toolbar key dialog +* add close button in clipboard history by @codokie (#403, #649) +* add Russian (Student) layout by @Zolax9 (#640) +* make numpad on symbols key long press optional (#588) +* minor fixes and improvements, including #632, #637, #638 by @RHJihan diff --git a/fastlane/metadata/android/ru-RU/full_description.txt b/fastlane/metadata/android/ru-RU/full_description.txt index 80c31b125..8d9c085e1 100644 --- a/fastlane/metadata/android/ru-RU/full_description.txt +++ b/fastlane/metadata/android/ru-RU/full_description.txt @@ -15,11 +15,12 @@ HeliBoard это клавиатура с открытым исходным ко
  • Может следовать динамическим цветам для Android 12+
  • Настроить раскладки клавиатуры (доступно только при отключении использования системных языков)
  • +
  • Настроить специальные расскладки такие как, символьная, числовая, или функциональная раскладка
  • Многоязычный набор текста
  • Скользящий ввод текста (только с закрытой библиотекой ☹️)
    • Библиотека не включена в приложение, поскольку не совместима с открытым исходным кодом.
    • -
    • Можно извлечь из пакетов GApps (swypelibs) или загрузить здесь
    • +
    • Можно извлечь из пакетов GApps (swypelibs) или загрузить здесь (нажмите на файле на маленькую кнопку Скачать)
  • История буфера обмена
  • Режим одной руки
  • From 00ae92318d08e8502831c3ab3708593170088e1b Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 6 Apr 2025 18:33:06 +0200 Subject: [PATCH 058/175] add missed changelog translations --- fastlane/metadata/android/cs-CZ/changelogs/2000.txt | 10 ++++++++++ fastlane/metadata/android/cs-CZ/changelogs/2001.txt | 11 +++++++++++ fastlane/metadata/android/cs-CZ/changelogs/2002.txt | 4 ++++ fastlane/metadata/android/cs-CZ/changelogs/2003.txt | 11 +++++++++++ fastlane/metadata/android/cs-CZ/changelogs/2100.txt | 8 ++++++++ fastlane/metadata/android/cs-CZ/changelogs/2200.txt | 11 +++++++++++ fastlane/metadata/android/cs-CZ/changelogs/2201.txt | 2 ++ fastlane/metadata/android/cs-CZ/changelogs/2300.txt | 9 +++++++++ fastlane/metadata/android/cs-CZ/changelogs/2301.txt | 9 +++++++++ 9 files changed, 75 insertions(+) create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/2000.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/2001.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/2002.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/2003.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/2100.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/2200.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/2201.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/2300.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/2301.txt diff --git a/fastlane/metadata/android/cs-CZ/changelogs/2000.txt b/fastlane/metadata/android/cs-CZ/changelogs/2000.txt new file mode 100644 index 000000000..bd1ce4e3b --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/2000.txt @@ -0,0 +1,10 @@ +* add basic support for modifier keys +* add long press functions to more toolbar keys +* and more clipboard history toolbar keys +* make clipboard history toolbar customizable +* allow customizing all colors +* add setting to always show word to be enterd as middle suggestion +* add caps lock indicator +* add Piedmontese, Eastern Mari, Mansi, extended layouts for Kannada and Hungarian +* fix cut off text in key preview popup on some devices +* further fixes and improvements, see release notes diff --git a/fastlane/metadata/android/cs-CZ/changelogs/2001.txt b/fastlane/metadata/android/cs-CZ/changelogs/2001.txt new file mode 100644 index 000000000..65c72100a --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/2001.txt @@ -0,0 +1,11 @@ +* allow customizing functional key layouts +* slightly adjust symbols and more symbols layouts +* add options to auto-show/hide toolbar +* add toast notification when copying text +* separate language switch key behavior from enablement +* add comma key popups for number and phone layouts +* make long-press pinning in toolbar optional +* move toolbar settings to a separate section +* add tab key +* understand ctrl, toolbar and other key labels in layouts +* minor fixes and improvements diff --git a/fastlane/metadata/android/cs-CZ/changelogs/2002.txt b/fastlane/metadata/android/cs-CZ/changelogs/2002.txt new file mode 100644 index 000000000..751dfe142 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/2002.txt @@ -0,0 +1,4 @@ +* add emoji toolbar key, by @codokie (#845, #837) +* improvements regarding duplicated letters (#225 and maybe others) +* avoid positioning cursor inside emojis (#859) +* minor fixes for recently added features diff --git a/fastlane/metadata/android/cs-CZ/changelogs/2003.txt b/fastlane/metadata/android/cs-CZ/changelogs/2003.txt new file mode 100644 index 000000000..9bf1f6ba0 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/2003.txt @@ -0,0 +1,11 @@ +* customizable functional key layout +* slightly adjust symbols and more symbols layouts +* basic support for alt, ctrl, fn, meta keys +* extend toolbar (long-press functionality, optional long-press pinning, auto-show/hide, better clipboard toolbar, ...) +* add tab key +* add caps lock indicator +* add layouts for some languages +* add toolbar keys as keyboard keys +* allow customizing all colors +* toast notification when copying text +* bug fixes and further improvements, see full release notes diff --git a/fastlane/metadata/android/cs-CZ/changelogs/2100.txt b/fastlane/metadata/android/cs-CZ/changelogs/2100.txt new file mode 100644 index 000000000..1bcb32256 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/2100.txt @@ -0,0 +1,8 @@ +* fix broken functional key layout for tablets +* only show language switch key when there is something to switch to +* make default colors for "all colors" setting random instead of gray +* allow customizing start lag for gestures during typing, by @devycarol +* allow customizing currency keys +* reduce long-press time for shift -> caps lock, by @devycarol +* extend superscript popups in number row and symbols layout, by @b02860de585071a2 +* minor fixes and improvements diff --git a/fastlane/metadata/android/cs-CZ/changelogs/2200.txt b/fastlane/metadata/android/cs-CZ/changelogs/2200.txt new file mode 100644 index 000000000..133274e98 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/2200.txt @@ -0,0 +1,11 @@ +* add ability for saving / exporting custom themes +* make arrow keys on keyboard repeatable +* more cursor toolbar keys (page up/down(/start/end, word left/right) +* add paste key +* improve key swipe behavior +* add space swipe setting to toggle numpad +* add clipboard suggestion for recently copied text +* de-select text on pressing select keys again +* tune some colors in settings for Android 12+ +* adjust language dependent popup keys +* minor fixes and improvements diff --git a/fastlane/metadata/android/cs-CZ/changelogs/2201.txt b/fastlane/metadata/android/cs-CZ/changelogs/2201.txt new file mode 100644 index 000000000..7c8756ed5 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/2201.txt @@ -0,0 +1,2 @@ +* add visual options for gesture typing, by @devycarol (#944) +* update some icons, by @BlackyHawky (#977) diff --git a/fastlane/metadata/android/cs-CZ/changelogs/2300.txt b/fastlane/metadata/android/cs-CZ/changelogs/2300.txt new file mode 100644 index 000000000..71c590ce2 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/2300.txt @@ -0,0 +1,9 @@ +* Allow customizing number row, toolbar codes, icons, spacebar text, bottom row for emoji and clipboard views +* Decouple icon style from keyboard style +* Disable remove redundant popups by default (and add a small fix) +* Less aggressive addition of words to personal dictionary +* No vibration in do not disturb mode +* Improve performance when copying large texta +* Fix partially broken punctuation popups +* Fix some of the issues where text is duplicated +* Minor things and more bug fixes diff --git a/fastlane/metadata/android/cs-CZ/changelogs/2301.txt b/fastlane/metadata/android/cs-CZ/changelogs/2301.txt new file mode 100644 index 000000000..71c590ce2 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/2301.txt @@ -0,0 +1,9 @@ +* Allow customizing number row, toolbar codes, icons, spacebar text, bottom row for emoji and clipboard views +* Decouple icon style from keyboard style +* Disable remove redundant popups by default (and add a small fix) +* Less aggressive addition of words to personal dictionary +* No vibration in do not disturb mode +* Improve performance when copying large texta +* Fix partially broken punctuation popups +* Fix some of the issues where text is duplicated +* Minor things and more bug fixes From 003ec854abcfaf0241e9d185f73d8b3b7b08ad02 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 6 Apr 2025 19:20:01 +0200 Subject: [PATCH 059/175] update version --- app/build.gradle.kts | 4 ++-- fastlane/metadata/android/en-US/changelogs/3004.txt | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/3004.txt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 07ee80928..33b81b127 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,8 +13,8 @@ android { applicationId = "helium314.keyboard" minSdk = 21 targetSdk = 35 - versionCode = 3003 - versionName = "3.0-alpha3" + versionCode = 3004 + versionName = "3.0-beta1" ndk { abiFilters.clear() abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) diff --git a/fastlane/metadata/android/en-US/changelogs/3004.txt b/fastlane/metadata/android/en-US/changelogs/3004.txt new file mode 100644 index 000000000..ce0395033 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/3004.txt @@ -0,0 +1,11 @@ +* add layouts: Arabic Hija'i, Hebrew 1452-2, Hindi Phonetic, Dargwa (Urakhi), Baishakhi, Kurdish +* update some layouts +* support combining accents +* split keyboard toolbar key +* add .com popups +* allow setting custom font +* add font scale setting +* improve automatic language switching +* overhaul settings +* add settings for more tuning of keyboard padding, auto-space, auto-correction, number row +* more features and fixes From 8fddf94121e4eb72b0ae9556fe475ef92e1fb54f Mon Sep 17 00:00:00 2001 From: Helium314 Date: Tue, 8 Apr 2025 16:10:04 +0200 Subject: [PATCH 060/175] fix unable to change one-handed mode scale --- .../java/helium314/keyboard/latin/KeyboardWrapperView.kt | 2 +- .../java/helium314/keyboard/latin/settings/Settings.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/KeyboardWrapperView.kt b/app/src/main/java/helium314/keyboard/latin/KeyboardWrapperView.kt index 5fb5a122d..35a689740 100644 --- a/app/src/main/java/helium314/keyboard/latin/KeyboardWrapperView.kt +++ b/app/src/main/java/helium314/keyboard/latin/KeyboardWrapperView.kt @@ -78,7 +78,7 @@ class KeyboardWrapperView @JvmOverloads constructor( val changePercent = 2 * sign * (x - motionEvent.rawX) / context.resources.displayMetrics.density if (abs(changePercent) < 1) return@setOnTouchListener true x = motionEvent.rawX - val oldScale = Settings.readOneHandedModeScale(context.prefs(), Settings.getValues().mDisplayOrientation == Configuration.ORIENTATION_PORTRAIT) + val oldScale = Settings.readOneHandedModeScale(context.prefs(), Settings.getValues().mDisplayOrientation == Configuration.ORIENTATION_LANDSCAPE) val newScale = (oldScale + changePercent / 100f).coerceAtMost(2.5f).coerceAtLeast(0.5f) if (newScale == oldScale) return@setOnTouchListener true Settings.getInstance().writeOneHandedModeScale(newScale) diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java index 098b51b0d..0f9c21ed8 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -361,7 +361,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public void writeOneHandedModeEnabled(final boolean enabled) { mPrefs.edit().putBoolean(PREF_ONE_HANDED_MODE_PREFIX + - (mSettingsValues.mDisplayOrientation == Configuration.ORIENTATION_PORTRAIT), enabled).apply(); + (mSettingsValues.mDisplayOrientation != Configuration.ORIENTATION_LANDSCAPE), enabled).apply(); } public static float readOneHandedModeScale(final SharedPreferences prefs, final boolean isLandscape) { @@ -370,7 +370,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public void writeOneHandedModeScale(final Float scale) { mPrefs.edit().putFloat(PREF_ONE_HANDED_SCALE_PREFIX + - (mSettingsValues.mDisplayOrientation == Configuration.ORIENTATION_PORTRAIT), scale).apply(); + (mSettingsValues.mDisplayOrientation != Configuration.ORIENTATION_LANDSCAPE), scale).apply(); } public static int readOneHandedModeGravity(final SharedPreferences prefs, final boolean isLandscape) { @@ -379,7 +379,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public void writeOneHandedModeGravity(final int gravity) { mPrefs.edit().putInt(PREF_ONE_HANDED_GRAVITY_PREFIX + - (mSettingsValues.mDisplayOrientation == Configuration.ORIENTATION_PORTRAIT), gravity).apply(); + (mSettingsValues.mDisplayOrientation != Configuration.ORIENTATION_LANDSCAPE), gravity).apply(); } public void writeSplitKeyboardEnabled(final boolean enabled, final boolean isLandscape) { From fe7f1a1b38d13f926baf05d19d5d99100dae9eff Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 14 Apr 2025 17:06:34 +0200 Subject: [PATCH 061/175] fix crash when deleting subtype fixes GH-1476 --- .../main/java/helium314/keyboard/latin/utils/LayoutType.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/LayoutType.kt b/app/src/main/java/helium314/keyboard/latin/utils/LayoutType.kt index 412bb158c..00db72c87 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/LayoutType.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/LayoutType.kt @@ -13,9 +13,9 @@ enum class LayoutType { companion object { fun EnumMap.toExtraValue() = map { it.key.name + Separators.KV + it.value }.joinToString(Separators.ENTRY) - fun getLayoutMap(string: String): EnumMap { + fun getLayoutMap(string: String?): EnumMap { val map = EnumMap(LayoutType::class.java) - string.split(Separators.ENTRY).forEach { + string?.split(Separators.ENTRY)?.forEach { val s = it.split(Separators.KV) runCatching { map[LayoutType.valueOf(s[0])] = s[1] } } From 91554b02eb34c9adc4f20d980cae5bc2505aeff9 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 14 Apr 2025 18:46:41 +0200 Subject: [PATCH 062/175] fix unchanged layout list when deleting secondary layout --- .../helium314/keyboard/settings/dialogs/LayoutPickerDialog.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutPickerDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutPickerDialog.kt index e42631bb7..ace5aafb8 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutPickerDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutPickerDialog.kt @@ -204,6 +204,7 @@ private fun LayoutItemRow( onConfirmed = { showDeleteDialog = false onDelete(layoutName) + (ctx.getActivity() as? SettingsActivity)?.prefChanged() } ) } From 901e745158412882bc03c45d78c2e2773c095c8f Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Fri, 18 Apr 2025 11:02:27 +0300 Subject: [PATCH 063/175] Fix bottom of keyboard being under navigation bar (#1461) mostly for Android 15+, but issues may also occur on older Android versions --- .../helium314/keyboard/keyboard/KeyboardView.java | 2 ++ .../keyboard/clipboard/ClipboardHistoryView.kt | 1 + .../keyboard/clipboard/ClipboardLayoutParams.kt | 2 +- .../keyboard/emoji/EmojiPalettesView.java | 3 ++- .../keyboard/internal/KeyboardParams.java | 15 --------------- app/src/main/java/helium314/keyboard/latin/App.kt | 9 +++++++++ 6 files changed, 15 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java index 6fbf8238b..7b2b21f4e 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java @@ -148,6 +148,8 @@ public class KeyboardView extends View { mPaint.setAntiAlias(true); mTypeface = Settings.getInstance().getCustomTypeface(); + + setFitsSystemWindows(true); } @Nullable diff --git a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt index 284616b44..0f0cb756f 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt @@ -71,6 +71,7 @@ class ClipboardHistoryView @JvmOverloads constructor( getEnabledClipboardToolbarKeys(context.prefs()) .forEach { toolbarKeys.add(createToolbarKey(context, KeyboardIconsSet.instance, it)) } keyboardAttr.recycle() + fitsSystemWindows = true } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { diff --git a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardLayoutParams.kt b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardLayoutParams.kt index 1eada9c2c..c5edd6ab5 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardLayoutParams.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardLayoutParams.kt @@ -64,4 +64,4 @@ class ClipboardLayoutParams(ctx: Context) { view.layoutParams = this } } -} \ No newline at end of file +} diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java index 56a738659..8428f842d 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java @@ -106,6 +106,7 @@ public final class EmojiPalettesView extends LinearLayout R.styleable.EmojiPalettesView_categoryPageIndicatorColor, 0); emojiPalettesViewAttr.recycle(); mEmojiLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false); + setFitsSystemWindows(true); } @Override @@ -360,4 +361,4 @@ public final class EmojiPalettesView extends LinearLayout public void clearKeyboardCache() { mEmojiCategory.clearKeyboardCache(); } -} \ No newline at end of file +} diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardParams.java b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardParams.java index 50ba0dad6..56e3ebe65 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardParams.java +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardParams.java @@ -8,14 +8,9 @@ package helium314.keyboard.keyboard.internal; import android.content.Context; import android.content.res.TypedArray; -import android.graphics.Insets; -import android.os.Build; import android.util.AttributeSet; import android.util.SparseIntArray; -import android.view.WindowInsets; -import android.view.WindowManager; -import android.view.WindowMetrics; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -230,16 +225,6 @@ public class KeyboardParams { mBottomPadding = (int) (keyboardAttr.getFraction( R.styleable.Keyboard_keyboardBottomPadding, height, height, 0) * Settings.getValues().mBottomPaddingScale); - - if (Build.VERSION.SDK_INT >= 35) { - WindowManager wm = context.getSystemService(WindowManager.class); - WindowMetrics windowMetrics = wm.getCurrentWindowMetrics(); - WindowInsets windowInsets = windowMetrics.getWindowInsets(); - int insetTypes = WindowInsets.Type.systemBars() | WindowInsets.Type.displayCutout(); - Insets insets = windowInsets.getInsetsIgnoringVisibility(insetTypes); - mBottomPadding += insets.bottom; - } - mLeftPadding = (int) (keyboardAttr.getFraction( R.styleable.Keyboard_keyboardLeftPadding, width, width, 0) * Settings.getValues().mSidePaddingScale); diff --git a/app/src/main/java/helium314/keyboard/latin/App.kt b/app/src/main/java/helium314/keyboard/latin/App.kt index 2ed0765c3..ad6ef8db7 100644 --- a/app/src/main/java/helium314/keyboard/latin/App.kt +++ b/app/src/main/java/helium314/keyboard/latin/App.kt @@ -23,6 +23,7 @@ import helium314.keyboard.latin.utils.DictionaryInfoUtils.USER_DICTIONARY_SUFFIX import helium314.keyboard.latin.utils.LayoutType import helium314.keyboard.latin.utils.LayoutType.Companion.folder import helium314.keyboard.latin.utils.LayoutUtilsCustom +import helium314.keyboard.latin.utils.Log import helium314.keyboard.latin.utils.ScriptUtils.SCRIPT_LATIN import helium314.keyboard.latin.utils.ScriptUtils.script import helium314.keyboard.latin.utils.SubtypeSettings @@ -51,6 +52,14 @@ class App : Application() { checkVersionUpgrade(this) app = this Defaults.initDynamicDefaults(this) + + val packageInfo = packageManager.getPackageInfo(packageName, 0) + @Suppress("DEPRECATION") + Log.i( + "startup", "Starting ${applicationInfo.processName} version ${packageInfo.versionName} (${ + packageInfo.versionCode + }) on Android ${android.os.Build.VERSION.RELEASE} (SDK ${android.os.Build.VERSION.SDK_INT})" + ) } companion object { From c32b3bada451262540a28fb2eebf58743b084ed6 Mon Sep 17 00:00:00 2001 From: Benson Muite Date: Sat, 19 Apr 2025 09:27:58 +0300 Subject: [PATCH 064/175] Keyboard layouts for languages primarily used in Africa (#1483) --- app/src/main/assets/layouts/main/akan.txt | 28 ++++ app/src/main/assets/layouts/main/bemba.txt | 29 +++++ app/src/main/assets/layouts/main/dagbani.txt | 28 ++++ app/src/main/assets/layouts/main/ewe.txt | 28 ++++ app/src/main/assets/layouts/main/ga.txt | 28 ++++ app/src/main/assets/layouts/main/hausa.txt | 28 ++++ app/src/main/assets/layouts/main/igbo.txt | 28 ++++ app/src/main/assets/layouts/main/kikuyu.txt | 28 ++++ app/src/main/assets/layouts/main/lingala.txt | 28 ++++ app/src/main/assets/layouts/main/luganda.txt | 29 +++++ app/src/main/assets/layouts/main/sesotho.txt | 28 ++++ app/src/main/assets/layouts/main/yoruba.txt | 28 ++++ .../keyboard_parser/LocaleKeyboardInfos.kt | 13 +- .../keyboard/latin/common/LocaleUtils.kt | 2 +- app/src/main/res/values/strings.xml | 4 + app/src/main/res/xml/method.xml | 122 +++++++++++++++++- 16 files changed, 474 insertions(+), 5 deletions(-) create mode 100644 app/src/main/assets/layouts/main/akan.txt create mode 100644 app/src/main/assets/layouts/main/bemba.txt create mode 100644 app/src/main/assets/layouts/main/dagbani.txt create mode 100644 app/src/main/assets/layouts/main/ewe.txt create mode 100644 app/src/main/assets/layouts/main/ga.txt create mode 100644 app/src/main/assets/layouts/main/hausa.txt create mode 100644 app/src/main/assets/layouts/main/igbo.txt create mode 100644 app/src/main/assets/layouts/main/kikuyu.txt create mode 100644 app/src/main/assets/layouts/main/lingala.txt create mode 100644 app/src/main/assets/layouts/main/luganda.txt create mode 100644 app/src/main/assets/layouts/main/sesotho.txt create mode 100644 app/src/main/assets/layouts/main/yoruba.txt diff --git a/app/src/main/assets/layouts/main/akan.txt b/app/src/main/assets/layouts/main/akan.txt new file mode 100644 index 000000000..1f139b582 --- /dev/null +++ b/app/src/main/assets/layouts/main/akan.txt @@ -0,0 +1,28 @@ +ɛ q +w +e +r +t +y +u +i +o +p + +a +s +d +f +g +h +j +k +l + +z +ɔ x +c ¢ +v +b +n +m diff --git a/app/src/main/assets/layouts/main/bemba.txt b/app/src/main/assets/layouts/main/bemba.txt new file mode 100644 index 000000000..5253b2885 --- /dev/null +++ b/app/src/main/assets/layouts/main/bemba.txt @@ -0,0 +1,29 @@ +q +w +e +r +t +y +u +i +o +p +ŋ + +a +s +d +f +g +h +j +k +l + +z +x +c +v +b +n +m diff --git a/app/src/main/assets/layouts/main/dagbani.txt b/app/src/main/assets/layouts/main/dagbani.txt new file mode 100644 index 000000000..588ff0513 --- /dev/null +++ b/app/src/main/assets/layouts/main/dagbani.txt @@ -0,0 +1,28 @@ +q +w +ɛ e +r ¢ +t +y +u +i +ɔ o +p + +a +s +d +f +ɣ g +h +j +k +l + +ʒ z +x x +c +v +b +ŋ n +m diff --git a/app/src/main/assets/layouts/main/ewe.txt b/app/src/main/assets/layouts/main/ewe.txt new file mode 100644 index 000000000..bb307f1a3 --- /dev/null +++ b/app/src/main/assets/layouts/main/ewe.txt @@ -0,0 +1,28 @@ +ɛ q +w +e +r +t +ɣ y +u +i +o +p + +a +s +d +f +g +h +j +k +l + +z +ɔ x +c ¢ +v +b +n +m diff --git a/app/src/main/assets/layouts/main/ga.txt b/app/src/main/assets/layouts/main/ga.txt new file mode 100644 index 000000000..03d1fe66e --- /dev/null +++ b/app/src/main/assets/layouts/main/ga.txt @@ -0,0 +1,28 @@ +ɛ q +w +e +r +t +y +u +i +o +p + +a +s +d +f +g +h +j +k +l + +z +ɔ x +ŋ c ¢ +v +b +n +m diff --git a/app/src/main/assets/layouts/main/hausa.txt b/app/src/main/assets/layouts/main/hausa.txt new file mode 100644 index 000000000..3138eb991 --- /dev/null +++ b/app/src/main/assets/layouts/main/hausa.txt @@ -0,0 +1,28 @@ +ẹ q +w +e +r +t +y +u +i +o +p + +a +s +d +f +g +h +j +k +l + +z +ọ x +c +v +b +n ₦ +m diff --git a/app/src/main/assets/layouts/main/igbo.txt b/app/src/main/assets/layouts/main/igbo.txt new file mode 100644 index 000000000..9cf50d780 --- /dev/null +++ b/app/src/main/assets/layouts/main/igbo.txt @@ -0,0 +1,28 @@ +ṅ q +w +e +r +t +y +u +i +o +p + +a +s +d +f +g +h +j +k +l + +z +ọ x +c +ụ v +b +n ₦ +m diff --git a/app/src/main/assets/layouts/main/kikuyu.txt b/app/src/main/assets/layouts/main/kikuyu.txt new file mode 100644 index 000000000..0fdbdd8d2 --- /dev/null +++ b/app/src/main/assets/layouts/main/kikuyu.txt @@ -0,0 +1,28 @@ +ĩ q +w +e +r +t +y +u +i +o +p + +a +s +d +f +g +h +j +k +l + +z +ũ x +c +v +b +n +m diff --git a/app/src/main/assets/layouts/main/lingala.txt b/app/src/main/assets/layouts/main/lingala.txt new file mode 100644 index 000000000..830109805 --- /dev/null +++ b/app/src/main/assets/layouts/main/lingala.txt @@ -0,0 +1,28 @@ +q +w +ɛ e +r +t +y +u +i +ɔ o +p + +a +s +d +f +g +h +j +k +l + +z +x +c +̌ v +b +n +m diff --git a/app/src/main/assets/layouts/main/luganda.txt b/app/src/main/assets/layouts/main/luganda.txt new file mode 100644 index 000000000..5253b2885 --- /dev/null +++ b/app/src/main/assets/layouts/main/luganda.txt @@ -0,0 +1,29 @@ +q +w +e +r +t +y +u +i +o +p +ŋ + +a +s +d +f +g +h +j +k +l + +z +x +c +v +b +n +m diff --git a/app/src/main/assets/layouts/main/sesotho.txt b/app/src/main/assets/layouts/main/sesotho.txt new file mode 100644 index 000000000..b0796b3b5 --- /dev/null +++ b/app/src/main/assets/layouts/main/sesotho.txt @@ -0,0 +1,28 @@ +q +w +e +r +t +y +u +i +o +p + +a +š s +d +f +g +h +j +k +l + +z +x +c +v +b +n +m diff --git a/app/src/main/assets/layouts/main/yoruba.txt b/app/src/main/assets/layouts/main/yoruba.txt new file mode 100644 index 000000000..3ee1696dd --- /dev/null +++ b/app/src/main/assets/layouts/main/yoruba.txt @@ -0,0 +1,28 @@ +ẹ q +w +e +r +t +y +u +i +o +p + +a +s +d +f +g +h +j +k +l + +z +ọ x +c +ṣ v +b +n ₦ +m diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt index eba17161e..f0f5d5a23 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt @@ -266,7 +266,7 @@ private fun getCurrencyKey(locale: Locale): Pair> { return euro if (locale.language.matches("ca|eu|lb|mt".toRegex())) return euro - if (locale.language.matches("fa|iw|ko|lo|mn|ne|si|th|uk|vi|km".toRegex())) + if (locale.language.matches("ak|dag|ee|fa|gaa|ha|ig|iw|lo|ko|km|mn|ne|si|th|uk|vi|yo".toRegex())) return genericCurrencyKey(getCurrency(locale)) if (locale.language == "hy") return dram @@ -292,17 +292,24 @@ private fun getCurrency(locale: Locale): String { if (locale.country == "BD") return "৳" if (locale.country == "LK") return "රු" return when (locale.language) { + "ak" -> "¢" + "dag" -> "¢" + "ee" -> "¢" "fa" -> "﷼" + "gaa" -> "¢" + "ha" -> "₦" + "ig" -> "₦" "iw" -> "₪" - "ko" -> "₩" "lo" -> "₭" + "km" -> "៛" + "ko" -> "₩" "mn" -> "₮" "ne" -> "रु." "si" -> "රු" "th" -> "฿" "uk" -> "₴" "vi" -> "₫" - "km" -> "៛" + "yo" -> "₦" else -> "$" } } diff --git a/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt b/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt index 377d0c08d..85f8f8850 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt @@ -188,7 +188,7 @@ object LocaleUtils { fun getLocaleDisplayNameInLocale(locale: Locale, resources: Resources, displayLocale: Locale): String { val languageTag = locale.toLanguageTag() if (languageTag == SubtypeLocaleUtils.NO_LANGUAGE) return resources.getString(R.string.subtype_no_language) - if (locale.script() != locale.language.constructLocale().script() || locale.language == "mns" || locale.language == "xdq" || locale.language=="dru") { + if (locale.script() != locale.language.constructLocale().script() || locale.language == "mns" || locale.language == "xdq" || locale.language=="dru" || locale.language=="st" || locale.language=="dag") { val resId = resources.getIdentifier( "subtype_${languageTag.replace("-", "_")}", "string", diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 03e7bcff3..a0f317a99 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -367,6 +367,10 @@ Mansi Kaitag + + Dagbani + + Sesotho Serbian (Latin) @@ -164,6 +176,15 @@ android:imeSubtypeExtraValue="AsciiCapable,EmojiCapable" android:isAsciiCapable="true" /> + + + + + + + + + + + + Date: Sat, 19 Apr 2025 08:35:46 +0200 Subject: [PATCH 065/175] clarify when we use our own name for the language instead of using whatver is provided by the system --- .../java/helium314/keyboard/latin/common/LocaleUtils.kt | 8 +++++++- layouts.md | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt b/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt index 85f8f8850..ab37a9adb 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt @@ -188,7 +188,8 @@ object LocaleUtils { fun getLocaleDisplayNameInLocale(locale: Locale, resources: Resources, displayLocale: Locale): String { val languageTag = locale.toLanguageTag() if (languageTag == SubtypeLocaleUtils.NO_LANGUAGE) return resources.getString(R.string.subtype_no_language) - if (locale.script() != locale.language.constructLocale().script() || locale.language == "mns" || locale.language == "xdq" || locale.language=="dru" || locale.language=="st" || locale.language=="dag") { + if (hasNonDefaultScript(locale) || doesNotHaveAndroidName(locale.language)) { + // supply our own name for the language instead of using name provided by the system val resId = resources.getIdentifier( "subtype_${languageTag.replace("-", "_")}", "string", @@ -203,4 +204,9 @@ object LocaleUtils { localeDisplayName } } + + private fun hasNonDefaultScript(locale: Locale) = locale.script() != locale.language.constructLocale().script() + + private fun doesNotHaveAndroidName(language: String) = + language == "mns" || language == "xdq" || language=="dru" || language == "st" || language == "dag" } diff --git a/layouts.md b/layouts.md index 9464abea6..8612a2e97 100644 --- a/layouts.md +++ b/layouts.md @@ -125,7 +125,7 @@ You can also specify special key codes like `a|!code/key_action_previous` or `ab * `[number_row]` may contain a custom number row (1-9 and 0 separated by space). You should also add the language to `numberRowLocales` in [`PreferencesSettingsFragment`](app/src/main/java/helium314/keyboard/latin/settings/PreferencesSettingsFragment.java) so the user can opt into having a localized number row. * `[extra_keys]` are typically keys shown in the default layout of the language. This is currently only used for latin layouts to avoid duplicating layouts for just adding few keys on the right side. The layout name need to end with `+`, but the `+` is removed when looking up the actual layout. * If you add a new language for which Android does not have a display name, it will be displayed using the language tag - * Avoiding this currently is more complicated than necessary: add the language tag to [LocaleUtils.getLocaleDisplayNameInSystemLocale](/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt#L181) to have an exception, and add a string named `subtype_` to [`strings.xml`](/app/src/main/res/values/strings.xml). Further you may need to add a `subtype_in_root_locale_` to [donottranslate.xml](/app/src/main/res/values/donottranslate.xml), and add the language tag to `subtype_locale_exception_keys` and `subtype_locale_displayed_in_root_locale`. + * Avoiding this currently is more complicated than necessary: add the language to [LocaleUtils.doesNotHaveAndroidName](/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt#L210) to have an exception, and add a string named `subtype_` to [`strings.xml`](/app/src/main/res/values/strings.xml). In case you still have it not displayed properly, you may need to add a `subtype_in_root_locale_` to [donottranslate.xml](/app/src/main/res/values/donottranslate.xml), and add the language tag to `subtype_locale_exception_keys` and `subtype_locale_displayed_in_root_locale`. * If a newly added language does not use latin script, please update the default scripts method `Locale.script` in [ScriptUtils](app/src/main/java/helium314/keyboard/latin/utils/ScriptUtils.kt) ## Functional key layouts From 1012386c8c8eaa541466f9578332284880796a55 Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Sun, 20 Apr 2025 19:58:58 +0300 Subject: [PATCH 066/175] more reliable fix for bottom inset padding on edge-to-edge (#1486) --- .../keyboard/keyboard/KeyboardView.java | 2 - .../clipboard/ClipboardHistoryView.kt | 1 - .../keyboard/emoji/EmojiPalettesView.java | 1 - .../helium314/keyboard/latin/InputView.java | 37 +++++++++++++++++-- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java index 7b2b21f4e..6fbf8238b 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java @@ -148,8 +148,6 @@ public class KeyboardView extends View { mPaint.setAntiAlias(true); mTypeface = Settings.getInstance().getCustomTypeface(); - - setFitsSystemWindows(true); } @Nullable diff --git a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt index 0f0cb756f..284616b44 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt @@ -71,7 +71,6 @@ class ClipboardHistoryView @JvmOverloads constructor( getEnabledClipboardToolbarKeys(context.prefs()) .forEach { toolbarKeys.add(createToolbarKey(context, KeyboardIconsSet.instance, it)) } keyboardAttr.recycle() - fitsSystemWindows = true } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java index 8428f842d..5074b6b40 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java @@ -106,7 +106,6 @@ public final class EmojiPalettesView extends LinearLayout R.styleable.EmojiPalettesView_categoryPageIndicatorColor, 0); emojiPalettesViewAttr.recycle(); mEmojiLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false); - setFitsSystemWindows(true); } @Override diff --git a/app/src/main/java/helium314/keyboard/latin/InputView.java b/app/src/main/java/helium314/keyboard/latin/InputView.java index 8125edc09..31bd722e8 100644 --- a/app/src/main/java/helium314/keyboard/latin/InputView.java +++ b/app/src/main/java/helium314/keyboard/latin/InputView.java @@ -7,10 +7,15 @@ package helium314.keyboard.latin; import android.content.Context; +import android.graphics.Insets; import android.graphics.Rect; +import android.os.Build; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; +import android.view.WindowInsets; +import android.view.WindowManager; +import android.view.WindowMetrics; import android.widget.FrameLayout; import androidx.core.view.ViewKt; @@ -21,8 +26,12 @@ import helium314.keyboard.latin.common.ColorType; import helium314.keyboard.latin.settings.Settings; import helium314.keyboard.latin.suggestions.PopupSuggestionsView; import helium314.keyboard.latin.suggestions.SuggestionStripView; +import kotlin.Unit; + public final class InputView extends FrameLayout { + private static final int[] LOCATION = new int[2]; + private final Rect mInputViewRect = new Rect(); private MainKeyboardView mMainKeyboardView; private KeyboardTopPaddingForwarder mKeyboardTopPaddingForwarder; @@ -43,10 +52,7 @@ public final class InputView extends FrameLayout { mMainKeyboardView, suggestionStripView); mMoreSuggestionsViewCanceler = new MoreSuggestionsViewCanceler( mMainKeyboardView, suggestionStripView); - ViewKt.doOnNextLayout(this, v -> { - Settings.getValues().mColors.setBackground(findViewById(R.id.main_keyboard_frame), ColorType.MAIN_BACKGROUND); - return null; - }); + ViewKt.doOnNextLayout(this, this::onNextLayout); } public void setKeyboardTopPadding(final int keyboardTopPadding) { @@ -104,6 +110,29 @@ public final class InputView extends FrameLayout { return mActiveForwarder.onTouchEvent(x, y, me); } + private Unit onNextLayout(View v) { + Settings.getValues().mColors.setBackground(findViewById(R.id.main_keyboard_frame), ColorType.MAIN_BACKGROUND); + + if (Build.VERSION.SDK_INT >= 30) { + getLocationOnScreen(LOCATION); + WindowManager wm = getContext().getSystemService(WindowManager.class); + WindowMetrics windowMetrics = wm.getCurrentWindowMetrics(); + if (LOCATION[1] + getHeight() == windowMetrics.getBounds().height()) { + // Edge-to-edge mode + WindowInsets windowInsets = windowMetrics.getWindowInsets(); + int insetTypes = WindowInsets.Type.systemBars() | WindowInsets.Type.displayCutout(); + Insets insets = windowInsets.getInsetsIgnoringVisibility(insetTypes); + + // Can't set padding on this view, since it results in an overlap with window above the keyboard. + mMainKeyboardView.setPadding(0, 0, 0, insets.bottom); + findViewById(R.id.emoji_palettes_view).setPadding(0, 0, 0, insets.bottom); + findViewById(R.id.clipboard_history_view).setPadding(0, 0, 0, insets.bottom); + } + } + + return null; + } + /** * This class forwards series of {@link MotionEvent}s from SenderView to * ReceiverView. From d87ed8e53dc87ab72dd7aef27c2872223ffba1ca Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 21 Apr 2025 06:03:32 +0200 Subject: [PATCH 067/175] fix pattern for files to back up see #1490 --- .../keyboard/settings/preferences/BackupRestorePreference.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt index ee771d5bf..76b1a31ac 100644 --- a/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt +++ b/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt @@ -52,7 +52,7 @@ fun BackupRestorePreference(setting: Setting) { var error: String? by rememberSaveable { mutableStateOf(null) } val backupFilePatterns by lazy { listOf( "blacklists/.*\\.txt".toRegex(), - "layouts/${LayoutUtilsCustom.CUSTOM_LAYOUT_PREFIX}+\\..{0,4}".toRegex(), // can't expect a period at the end, as this would break restoring older backups + "layouts/.*${LayoutUtilsCustom.CUSTOM_LAYOUT_PREFIX}+\\..{0,4}".toRegex(), // can't expect a period at the end, as this would break restoring older backups "dicts/.*/.*user\\.dict".toRegex(), "UserHistoryDictionary.*/UserHistoryDictionary.*\\.(body|header)".toRegex(), "custom_background_image.*".toRegex(), From da7ab059202c46655a3ac993a81b5941b66699fc Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 21 Apr 2025 07:33:58 +0200 Subject: [PATCH 068/175] remove old upgrade functionality done for migration from previous package name should be fine after more than a year of HeliBoard fixes issue when restoring custom layouts upgrade now would need to be OpenBoard -> HeliBoard <= 2.3 -> HeliBoard >= 3.0 --- .../main/java/helium314/keyboard/latin/App.kt | 99 ------------------- .../preferences/BackupRestorePreference.kt | 49 ++------- 2 files changed, 6 insertions(+), 142 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/App.kt b/app/src/main/java/helium314/keyboard/latin/App.kt index ad6ef8db7..9e40e23e7 100644 --- a/app/src/main/java/helium314/keyboard/latin/App.kt +++ b/app/src/main/java/helium314/keyboard/latin/App.kt @@ -34,7 +34,6 @@ import helium314.keyboard.latin.utils.getResourceSubtypes import helium314.keyboard.latin.utils.locale import helium314.keyboard.latin.utils.mainLayoutName import helium314.keyboard.latin.utils.prefs -import helium314.keyboard.latin.utils.protectedPrefs import helium314.keyboard.latin.utils.upgradeToolbarPrefs import helium314.keyboard.latin.utils.writeCustomKeyCodes import helium314.keyboard.settings.screens.colorPrefsAndResIds @@ -91,8 +90,6 @@ fun checkVersionUpgrade(context: Context) { file.delete() } } - if (oldVersion == 0) // new install or restoring settings from old app name - upgradesWhenComingFromOldAppName(context) if (oldVersion <= 1000) { // upgrade old custom layouts name val oldShiftSymbolsFile = getCustomLayoutFile("custom.shift_symbols", context) if (oldShiftSymbolsFile.exists()) { @@ -566,99 +563,3 @@ fun checkVersionUpgrade(context: Context) { LayoutUtilsCustom.onLayoutFileChanged() // just to be sure prefs.edit { putInt(Settings.PREF_VERSION_CODE, BuildConfig.VERSION_CODE) } } - -// todo (later): remove it when most users probably have upgraded -private fun upgradesWhenComingFromOldAppName(context: Context) { - // move layout files - try { - File(context.filesDir, "layouts").listFiles()?.forEach { - it.copyTo(getCustomLayoutFile(it.name, context), true) - it.delete() - } - } catch (_: Exception) {} - // move background images - try { - val bgDay = File(context.filesDir, "custom_background_image") - if (bgDay.isFile) { - bgDay.copyTo(Settings.getCustomBackgroundFile(context, false, false), true) - bgDay.delete() - } - val bgNight = File(context.filesDir, "custom_background_image_night") - if (bgNight.isFile) { - bgNight.copyTo(Settings.getCustomBackgroundFile(context, true, false), true) - bgNight.delete() - } - } catch (_: Exception) {} - // upgrade prefs - val prefs = context.prefs() - if (prefs.all.containsKey("theme_variant")) { - prefs.edit().putString(Settings.PREF_THEME_COLORS, prefs.getString("theme_variant", "")).apply() - prefs.edit().remove("theme_variant").apply() - } - if (prefs.all.containsKey("theme_variant_night")) { - prefs.edit().putString(Settings.PREF_THEME_COLORS_NIGHT, prefs.getString("theme_variant_night", "")).apply() - prefs.edit().remove("theme_variant_night").apply() - } - prefs.all.toMap().forEach { - if (it.key.startsWith("pref_key_") && it.key != "pref_key_longpress_timeout") { - var remove = true - when (val value = it.value) { - is Boolean -> prefs.edit().putBoolean(it.key.substringAfter("pref_key_"), value).apply() - is Int -> prefs.edit().putInt(it.key.substringAfter("pref_key_"), value).apply() - is Long -> prefs.edit().putLong(it.key.substringAfter("pref_key_"), value).apply() - is String -> prefs.edit().putString(it.key.substringAfter("pref_key_"), value).apply() - is Float -> prefs.edit().putFloat(it.key.substringAfter("pref_key_"), value).apply() - else -> remove = false - } - if (remove) - prefs.edit().remove(it.key).apply() - } else if (it.key.startsWith("pref_")) { - var remove = true - when (val value = it.value) { - is Boolean -> prefs.edit().putBoolean(it.key.substringAfter("pref_"), value).apply() - is Int -> prefs.edit().putInt(it.key.substringAfter("pref_"), value).apply() - is Long -> prefs.edit().putLong(it.key.substringAfter("pref_"), value).apply() - is String -> prefs.edit().putString(it.key.substringAfter("pref_"), value).apply() - is Float -> prefs.edit().putFloat(it.key.substringAfter("pref_"), value).apply() - else -> remove = false - } - if (remove) - prefs.edit().remove(it.key).apply() - } - } - // change more_keys to popup_keys - if (prefs.contains("more_keys_order")) { - prefs.edit().putString(Settings.PREF_POPUP_KEYS_ORDER, prefs.getString("more_keys_order", "")?.replace("more_", "popup_")).apply() - prefs.edit().remove("more_keys_order").apply() - } - if (prefs.contains("more_keys_labels_order")) { - prefs.edit().putString(Settings.PREF_POPUP_KEYS_LABELS_ORDER, prefs.getString("more_keys_labels_order", "")?.replace("more_", "popup_")).apply() - prefs.edit().remove("more_keys_labels_order").apply() - } - if (prefs.contains("more_more_keys")) { - prefs.edit().putString(Settings.PREF_MORE_POPUP_KEYS, prefs.getString("more_more_keys", "")).apply() - prefs.edit().remove("more_more_keys").apply() - } - if (prefs.contains("spellcheck_use_contacts")) { - prefs.edit().putBoolean(Settings.PREF_USE_CONTACTS, prefs.getBoolean("spellcheck_use_contacts", false)).apply() - prefs.edit().remove("spellcheck_use_contacts").apply() - } - // upgrade additional subtype locale strings - if (prefs.contains(Settings.PREF_ADDITIONAL_SUBTYPES)) { - val additionalSubtypes = mutableListOf() - prefs.getString(Settings.PREF_ADDITIONAL_SUBTYPES, "")!!.split(";").forEach { - val localeString = it.substringBefore(":") - additionalSubtypes.add(it.replace(localeString, localeString.constructLocale().toLanguageTag())) - } - prefs.edit().putString(Settings.PREF_ADDITIONAL_SUBTYPES, additionalSubtypes.joinToString(";")).apply() - } - // move pinned clips to credential protected storage if device is not locked (should never happen) - if (!prefs.contains(Settings.PREF_PINNED_CLIPS)) return - try { - val defaultProtectedPrefs = context.protectedPrefs() - defaultProtectedPrefs.edit { putString(Settings.PREF_PINNED_CLIPS, prefs.getString(Settings.PREF_PINNED_CLIPS, "")) } - prefs.edit { remove(Settings.PREF_PINNED_CLIPS) } - } catch (_: IllegalStateException) { - // SharedPreferences in credential encrypted storage are not available until after user is unlocked - } -} diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt index 76b1a31ac..a736014b8 100644 --- a/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt +++ b/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt @@ -16,10 +16,8 @@ import helium314.keyboard.keyboard.KeyboardSwitcher import helium314.keyboard.latin.R import helium314.keyboard.latin.checkVersionUpgrade import helium314.keyboard.latin.common.FileUtils -import helium314.keyboard.latin.common.LocaleUtils.constructLocale import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.utils.DeviceProtectedUtils -import helium314.keyboard.latin.utils.DictionaryInfoUtils import helium314.keyboard.latin.utils.ExecutorUtils import helium314.keyboard.latin.utils.LayoutUtilsCustom import helium314.keyboard.latin.utils.Log @@ -51,10 +49,10 @@ fun BackupRestorePreference(setting: Setting) { val prefs = ctx.prefs() var error: String? by rememberSaveable { mutableStateOf(null) } val backupFilePatterns by lazy { listOf( - "blacklists/.*\\.txt".toRegex(), - "layouts/.*${LayoutUtilsCustom.CUSTOM_LAYOUT_PREFIX}+\\..{0,4}".toRegex(), // can't expect a period at the end, as this would break restoring older backups - "dicts/.*/.*user\\.dict".toRegex(), - "UserHistoryDictionary.*/UserHistoryDictionary.*\\.(body|header)".toRegex(), + "blacklists${File.separator}.*\\.txt".toRegex(), + "layouts${File.separator}.*${LayoutUtilsCustom.CUSTOM_LAYOUT_PREFIX}+\\..{0,4}".toRegex(), // can't expect a period at the end, as this would break restoring older backups + "dicts${File.separator}.*${File.separator}.*user\\.dict".toRegex(), + "UserHistoryDictionary.*${File.separator}UserHistoryDictionary.*\\.(body|header)".toRegex(), "custom_background_image.*".toRegex(), "custom_font".toRegex(), ) } @@ -131,13 +129,11 @@ fun BackupRestorePreference(setting: Setting) { if (entry.name.startsWith("unprotected${File.separator}")) { val adjustedName = entry.name.substringAfter("unprotected${File.separator}") if (backupFilePatterns.any { adjustedName.matches(it) }) { - val targetFileName = upgradeFileNames(adjustedName) - val file = File(deviceProtectedFilesDir, targetFileName) + val file = File(deviceProtectedFilesDir, adjustedName) FileUtils.copyStreamToNewFile(zip, file) } } else if (backupFilePatterns.any { entry!!.name.matches(it) }) { - val targetFileName = upgradeFileNames(entry.name) - val file = File(filesDir, targetFileName) + val file = File(filesDir, entry.name) FileUtils.copyStreamToNewFile(zip, file) } else if (entry.name == PREFS_FILE_NAME) { val prefLines = String(zip.readBytes()).split("\n") @@ -253,38 +249,5 @@ private fun readJsonLinesToSettings(list: List, prefs: SharedPreferences } } -// todo (later): remove this when new package name has been in use for long enough, this is only for migrating from old openboard name -private fun upgradeFileNames(originalName: String): String { - return when { - originalName.endsWith(DictionaryInfoUtils.USER_DICTIONARY_SUFFIX) -> { - // replace directory after switch to language tag - val dirName = originalName.substringAfter(File.separator).substringBefore(File.separator) - originalName.replace(dirName, dirName.constructLocale().toLanguageTag()) - } - originalName.startsWith("blacklists") -> { - // replace file name after switch to language tag - val fileName = originalName.substringAfter("blacklists${File.separator}").substringBefore(".txt") - originalName.replace(fileName, fileName.constructLocale().toLanguageTag()) - } - originalName.startsWith("layouts") -> { - // replace file name after switch to language tag, but only if it's not a layout - val localeString = originalName.substringAfter(".").substringBefore(".") - if (localeString in listOf("symbols", "symbols_shifted", "symbols_arabic", "number", "numpad", "numpad_landscape", "phone", "phone_symbols")) - return originalName // it's a layout! - val locale = localeString.constructLocale() - if (locale.toLanguageTag() != "und") - originalName.replace(localeString, locale.toLanguageTag()) - else - originalName // no valid locale -> must be symbols layout, don't change - } - originalName.startsWith("UserHistoryDictionary") -> { - val localeString = originalName.substringAfter(".").substringBefore(".") - val locale = localeString.constructLocale() - originalName.replace(localeString, locale.toLanguageTag()) - } - else -> originalName - } -} - private const val PREFS_FILE_NAME = "preferences.json" private const val PROTECTED_PREFS_FILE_NAME = "protected_preferences.json" From d15a97ccbaa3a75a62b597ad13f7816c8bca9775 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 21 Apr 2025 07:37:42 +0200 Subject: [PATCH 069/175] consider all layout types when checking for custom layouts without file fixes #1490 --- .../keyboard/latin/utils/LayoutUtilsCustom.kt | 14 +++++++ .../keyboard/latin/utils/SubtypeSettings.kt | 42 +++++++++++-------- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtilsCustom.kt b/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtilsCustom.kt index bc40baed5..33ea1f28a 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtilsCustom.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtilsCustom.kt @@ -143,6 +143,20 @@ object LayoutUtilsCustom { return file } + /** @return whether a layout has no file and was removed from [layouts] */ + fun removeMissingLayouts(layouts: EnumMap, context: Context): Boolean { + var removed = false + LayoutType.entries.forEach { type -> + val name = layouts[type] ?: return@forEach + if (!isCustomLayout(name) || getLayoutFiles(type, context).any { it.name == name }) + return@forEach + // no file for custom layout + layouts.remove(type) + removed = true + } + return removed + } + // this goes into prefs and file names, so do not change! const val CUSTOM_LAYOUT_PREFIX = "custom." private const val TAG = "LayoutUtilsCustom" diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt index 88a5d9450..2566cf703 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt @@ -13,12 +13,14 @@ import helium314.keyboard.compat.locale import helium314.keyboard.keyboard.KeyboardSwitcher import helium314.keyboard.latin.RichInputMethodManager import helium314.keyboard.latin.common.Constants.Separators +import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET import helium314.keyboard.latin.common.LocaleUtils import helium314.keyboard.latin.define.DebugFlags import helium314.keyboard.latin.settings.Defaults import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.settings.SettingsSubtype import helium314.keyboard.latin.settings.SettingsSubtype.Companion.toSettingsSubtype +import helium314.keyboard.latin.utils.LayoutType.Companion.toExtraValue import helium314.keyboard.latin.utils.ScriptUtils.script import java.util.Locale @@ -164,10 +166,11 @@ object SubtypeSettings { fun reloadEnabledSubtypes(context: Context) { enabledSubtypes.clear() - removeInvalidCustomSubtypes(context) + removeMissingCustomLayouts(context) loadAdditionalSubtypes(context.prefs()) loadEnabledSubtypes(context) - RichInputMethodManager.getInstance().refreshSubtypeCaches() + if (RichInputMethodManager.isInitialized()) + RichInputMethodManager.getInstance().refreshSubtypeCaches() } fun createSettingsSubtypes(prefSubtypes: String): List = @@ -187,7 +190,7 @@ object SubtypeSettings { reloadSystemLocales(context) loadResourceSubtypes(context.resources) - removeInvalidCustomSubtypes(context) + removeMissingCustomLayouts(context) loadAdditionalSubtypes(context.prefs()) loadEnabledSubtypes(context) } @@ -215,22 +218,27 @@ object SubtypeSettings { } } - // remove custom subtypes without a layout file - private fun removeInvalidCustomSubtypes(context: Context) { + // remove layouts without a layout file from custom subtypes + // should not be necessary, but better fall back to default instead of crashing when encountering a bug + private fun removeMissingCustomLayouts(context: Context) { val prefs = context.prefs() - val additionalSubtypes = prefs.getString(Settings.PREF_ADDITIONAL_SUBTYPES, Defaults.PREF_ADDITIONAL_SUBTYPES)!!.split(Separators.SETS) - val customLayoutFiles by lazy { LayoutUtilsCustom.getLayoutFiles(LayoutType.MAIN, context).map { it.name } } - val subtypesToRemove = mutableListOf() - additionalSubtypes.forEach { - val name = it.toSettingsSubtype().mainLayoutName() ?: SubtypeLocaleUtils.QWERTY - if (!LayoutUtilsCustom.isCustomLayout(name)) return@forEach - if (name !in customLayoutFiles) - subtypesToRemove.add(it) + val additionalSubtypes = prefs.getString(Settings.PREF_ADDITIONAL_SUBTYPES, Defaults.PREF_ADDITIONAL_SUBTYPES)!! + .split(Separators.SETS).map { it.toSettingsSubtype() } + additionalSubtypes.forEach { subtype -> + val layouts = LayoutType.getLayoutMap(subtype.getExtraValueOf(KEYBOARD_LAYOUT_SET) ?: "") + if (LayoutUtilsCustom.removeMissingLayouts(layouts, context)) { + // layout file is missing -> adjust the subtype to use the modified layout map + val newSubtype = if (layouts.isEmpty()) subtype.without(KEYBOARD_LAYOUT_SET) + else subtype.with(KEYBOARD_LAYOUT_SET, layouts.toExtraValue()) + SubtypeUtilsAdditional.changeAdditionalSubtype(subtype, newSubtype, context) + val message = "removing custom layouts without file from subtype $subtype" + if (DebugFlags.DEBUG_ENABLED) + Toast.makeText(context, message, Toast.LENGTH_LONG).show() + Log.w(TAG, message) + // we return here, because changeAdditionalSubtype calls reloadEnabledSubtypes, which calls this method + return + } } - if (subtypesToRemove.isEmpty()) return - Log.w(TAG, "removing custom subtypes without main layout files: $subtypesToRemove") - // todo: now we have a qwerty fallback anyway, consider removing this method (makes bugs more obvious to users) - prefs.edit().putString(Settings.PREF_ADDITIONAL_SUBTYPES, additionalSubtypes.filterNot { it in subtypesToRemove }.joinToString(Separators.SETS)).apply() } private fun loadAdditionalSubtypes(prefs: SharedPreferences) { From d9f17733d9c2e2075028767197add0a0dea4d1ce Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Mon, 21 Apr 2025 09:06:41 +0300 Subject: [PATCH 070/175] Make settings screens fully usable on Android 15 (#1484) enable edge to edge in settings for all Android versions to avoid minor glitches and have more consistent appearance --- .../keyboard/settings/SearchScreen.kt | 71 ++-- .../keyboard/settings/SettingsActivity.kt | 18 +- .../settings/screens/MainSettingsScreen.kt | 113 +++--- .../screens/PersonalDictionaryScreen.kt | 3 + .../settings/screens/SubtypeScreen.kt | 325 ++++++++++-------- 5 files changed, 301 insertions(+), 229 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt b/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt index 8fd287bf7..dec486ef5 100644 --- a/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt @@ -6,9 +6,14 @@ import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.ime import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBars +import androidx.compose.foundation.layout.union import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState @@ -20,6 +25,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextField @@ -58,36 +64,41 @@ fun SearchSettingsScreen( content = { if (content != null) content() else { - Column(Modifier.verticalScroll(rememberScrollState())) { - settings.forEach { - if (it is Int) { - PreferenceCategory(stringResource(it)) - } else { - // this only animates appearing prefs - // a solution would be using a list(visible to key) - AnimatedVisibility(visible = it != null) { - if (it != null) - SettingsActivity.settingsContainer[it]?.Preference() + Scaffold(contentWindowInsets = WindowInsets.systemBars.union(WindowInsets.ime)) { innerPadding -> + Column( + Modifier.verticalScroll(rememberScrollState()) + .then(Modifier.padding(bottom = innerPadding.calculateBottomPadding())) + ) { + settings.forEach { + if (it is Int) { + PreferenceCategory(stringResource(it)) + } else { + // this only animates appearing prefs + // a solution would be using a list(visible to key) + AnimatedVisibility(visible = it != null) { + if (it != null) + SettingsActivity.settingsContainer[it]?.Preference() + } } } } + // lazyColumn has janky scroll for a while (not sure why compose gets smoother after a while) + // maybe related to unnecessary recompositions? but even for just displaying text it's there + // didn't manage to improve things with @Immutable list wrapper and other lazy list hints + // so for now: just use "normal" Column + // even though it takes up to ~50% longer to load it's much better UX + // and the missing appear animations could be added + // LazyColumn { + // items(prefs.filterNotNull(), key = { it }) { + // Box(Modifier.animateItem()) { + // if (it is Int) + // PreferenceCategory(stringResource(it)) + // else + // SettingsActivity.settingsContainer[it]!!.Preference() + // } + // } + // } } - // lazyColumn has janky scroll for a while (not sure why compose gets smoother after a while) - // maybe related to unnecessary recompositions? but even for just displaying text it's there - // didn't manage to improve things with @Immutable list wrapper and other lazy list hints - // so for now: just use "normal" Column - // even though it takes up to ~50% longer to load it's much better UX - // and the missing appear animations could be added -// LazyColumn { -// items(prefs.filterNotNull(), key = { it }) { -// Box(Modifier.animateItem()) { -// if (it is Int) -// PreferenceCategory(stringResource(it)) -// else -// SettingsActivity.settingsContainer[it]!!.Preference() -// } -// } -// } } }, filteredItems = { SettingsActivity.settingsContainer.filter(it) }, @@ -195,9 +206,11 @@ fun SearchScreen( } } else { val items = filteredItems(searchText.text) - LazyColumn { - items(items) { - itemContent(it) + Scaffold(contentWindowInsets = WindowInsets.systemBars.union(WindowInsets.ime)) { innerPadding -> + LazyColumn(contentPadding = PaddingValues.Absolute(bottom = innerPadding.calculateBottomPadding())) { + items(items) { + itemContent(it) + } } } } diff --git a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt index acb74220a..b0cc0d461 100644 --- a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt +++ b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt @@ -12,7 +12,14 @@ import android.view.WindowInsets.Type import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import androidx.activity.ComponentActivity +import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.ime +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBars +import androidx.compose.foundation.layout.union +import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.collectAsState @@ -20,6 +27,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView import androidx.core.view.ViewCompat import helium314.keyboard.compat.locale @@ -98,9 +106,11 @@ class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferen || !UncachedInputMethodManagerUtils.isThisImeEnabled(this, imm) ) } if (spellchecker) - Column { // lazy way of implementing spell checker settings - settingsContainer[Settings.PREF_USE_CONTACTS]!!.Preference() - settingsContainer[Settings.PREF_BLOCK_POTENTIALLY_OFFENSIVE]!!.Preference() + Scaffold(contentWindowInsets = WindowInsets.systemBars.union(WindowInsets.ime)) { innerPadding -> + Column(Modifier.padding(innerPadding)) { // lazy way of implementing spell checker settings + settingsContainer[Settings.PREF_USE_CONTACTS]!!.Preference() + settingsContainer[Settings.PREF_BLOCK_POTENTIALLY_OFFENSIVE]!!.Preference() + } } else SettingsNavHost(onClickBack = { this.finish() }) @@ -143,6 +153,8 @@ class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferen } intent = null } + + enableEdgeToEdge() } override fun onStart() { diff --git a/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt index 85fde377a..87ba842b6 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt @@ -2,8 +2,14 @@ package helium314.keyboard.settings.screens import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.ime +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBars +import androidx.compose.foundation.layout.union import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -42,59 +48,64 @@ fun MainSettingsScreen( settings = emptyList(), ) { val enabledSubtypes = SubtypeSettings.getEnabledSubtypes(true) - Column(Modifier.verticalScroll(rememberScrollState())) { - Preference( - name = stringResource(R.string.language_and_layouts_title), - description = enabledSubtypes.joinToString(", ") { it.displayName(ctx) }, - onClick = onClickLanguage, - icon = R.drawable.ic_settings_languages - ) { NextScreenIcon() } - Preference( - name = stringResource(R.string.settings_screen_preferences), - onClick = onClickPreferences, - icon = R.drawable.ic_settings_preferences - ) { NextScreenIcon() } - Preference( - name = stringResource(R.string.settings_screen_appearance), - onClick = onClickAppearance, - icon = R.drawable.ic_settings_appearance - ) { NextScreenIcon() } - Preference( - name = stringResource(R.string.settings_screen_toolbar), - onClick = onClickToolbar, - icon = R.drawable.ic_settings_toolbar - ) { NextScreenIcon() } - if (JniUtils.sHaveGestureLib) + Scaffold(contentWindowInsets = WindowInsets.systemBars.union(WindowInsets.ime)) { innerPadding -> + Column( + Modifier.verticalScroll(rememberScrollState()) + .then(Modifier.padding(bottom = innerPadding.calculateBottomPadding())) + ) { Preference( - name = stringResource(R.string.settings_screen_gesture), - onClick = onClickGestureTyping, - icon = R.drawable.ic_settings_gesture + name = stringResource(R.string.language_and_layouts_title), + description = enabledSubtypes.joinToString(", ") { it.displayName(ctx) }, + onClick = onClickLanguage, + icon = R.drawable.ic_settings_languages ) { NextScreenIcon() } - Preference( - name = stringResource(R.string.settings_screen_correction), - onClick = onClickTextCorrection, - icon = R.drawable.ic_settings_correction - ) { NextScreenIcon() } - Preference( - name = stringResource(R.string.settings_screen_secondary_layouts), - onClick = onClickLayouts, - icon = R.drawable.ic_ime_switcher - ) { NextScreenIcon() } - Preference( - name = stringResource(R.string.dictionary_settings_category), - onClick = onClickDictionaries, - icon = R.drawable.ic_dictionary - ) { NextScreenIcon() } - Preference( - name = stringResource(R.string.settings_screen_advanced), - onClick = onClickAdvanced, - icon = R.drawable.ic_settings_advanced - ) { NextScreenIcon() } - Preference( - name = stringResource(R.string.settings_screen_about), - onClick = onClickAbout, - icon = R.drawable.ic_settings_about - ) { NextScreenIcon() } + Preference( + name = stringResource(R.string.settings_screen_preferences), + onClick = onClickPreferences, + icon = R.drawable.ic_settings_preferences + ) { NextScreenIcon() } + Preference( + name = stringResource(R.string.settings_screen_appearance), + onClick = onClickAppearance, + icon = R.drawable.ic_settings_appearance + ) { NextScreenIcon() } + Preference( + name = stringResource(R.string.settings_screen_toolbar), + onClick = onClickToolbar, + icon = R.drawable.ic_settings_toolbar + ) { NextScreenIcon() } + if (JniUtils.sHaveGestureLib) + Preference( + name = stringResource(R.string.settings_screen_gesture), + onClick = onClickGestureTyping, + icon = R.drawable.ic_settings_gesture + ) { NextScreenIcon() } + Preference( + name = stringResource(R.string.settings_screen_correction), + onClick = onClickTextCorrection, + icon = R.drawable.ic_settings_correction + ) { NextScreenIcon() } + Preference( + name = stringResource(R.string.settings_screen_secondary_layouts), + onClick = onClickLayouts, + icon = R.drawable.ic_ime_switcher + ) { NextScreenIcon() } + Preference( + name = stringResource(R.string.dictionary_settings_category), + onClick = onClickDictionaries, + icon = R.drawable.ic_dictionary + ) { NextScreenIcon() } + Preference( + name = stringResource(R.string.settings_screen_advanced), + onClick = onClickAdvanced, + icon = R.drawable.ic_settings_advanced + ) { NextScreenIcon() } + Preference( + name = stringResource(R.string.settings_screen_about), + onClick = onClickAbout, + icon = R.drawable.ic_settings_about + ) { NextScreenIcon() } + } } } } diff --git a/app/src/main/java/helium314/keyboard/settings/screens/PersonalDictionaryScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/PersonalDictionaryScreen.kt index a7bb82f2c..8d5527442 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/PersonalDictionaryScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/PersonalDictionaryScreen.kt @@ -10,7 +10,9 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.ExtendedFloatingActionButton @@ -177,6 +179,7 @@ fun PersonalDictionaryScreen( text = { Text(stringResource(R.string.user_dict_add_word_button)) }, icon = { Icon(painter = painterResource(R.drawable.ic_edit), stringResource(R.string.user_dict_add_word_button)) }, modifier = Modifier.wrapContentSize(Alignment.BottomEnd).padding(all = 12.dp) + .then(Modifier.systemBarsPadding().imePadding()) ) } diff --git a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt index 6dd6cbef3..d11c5bdbf 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt @@ -4,8 +4,12 @@ import android.content.Context import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.ime import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBars +import androidx.compose.foundation.layout.union import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -13,6 +17,7 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Switch import androidx.compose.material3.Text @@ -140,163 +145,191 @@ fun SubtypeScreen( itemContent = { }, filteredItems = { emptyList() } ) { - Column( - modifier = Modifier.verticalScroll(scrollState).padding(horizontal = 12.dp), - verticalArrangement = Arrangement.spacedBy(8.dp), - ) { - MainLayoutRow(currentSubtype, customMainLayouts) { setCurrentSubtype(it) } - if (availableLocalesForScript.size > 1) { - WithSmallTitle(stringResource(R.string.secondary_locale)) { - TextButton(onClick = { showSecondaryLocaleDialog = true }) { - val text = getSecondaryLocales(currentSubtype.extraValues).joinToString(", ") { - it.localizedDisplayName(ctx) - }.ifEmpty { stringResource(R.string.action_none) } - Text(text, Modifier.fillMaxWidth()) - } - } - } - Row { - TextButton(onClick = { showKeyOrderDialog = true }, Modifier.weight(1f)) - { Text(stringResource(R.string.popup_order)) } - DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) == null) { - setCurrentSubtype(currentSubtype.without(ExtraValue.POPUP_ORDER)) - } - } - Row { - TextButton(onClick = { showHintOrderDialog = true }, Modifier.weight(1f)) - { Text(stringResource(R.string.hint_source)) } - DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.HINT_ORDER) == null) { - setCurrentSubtype(currentSubtype.without(ExtraValue.HINT_ORDER)) - } - } - if (currentSubtype.locale.script() == ScriptUtils.SCRIPT_LATIN) { - WithSmallTitle(stringResource(R.string.show_popup_keys_title)) { - val explicitValue = currentSubtype.getExtraValueOf(ExtraValue.MORE_POPUPS) - val value = explicitValue ?: prefs.getString(Settings.PREF_MORE_POPUP_KEYS, Defaults.PREF_MORE_POPUP_KEYS)!! - Row { - TextButton(onClick = { showMorePopupsDialog = true }, Modifier.weight(1f)) - { Text(stringResource(morePopupKeysResId(value))) } - DefaultButton(explicitValue == null) { - setCurrentSubtype(currentSubtype.without(ExtraValue.MORE_POPUPS)) + Scaffold(contentWindowInsets = WindowInsets.systemBars.union(WindowInsets.ime)) { innerPadding -> + Column( + modifier = Modifier.verticalScroll(scrollState).padding(horizontal = 12.dp) + .then(Modifier.padding(bottom = innerPadding.calculateBottomPadding())), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + MainLayoutRow(currentSubtype, customMainLayouts) { setCurrentSubtype(it) } + if (availableLocalesForScript.size > 1) { + WithSmallTitle(stringResource(R.string.secondary_locale)) { + TextButton(onClick = { showSecondaryLocaleDialog = true }) { + val text = getSecondaryLocales(currentSubtype.extraValues).joinToString(", ") { + it.localizedDisplayName(ctx) + }.ifEmpty { stringResource(R.string.action_none) } + Text(text, Modifier.fillMaxWidth()) } } } - } - if (hasLocalizedNumberRow(currentSubtype.locale, ctx)) { - Row(verticalAlignment = Alignment.CenterVertically) { - val checked = currentSubtype.getExtraValueOf(ExtraValue.LOCALIZED_NUMBER_ROW)?.toBoolean() - Text(stringResource(R.string.localized_number_row), Modifier.weight(1f)) - Switch( - checked = checked ?: prefs.getBoolean(Settings.PREF_LOCALIZED_NUMBER_ROW, Defaults.PREF_LOCALIZED_NUMBER_ROW), - onCheckedChange = { - setCurrentSubtype(currentSubtype.with(ExtraValue.LOCALIZED_NUMBER_ROW, it.toString())) - } - ) - DefaultButton(checked == null) { - setCurrentSubtype(currentSubtype.without(ExtraValue.LOCALIZED_NUMBER_ROW)) + Row { + TextButton(onClick = { showKeyOrderDialog = true }, Modifier.weight(1f)) + { Text(stringResource(R.string.popup_order)) } + DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) == null) { + setCurrentSubtype(currentSubtype.without(ExtraValue.POPUP_ORDER)) } } - } - HorizontalDivider() - Text(stringResource(R.string.settings_screen_secondary_layouts), style = MaterialTheme.typography.titleMedium) - LayoutType.entries.forEach { type -> - if (type == LayoutType.MAIN) return@forEach - WithSmallTitle(stringResource(type.displayNameId)) { - val explicitLayout = currentSubtype.layoutName(type) - val layout = explicitLayout ?: Settings.readDefaultLayoutName(type, prefs) - val defaultLayouts = LayoutUtils.getAvailableLayouts(type, ctx) - val customLayouts = LayoutUtilsCustom.getLayoutFiles(type, ctx).map { it.name } - DropDownField( - items = defaultLayouts + customLayouts, - selectedItem = layout, - onSelected = { - setCurrentSubtype(currentSubtype.withLayout(type, it)) - }, - extraButton = { DefaultButton(explicitLayout == null) { - setCurrentSubtype(currentSubtype.withoutLayout(type)) - } }, - ) { - val displayName = if (LayoutUtilsCustom.isCustomLayout(it)) LayoutUtilsCustom.getDisplayName(it) - else it.getStringResourceOrName("layout_", ctx) - var showLayoutEditDialog by remember { mutableStateOf(false) } - Row( - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.fillMaxWidth() + Row { + TextButton(onClick = { showHintOrderDialog = true }, Modifier.weight(1f)) + { Text(stringResource(R.string.hint_source)) } + DefaultButton(currentSubtype.getExtraValueOf(ExtraValue.HINT_ORDER) == null) { + setCurrentSubtype(currentSubtype.without(ExtraValue.HINT_ORDER)) + } + } + if (currentSubtype.locale.script() == ScriptUtils.SCRIPT_LATIN) { + WithSmallTitle(stringResource(R.string.show_popup_keys_title)) { + val explicitValue = currentSubtype.getExtraValueOf(ExtraValue.MORE_POPUPS) + val value = explicitValue ?: prefs.getString( + Settings.PREF_MORE_POPUP_KEYS, + Defaults.PREF_MORE_POPUP_KEYS + )!! + Row { + TextButton(onClick = { showMorePopupsDialog = true }, Modifier.weight(1f)) + { Text(stringResource(morePopupKeysResId(value))) } + DefaultButton(explicitValue == null) { + setCurrentSubtype(currentSubtype.without(ExtraValue.MORE_POPUPS)) + } + } + } + } + if (hasLocalizedNumberRow(currentSubtype.locale, ctx)) { + Row(verticalAlignment = Alignment.CenterVertically) { + val checked = currentSubtype.getExtraValueOf(ExtraValue.LOCALIZED_NUMBER_ROW)?.toBoolean() + Text(stringResource(R.string.localized_number_row), Modifier.weight(1f)) + Switch( + checked = checked ?: prefs.getBoolean( + Settings.PREF_LOCALIZED_NUMBER_ROW, + Defaults.PREF_LOCALIZED_NUMBER_ROW + ), + onCheckedChange = { + setCurrentSubtype(currentSubtype.with(ExtraValue.LOCALIZED_NUMBER_ROW, it.toString())) + } + ) + DefaultButton(checked == null) { + setCurrentSubtype(currentSubtype.without(ExtraValue.LOCALIZED_NUMBER_ROW)) + } + } + } + HorizontalDivider() + Text( + stringResource(R.string.settings_screen_secondary_layouts), + style = MaterialTheme.typography.titleMedium + ) + LayoutType.entries.forEach { type -> + if (type == LayoutType.MAIN) return@forEach + WithSmallTitle(stringResource(type.displayNameId)) { + val explicitLayout = currentSubtype.layoutName(type) + val layout = explicitLayout ?: Settings.readDefaultLayoutName(type, prefs) + val defaultLayouts = LayoutUtils.getAvailableLayouts(type, ctx) + val customLayouts = LayoutUtilsCustom.getLayoutFiles(type, ctx).map { it.name } + DropDownField( + items = defaultLayouts + customLayouts, + selectedItem = layout, + onSelected = { + setCurrentSubtype(currentSubtype.withLayout(type, it)) + }, + extraButton = { + DefaultButton(explicitLayout == null) { + setCurrentSubtype(currentSubtype.withoutLayout(type)) + } + }, ) { - Text(displayName) - if (LayoutUtilsCustom.isCustomLayout(it)) - IconButton({ showLayoutEditDialog = true }) { Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout)) } + val displayName = + if (LayoutUtilsCustom.isCustomLayout(it)) LayoutUtilsCustom.getDisplayName(it) + else it.getStringResourceOrName("layout_", ctx) + var showLayoutEditDialog by remember { mutableStateOf(false) } + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth() + ) { + Text(displayName) + if (LayoutUtilsCustom.isCustomLayout(it)) + IconButton({ + showLayoutEditDialog = true + }) { + Icon( + painterResource(R.drawable.ic_edit), + stringResource(R.string.edit_layout) + ) + } + } + if (showLayoutEditDialog) + LayoutEditDialog( + onDismissRequest = { showLayoutEditDialog = false }, + layoutType = type, + initialLayoutName = it, + isNameValid = null + ) } - if (showLayoutEditDialog) - LayoutEditDialog( - onDismissRequest = { showLayoutEditDialog = false }, - layoutType = type, - initialLayoutName = it, - isNameValid = null - ) } } } } - } - if (showSecondaryLocaleDialog) - MultiListPickerDialog( - onDismissRequest = { showSecondaryLocaleDialog = false }, - onConfirmed = { locales -> - val newValue = locales.joinToString(Separators.KV) { it.toLanguageTag() } - setCurrentSubtype( - if (newValue.isEmpty()) currentSubtype.without(ExtraValue.SECONDARY_LOCALES) - else currentSubtype.with(ExtraValue.SECONDARY_LOCALES, newValue) - ) - }, - title = { Text(stringResource(R.string.locales_with_dict)) }, - items = availableLocalesForScript, - initialSelection = currentSubtype.getExtraValueOf(ExtraValue.SECONDARY_LOCALES) - ?.split(Separators.KV)?.map { it.constructLocale() }.orEmpty(), - getItemName = { it.localizedDisplayName(ctx) } - ) - if (showKeyOrderDialog) { - val setting = currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) - PopupOrderDialog( - onDismissRequest = { showKeyOrderDialog = false }, - initialValue = setting ?: prefs.getString(Settings.PREF_POPUP_KEYS_ORDER, Defaults.PREF_POPUP_KEYS_ORDER)!!, - title = stringResource(R.string.popup_order), - showDefault = setting != null, - onConfirmed = { - setCurrentSubtype( - if (it == null) currentSubtype.without(ExtraValue.POPUP_ORDER) - else currentSubtype.with(ExtraValue.POPUP_ORDER, it) - ) - } - ) - } - if (showHintOrderDialog) { - val setting = currentSubtype.getExtraValueOf(ExtraValue.HINT_ORDER) - PopupOrderDialog( - onDismissRequest = { showHintOrderDialog = false }, - initialValue = setting ?: prefs.getString(Settings.PREF_POPUP_KEYS_LABELS_ORDER, Defaults.PREF_POPUP_KEYS_LABELS_ORDER)!!, - title = stringResource(R.string.hint_source), - showDefault = setting != null, - onConfirmed = { - setCurrentSubtype( - if (it == null) currentSubtype.without(ExtraValue.HINT_ORDER) - else currentSubtype.with(ExtraValue.HINT_ORDER, it) - ) - } - ) - } - if (showMorePopupsDialog) { - val items = listOf(POPUP_KEYS_NORMAL, POPUP_KEYS_MAIN, POPUP_KEYS_MORE, POPUP_KEYS_ALL) - val explicitValue = currentSubtype.getExtraValueOf(ExtraValue.MORE_POPUPS) - val value = explicitValue ?: prefs.getString(Settings.PREF_MORE_POPUP_KEYS, Defaults.PREF_MORE_POPUP_KEYS) - ListPickerDialog( - onDismissRequest = { showMorePopupsDialog = false }, - items = items, - getItemName = { stringResource(morePopupKeysResId(it)) }, - selectedItem = value, - onItemSelected = { setCurrentSubtype(currentSubtype.with(ExtraValue.MORE_POPUPS, it)) } - ) + if (showSecondaryLocaleDialog) + MultiListPickerDialog( + onDismissRequest = { showSecondaryLocaleDialog = false }, + onConfirmed = { locales -> + val newValue = locales.joinToString(Separators.KV) { it.toLanguageTag() } + setCurrentSubtype( + if (newValue.isEmpty()) currentSubtype.without(ExtraValue.SECONDARY_LOCALES) + else currentSubtype.with(ExtraValue.SECONDARY_LOCALES, newValue) + ) + }, + title = { Text(stringResource(R.string.locales_with_dict)) }, + items = availableLocalesForScript, + initialSelection = currentSubtype.getExtraValueOf(ExtraValue.SECONDARY_LOCALES) + ?.split(Separators.KV)?.map { it.constructLocale() }.orEmpty(), + getItemName = { it.localizedDisplayName(ctx) } + ) + if (showKeyOrderDialog) { + val setting = currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) + PopupOrderDialog( + onDismissRequest = { showKeyOrderDialog = false }, + initialValue = setting ?: prefs.getString( + Settings.PREF_POPUP_KEYS_ORDER, + Defaults.PREF_POPUP_KEYS_ORDER + )!!, + title = stringResource(R.string.popup_order), + showDefault = setting != null, + onConfirmed = { + setCurrentSubtype( + if (it == null) currentSubtype.without(ExtraValue.POPUP_ORDER) + else currentSubtype.with(ExtraValue.POPUP_ORDER, it) + ) + } + ) + } + if (showHintOrderDialog) { + val setting = currentSubtype.getExtraValueOf(ExtraValue.HINT_ORDER) + PopupOrderDialog( + onDismissRequest = { showHintOrderDialog = false }, + initialValue = setting ?: prefs.getString( + Settings.PREF_POPUP_KEYS_LABELS_ORDER, + Defaults.PREF_POPUP_KEYS_LABELS_ORDER + )!!, + title = stringResource(R.string.hint_source), + showDefault = setting != null, + onConfirmed = { + setCurrentSubtype( + if (it == null) currentSubtype.without(ExtraValue.HINT_ORDER) + else currentSubtype.with(ExtraValue.HINT_ORDER, it) + ) + } + ) + } + if (showMorePopupsDialog) { + val items = listOf(POPUP_KEYS_NORMAL, POPUP_KEYS_MAIN, POPUP_KEYS_MORE, POPUP_KEYS_ALL) + val explicitValue = currentSubtype.getExtraValueOf(ExtraValue.MORE_POPUPS) + val value = explicitValue ?: prefs.getString(Settings.PREF_MORE_POPUP_KEYS, Defaults.PREF_MORE_POPUP_KEYS) + ListPickerDialog( + onDismissRequest = { showMorePopupsDialog = false }, + items = items, + getItemName = { stringResource(morePopupKeysResId(it)) }, + selectedItem = value, + onItemSelected = { setCurrentSubtype(currentSubtype.with(ExtraValue.MORE_POPUPS, it)) } + ) + } } } From 7e59bcc799c66895bdf62840d622dc80bdf13d8b Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 21 Apr 2025 08:29:50 +0200 Subject: [PATCH 071/175] remove weird workaround to get acceptable layout edit dialog positioning not necessary any more after enabling edge to edge --- .../keyboard/settings/SettingsActivity.kt | 10 ---------- .../keyboard/settings/dialogs/LayoutEditDialog.kt | 15 +++++++-------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt index b0cc0d461..c1e249030 100644 --- a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt +++ b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt @@ -79,16 +79,6 @@ class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferen setSystemBarIconColor() val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - // with this the layout edit dialog is not covered by the keyboard - // alternative of Modifier.imePadding() and properties = DialogProperties(decorFitsSystemWindows = false) has other weird side effects - ViewCompat.setOnApplyWindowInsetsListener(window.decorView.rootView) { _, insets -> - @Suppress("DEPRECATION") - bottomInsets.value = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) - insets.getInsets(Type.ime()).bottom - else insets.systemWindowInsetBottom - insets - } - settingsContainer = SettingsContainer(this) val spellchecker = intent?.getBooleanExtra("spellchecker", false) ?: false diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutEditDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutEditDialog.kt index 81a3c0451..f50af816d 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutEditDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutEditDialog.kt @@ -2,11 +2,14 @@ package helium314.keyboard.settings.dialogs import android.widget.Toast -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.exclude +import androidx.compose.foundation.layout.ime +import androidx.compose.foundation.layout.systemBars +import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.rememberCoroutineScope @@ -14,7 +17,6 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview @@ -50,7 +52,6 @@ fun LayoutEditDialog( val ctx = LocalContext.current val scope = rememberCoroutineScope() val startIsCustom = LayoutUtilsCustom.isCustomLayout(initialLayoutName) - val bottomInsets by SettingsActivity.bottomInsets.collectAsState() var displayNameValue by rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue( if (startIsCustom) LayoutUtilsCustom.getDisplayName(initialLayoutName) @@ -110,10 +111,8 @@ fun LayoutEditDialog( } valid && nameValid // don't allow saving with invalid name, but inform user about issues with layout content }, - // this looks weird when the text field is not covered by the keyboard (long dialog) - // but better than not seeing the bottom part of the field... - modifier = Modifier.padding(bottom = with(LocalDensity.current) - { (bottomInsets / 2 + 36).toDp() }), // why is the /2 necessary? + // why is exclude(WindowInsets.systemBars) necessary? + modifier = Modifier.windowInsetsPadding(WindowInsets.ime.exclude(WindowInsets.systemBars)), reducePadding = true, ) } From 46f92276159134660069f3af194bd43908940562 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 21 Apr 2025 09:48:22 +0200 Subject: [PATCH 072/175] properly reload emoji keyboards (fixes split layout change not shown) --- .../helium314/keyboard/keyboard/KeyboardSwitcher.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java index aeb07b9e3..defdbe5e7 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java @@ -515,9 +515,11 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { } public void reloadKeyboard() { - if (mCurrentInputView != null) - loadKeyboard(mLatinIME.getCurrentInputEditorInfo(), Settings.getValues(), - mLatinIME.getCurrentAutoCapsState(), mLatinIME.getCurrentRecapitalizeState()); + if (mCurrentInputView == null) + return; + mEmojiPalettesView.clearKeyboardCache(); + loadKeyboard(mLatinIME.getCurrentInputEditorInfo(), Settings.getValues(), + mLatinIME.getCurrentAutoCapsState(), mLatinIME.getCurrentRecapitalizeState()); } /** From 49ed863a7ef27e0b6e603ebb67ae7d7f6daa6a21 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 21 Apr 2025 10:23:49 +0200 Subject: [PATCH 073/175] upgrade version and translations --- app/build.gradle.kts | 8 +- .../main/assets/dictionaries_in_dict_repo.csv | 1 + app/src/main/res/values-bg/strings.xml | 2 + app/src/main/res/values-bn/strings.xml | 2 + app/src/main/res/values-ca/strings.xml | 2 + app/src/main/res/values-cs/strings.xml | 122 ++++++++++++++- app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-et/strings.xml | 2 + app/src/main/res/values-fr/strings.xml | 2 + app/src/main/res/values-it/strings.xml | 6 +- app/src/main/res/values-kab/strings.xml | 13 +- app/src/main/res/values-nl/strings.xml | 12 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 141 +++++++----------- app/src/main/res/values-zh-rCN/strings.xml | 2 + .../metadata/android/ar/changelogs/3004.txt | 11 ++ .../metadata/android/ar/changelogs/3005.txt | 11 ++ .../metadata/android/ca/changelogs/3004.txt | 11 ++ .../metadata/android/ca/changelogs/3005.txt | 11 ++ .../android/cs-CZ/changelogs/3004.txt | 11 ++ .../android/cs-CZ/changelogs/3005.txt | 11 ++ .../android/cs-CZ/full_description.txt | 30 ++++ .../android/en-US/changelogs/3005.txt | 11 ++ .../metadata/android/et/changelogs/3004.txt | 11 ++ .../metadata/android/et/changelogs/3005.txt | 11 ++ .../android/it-IT/changelogs/3004.txt | 11 ++ .../android/it-IT/changelogs/3005.txt | 11 ++ .../android/nl-NL/changelogs/3004.txt | 11 ++ .../android/nl-NL/changelogs/3005.txt | 11 ++ 29 files changed, 386 insertions(+), 105 deletions(-) create mode 100644 fastlane/metadata/android/ar/changelogs/3004.txt create mode 100644 fastlane/metadata/android/ar/changelogs/3005.txt create mode 100644 fastlane/metadata/android/ca/changelogs/3004.txt create mode 100644 fastlane/metadata/android/ca/changelogs/3005.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/3004.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/3005.txt create mode 100644 fastlane/metadata/android/cs-CZ/full_description.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/3005.txt create mode 100644 fastlane/metadata/android/et/changelogs/3004.txt create mode 100644 fastlane/metadata/android/et/changelogs/3005.txt create mode 100644 fastlane/metadata/android/it-IT/changelogs/3004.txt create mode 100644 fastlane/metadata/android/it-IT/changelogs/3005.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/3004.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/3005.txt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 33b81b127..029d4cbaa 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,8 +13,8 @@ android { applicationId = "helium314.keyboard" minSdk = 21 targetSdk = 35 - versionCode = 3004 - versionName = "3.0-beta1" + versionCode = 3005 + versionName = "3.0-beta2" ndk { abiFilters.clear() abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) @@ -43,7 +43,7 @@ android { applicationIdSuffix = ".debug" } create("runTests") { // build variant for running tests on CI that skips tests known to fail - isMinifyEnabled = true + isMinifyEnabled = false isJniDebuggable = false } create("debugNoMinify") { // for faster builds in IDE @@ -69,7 +69,7 @@ android { } ndkVersion = "28.0.13004108" - packagingOptions { + packaging { jniLibs { // shrinks APK by 3 MB, zipped size unchanged useLegacyPackaging = true diff --git a/app/src/main/assets/dictionaries_in_dict_repo.csv b/app/src/main/assets/dictionaries_in_dict_repo.csv index 8b38e33cc..2cc1541fa 100644 --- a/app/src/main/assets/dictionaries_in_dict_repo.csv +++ b/app/src/main/assets/dictionaries_in_dict_repo.csv @@ -20,6 +20,7 @@ emoji,fr, main,fr, main,gl, main,ka, +main,de_CH, main,de, main,gom, main,el, diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 5b4e1fb84..b3ec60fd4 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -481,4 +481,6 @@ Обратен интервал връща автоматичното коригиране Shift премахва чакащия автоматичен интервал Формат на клавиша за времево клеймо + Сото + Дагбани diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index c679923ee..865c5d24f 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -445,4 +445,6 @@ পরামর্শ বাছাইয়ের পরে স্বয়ংক্রিয় স্পেস শিফট অনিষ্পাদিত স্বয়ংক্রিয় স্পেস অপসারণ করবে টাইমস্ট্যাম্প বোতামের ফরম্যাট + সেসুতু + ডাগবানি diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 6f2970007..0f77c17d2 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -444,4 +444,6 @@ Retrocès reverteix l\'auto-correcció Espai automàtic després de triar suggeriment Format de la clau de marca de temps + Dagbani + Sesotho diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 679087598..a5912e53a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -48,7 +48,7 @@ "Angličtina (Velká Británie)" "Angličtina (USA)" "Španělština (USA)" - hinglish + Hinglish srbština (Latinka) "Angličtina (Velká Británie) (%s)" "Angličtina (USA) (%s)" @@ -139,7 +139,7 @@ Vzhled podle systémového nastavení Nastavení HeliBoard Návrhy - Emoji klávesa + Klávesa pro emodži Abeceda (Workman) Pokud vypnuto, tlačítko schránky vloží obsah schránky, pokud nějaký existuje Abeceda (Colemak Mod-DH) @@ -218,7 +218,7 @@ Kaitag Zavřít historii schránky Výběr kláves panelu nástrojů schránky - Měřítko dolní výplně + Měřítko dolního odsazení Kaitag (%s) Zkopírovat stávající rozložení Nastavit název rozvržení @@ -308,7 +308,7 @@ \nVarování: načítání externího kódu může představovat bezpečnostní riziko. Používejte pouze knihovnu ze zdroje, kterému důvěřujete. Popis skrytých funkcí %s (Rozšířené) - ► Dlouhý stisk kláves na připnuté liště nástrojů vyvolá další funkce: <br> \n\t• schránka &#65515; vložit <br> \n\t• pohyb doleva/doprava &#65515; slovo doleva/doprava <br> \n\t• pohyb nahoru/dolů &#65515; stránka nahoru/dolů <br> \n\t• slovo doleva/doprava &#65515; začátek/konec řádku <br> \n\t• stránka nahoru/dolů &#65515; začátek/konec stránky <br> \n\t• kopírovat &#65515; vystřihnout <br> \n\t• vybrat slovo &#8596; vybrat vše <br> \n\t• zrušit &#8596; opakovat <br> <br> \n► Dlouhý stisk kláves v liště s návrhy je připne. <br> <br> \n► Dlouhý stisk klávesy čárky pro přístup k zobrazení schránky, zobrazení emoji, režimu pro jedno ruce, nastavení nebo přepnutí jazyka: <br> \n\t• Zobrazení emoji a přepnutí jazyka zmizí, pokud máte odpovídající klávesu povolenou; <br> \n\t• U některých rozložení to není klávesa čárky, ale klávesa na stejné pozici (např. u Dvorak rozložení je to klávesa \'q\'). <br> <br> \n► Při zapnutém inkognito režimu se nebudou učit žádná slova a žádná emoji nebudou přidána do historie. <br> <br> \n► Stiskněte ikonu inkognito pro přístup k liště nástrojů. <br> <br> \n► Posuvný vstup klávesy: Přejeďte od klávesy Shift na jinou klávesu pro napsání jednoho velkého písmene: <br> \n\t• Toto také funguje pro klávesu \'?123\' pro napsání jednoho symbolu z klávesnice symbolů a pro související klávesy. <br> <br> \n► Držte klávesu Shift nebo symbolu, stiskněte jednu nebo více kláves a pak uvolněte Shift nebo symbolovou klávesu pro návrat na předchozí klávesnici. <br> <br> \n► Dlouhý stisk návrhu v liště návrhů pro zobrazení více návrhů a tlačítko pro smazání tohoto návrhu. <br> <br> \n► Přejeďte prstem nahoru z návrhu pro otevření více návrhů a uvolněte prst na návrhu pro jeho výběr. <br> <br> \n► Dlouhý stisk položky v historii schránky pro její připnutí (udržení v schránce, dokud ji neodpinete). <br> <br> \n► Přejeďte prstem doleva ve zobrazení schránky pro odstranění položky (kromě případů, kdy je připnuta). <br> <br> \n► Vyberte text a stiskněte Shift pro přepínání mezi velkými písmeny, malými písmeny a velkými prvními písmeny slov. <br> <br> \n► Můžete přidat slovníky otevřením v průzkumníku souborů: <br> \n\t• Toto funguje pouze s <i>content-uris</i>, nikoliv s <i>file-uris</i>, což znamená, že to nemusí fungovat u některých průzkumníků souborů. <br> <br> \n► Pro uživatele provádějící manuální zálohy s root přístupem: <br> \n\t• Začínaje Androidem 7, soubor sdílených preferencí není na výchozím místě, protože aplikace používá %s. To je nutné, aby nastavení mohla být přečtena před odemknutím zařízení, např. při spuštění; <br> \n\t• Soubor se nachází v /data/user_de/0/package_id/shared_prefs/, i když to může záviset na zařízení a verzi Androidu. <br> <br> \n<i><b>Režim ladění / ladící APK</b></i> <br> <br> \n► Dlouhý stisk návrhu pro zobrazení zdrojového slovníku. <br> <br> \n► Při používání ladícího APK najdete Nastavení ladění v pokročilých preferencích, i když jejich užitečnost je omezená, kromě dumpování slovníků do logu. <br> \n\t• Pro vydané APK je nutné několikrát stisknout verzi v <i>O aplikaci</i>, poté najdete nastavení ladění v <i>Pokročilých preferencích</i>. <br> \n\t• Při povolení <i>Zobrazit informace o návrzích</i> budou návrhy mít malá čísla nahoře ukazující interní skóre a zdrojový slovník. <br> <br> \n► Při pádu aplikace budete vyzváni, zda chcete získat záznamy o pádu, když otevřete Nastavení. <br> <br> \n► Při používání vícejazyčného psaní bude klávesa mezerníku zobrazovat hodnotu důvěry, která se používá k určení aktuálně používaného jazyka. <br> <br> \n► Návrhy budou mít malá čísla nahoře ukazující interní skóre a zdrojový slovník (může být vypnuto). + ► Dlouhý stisk kláves na připnuté liště nástrojů vyvolá další funkce: <br> \n\t• schránka &#65515; vložit <br> \n\t• pohyb doleva/doprava &#65515; slovo doleva/doprava <br> \n\t• pohyb nahoru/dolů &#65515; stránka nahoru/dolů <br> \n\t• slovo doleva/doprava &#65515; začátek/konec řádku <br> \n\t• stránka nahoru/dolů &#65515; začátek/konec stránky <br> \n\t• kopírovat &#65515; vystřihnout <br> \n\t• vybrat slovo &#8596; vybrat vše <br> \n\t• zrušit &#8596; opakovat <br> <br> \n► Dlouhý stisk kláves v liště s návrhy je připne. <br> <br> \n► Dlouhý stisk klávesy čárky pro přístup k zobrazení schránky, zobrazení emodži, režimu pro jedno ruce, nastavení nebo přepnutí jazyka: <br> \n\t• Zobrazení emodži a přepnutí jazyka zmizí, pokud máte odpovídající klávesu povolenou; <br> \n\t• U některých rozložení to není klávesa čárky, ale klávesa na stejné pozici (např. u Dvorak rozložení je to klávesa \'q\'). <br> <br> \n► Při zapnutém inkognito režimu se nebudou učit žádná slova a žádná emodži nebudou přidána do historie. <br> <br> \n► Stiskněte ikonu inkognito pro přístup k liště nástrojů. <br> <br> \n► Posuvný vstup klávesy: Přejeďte od klávesy Shift na jinou klávesu pro napsání jednoho velkého písmene: <br> \n\t• Toto také funguje pro klávesu \'?123\' pro napsání jednoho symbolu z klávesnice symbolů a pro související klávesy. <br> <br> \n► Držte klávesu Shift nebo symbolu, stiskněte jednu nebo více kláves a pak uvolněte Shift nebo symbolovou klávesu pro návrat na předchozí klávesnici. <br> <br> \n► Dlouhý stisk návrhu v liště návrhů pro zobrazení více návrhů a tlačítko pro smazání tohoto návrhu. <br> <br> \n► Přejeďte prstem nahoru z návrhu pro otevření více návrhů a uvolněte prst na návrhu pro jeho výběr. <br> <br> \n► Dlouhý stisk položky v historii schránky pro její připnutí (udržení v schránce, dokud ji neodpinete). <br> <br> \n► Přejeďte prstem doleva ve zobrazení schránky pro odstranění položky (kromě případů, kdy je připnuta). <br> <br> \n► Vyberte text a stiskněte Shift pro přepínání mezi velkými písmeny, malými písmeny a velkými prvními písmeny slov. <br> <br> \n► Můžete přidat slovníky otevřením v průzkumníku souborů: <br> \n\t• Toto funguje pouze s <i>content-uris</i>, nikoliv s <i>file-uris</i>, což znamená, že to nemusí fungovat u některých průzkumníků souborů. <br> <br> \n► Pro uživatele provádějící manuální zálohy s root přístupem: <br> \n\t• Začínaje Androidem 7, soubor sdílených preferencí není na výchozím místě, protože aplikace používá %s. To je nutné, aby nastavení mohla být přečtena před odemknutím zařízení, např. při spuštění; <br> \n\t• Soubor se nachází v /data/user_de/0/package_id/shared_prefs/, i když to může záviset na zařízení a verzi Androidu. <br> <br> \n<i><b>Režim ladění / ladící APK</b></i> <br> <br> \n► Dlouhý stisk návrhu pro zobrazení zdrojového slovníku. <br> <br> \n► Při používání ladícího APK najdete Nastavení ladění v pokročilých preferencích, i když jejich užitečnost je omezená, kromě dumpování slovníků do logu. <br> \n\t• Pro vydané APK je nutné několikrát stisknout verzi v <i>O aplikaci</i>, poté najdete nastavení ladění v <i>Pokročilých preferencích</i>. <br> \n\t• Při povolení <i>Zobrazit informace o návrzích</i> budou návrhy mít malá čísla nahoře ukazující interní skóre a zdrojový slovník. <br> <br> \n► Při pádu aplikace budete vyzváni, zda chcete získat záznamy o pádu, když otevřete Nastavení. <br> <br> \n► Při používání vícejazyčného psaní bude klávesa mezerníku zobrazovat hodnotu důvěry, která se používá k určení aktuálně používaného jazyka. <br> <br> \n► Návrhy budou mít malá čísla nahoře ukazující interní skóre a zdrojový slovník (může být vypnuto). Nelze přečíst soubor Další symboly Telefon @@ -335,4 +335,118 @@ Mezerník Vzdálenost rozdělení (na šířku) Povolit rozdělenou klávesnici (na šířku) + Webová pole pro úpravu (nacházejí se převážně v prohlížečích) jsou velmi častou příčinou problémů s nastavením zobrazování návrhů + Nezobrazovat návrhy pro webová pole pro úpravu + Začátek stránky + Konec stránky + Stránka nahoru + Stránka dolů + Rozdělená klávesnice + Backspace vrátí automatickou opravu + Plovoucí náhled + Zobrazit navržené slovo během gest + Přesunout náhled během gesta + Vždy okamžitě začít + Nahradit vyskakovací okno tečky doménami nejvyšší úrovně při zadávání adres URL a e-mailových adres + Automatická mezera pov výběru návrhu + Automatická mezera po napsání slova gestem + Zakázat automatickou mezeru po stisku Shiftu + Shift odstraní čekající automatickou mezeru + Zobrazit vyskakovací klávesy domén + Formát pro klíč časové značky + Automaticky opravovat zkratky + Pokud je povoleno, mohou být zkratky rozbaleny automatickým opravením + Zpomalení rychlého psaní + Doba do zmizení stopy gesta + Automatická mezera před napsáním slova gestem + Navrhovat obsah schránky + Zobrazit nedávno zkopírovaný obsah jako návrh + Slovo doleva + Slovo doprava + Přidat velmi běžné varianty (výchozí) + Zobrazit nápovědy na číselném řádku + Jazyky se slovníky + Uložit do souboru + Připnout klávesu do panelu nástrojů při dlouhém podržení + Nastavit hlavní a až 6 dalších symbolů měny, oddělených mezerami + Neplatný název + Dolní řádek schránky + Dolní řádek emodži + Stisknutí klávesy Enter nebo mezerníku po ostatních klávesách v numerické klávesnici + Mezerník (číselné rozložení) + Změnit velikost režimu jedné ruky + Opravdu chcete resetovat všechny přizpůsobené ikony? + Číselný řádek (základní) + Shift (stisknutý) + Obsah zkopírován + %s (Baishakhi) + Ukončit režim jedné ruky + Vlastní text na mezerníku + Zobrazit další barvy + Načíst + Emodži + Hlasový vstup zakázán + Přizpůsobit měny + %s (fonetická) + Dargwa (Urakhi) + Zkopírovat do schránky + Přepsat verzi emodži + Tab + Caps Lock + Zobrazit / skrýt panel nástrojů + Nespojovač s nulovou šířkou + Přepnout numerickou klávesnici + Přizpůsobit kódy kláves v panelu nástrojů + Automaticky zobrazit panel nástrojů + Zobrazit panel nástrojů, když je spuštěn vstup nebo vybrán text + Automaticky skrýt panel nástrojů + Skrýt panel nástrojů, když jsou dostupné návrhy + Přizpůsobit ikony + Vlastní podtyp + Varování: rozložení se aktuálně používá + Opravdu chcete odstranit %s? + Nastavit vlastní písmo ze souboru + Urakhi (%s) + Nastavit obrázek na pozadí (na šířku) + Pokud není nastaven, bude použit obrázek na výšku + Načtením přepíšete aktuální motiv + Panel nástrojů + Kód dlouhého stisknutí + Přepnout stranu režimu jedné ruky + Spojovač s nulovou šířkou + Výběr emodži v zobrazení emodži + Odstranit přebytečné vyskakovací klávesy + Opravdu chcete vymazat všechny přizpůsobené kódy kláves? + Sekundární rozložení + Funkční klávesy (velká obrazovka) + Číselný řádek + Přepnout na hlavní klávesnici po… + Výběr záznamu v historii schránky + Stisknutí klávesy Enter nebo mezerníku v zobrazení znaků + Toto nastavení odhalí všechny interně používané barvy. Seznam barev se může kdykoli změnit. Výchozí barva je náhodná a názvy se nepřekládají. + Mansijština + Mansijština (%s) + Funkční klávesy + Funkční klávesy (znaky) + Funkční klávesy (další znaky) + Enter + Styl ikon + Měřítko dolního odsazení (na šířku) + Měřítko písma klávesnice + Měřítko písma v zobrazení emodži + Měřítko postranního odsazení (na šířku) + Měřítko postranního odsazení + Koš + Kód klávesy + Delete + Shift + Přepnout vzdálenost přejetí jazyka + Vyberte připnuté klávesy v panelu nástrojů + Toto zakáže další akce dlouhého stisknutí pro klávesy panelu nástrojů, které nejsou připnuty + Zakázat vyskakovací klávesy, které se již nacházejí v základním rozložení klávesnice + Barvy můžete najít a sdílet v %s. + sekci diskuze + Rozložení můžete najít a sdílet v %s. + Sesothština + Dagbani diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 30385268c..1f0eb8a08 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -439,4 +439,5 @@ Zahlenreihe (Basis) Web-Eingabefelder (meist in Browsern) sind eine häufige Ursache für Probleme mit der Einstellung \"Immer Vorschläge anzeigen\" Drücken der Eingabetaste oder der Leertaste nach anderen Tasten im Ziffernblock + Leertaste diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 0eb962d78..3b7fdca5c 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -481,4 +481,6 @@ Shift-klahvi vajutus välistab lisatava automaatse tühiku Automaatne tühik peale viipamisega sõna kirjutamist Ajatempli klahvi vorming + dagbani + sotho diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6b675bb74..1a56c3646 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -451,4 +451,6 @@ Nouveau dictionnaire: La touche Retour arrière annule la correction automatique Pas d\'espace automatique lors de l\'appui sur Maj Format de la clé d\'horodatage + Dagbani + Sesotho diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 0b6722c51..0b9be9043 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -304,7 +304,7 @@ Il dizionario è stato creato per la lingua %1$s, ma lo stai aggiungendo a %2$s. Confermi? Chiudi Traccia dell\'input gestuale - Tocca una lingua → Impostazioni + Tocca lingua → Impostazioni Salva log Holo bianco Dizionario interno principale @@ -446,10 +446,10 @@ I campi di testo Web (specie all\'interno dei browser) sono una causa ricorrente di problemi con i suggerimenti sempre attivi Barra dei numeri (base) Spazio - Nessuno spazio finale con ⇧ (maiuscolo) attivo + Nessuno spazio automatico alla pressione di ⇧ (maiuscolo) dopo un gesto Spazio automatico dopo la scelta di una parola suggerita Spazio automatico dopo una parola aggiunta con l\'inserimento gestuale - Nessuno spazio automatico con ⇧ (maiuscolo) attivo + Spazio automatico disattivato dopo Maiuscolo Usa Backspace per annullare l\'autocorrezione Spazio automatico prima di una parola aggiunta con l\'inserimento gestuale Formato per il tasto data/ora diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 430b55ff7..1c0496a88 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -112,4 +112,15 @@ Agemmay alatini (QWERTZ) Adda Lqem aneggaru - \ No newline at end of file + Sali + Armitan + Ṛǧu + Tallunt + Ijdi + Mansi + Aɣanib + Afeggag n ifecka + Ubrik + Kaitag + Imawalen nniḍen + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 1b2c9fa21..ee917a98e 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -4,7 +4,7 @@ modified SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only --> - Contactpersoonnamen opzoeken + Contactnamen opzoeken "Trillen bij toetsaanslag" "Geluid bij toetsaanslag" "Pop-up bij toetsaanslag" @@ -18,7 +18,7 @@ Taalkeuzetoets %s ms "Systeemstandaard" - "Namen uit Contacten gebruiken voor suggesties en correcties" + Gebruik namen uit Contacten voor suggesties en correcties "Gepersonaliseerde suggesties" Dubbel-spatie punt Dubbele tik op spatiebalk voor een punt gevolgd door een spatie @@ -117,7 +117,7 @@ Het uiterlijk volgt de systeeminstellingen Klembordgeschiedenis Experimenteel - Diversen + Overig Geen limiet Bewaartijd van de geschiedenis Verwijderen met veegbeweging @@ -171,7 +171,7 @@ Beide Woorden toevoegen aan persoonlijk woordenboek Gebruik het persoonlijke woordenboek van het apparaat om geleerde woorden op te slaan - Waarschuwing: met het uitschakelen van deze instelling worden geleerde gegevens gewist + Waarschuwing: Als u deze instelling uitschakelt, worden de geleerde gegevens gewist Altijd suggesties tonen Automatisch corrigeren, zelfs als dit niet expliciet wordt gevraagd door het invoerveld Meer autocorrectie @@ -444,7 +444,7 @@ Bediening met één hand wisselen Vuilnisbak Alle aangepaste pictogrammen herstellen? - Trillen in de nietstoren-modus + Trillen in de niet storen-modus Emoji-versie overschrijven %s (Phonetic) Dargwa (Urakhi) @@ -490,4 +490,6 @@ Shift verwijdert autom. spatie in afwachting Backspace draait autocorrectie terug Formaat voor tijdstempeltoetd + Dagbani + Sesotho diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 3970f6192..6505e0335 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -465,7 +465,7 @@ Włącz podzieloną klawiaturę (poziomo) Szerokość podziału (poziomo) Podziel klawiaturę - Na pewno usunąć %s ? + Na pewno usunąć %s? Inne układy Klawisze funkcyjne (tablet) Nieprawidłowa nazwa diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b7711d8f4..6886e3c3e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -14,37 +14,37 @@ "Исправление текста" Дополнительные "Тема" - "Включить разделённую клавиатуру" + Включить разделение клавиатуры Смена методов ввода "Клавиша смены языка" %s мс. "По умолчанию" - "Подсказывать исправления на основе имен из списка контактов" + Использовать имена из Контактов для предложений и исправлений "Пользовательские словари" "Точки автоматически" - Вводить точку с пробелом двойным нажатием пробела + Двойное нажатие на клавишу пробела вставляет точку и пробел "Заглавные автоматически" - "Писать первое слово предложения с прописной буквы" + Автоматически ставить заглавную букву в начале предложений "Личный словарь" "Основной словарь" - "Варианты исправлений" + Показывать варианты исправлений "Предлагать варианты слов во время ввода" - "Блокировка нецензурных слов" + Блокировать нецензурные слова "Не предлагать слова, которые могут быть сочтены оскорбительными" "Автоисправление" "Автоматическое исправление опечаток при вводе знака препинания или пробела" Откл. "Умеренное" - "Активно" - "Очень активно" - "Подсказывать слова" - "Предлагать подсказки на основе предыдущего слова" + Активное + Агрессивное + Предлагать следующее слово + Учитывать предыдущее слово при формировании предложений "Включить функцию" - "Вводите слова, не отрывая пальца от клавиатуры" + Набирайте текст, проводя по буквам и не отрывая палец от экрана Рисовать линию Показывать подсказки Непрерывный ввод фраз - Проводите по клавише пробела после каждого слова + Умный пробел при жестах: вводите несколько слов, проводя пальцем через пробел Английский (Великобритания) Английский (США) Испанский (США) @@ -77,7 +77,7 @@ Раскладка Вибросигнал при нажатии клавиш Звук при нажатии клавиш - Долгое нажатие + Длительность долгого нажатия Эмодзи для физической клавиатуры Физическая клавиша Alt показывает все доступные эмодзи По умолчанию @@ -99,7 +99,7 @@ Показывать значок приложения Отображать значок приложения на панели запуска Дополнительные словари - Доступен словарь + Доступный словарь Словарей нет Последнее обновление Настройки @@ -118,26 +118,26 @@ " АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ" Ряд с цифрами Всегда показывать ряд с цифрами - "Показывать спецсимволы" - Показывать спецсимволы на клавишах + Показывать дополнительные символы + Показывать дополнительные символы для ввода долгим нажатием Увеличенные клавиши Масштабирование по высоте Обнаружение URL-адреса - Попытаться обнаружить URL-адреса и подобные им строки, как одно слово + Попытаться обнаружить URL-адреса и схожие конструкции как единое целое Удаление жестом - Проведите пальцем от клавиши удаления, чтобы выделить и удалить большие фрагменты текста одновременно + Проведите пальцем от клавиши удаления, чтобы выделить и сразу удалить большие фрагменты текста Резервное копирование и восстановление - Сохраните или загрузите из файла. Внимание: восстановление перезапишет существующие данные + Сохранение в файл или загрузка из него. Внимание: восстановление перезапишет текущие данные Ошибка резервного копирования: %s Ошибка восстановления из резервной копии: %s - Резервное копирование - Восстановление + Сохранить + Загрузить Многоязычный набор текста Загрузить библиотеку ввода жестами Предоставьте встроенную библиотеку для включения ввода жестами Больше клавиш Включить режим инкогнито - Отключить запоминание слов + Отключить запоминание новых слов Клавиша эмодзи История буфера обмена Включить журнал буфера обмена @@ -158,8 +158,8 @@ Цвета темы (тёмная тема) Внешний вид будет следовать настройкам системы Автоматически добавлять пробел после знаков препинания при вводе нового слова - Если отключено, клавиша буфера обмена будет вставлять содержимое буфера обмена, если таковое имеется - Автоматическая подстановка пробела после точки + Если отключено, клавиша буфера обмена вставит содержимое буфера обмена, если оно есть + Автоматически добавлять пробел после знаков препинания Изменять метод ввода с помощью пробела Латиница (Colemak Mod-DH) Экспериментальные @@ -195,13 +195,13 @@ GNU General Public License v3.0 Закрыть Языки системы - Нажмите на язык, чтобы открыть настройки + Нажмите на язык для настроек "Выберите метод ввода" Описание скрытых функций Показать функции, которые могут остаться незамеченными "Отменить" "Повторить" - "Устройство будет запоминать то, что вы вводите чаще всего" + Анализировать переписку и введённый текст для улучшения предложений "ОК" "Далее" "Назад" @@ -250,9 +250,9 @@ Выберите источник подсказки Выберите язык Установить изображение для дневного или ночного режима? - Выбор клавиш панели инструментов + Выбрать клавиши панели инструментов Океан - Показывать подсказки, если длительное нажатие клавиши запускает дополнительные функции + Отображать подсказки, если долгое нажатие клавиши запускает дополнительную функцию Песок Выберите слово Показывать все цвета @@ -266,7 +266,7 @@ Виолетта Локализация ряда с цифрами Добавить все доступные варианты - Больше автокоррекции + Больше автоисправлений Расстояние разделения Игнорировать запросы других приложений об отключении предложений (может вызвать проблемы) Смена языка @@ -277,18 +277,18 @@ Загрузить библиотеку Высота нижнего отступа Ввод жестами - Показывать больше букв с диакритическими знаками при удержании + Показывать больше букв с диакритическими знаками в всплывающем окне Режим одной руки Сохранить журнал Раскладка - Автокоррекция, даже если это явно не запрошено в поле ввода + Автоматически исправлять даже если поле ввода не требует этого Holo Белая Смена обоих Вверх Удалить пользовательский словарь «%s»? Не получается прочитать файл здесь - Выберите для добавления словаря. Словари в формате .dict можно скачать %s. + Выберите словарь для добавления. Словари в формате .dict можно загрузить %s. Вправо Ошибка загрузки файла словаря Больше символов @@ -316,42 +316,7 @@ Числовая клавиатура (ландшафт) Телефон Символы телефона - ► Долгое нажатие на закреплённые клавиши панели инструментов открывает дополнительные функции:<br> -\n\t• буфер обмена &#65515; вставить <br> -\n\t• сдвинуть курсор влево/вправо &#65515; перейти на слово влево/вправо <br> -\n\t• сдвинуть курсор вверх/вниз &#65515; перейти на страницу вверх/вниз <br> -\n\t• слово левее/правее &#65515; перейти к началу/концу строки <br> -\n\t• страница вверх/вниз &#65515; перейти к началу/концу страниц<br> -\n\t• копировать &#65515; вырезать <br> -\n\t• выделить слово &#8596; выделить всё <br> -\n\t• отменить &#8596; повторить <br> <br> -\n► Долгое нажатие на клавиши в панели инструментов полосы подсказок - закрепляет их в полосе подсказок. <br> <br> -\n► Долгое нажатие на клавишу запятой - открывает Вид буфера обмена, Вид эмодзи, Режим одной руки, Настройки или Сменить язык: <br> -\n\t• Вид эмодзи и Смена языка будут недоступны, если соответствующая клавиша уже включена; <br> -\n\t• Для некоторых раскладок клавиатуры это не клавиша запятой, а клавиша, находящаяся в том же положении (например, это клавиша \"q\" для раскладки Dvorak). <br> <br> -\n► Когда включен режим инкогнито, никакие слова не будут сохранены, и эмодзи не будут добавлены в список использованных. <br> <br> -\n► Нажмите на иконку Инкогнито, чтобы получить доступ к панели инструментов.<br> <br> -\n► Скользящий ввод клавиш: Проведите пальцем от клавиши Shift к другой клавише, чтобы ввести одну заглавную букву: <br> -\n\t• Это также работает для клавиши \\\'?123\\\' чтобы ввести один символ из клавиатуры символов и для связанных с ней клавиш. <br> <br> -\n► Удерживайте клавишу Shift или клавишу символа, нажмите одну или несколько клавиш и затем отпустите клавишу Shift или клавишу символа, чтобы переключиться обратно на предыдущую клавиатуру. <br> <br> -\n► Долгое нажатие на подсказку в полосе подсказок показывает ещё больше подсказок и клавишу удаления для удаления этой подсказки. <br> <br> -\n► Проведите пальцем вверх от подсказки, чтобы показать больше подсказок и отпустите на нужной, чтобы выбрать её. <br> <br> -\n► Долгое нажатие на запись в истории буфера обмена закрепляет её (сохраняет в буфере обмена до тех пор, пока вы не отмените закрепление). <br> <br> -\n► Проведите пальцем влево в просмотре буфера обмена, чтобы удалить запись (кроме случаев, когда она закреплена). <br> <br> -\n► Выделите текст и нажмите клавишу Shift, чтобы переключаться между прописными, строчными буквами и капитализацией слов. <br> <br> -\n► Вы можете добавить словари, открыв их в файловом менеджере: <br> -\n\t• Это работает только с <i>content-uris</i> и не работает с <i>file-uris</i>, поэтому это может не работать с некоторыми файловыми менеджерами. <br> <br> -\n► Для пользователей, создающих резервные копии вручную с правами суперпользователя (root): <br> -\n\t• Начиная с Android 7, файл общих настроек находится в другом месте, поскольку приложение использует %s. Это необходимо, чтобы настройки можно было прочитать до разблокировки устройства, например, при запуске; <br> -\n\t• Файл находится в /data/user_de/0/package_id/shared_prefs/, хотя это может зависеть от устройства и версии Android. <br> <br> -\n<i><b>Режим отладки / отладочная версия APK</b></i> <br> <br> -\n► Долгое нажатие на подсказку показывает исходный словарь. <br> <br> -\n► Когда используется отладочная версия APK, можно найти в Настройки отладки в разделе Расширенные настройки, хотя их полезность ограничена, за исключением выгрузки словарей в журнал. <br> -\n\t• Для релизной версии APK необходимо несколько раз нажать на версию в разделе <i>О программе</i>, затем можно найти настройки отладки в разделе <i>Расширенные настройки</i>. <br> -\n\t• Когда включена опция <i>Показать информацию о подсказках</i>, подсказки будут иметь небольшие цифры вверху, которые показывают некоторые внутренние баллы и исходный словарь. <br> <br> -\n► В случае аварийного завершения работы приложения, вам будет предложено, получить журналы ошибок, когда вы откроете раздел Настройки. <br> <br> -\n► Когда используется многоязычный ввод, клавиша пробела будет показывать значение достоверности, которое используется для определения текущего используемого языка. <br> <br> -\n► Подсказки будут иметь небольшие цифры вверху, которые показывают некоторые внутренние баллы и исходный словарь (это можно отключить). + ► Долгое нажатие на закреплённые клавиши панели инструментов открывает дополнительные функции:<br> \n\t• буфер обмена &#65515; вставить <br> \n\t• сдвинуть курсор влево/вправо &#65515; перейти на слово влево/вправо <br> \n\t• сдвинуть курсор вверх/вниз &#65515; перейти на страницу вверх/вниз <br> \n\t• слово левее/правее &#65515; перейти к началу/концу строки <br> \n\t• страница вверх/вниз &#65515; перейти к началу/концу страниц<br> \n\t• копировать &#65515; вырезать <br> \n\t• выделить слово &#8596; выделить всё <br> \n\t• отменить &#8596; повторить <br> <br> \n► Долгое нажатие на клавиши в панели инструментов полосы предложений - закрепляет их в полосе предложений. <br> <br> \n► Долгое нажатие на клавишу запятой - открывает Вид буфера обмена, Вид эмодзи, Режим одной руки, Настройки или Сменить язык: <br> \n\t• Вид эмодзи и Смена языка будут недоступны, если соответствующая клавиша уже включена; <br> \n\t• Для некоторых раскладок клавиатуры это не клавиша запятой, а клавиша, находящаяся в том же положении (например, это клавиша \"q\" для раскладки Dvorak). <br> <br> \n► Когда включен режим инкогнито, никакие слова не будут сохранены, и эмодзи не будут добавлены в список использованных. <br> <br> \n► Нажмите на иконку Инкогнито, чтобы получить доступ к панели инструментов.<br> <br> \n► Скользящий ввод клавиш: Проведите пальцем от клавиши Shift к другой клавише, чтобы ввести одну заглавную букву: <br> \n\t• Также это работает для клавиши \\\'?123\\\', чтобы ввести один символ из клавиатуры символов и для связанных с ней клавиш. <br> <br> \n► Удерживайте клавишу Shift или клавишу символа, нажмите одну или несколько клавиш и затем отпустите клавишу Shift или клавишу символа, чтобы переключиться обратно на предыдущую клавиатуру. <br> <br> \n► Долгое нажатие на предложение в полосе предложений показывает ещё больше предложений и клавишу удаления для удаления этого предложения. <br> <br> \n► Проведите пальцем вверх от предложения, чтобы показать больше предложений и отпустите на нужном, чтобы выбрать его. <br> <br> \n► Долгое нажатие на запись в истории буфера обмена закрепляет её (сохраняет в буфере обмена до тех пор, пока вы не отмените закрепление). <br> <br> \n► Проведите пальцем влево в просмотре буфера обмена, чтобы удалить запись (кроме случаев, когда она закреплена). <br> <br> \n► Выделите текст и нажмите клавишу Shift, чтобы переключаться между прописными, строчными буквами и капитализацией слов. <br> <br> \n► Вы можете добавить словари, открыв их в файловом менеджере: <br> \n\t• Это работает только с <i>content-uris</i> и не работает с <i>file-uris</i>, поэтому это может не работать с некоторыми файловыми менеджерами. <br> <br> \n► Для пользователей, создающих резервные копии вручную с правами суперпользователя (root): <br> \n\t• Начиная с Android 7, файл общих настроек находится в другом месте, поскольку приложение использует %s. Это необходимо, чтобы настройки можно было прочитать до разблокировки устройства, например, при запуске; <br> \n\t• Файл находится в /data/user_de/0/package_id/shared_prefs/, хотя это может зависеть от устройства и версии Android. <br> <br> \n<i><b>Режим отладки / отладочная версия APK</b></i> <br> <br> \n► Долгое нажатие на подсказку показывает исходный словарь. <br> <br> \n► Когда используется отладочная версия APK, можно найти в Настройки отладки в разделе Расширенные настройки, хотя их полезность ограничена, за исключением выгрузки словарей в журнал. <br> \n\t• Для релизной версии APK необходимо несколько раз нажать на версию в разделе <i>О программе</i>, затем можно найти настройки отладки в разделе <i>Расширенные настройки</i>. <br> \n\t• Когда включена опция <i>Показать информацию о подсказках</i>, подсказки будут иметь небольшие цифры вверху, которые показывают некоторые внутренние баллы и исходный словарь. <br> <br> \n► В случае аварийного завершения работы приложения, вам будет предложено, получить журналы ошибок, когда вы откроете раздел Настройки. <br> <br> \n► Когда используется многоязычный ввод, клавиша пробела будет показывать значение достоверности, которое используется для определения текущего используемого языка. <br> <br> \n► Предложения будут иметь небольшие цифры вверху, которые показывают некоторые внутренние баллы и исходный словарь (это можно отключить). Обратное направление, если выбран подтип клавиатуры с письмом справа налево Переменное направление панели инструментов %s (Пробхат) @@ -359,21 +324,21 @@ Вертикальный свайп по пробелу Бездействие Перемещение курсора - Длительное нажатие клавиши символов для цифровой клавиатуры + Долгое нажатие клавиши символов для цифровой клавиатуры %s (Студенческая) Вырезать - Поведение клавиши смены языка + Действие клавиши смены языка Эмодзи Выбрать закреплённые клавиши панели инструментов - Это отключит остальные функции клавиш панели инструментов при длительном нажатии - Закреплять клавиши панели инструментов при длительном нажатии + При этом отключатся остальные функции долгого нажатия для незакреплённых кнопок панели + Закреплять клавиши панели инструментов при долгом нажатии Контент скопирован Показывать панель инструментов автоматически Скрывать панель инструментов автоматически Всегда использовать среднее предложение - При нажатии точки или пунктуации будет использовано среднее предложение + При нажатии пробела или знака препинания будет использовано среднее предложение Закрыть буфер обмена - Выбрать клавиши панели инструментов буфера обмена + Выбрать клавиши панели буфера обмена %s (Расширенная) Скрывать панель инструментов при появлении предложений Панель инструментов @@ -385,8 +350,8 @@ Функциональные клавиши (Символы) Всегда начинать немедленно Время восстановления быстрой печати - Кастомизировать валюты - Установить главные и до 6 дополнительных символа валют, разделённых пробелом + Настройка валют + Укажите основные и до 6 доп. символов валют через пробел Загрузить Сохранить в файл Скопировать в буфер обмена @@ -401,14 +366,14 @@ Показать недавно скопированное содержимое буфера обмена в качестве предложения Переключить цифровую клавиатуру Вернуться к основной клавиатуре после… - Выбор эмодзи в режиме просмотра - Выбор записи из истории буфера обмена - Нажатие Enter или пробела после других клавиш в режиме символов + Выбора эмодзи в режиме просмотра + Выбора записи из истории буфера обмена + Нажатия Enter или пробела после других клавиш в режиме символов Добавить самые распространённые варианты (по умолчанию) Удалить лишние всплывающие окна Убрать всплывающие клавиши, присутствующие в базовой раскладке Ряд с цифрами - Видеть предложенное слово во время набора жестами + Показывать предложенное слово во время набора жестами Время жизни следа жеста Пользовательский текст на клавише пробела Строка буфера обмена внизу @@ -430,22 +395,22 @@ Соединитель нулевой ширины Настроить коды клавиш панели инструментов Код клавиши - Код длинного нажатия + Код долгого нажатия Настроить иконки Разъединитель нулевой ширины Выход из режима работы одной рукой Действительно сбросить все настроенные иконки? Корзина - Вибрация в режиме «Не беспокоить» + Вибрация в режиме Не беспокоить %s (Фонетика) - Автокоррекция сочетаний клавиш + Автоисправление сокращений Установить пользовательский шрифт из файла Масштаб нижнего отступа (ландшафт) Масштаб шрифта клавиатуры Масштаб шрифта отображения эмодзи Масштаб бокового отступа Масштаб бокового отступа (ландшафт) - Если включено, сочетания клавиш могут быть расширены с помощью автокоррекции + Если включено, автоисправление превратит сокращения в полные слова Вы действительно хотите удалить все настроенные коды клавиш? Переопределить версию эмодзи Если не установлено, будет использоваться портретное изображение @@ -467,8 +432,8 @@ обсуждения Недопустимое имя Показать всплывающие клавиши TLD - При вводе URL и адресов электронной почты отображать домены верхнего уровня вместо всплывающих меню клавиши точки - Нажатие Enter или пробела после других клавиш на цифровой клавиатуре + При вводе URL и адресов электронной почты заменить всплывающие подсказки клавиши точки на подсказки с доменами верхнего уровня + Нажатия Enter или пробела после других клавиш на цифровой клавиатуре Поля ввода на веб-страницах (в основном в браузерах) часто вызывают проблемы с настройкой постоянного отображения подсказок Ряд с цифрами (основной) Не всегда показывать подсказки для полей ввода на веб-страницах @@ -478,6 +443,8 @@ Автопробел отключается при нажатии Shift Нажатие Shift убирает запланированный автопробел Автопробел перед набором слова жестами - Нажатие Backspace отменяет автокоррекцию + Нажатие Backspace отменяет автоисправление Формат ключа временной метки + Дагбани + Сесото diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c8acbb6c0..161780262 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -447,4 +447,6 @@ 退格键恢复自动更正 选择建议后自动插入空格 时间戳键的格式 + 索托语 + 达巴尼语 diff --git a/fastlane/metadata/android/ar/changelogs/3004.txt b/fastlane/metadata/android/ar/changelogs/3004.txt new file mode 100644 index 000000000..cb1eb5fde --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/3004.txt @@ -0,0 +1,11 @@ +* إضافة تخطيطات: Hija'i العربية، العبرية 1452-2، الهندية الصوتية، دارغوا (أوراخي)، بايشاخي، الكرديش +* تحديث بعض التخطيطات +* الدعم الجمع بين اللهجات +* مفتاح شريط أدوات لوحة المفاتيح +* إضافة منبثقات .com +* السماح لضبط الخط المخصص +* إضافة إعداد مقياس الخط +* تحسين تبديل اللغة التلقائي +* إعدادات الإصلاح +* أضف إعدادات لمزيد من ضبط حشوة لوحة المفاتيح، والمساحة التلقائية، والتصحيح التلقائي، و صف الأرقام +* المزيد من الميزات والإصلاحات diff --git a/fastlane/metadata/android/ar/changelogs/3005.txt b/fastlane/metadata/android/ar/changelogs/3005.txt new file mode 100644 index 000000000..cb1eb5fde --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/3005.txt @@ -0,0 +1,11 @@ +* إضافة تخطيطات: Hija'i العربية، العبرية 1452-2، الهندية الصوتية، دارغوا (أوراخي)، بايشاخي، الكرديش +* تحديث بعض التخطيطات +* الدعم الجمع بين اللهجات +* مفتاح شريط أدوات لوحة المفاتيح +* إضافة منبثقات .com +* السماح لضبط الخط المخصص +* إضافة إعداد مقياس الخط +* تحسين تبديل اللغة التلقائي +* إعدادات الإصلاح +* أضف إعدادات لمزيد من ضبط حشوة لوحة المفاتيح، والمساحة التلقائية، والتصحيح التلقائي، و صف الأرقام +* المزيد من الميزات والإصلاحات diff --git a/fastlane/metadata/android/ca/changelogs/3004.txt b/fastlane/metadata/android/ca/changelogs/3004.txt new file mode 100644 index 000000000..4f0c8df16 --- /dev/null +++ b/fastlane/metadata/android/ca/changelogs/3004.txt @@ -0,0 +1,11 @@ +* Afeg. dissenys: àrab Hija'i, hebreu 1452-2, fonètica hindi, Dargwa (Urakhi), Baishakhi, kurd +* Actu. dissenys +* Suport per combinar accents +* Tecla dividida de la barra d'eines del teclat +* Afeg. finestres emergents .com +* Permet configurar lletra personalitzada +* Afeg. la configuració d'escala de lletra +* Millorar el canvi automàtic d'idioma +* Revisada configuració +* Afeg. paràmetres per ajustar més el farciment del teclat, l'espai automàtic, la correcció automàtica, la fila de nombres +* Més… diff --git a/fastlane/metadata/android/ca/changelogs/3005.txt b/fastlane/metadata/android/ca/changelogs/3005.txt new file mode 100644 index 000000000..4f0c8df16 --- /dev/null +++ b/fastlane/metadata/android/ca/changelogs/3005.txt @@ -0,0 +1,11 @@ +* Afeg. dissenys: àrab Hija'i, hebreu 1452-2, fonètica hindi, Dargwa (Urakhi), Baishakhi, kurd +* Actu. dissenys +* Suport per combinar accents +* Tecla dividida de la barra d'eines del teclat +* Afeg. finestres emergents .com +* Permet configurar lletra personalitzada +* Afeg. la configuració d'escala de lletra +* Millorar el canvi automàtic d'idioma +* Revisada configuració +* Afeg. paràmetres per ajustar més el farciment del teclat, l'espai automàtic, la correcció automàtica, la fila de nombres +* Més… diff --git a/fastlane/metadata/android/cs-CZ/changelogs/3004.txt b/fastlane/metadata/android/cs-CZ/changelogs/3004.txt new file mode 100644 index 000000000..7b5a3f128 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/3004.txt @@ -0,0 +1,11 @@ +* přidána rozvržení: arabština hidžá'í, hebrejština 1452-2, fonetické hindu, dargwa (urakhi), baishakhi, kurdština +* aktualizace některých rozvržení +* podpora kombinování přízvuků +* klávesa pro rozdělení klávesnice +* přidána nabídka .com +* možnost nastavení vlastního písma +* přidáno nastavení měřítka písma +* zlepšeno automatické přepínání jazyků +* přepracována nastavení +* přidána nastavení pro lepší nastavení odsazení, automatické mezery, automatické opravy, číselné řady +* další funkce a opravy diff --git a/fastlane/metadata/android/cs-CZ/changelogs/3005.txt b/fastlane/metadata/android/cs-CZ/changelogs/3005.txt new file mode 100644 index 000000000..7b5a3f128 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/3005.txt @@ -0,0 +1,11 @@ +* přidána rozvržení: arabština hidžá'í, hebrejština 1452-2, fonetické hindu, dargwa (urakhi), baishakhi, kurdština +* aktualizace některých rozvržení +* podpora kombinování přízvuků +* klávesa pro rozdělení klávesnice +* přidána nabídka .com +* možnost nastavení vlastního písma +* přidáno nastavení měřítka písma +* zlepšeno automatické přepínání jazyků +* přepracována nastavení +* přidána nastavení pro lepší nastavení odsazení, automatické mezery, automatické opravy, číselné řady +* další funkce a opravy diff --git a/fastlane/metadata/android/cs-CZ/full_description.txt b/fastlane/metadata/android/cs-CZ/full_description.txt new file mode 100644 index 000000000..78bdc2dc0 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/full_description.txt @@ -0,0 +1,30 @@ +HeliBoard je open-source klávesnice zaměřená na soukromí, založená na AOSP / OpenBoard. +Nepoužívá internet, a je tedy 100% offline. + +Funkce: +
      +
    • Přidávejte slovníky pro návrhy a kontrolu pravopisu
    • +
        +
      • vytvořte si vlastní, nebo si je stáhněte zde, nebo v experimentální sekci (kvalita se může lišit)
      • +
      • další slovníky pro emotikony nebo vědecké symboly lze použít k poskytování návrhů (podobně jako „vyhledávání emoji“)
      • +
      • upozorňujeme, že pro korejské rozložení fungují návrhy pouze s tímto slovníkem, nástroje v repozitáři se slovníky nedokážou vytvořit funkční slovníky
      • +
      +
    • Přizpůsobte si vzhled klávesnice (styl, barvy a obrázek na pozadí)
    • +
        +
      • dokáže se přizpůsobit dennímu/nočnímu nastavení v Androidu 10+ (a na některých verzích Androidu 9)
      • +
      • dokáže se přizpůsobit dynamickým barvám v Androidu 12+
      • +
      +
    • Přizpůsobte si rozložení klávesnice (dostupné pouze při vypnuté volbě používat systémové jazyky)
    • +
    • Přizpůsobte si speciální rozložení, jako jsou symboly, čísla nebo rozložení funkčních kláves
    • +
    • Vícejazyčné psaní
    • +
    • Psaní jedním tahem (pouze s proprietární knihovnou ☹️)
    • +
        +
      • knihovna není součástí aplikace, protože není dostupná žádná kompatibilní open source verze
      • +
      • lze ji extrahovat z balíků GApps („swypelibs“) nebo stáhnout zde (klikněte na soubor a pak na „raw“ nebo malé tlačítko pro stažení)
      • +
      +
    • Historie schránky
    • +
    • Režim ovládání jednou rukou
    • +
    • Rozdělená klávesnice (dostupná pouze pokud je obrazovka dostatečně velká)
    • +
    • Numerická klávesnice
    • +
    • Záloha a obnova nastavení a naučených slov / historie
    • +
    diff --git a/fastlane/metadata/android/en-US/changelogs/3005.txt b/fastlane/metadata/android/en-US/changelogs/3005.txt new file mode 100644 index 000000000..ce0395033 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/3005.txt @@ -0,0 +1,11 @@ +* add layouts: Arabic Hija'i, Hebrew 1452-2, Hindi Phonetic, Dargwa (Urakhi), Baishakhi, Kurdish +* update some layouts +* support combining accents +* split keyboard toolbar key +* add .com popups +* allow setting custom font +* add font scale setting +* improve automatic language switching +* overhaul settings +* add settings for more tuning of keyboard padding, auto-space, auto-correction, number row +* more features and fixes diff --git a/fastlane/metadata/android/et/changelogs/3004.txt b/fastlane/metadata/android/et/changelogs/3004.txt new file mode 100644 index 000000000..f9be70240 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/3004.txt @@ -0,0 +1,11 @@ +* uued klahvipaigustused: araabia hija'i, heebrea 1452-2, hindi foneetiline, dargi (Urahhi), baišaki, kurdi +* mõnede klahvipaigustuste täiendused +* aktsentide kombineerimise tugi +* nupp klahvistiku poolitamiseks +* lisandusid .com hüpikaknad +* oma kirjatüübi valikuvõimalus +* kirjatüübi skaleerimise võimalus +* improve automatic language switching +* seadistuste kohendus +* lisaseadistused klahvide vaheruumi, tühikute lisamise, autokorrektsiooni ja ridade arvu jaoks +* pisitäiendused ja parandused diff --git a/fastlane/metadata/android/et/changelogs/3005.txt b/fastlane/metadata/android/et/changelogs/3005.txt new file mode 100644 index 000000000..f9be70240 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/3005.txt @@ -0,0 +1,11 @@ +* uued klahvipaigustused: araabia hija'i, heebrea 1452-2, hindi foneetiline, dargi (Urahhi), baišaki, kurdi +* mõnede klahvipaigustuste täiendused +* aktsentide kombineerimise tugi +* nupp klahvistiku poolitamiseks +* lisandusid .com hüpikaknad +* oma kirjatüübi valikuvõimalus +* kirjatüübi skaleerimise võimalus +* improve automatic language switching +* seadistuste kohendus +* lisaseadistused klahvide vaheruumi, tühikute lisamise, autokorrektsiooni ja ridade arvu jaoks +* pisitäiendused ja parandused diff --git a/fastlane/metadata/android/it-IT/changelogs/3004.txt b/fastlane/metadata/android/it-IT/changelogs/3004.txt new file mode 100644 index 000000000..16cb2ba25 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/3004.txt @@ -0,0 +1,11 @@ +* layout aggiunti: Arabo Hija'i, Ebraico 1452-2, Hindi fonetico, Dargwa (Urakhi), Baishakhi, Curdo +* alcuni layout aggiornati +* supporto agli accenti combinati +* pulsante 'Tastiera divisa' nella barra degli strumenti +* popup .com aggiunto +* font personalizzato per i tasti +* aggiustamento dimensione per i tasti +* modalità multilingua migliorata +* impostazioni ridisegnate +* aggiunte alcune opzioni per spaziatura automatica, correzione testo e riga dei numeri +* altre funzionalità, migliorie e bugfix diff --git a/fastlane/metadata/android/it-IT/changelogs/3005.txt b/fastlane/metadata/android/it-IT/changelogs/3005.txt new file mode 100644 index 000000000..16cb2ba25 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/3005.txt @@ -0,0 +1,11 @@ +* layout aggiunti: Arabo Hija'i, Ebraico 1452-2, Hindi fonetico, Dargwa (Urakhi), Baishakhi, Curdo +* alcuni layout aggiornati +* supporto agli accenti combinati +* pulsante 'Tastiera divisa' nella barra degli strumenti +* popup .com aggiunto +* font personalizzato per i tasti +* aggiustamento dimensione per i tasti +* modalità multilingua migliorata +* impostazioni ridisegnate +* aggiunte alcune opzioni per spaziatura automatica, correzione testo e riga dei numeri +* altre funzionalità, migliorie e bugfix diff --git a/fastlane/metadata/android/nl-NL/changelogs/3004.txt b/fastlane/metadata/android/nl-NL/changelogs/3004.txt new file mode 100644 index 000000000..6256f8aeb --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/3004.txt @@ -0,0 +1,11 @@ +* lay-outs toevoegen: Arabisch Hija'i, Hebreeuws 1452-2, Hindi Fonetisch, Dargwa (Urakhi), Baishakhi, Koerdisch +* Update enkele lay-outs +* Ondersteuning voor het combineren van accenten +* Gesplitste toetsenbordwerkbalktoets +* voeg .com pop-ups toe +* Toestaan instellen van aangepast lettertype +* Instelling voor lettertypeschaal toevoegen +* automatische taalomschakeling verbeteren +* Revisie instellingen +* Voeg instellingen toe voor meer afstemming van toetsenbordopvulling, automatische spatie, autocorrectie, cijferrij +* Meer functies en fixes diff --git a/fastlane/metadata/android/nl-NL/changelogs/3005.txt b/fastlane/metadata/android/nl-NL/changelogs/3005.txt new file mode 100644 index 000000000..6256f8aeb --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/3005.txt @@ -0,0 +1,11 @@ +* lay-outs toevoegen: Arabisch Hija'i, Hebreeuws 1452-2, Hindi Fonetisch, Dargwa (Urakhi), Baishakhi, Koerdisch +* Update enkele lay-outs +* Ondersteuning voor het combineren van accenten +* Gesplitste toetsenbordwerkbalktoets +* voeg .com pop-ups toe +* Toestaan instellen van aangepast lettertype +* Instelling voor lettertypeschaal toevoegen +* automatische taalomschakeling verbeteren +* Revisie instellingen +* Voeg instellingen toe voor meer afstemming van toetsenbordopvulling, automatische spatie, autocorrectie, cijferrij +* Meer functies en fixes From 69bcca0a22cd407e97bf0cf845f23a680a1e03a6 Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Tue, 22 Apr 2025 23:29:03 +0300 Subject: [PATCH 074/175] Apply padding on all sides on settings screens (#1496) --- .../keyboard/settings/SearchScreen.kt | 22 +++++++++++-------- .../keyboard/settings/SettingsActivity.kt | 8 ++----- .../settings/screens/MainSettingsScreen.kt | 15 +++++++------ .../screens/PersonalDictionaryScreen.kt | 5 ++--- .../settings/screens/SubtypeScreen.kt | 12 +++++----- 5 files changed, 32 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt b/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt index dec486ef5..7448d01ab 100644 --- a/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt @@ -6,14 +6,13 @@ import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.ime +import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.systemBars -import androidx.compose.foundation.layout.union +import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState @@ -64,10 +63,12 @@ fun SearchSettingsScreen( content = { if (content != null) content() else { - Scaffold(contentWindowInsets = WindowInsets.systemBars.union(WindowInsets.ime)) { innerPadding -> + Scaffold( + contentWindowInsets = WindowInsets.safeDrawing + .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom) + ) { innerPadding -> Column( - Modifier.verticalScroll(rememberScrollState()) - .then(Modifier.padding(bottom = innerPadding.calculateBottomPadding())) + Modifier.verticalScroll(rememberScrollState()).then(Modifier.padding(innerPadding)) ) { settings.forEach { if (it is Int) { @@ -206,8 +207,11 @@ fun SearchScreen( } } else { val items = filteredItems(searchText.text) - Scaffold(contentWindowInsets = WindowInsets.systemBars.union(WindowInsets.ime)) { innerPadding -> - LazyColumn(contentPadding = PaddingValues.Absolute(bottom = innerPadding.calculateBottomPadding())) { + Scaffold( + contentWindowInsets = WindowInsets.safeDrawing + .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom) + ) { innerPadding -> + LazyColumn(contentPadding = innerPadding) { items(items) { itemContent(it) } diff --git a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt index c1e249030..013cd39e1 100644 --- a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt +++ b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt @@ -8,17 +8,14 @@ import android.net.Uri import android.os.Build import android.os.Bundle import android.view.View -import android.view.WindowInsets.Type import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import androidx.activity.ComponentActivity import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.ime import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.systemBars -import androidx.compose.foundation.layout.union +import androidx.compose.foundation.layout.safeDrawing import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -29,7 +26,6 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView -import androidx.core.view.ViewCompat import helium314.keyboard.compat.locale import helium314.keyboard.keyboard.KeyboardSwitcher import helium314.keyboard.latin.BuildConfig @@ -96,7 +92,7 @@ class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferen || !UncachedInputMethodManagerUtils.isThisImeEnabled(this, imm) ) } if (spellchecker) - Scaffold(contentWindowInsets = WindowInsets.systemBars.union(WindowInsets.ime)) { innerPadding -> + Scaffold(contentWindowInsets = WindowInsets.safeDrawing) { innerPadding -> Column(Modifier.padding(innerPadding)) { // lazy way of implementing spell checker settings settingsContainer[Settings.PREF_USE_CONTACTS]!!.Preference() settingsContainer[Settings.PREF_BLOCK_POTENTIALLY_OFFENSIVE]!!.Preference() diff --git a/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt index 87ba842b6..7efe23773 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt @@ -3,10 +3,10 @@ package helium314.keyboard.settings.screens import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.ime +import androidx.compose.foundation.layout.WindowInsetsSides +import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.systemBars -import androidx.compose.foundation.layout.union +import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Scaffold @@ -21,10 +21,10 @@ import helium314.keyboard.latin.utils.JniUtils import helium314.keyboard.latin.utils.SubtypeSettings import helium314.keyboard.latin.utils.displayName import helium314.keyboard.settings.NextScreenIcon -import helium314.keyboard.settings.preferences.Preference import helium314.keyboard.settings.SearchSettingsScreen import helium314.keyboard.settings.Theme import helium314.keyboard.settings.initPreview +import helium314.keyboard.settings.preferences.Preference import helium314.keyboard.settings.previewDark @Composable @@ -48,10 +48,11 @@ fun MainSettingsScreen( settings = emptyList(), ) { val enabledSubtypes = SubtypeSettings.getEnabledSubtypes(true) - Scaffold(contentWindowInsets = WindowInsets.systemBars.union(WindowInsets.ime)) { innerPadding -> + Scaffold( + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom) + ) { innerPadding -> Column( - Modifier.verticalScroll(rememberScrollState()) - .then(Modifier.padding(bottom = innerPadding.calculateBottomPadding())) + Modifier.verticalScroll(rememberScrollState()).then(Modifier.padding(innerPadding)) ) { Preference( name = stringResource(R.string.language_and_layouts_title), diff --git a/app/src/main/java/helium314/keyboard/settings/screens/PersonalDictionaryScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/PersonalDictionaryScreen.kt index 8d5527442..e9f38a228 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/PersonalDictionaryScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/PersonalDictionaryScreen.kt @@ -10,9 +10,8 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.systemBarsPadding +import androidx.compose.foundation.layout.safeDrawingPadding import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.ExtendedFloatingActionButton @@ -179,7 +178,7 @@ fun PersonalDictionaryScreen( text = { Text(stringResource(R.string.user_dict_add_word_button)) }, icon = { Icon(painter = painterResource(R.drawable.ic_edit), stringResource(R.string.user_dict_add_word_button)) }, modifier = Modifier.wrapContentSize(Alignment.BottomEnd).padding(all = 12.dp) - .then(Modifier.systemBarsPadding().imePadding()) + .then(Modifier.safeDrawingPadding()) ) } diff --git a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt index d11c5bdbf..df1161cbe 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt @@ -5,11 +5,11 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.ime +import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.systemBars -import androidx.compose.foundation.layout.union +import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -145,10 +145,12 @@ fun SubtypeScreen( itemContent = { }, filteredItems = { emptyList() } ) { - Scaffold(contentWindowInsets = WindowInsets.systemBars.union(WindowInsets.ime)) { innerPadding -> + Scaffold( + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom) + ) { innerPadding -> Column( modifier = Modifier.verticalScroll(scrollState).padding(horizontal = 12.dp) - .then(Modifier.padding(bottom = innerPadding.calculateBottomPadding())), + .then(Modifier.padding(innerPadding)), verticalArrangement = Arrangement.spacedBy(8.dp), ) { MainLayoutRow(currentSubtype, customMainLayouts) { setCurrentSubtype(it) } From 5b32118b08392f6a7a2c54f73d46c840f47d2a34 Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Fri, 25 Apr 2025 17:53:22 +0300 Subject: [PATCH 075/175] Add title to spell checker settings (#1501) --- .../keyboard/settings/SettingsActivity.kt | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt index 013cd39e1..c884471f6 100644 --- a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt +++ b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt @@ -16,9 +16,13 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -26,10 +30,13 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import helium314.keyboard.compat.locale import helium314.keyboard.keyboard.KeyboardSwitcher import helium314.keyboard.latin.BuildConfig import helium314.keyboard.latin.InputAttributes +import helium314.keyboard.latin.R import helium314.keyboard.latin.common.FileUtils import helium314.keyboard.latin.define.DebugFlags import helium314.keyboard.latin.settings.Settings @@ -63,6 +70,7 @@ class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferen private val crashReportFiles = MutableStateFlow>(emptyList()) private var paused = true + @OptIn(ExperimentalMaterial3Api::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (Settings.getValues() == null) { @@ -93,7 +101,19 @@ class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferen ) } if (spellchecker) Scaffold(contentWindowInsets = WindowInsets.safeDrawing) { innerPadding -> - Column(Modifier.padding(innerPadding)) { // lazy way of implementing spell checker settings + Column(Modifier.padding(innerPadding)) { + TopAppBar( + title = { Text(stringResource(R.string.android_spell_checker_settings)) }, + windowInsets = WindowInsets(0), + navigationIcon = { + IconButton(onClick = { this@SettingsActivity.finish() }) { + Icon( + painterResource(R.drawable.ic_arrow_back), + stringResource(R.string.spoken_description_action_previous) + ) + } + }, + ) settingsContainer[Settings.PREF_USE_CONTACTS]!!.Preference() settingsContainer[Settings.PREF_BLOCK_POTENTIALLY_OFFENSIVE]!!.Preference() } From e60efba59d304a7f339a6408eacc1c30dad6af19 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Fri, 25 Apr 2025 17:03:34 +0200 Subject: [PATCH 076/175] remove some unnecessary code looks like with edge to edge the status bar color is set automatically also slightly rearrange code for showing welcome wizard and crash report dialog --- .../keyboard/settings/SettingsActivity.kt | 66 ++++++------------- 1 file changed, 21 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt index c884471f6..ec7b33426 100644 --- a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt +++ b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt @@ -5,9 +5,7 @@ import android.content.Context import android.content.Intent import android.content.SharedPreferences import android.net.Uri -import android.os.Build import android.os.Bundle -import android.view.View import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import androidx.activity.ComponentActivity @@ -41,7 +39,6 @@ import helium314.keyboard.latin.common.FileUtils import helium314.keyboard.latin.define.DebugFlags import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.utils.ExecutorUtils -import helium314.keyboard.latin.utils.ResourceUtils import helium314.keyboard.latin.utils.UncachedInputMethodManagerUtils import helium314.keyboard.latin.utils.cleanUnusedMainDicts import helium314.keyboard.latin.utils.prefs @@ -80,7 +77,6 @@ class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferen ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD).execute { cleanUnusedMainDicts(this) } if (BuildConfig.DEBUG || DebugFlags.DEBUG_ENABLED) crashReportFiles.value = findCrashReports() - setSystemBarIconColor() val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager settingsContainer = SettingsContainer(this) @@ -118,8 +114,28 @@ class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferen settingsContainer[Settings.PREF_BLOCK_POTENTIALLY_OFFENSIVE]!!.Preference() } } - else + else { SettingsNavHost(onClickBack = { this.finish() }) + if (showWelcomeWizard) { + WelcomeWizard(close = { showWelcomeWizard = false }, finish = this::finish) + } else if (crashReports.isNotEmpty()) { + ConfirmationDialog( + cancelButtonText = "ignore", + onDismissRequest = { crashReportFiles.value = emptyList() }, + neutralButtonText = "delete", + onNeutral = { crashReports.forEach { it.delete() }; crashReportFiles.value = emptyList() }, + confirmButtonText = "get", + onConfirmed = { + val intent = Intent(Intent.ACTION_CREATE_DOCUMENT) + intent.addCategory(Intent.CATEGORY_OPENABLE) + intent.putExtra(Intent.EXTRA_TITLE, "crash_reports.zip") + intent.setType("application/zip") + crashFilePicker.launch(intent) + }, + content = { Text("Crash report files found") }, + ) + } + } if (dictUri != null) { NewDictionaryDialog( onDismissRequest = { dictUriFlow.value = null }, @@ -127,26 +143,6 @@ class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferen mainLocale = null ) } - if (!showWelcomeWizard && !spellchecker && crashReports.isNotEmpty()) { - ConfirmationDialog( - cancelButtonText = "ignore", - onDismissRequest = { crashReportFiles.value = emptyList() }, - neutralButtonText = "delete", - onNeutral = { crashReports.forEach { it.delete() }; crashReportFiles.value = emptyList() }, - confirmButtonText = "get", - onConfirmed = { - val intent = Intent(Intent.ACTION_CREATE_DOCUMENT) - intent.addCategory(Intent.CATEGORY_OPENABLE) - intent.putExtra(Intent.EXTRA_TITLE, "crash_reports.zip") - intent.setType("application/zip") - crashFilePicker.launch(intent) - }, - content = { Text("Crash report files found") }, - ) - } - if (!spellchecker && showWelcomeWizard) { - WelcomeWizard(close = { showWelcomeWizard = false }, finish = this::finish) - } } } } @@ -224,23 +220,6 @@ class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferen } } - // deprecated but works... ideally it would be done automatically like it worked before switching to compose - private fun setSystemBarIconColor() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return - val view = window.decorView - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - if (ResourceUtils.isNight(resources)) - view.systemUiVisibility = view.systemUiVisibility and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() and View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.inv() - else - view.systemUiVisibility = view.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR - } else { - if (ResourceUtils.isNight(resources)) - view.systemUiVisibility = view.systemUiVisibility and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() - else - view.systemUiVisibility = view.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR - } - } - companion object { // public write so compose previews can show the screens // having it in a companion object is not ideal as it will stay in memory even after settings are closed @@ -249,9 +228,6 @@ class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferen var forceNight: Boolean? = null var forceTheme: String? = null - - // weird inset forwarding because otherwise layout dialog sometimes doesn't care about keyboard showing - var bottomInsets = MutableStateFlow(0) } override fun onSharedPreferenceChanged(prefereces: SharedPreferences?, key: String?) { From 01c0cd9de214f2d6c0f8e6e2182519ca9659ce6f Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Fri, 25 Apr 2025 18:19:58 +0300 Subject: [PATCH 077/175] Saving log using logcat (#1487) Old logger will be removed later, see discussion in PR --- .../keyboard/settings/screens/AboutScreen.kt | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt index 9d84985c6..6f5c2daf6 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt @@ -31,16 +31,17 @@ import helium314.keyboard.latin.utils.Log import helium314.keyboard.latin.utils.SpannableStringUtils import helium314.keyboard.latin.utils.getActivity import helium314.keyboard.latin.utils.prefs +import helium314.keyboard.settings.SearchSettingsScreen +import helium314.keyboard.settings.Setting +import helium314.keyboard.settings.SettingsActivity import helium314.keyboard.settings.SettingsContainer import helium314.keyboard.settings.SettingsWithoutKey -import helium314.keyboard.settings.Setting -import helium314.keyboard.settings.preferences.Preference -import helium314.keyboard.settings.SearchSettingsScreen -import helium314.keyboard.settings.SettingsActivity import helium314.keyboard.settings.Theme +import helium314.keyboard.settings.preferences.Preference import helium314.keyboard.settings.previewDark import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import java.io.OutputStream import java.text.SimpleDateFormat import java.util.Calendar @@ -54,7 +55,7 @@ fun AboutScreen( SettingsWithoutKey.LICENSE, SettingsWithoutKey.HIDDEN_FEATURES, SettingsWithoutKey.GITHUB, - SettingsWithoutKey.SAVE_LOG + SettingsWithoutKey.SAVE_LOG, ) SearchSettingsScreen( onClickBack = onClickBack, @@ -142,16 +143,24 @@ fun createAboutSettings(context: Context) = listOf( icon = R.drawable.ic_settings_about_github ) }, - Setting(context, SettingsWithoutKey.SAVE_LOG, R.string.save_log) { setting -> + saveLog(context, SettingsWithoutKey.SAVE_LOG, R.string.save_log) { + val inputStream = Runtime.getRuntime().exec("logcat -d -b all").inputStream + inputStream.copyTo(it) + inputStream.close() + } +) + +private fun saveLog(context: Context, key: String, titleId: Int, writer: (OutputStream) -> Unit) = + Setting(context, key, titleId) { setting -> val ctx = LocalContext.current val scope = rememberCoroutineScope() val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode != Activity.RESULT_OK) return@rememberLauncherForActivityResult val uri = result.data?.data ?: return@rememberLauncherForActivityResult scope.launch(Dispatchers.IO) { - ctx.getActivity()?.contentResolver?.openOutputStream(uri)?.use { os -> - os.bufferedWriter().use { it.write(Log.getLog().joinToString("\n")) } - } + val outputStream = ctx.getActivity()?.contentResolver?.openOutputStream(uri) + outputStream?.use(writer) + outputStream?.close() } } Preference( @@ -171,8 +180,7 @@ fun createAboutSettings(context: Context) = listOf( }, icon = R.drawable.ic_settings_about_log ) - }, -) + } @Preview @Composable From 14b5439a974c503b609f1cd84e9c67e73b8a97ed Mon Sep 17 00:00:00 2001 From: Gabriele Monaco <32201227+glemco@users.noreply.github.com> Date: Fri, 25 Apr 2025 21:04:05 +0300 Subject: [PATCH 078/175] Use the euro sign for PMS (#1504) --- .../keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt index f0f5d5a23..637056c06 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt @@ -264,7 +264,7 @@ private fun getCurrencyKey(locale: Locale): Pair> { return euro if (locale.toString().matches(euroLocales)) return euro - if (locale.language.matches("ca|eu|lb|mt".toRegex())) + if (locale.language.matches("ca|eu|lb|mt|pms".toRegex())) return euro if (locale.language.matches("ak|dag|ee|fa|gaa|ha|ig|iw|lo|ko|km|mn|ne|si|th|uk|vi|yo".toRegex())) return genericCurrencyKey(getCurrency(locale)) From 6d9f69a4b6d30669fa84891aedb0ffc1d9c6937c Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Sat, 26 Apr 2025 08:34:27 +0300 Subject: [PATCH 079/175] Fix keyboard insets on Android 15, again (#1497) --- .../helium314/keyboard/latin/InputView.java | 62 ++++++++++++++++++- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/InputView.java b/app/src/main/java/helium314/keyboard/latin/InputView.java index 31bd722e8..aca0353b1 100644 --- a/app/src/main/java/helium314/keyboard/latin/InputView.java +++ b/app/src/main/java/helium314/keyboard/latin/InputView.java @@ -6,6 +6,9 @@ package helium314.keyboard.latin; +import java.util.function.BiFunction; + +import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Insets; import android.graphics.Rect; @@ -18,6 +21,7 @@ import android.view.WindowManager; import android.view.WindowMetrics; import android.widget.FrameLayout; +import androidx.annotation.RequiresApi; import androidx.core.view.ViewKt; import helium314.keyboard.accessibility.AccessibilityUtils; @@ -26,6 +30,7 @@ import helium314.keyboard.latin.common.ColorType; import helium314.keyboard.latin.settings.Settings; import helium314.keyboard.latin.suggestions.PopupSuggestionsView; import helium314.keyboard.latin.suggestions.SuggestionStripView; +import helium314.keyboard.latin.utils.Log; import kotlin.Unit; @@ -114,13 +119,17 @@ public final class InputView extends FrameLayout { Settings.getValues().mColors.setBackground(findViewById(R.id.main_keyboard_frame), ColorType.MAIN_BACKGROUND); if (Build.VERSION.SDK_INT >= 30) { - getLocationOnScreen(LOCATION); WindowManager wm = getContext().getSystemService(WindowManager.class); WindowMetrics windowMetrics = wm.getCurrentWindowMetrics(); - if (LOCATION[1] + getHeight() == windowMetrics.getBounds().height()) { + + if (Build.VERSION.SDK_INT >= 35 || isEdgeToEdge(windowMetrics)) { // Edge-to-edge mode + logInsets(wm.getMaximumWindowMetrics(), "max-metrics"); + logInsets(wm.getCurrentWindowMetrics(), "current-metrics"); + WindowInsets windowInsets = windowMetrics.getWindowInsets(); - int insetTypes = WindowInsets.Type.systemBars() | WindowInsets.Type.displayCutout(); + int insetTypes = WindowInsets.Type.systemBars() | WindowInsets.Type.displayCutout() + | WindowInsets.Type.systemGestures(); Insets insets = windowInsets.getInsetsIgnoringVisibility(insetTypes); // Can't set padding on this view, since it results in an overlap with window above the keyboard. @@ -133,6 +142,53 @@ public final class InputView extends FrameLayout { return null; } + @SuppressLint("DefaultLocale") + @RequiresApi(api = 30) + private boolean isEdgeToEdge(WindowMetrics windowMetrics) { + getLocationOnScreen(LOCATION); + Log.i("insets", String.format("Keyboard bottom: %d, screen height: %d.", LOCATION[1] + getHeight(), + windowMetrics.getBounds().height())); + return LOCATION[1] + getHeight() == windowMetrics.getBounds().height(); + } + + @RequiresApi(api = 30) + private static void logInsets(WindowMetrics metrics, String metricsType) { + logInsets(metrics, metricsType, WindowInsets::getInsets, "insets"); + logInsets(metrics, metricsType, WindowInsets::getInsetsIgnoringVisibility, "insetsIgnoringVisibility"); + } + + @RequiresApi(api = 30) + private static void logInsets(WindowMetrics metrics, String metricsType, + BiFunction insetsGetter, String visibility) { + logInsets(metrics, metricsType, WindowInsets.Type.navigationBars(),"navigationBars", + insetsGetter, visibility); + logInsets(metrics, metricsType, WindowInsets.Type.systemBars(), "systemBars", insetsGetter, visibility); + logInsets(metrics, metricsType, WindowInsets.Type.statusBars(), "statusBars", insetsGetter, visibility); + logInsets(metrics, metricsType, WindowInsets.Type.displayCutout(),"displayCutout", + insetsGetter, visibility); + logInsets(metrics, metricsType, WindowInsets.Type.systemGestures(),"systemGestures", + insetsGetter, visibility); + logInsets(metrics, metricsType, WindowInsets.Type.mandatorySystemGestures(), "mandatorySystemGestures", + insetsGetter, visibility); + logInsets(metrics, metricsType, WindowInsets.Type.tappableElement(),"tappableElement", + insetsGetter, visibility); + + if (Build.VERSION.SDK_INT >= 34) { + logInsets(metrics, metricsType, WindowInsets.Type.systemOverlays(), "systemOverlays", + insetsGetter, visibility); + } + } + + @RequiresApi(api = 30) + @SuppressLint("DefaultLocale") + private static void logInsets(WindowMetrics metrics, String metricsType, int insetTypes, String insetsType, + BiFunction insetsGetter, String visibility) { + WindowInsets windowInsets = metrics.getWindowInsets(); + Insets insets = insetsGetter.apply(windowInsets, insetTypes); + Log.i("insets", String.format("%s, %s, %s, bottom %d, top %d", metricsType, insetsType, visibility, + insets.bottom, insets.top)); + } + /** * This class forwards series of {@link MotionEvent}s from SenderView to * ReceiverView. From 322f8f971263d2500b5a64fe7345e55d02664ac0 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 26 Apr 2025 13:24:10 +0200 Subject: [PATCH 080/175] also consider default layouts when removing custom layouts without file was missing in d15a97ccbaa3a75a62b597ad13f7816c8bca9775 also rearrange the code a little fixes GH-1490 --- .../main/java/helium314/keyboard/latin/App.kt | 1 + .../keyboard/latin/utils/LayoutUtilsCustom.kt | 46 ++++++++++++++----- .../keyboard/latin/utils/SubtypeSettings.kt | 29 +----------- .../preferences/BackupRestorePreference.kt | 1 + 4 files changed, 37 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/App.kt b/app/src/main/java/helium314/keyboard/latin/App.kt index 9e40e23e7..904cc028b 100644 --- a/app/src/main/java/helium314/keyboard/latin/App.kt +++ b/app/src/main/java/helium314/keyboard/latin/App.kt @@ -51,6 +51,7 @@ class App : Application() { checkVersionUpgrade(this) app = this Defaults.initDynamicDefaults(this) + LayoutUtilsCustom.removeMissingLayouts(this) // only after version upgrade val packageInfo = packageManager.getPackageInfo(packageName, 0) @Suppress("DEPRECATION") diff --git a/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtilsCustom.kt b/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtilsCustom.kt index 33ea1f28a..19b44f739 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtilsCustom.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtilsCustom.kt @@ -2,6 +2,7 @@ package helium314.keyboard.latin.utils import android.content.Context +import android.widget.Toast import helium314.keyboard.keyboard.Key import helium314.keyboard.keyboard.KeyboardId import helium314.keyboard.keyboard.KeyboardLayoutSet @@ -10,9 +11,14 @@ import helium314.keyboard.keyboard.internal.KeyboardParams import helium314.keyboard.keyboard.internal.keyboard_parser.LayoutParser import helium314.keyboard.keyboard.internal.keyboard_parser.POPUP_KEYS_NORMAL import helium314.keyboard.keyboard.internal.keyboard_parser.addLocaleKeyTextsToParams +import helium314.keyboard.latin.common.Constants.Separators +import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET import helium314.keyboard.latin.common.decodeBase36 import helium314.keyboard.latin.common.encodeBase36 +import helium314.keyboard.latin.define.DebugFlags +import helium314.keyboard.latin.settings.Defaults import helium314.keyboard.latin.settings.Settings +import helium314.keyboard.latin.settings.SettingsSubtype.Companion.toSettingsSubtype import helium314.keyboard.latin.utils.LayoutType.Companion.folder import helium314.keyboard.latin.utils.ScriptUtils.script import kotlinx.serialization.SerializationException @@ -124,7 +130,6 @@ object LayoutUtilsCustom { layoutName } - /** @return layoutName for given [displayName]. If [layoutType ]is MAIN, non-null [locale] must be supplied */ fun getLayoutName(displayName: String, layoutType: LayoutType, locale: Locale? = null): String { if (layoutType != LayoutType.MAIN) @@ -143,18 +148,35 @@ object LayoutUtilsCustom { return file } - /** @return whether a layout has no file and was removed from [layouts] */ - fun removeMissingLayouts(layouts: EnumMap, context: Context): Boolean { - var removed = false - LayoutType.entries.forEach { type -> - val name = layouts[type] ?: return@forEach - if (!isCustomLayout(name) || getLayoutFiles(type, context).any { it.name == name }) - return@forEach - // no file for custom layout - layouts.remove(type) - removed = true + // remove layouts without a layout file from custom subtypes and settings + // should not be necessary, but better fall back to default instead of crashing when encountering a bug + fun removeMissingLayouts(context: Context) { + val prefs = context.prefs() + fun remove(type: LayoutType, name: String) { + val message = "removing custom layout ${getDisplayName(name)} / $name without file" + if (DebugFlags.DEBUG_ENABLED) + Toast.makeText(context, message, Toast.LENGTH_LONG).show() + Log.w(TAG, message) + SubtypeSettings.onRenameLayout(type, name, null, context) } - return removed + LayoutType.entries.forEach { type -> + val name = Settings.readDefaultLayoutName(type, prefs) + if (!isCustomLayout(name) || getLayoutFiles(type, context).any { it.name.startsWith(name) }) + return@forEach + remove(type, name) + } + prefs.getString(Settings.PREF_ADDITIONAL_SUBTYPES, Defaults.PREF_ADDITIONAL_SUBTYPES)!! + .split(Separators.SETS).forEach outer@{ + val subtype = it.toSettingsSubtype() + LayoutType.getLayoutMap(subtype.getExtraValueOf(KEYBOARD_LAYOUT_SET) ?: "").forEach { (type, name) -> + if (!isCustomLayout(name) || getLayoutFiles(type, context).any { it.name.startsWith(name) }) + return@forEach + remove(type, name) + // recursive call: additional subtypes must have changed, so we repeat until nothing needs to be deleted + removeMissingLayouts(context) + return + } + } } // this goes into prefs and file names, so do not change! diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt index 2566cf703..86486adb9 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt @@ -13,14 +13,12 @@ import helium314.keyboard.compat.locale import helium314.keyboard.keyboard.KeyboardSwitcher import helium314.keyboard.latin.RichInputMethodManager import helium314.keyboard.latin.common.Constants.Separators -import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET import helium314.keyboard.latin.common.LocaleUtils import helium314.keyboard.latin.define.DebugFlags import helium314.keyboard.latin.settings.Defaults import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.settings.SettingsSubtype import helium314.keyboard.latin.settings.SettingsSubtype.Companion.toSettingsSubtype -import helium314.keyboard.latin.utils.LayoutType.Companion.toExtraValue import helium314.keyboard.latin.utils.ScriptUtils.script import java.util.Locale @@ -156,7 +154,7 @@ object SubtypeSettings { } else subtype.toPref() }.joinToString(Separators.SETS) - prefs.edit().putString(key, new).apply() + editor.putString(key, new) } editor.apply() if (Settings.readDefaultLayoutName(type, prefs) == from) @@ -166,7 +164,6 @@ object SubtypeSettings { fun reloadEnabledSubtypes(context: Context) { enabledSubtypes.clear() - removeMissingCustomLayouts(context) loadAdditionalSubtypes(context.prefs()) loadEnabledSubtypes(context) if (RichInputMethodManager.isInitialized()) @@ -190,7 +187,6 @@ object SubtypeSettings { reloadSystemLocales(context) loadResourceSubtypes(context.resources) - removeMissingCustomLayouts(context) loadAdditionalSubtypes(context.prefs()) loadEnabledSubtypes(context) } @@ -218,29 +214,6 @@ object SubtypeSettings { } } - // remove layouts without a layout file from custom subtypes - // should not be necessary, but better fall back to default instead of crashing when encountering a bug - private fun removeMissingCustomLayouts(context: Context) { - val prefs = context.prefs() - val additionalSubtypes = prefs.getString(Settings.PREF_ADDITIONAL_SUBTYPES, Defaults.PREF_ADDITIONAL_SUBTYPES)!! - .split(Separators.SETS).map { it.toSettingsSubtype() } - additionalSubtypes.forEach { subtype -> - val layouts = LayoutType.getLayoutMap(subtype.getExtraValueOf(KEYBOARD_LAYOUT_SET) ?: "") - if (LayoutUtilsCustom.removeMissingLayouts(layouts, context)) { - // layout file is missing -> adjust the subtype to use the modified layout map - val newSubtype = if (layouts.isEmpty()) subtype.without(KEYBOARD_LAYOUT_SET) - else subtype.with(KEYBOARD_LAYOUT_SET, layouts.toExtraValue()) - SubtypeUtilsAdditional.changeAdditionalSubtype(subtype, newSubtype, context) - val message = "removing custom layouts without file from subtype $subtype" - if (DebugFlags.DEBUG_ENABLED) - Toast.makeText(context, message, Toast.LENGTH_LONG).show() - Log.w(TAG, message) - // we return here, because changeAdditionalSubtype calls reloadEnabledSubtypes, which calls this method - return - } - } - } - private fun loadAdditionalSubtypes(prefs: SharedPreferences) { additionalSubtypes.clear() val additionalSubtypeString = prefs.getString(Settings.PREF_ADDITIONAL_SUBTYPES, Defaults.PREF_ADDITIONAL_SUBTYPES)!! diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt index a736014b8..40bfa4a38 100644 --- a/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt +++ b/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt @@ -164,6 +164,7 @@ fun BackupRestorePreference(setting: Setting) { val newDictBroadcast = Intent(DictionaryPackConstants.NEW_DICTIONARY_INTENT_ACTION) ctx.getActivity()?.sendBroadcast(newDictBroadcast) LayoutUtilsCustom.onLayoutFileChanged() + LayoutUtilsCustom.removeMissingLayouts(ctx) (ctx.getActivity() as? SettingsActivity)?.prefChanged() KeyboardSwitcher.getInstance().setThemeNeedsReload() } From 106a74d7497aaff99eb9c177e30a06d91d6f9e16 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 26 Apr 2025 13:55:40 +0200 Subject: [PATCH 081/175] upgrade version and translations --- app/build.gradle.kts | 4 ++-- app/src/main/res/values-bn/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 11 ++++++++++- app/src/main/res/values-it/strings.xml | 2 ++ app/src/main/res/values-pl/strings.xml | 2 ++ fastlane/metadata/android/ar/changelogs/3006.txt | 11 +++++++++++ fastlane/metadata/android/ca/changelogs/3006.txt | 11 +++++++++++ fastlane/metadata/android/cs-CZ/changelogs/3006.txt | 11 +++++++++++ fastlane/metadata/android/en-US/changelogs/3006.txt | 11 +++++++++++ fastlane/metadata/android/et/changelogs/3006.txt | 11 +++++++++++ fastlane/metadata/android/it-IT/changelogs/3006.txt | 11 +++++++++++ fastlane/metadata/android/nl-NL/changelogs/3006.txt | 11 +++++++++++ 12 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 fastlane/metadata/android/ar/changelogs/3006.txt create mode 100644 fastlane/metadata/android/ca/changelogs/3006.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/3006.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/3006.txt create mode 100644 fastlane/metadata/android/et/changelogs/3006.txt create mode 100644 fastlane/metadata/android/it-IT/changelogs/3006.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/3006.txt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 029d4cbaa..18a378456 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,8 +13,8 @@ android { applicationId = "helium314.keyboard" minSdk = 21 targetSdk = 35 - versionCode = 3005 - versionName = "3.0-beta2" + versionCode = 3006 + versionName = "3.0-beta3" ndk { abiFilters.clear() abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 865c5d24f..dbdba51f7 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -444,7 +444,7 @@ ব্যাকস্পেস দ্বারা স্বতঃসংশোধন প্রত্যাবর্তন পরামর্শ বাছাইয়ের পরে স্বয়ংক্রিয় স্পেস শিফট অনিষ্পাদিত স্বয়ংক্রিয় স্পেস অপসারণ করবে - টাইমস্ট্যাম্প বোতামের ফরম্যাট + টাইমস্ট্যাম্পের ফরম্যাট সেসুতু ডাগবানি diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 1f0eb8a08..93229f1a2 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -303,7 +303,7 @@ Autokorrektur, auch wenn dies vom Eingabefeld nicht explizit angefordert wird Holo-Weiß Beides wechseln - ► Durch langes Drücken der angehefteten Tasten in der Symbolleiste erhälst du zusätzliche Funktionen: <br> \n\t•Zwischenablage &#65515; einfügen <br> \n\t• nach links/rechts bewegen &#65515; Wort links/rechts <br> \n\t• aufwärts/abwärts bewegen &#65515; Seite auf/ab <br> \n\t• Wort links/rechts &#65515; Zeilenanfang/-ende <br> \n\t• Seite auf/ab &#65515; Seite Anfang/Ende <br> \n\t• kopieren. &#65515; ausschneiden <br> \n\t•Wort wählen &#8596; alle auswählen <br> \n\t• rückgängig &#8596; wiederherstellen. <br> <br> \n► Durch langes Drücken von Tasten in der Symbolleiste der Vorschlagsleiste werden diese an die Vorschlagsleiste angeheftet. <br> <br> \n► Drücke lange auf die Komma-Taste, um die Zwischenablage-Ansicht, die Emoji-Ansicht, den Einhandmodus, die Einstellungen oder die Sprache zu wechseln.: <br> \n\t• Die Emoji-Ansicht und die Sprachumschaltung werden ausgeblendet, wenn du die entsprechende Taste aktiviert hast.; <br> \n\t• Bei einigen Layouts ist es nicht die Komma-Taste, sondern die Taste an der gleichen Position (z.B. \'q\' beim Dvorak-Layout). <br> <br> \n► Wenn der Inkognito-Modus aktiviert ist, werden keine Wörter gelernt und keine Emojis zu den Notizen hinzugefügt. <br> <br> \n► Drücke auf das Symbol Inkognito, um die Symbolleiste aufzurufen. <br> <br> \n► Gleitende Tasteneingabe: Streiche von der Umschalttaste zu einer anderen Taste, um einen einzelnen Großbuchstaben einzugeben: <br> \n\t• Dies funktioniert auch für die Taste \'?123\', um ein einzelnes Symbol von der Symboltastatur einzugeben, und für verwandte Tasten. <br> <br> \n► Halte die Umschalt- oder Symboltaste gedrückt, drücke eine oder mehrere Tasten, und lasse dann die Umschalt- oder Symboltaste los, um zur vorherigen Tastatur zurückzukehren.. <br> <br> \n► Drücke lange auf einen Vorschlag in der Vorschlagsleiste, um weitere Vorschläge anzuzeigen, und eine Löschtaste, um diesen Vorschlag zu entfernen. <br> <br> \n► Wische von einem Vorschlag nach oben, um weitere Vorschläge zu öffnen, und lasse den Vorschlag los, um ihn auszuwählen. <br> <br> \n► Drücke lange auf einen Eintrag in der Zwischenablage, um ihn anzuheften (er bleibt in der Zwischenablage, bis du die Anheftung aufhebst). <br> <br> \n► Wische in der Zwischenablageansicht nach links, um einen Eintrag zu entfernen (außer wenn er angeheftet ist) <br> <br> \n► Markiere den Text und drücke die Umschalttaste, um zwischen Groß- und Kleinschreibung sowie Großschreibung zu wechseln. <br> <br> \n► Du kannst Wörterbücher hinzufügen, indem du sie in einem Datei-Explorer öffnest: <br> \n\t• Dies funktioniert nur mit <i>content-uris</i> und nicht mit <i>file-uris</i>, was bedeutet, dass es mit einigen Datei-Explorern möglicherweise nicht funktioniert. <br> <br> \n► Für Benutzer, die manuelle Backups mit Root-Zugriff durchführen: <br> \n\t• Ab Android 7 befindet sich die gemeinsam genutzte Einstellungsdatei nicht am Standardspeicherort, da die App %s verwendet. Dies ist notwendig, damit die Einstellungen gelesen werden können, bevor das Gerät entsperrt wird, z. B. beim Booten; <br> \n\t• Die Datei befindet sich in /data/user_de/0/package_id/shared_prefs/, wobei dies vom jeweiligen Gerät und der Android-Version abhängen kann. <br> <br> \n<i><b>Debug-Modus / Debug-APK</b></i> <br> <br> \n► Drücke lange auf einen Vorschlag, um das Quellwörterbuch anzuzeigen. <br> <br> \n► Wenn du die Debug-APK verwendest, kannst du die Debug-Einstellungen in den erweiterten Einstellungen finden, obwohl die Nützlichkeit begrenzt ist, außer für die Ausgabe von Wörterbüchern in das Protokoll. <br> \n\t• Für eine Release-APK musst du die Version in <i>About</i> mehrmals antippen, dann findest du Debug-Einstellungen in <i>Erweiterte Einstellungen</i>. <br> \n\t• Wenn du die Option <i>Informationen zu Vorschlägen anzeigen</i> aktivierst, werden die Vorschläge mit kleinen Zahlen versehen, die die interne Bewertung und das Quellenwörterbuch anzeigen. <br> <br> \n► Im Falle eines Anwendungsabsturzes wirst du beim Öffnen der Einstellungen gefragt, ob du die Absturzprotokolle erhalten möchtest. <br> <br> \n► Bei mehrsprachiger Eingabe zeigt die Leertaste einen Vertrauenswert an, der zur Bestimmung der aktuell verwendeten Sprache verwendet wird. <br> <br> \n► Bei den Vorschlägen werden oben einige kleine Zahlen angezeigt, die den internen Punktestand und das Quellenwörterbuch anzeigen (kann deaktiviert werden). + ► Durch langes Drücken der angehefteten Tasten in der Symbolleiste erhält du zusätzliche Funktionen: <br> \n\t•Zwischenablage &#65515; einfügen <br> \n\t• nach links/rechts bewegen &#65515; Wort links/rechts <br> \n\t• aufwärts/abwärts bewegen &#65515; Seite auf/ab <br> \n\t• Wort links/rechts &#65515; Zeilenanfang/-ende <br> \n\t• Seite auf/ab &#65515; Seite Anfang/Ende <br> \n\t• kopieren. &#65515; ausschneiden <br> \n\t•Wort wählen &#8596; alle auswählen <br> \n\t• rückgängig &#8596; wiederherstellen. <br> <br> \n► Durch langes Drücken von Tasten in der Symbolleiste der Vorschlagsleiste werden diese an die Vorschlagsleiste angeheftet. <br> <br> \n► Drücke lange auf die Komma-Taste, um die Zwischenablage-Ansicht, die Emoji-Ansicht, den Einhandmodus, die Einstellungen oder die Sprache zu wechseln.: <br> \n\t• Die Emoji-Ansicht und die Sprachumschaltung werden ausgeblendet, wenn du die entsprechende Taste aktiviert hast.; <br> \n\t• Bei einigen Layouts ist es nicht die Komma-Taste, sondern die Taste an der gleichen Position (z.B. \'q\' beim Dvorak-Layout). <br> <br> \n► Wenn der Inkognito-Modus aktiviert ist, werden keine Wörter gelernt und keine Emojis zu den Notizen hinzugefügt. <br> <br> \n► Drücke auf das Symbol Inkognito, um die Symbolleiste aufzurufen. <br> <br> \n► Gleitende Tasteneingabe: Streiche von der Umschalttaste zu einer anderen Taste, um einen einzelnen Großbuchstaben einzugeben: <br> \n\t• Dies funktioniert auch für die Taste \'?123\', um ein einzelnes Symbol von der Symboltastatur einzugeben, und für verwandte Tasten. <br> <br> \n► Halte die Umschalt- oder Symboltaste gedrückt, drücke eine oder mehrere Tasten, und lasse dann die Umschalt- oder Symboltaste los, um zur vorherigen Tastatur zurückzukehren.. <br> <br> \n► Drücke lange auf einen Vorschlag in der Vorschlagsleiste, um weitere Vorschläge anzuzeigen, und eine Löschtaste, um diesen Vorschlag zu entfernen. <br> <br> \n► Wische von einem Vorschlag nach oben, um weitere Vorschläge zu öffnen, und lasse den Vorschlag los, um ihn auszuwählen. <br> <br> \n► Drücke lange auf einen Eintrag in der Zwischenablage, um ihn anzuheften (er bleibt in der Zwischenablage, bis du die Anheftung aufhebst). <br> <br> \n► Wische in der Zwischenablageansicht nach links, um einen Eintrag zu entfernen (außer wenn er angeheftet ist) <br> <br> \n► Markiere den Text und drücke die Umschalttaste, um zwischen Groß- und Kleinschreibung sowie Großschreibung zu wechseln. <br> <br> \n► Du kannst Wörterbücher hinzufügen, indem du sie in einem Datei-Explorer öffnest: <br> \n\t• Dies funktioniert nur mit <i>content-uris</i> und nicht mit <i>file-uris</i>, was bedeutet, dass es mit einigen Datei-Explorern möglicherweise nicht funktioniert. <br> <br> \n► Für Benutzer, die manuelle Backups mit Root-Zugriff durchführen: <br> \n\t• Ab Android 7 befindet sich die gemeinsam genutzte Einstellungsdatei nicht am Standardspeicherort, da die App %s verwendet. Dies ist notwendig, damit die Einstellungen gelesen werden können, bevor das Gerät entsperrt wird, z. B. beim Booten; <br> \n\t• Die Datei befindet sich in /data/user_de/0/package_id/shared_prefs/, wobei dies vom jeweiligen Gerät und der Android-Version abhängen kann. <br> <br> \n<i><b>Debug-Modus / Debug-APK</b></i> <br> <br> \n► Drücke lange auf einen Vorschlag, um das Quellwörterbuch anzuzeigen. <br> <br> \n► Wenn du die Debug-APK verwendest, kannst du die Debug-Einstellungen in den erweiterten Einstellungen finden, obwohl die Nützlichkeit begrenzt ist, außer für die Ausgabe von Wörterbüchern in das Protokoll. <br> \n\t• Für eine Release-APK musst du die Version in <i>About</i> mehrmals antippen, dann findest du Debug-Einstellungen in <i>Erweiterte Einstellungen</i>. <br> \n\t• Wenn du die Option <i>Informationen zu Vorschlägen anzeigen</i> aktivierst, werden die Vorschläge mit kleinen Zahlen versehen, die die interne Bewertung und das Quellenwörterbuch anzeigen. <br> <br> \n► Im Falle eines Anwendungsabsturzes wirst du beim Öffnen der Einstellungen gefragt, ob du die Absturzprotokolle erhalten möchtest. <br> <br> \n► Bei mehrsprachiger Eingabe zeigt die Leertaste einen Vertrauenswert an, der zur Bestimmung der aktuell verwendeten Sprache verwendet wird. <br> <br> \n► Bei den Vorschlägen werden oben einige kleine Zahlen angezeigt, die den internen Punktestand und das Quellenwörterbuch anzeigen (kann deaktiviert werden). "Ohne Wörterbuch erhältst du nur Vorschläge für Text, den du zuvor eingegeben hast.<br>\n Du kannst Wörterbücher %1$s herunterladen oder %3$s überprüfen, ob ein Wörterbuch für \"%2$s\" direkt heruntergeladen werden kann." %s (experimentell) Symbole @@ -440,4 +440,13 @@ Web-Eingabefelder (meist in Browsern) sind eine häufige Ursache für Probleme mit der Einstellung \"Immer Vorschläge anzeigen\" Drücken der Eingabetaste oder der Leertaste nach anderen Tasten im Ziffernblock Leertaste + Shift entfernt anstehende automatische Leerzeichen + Leerzeichen nach Wörtern bei Gesten-Eingabe + Kein automatisches Leerzeichen beim drücken von Shift + Leerzeichen vor Wörtern bei Gesten-Eingabe + Format der Timestamp-Taste + Dagbani + Sesotho + Rücktaste macht Autokorrektur rückgängig + Automatische Leerzeichen nach Auswählen eines Vorschlags diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 0b9be9043..950cfeccb 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -453,4 +453,6 @@ Usa Backspace per annullare l\'autocorrezione Spazio automatico prima di una parola aggiunta con l\'inserimento gestuale Formato per il tasto data/ora + Dagbani + Sesotho diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 6505e0335..c22edcbf0 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -490,4 +490,6 @@ Backspace cofa autokorektę Automatyczna spacja przed wpisaniem słowa gestem Format klawisza znacznika czasu + dagbani + sesotho diff --git a/fastlane/metadata/android/ar/changelogs/3006.txt b/fastlane/metadata/android/ar/changelogs/3006.txt new file mode 100644 index 000000000..cb1eb5fde --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/3006.txt @@ -0,0 +1,11 @@ +* إضافة تخطيطات: Hija'i العربية، العبرية 1452-2، الهندية الصوتية، دارغوا (أوراخي)، بايشاخي، الكرديش +* تحديث بعض التخطيطات +* الدعم الجمع بين اللهجات +* مفتاح شريط أدوات لوحة المفاتيح +* إضافة منبثقات .com +* السماح لضبط الخط المخصص +* إضافة إعداد مقياس الخط +* تحسين تبديل اللغة التلقائي +* إعدادات الإصلاح +* أضف إعدادات لمزيد من ضبط حشوة لوحة المفاتيح، والمساحة التلقائية، والتصحيح التلقائي، و صف الأرقام +* المزيد من الميزات والإصلاحات diff --git a/fastlane/metadata/android/ca/changelogs/3006.txt b/fastlane/metadata/android/ca/changelogs/3006.txt new file mode 100644 index 000000000..4f0c8df16 --- /dev/null +++ b/fastlane/metadata/android/ca/changelogs/3006.txt @@ -0,0 +1,11 @@ +* Afeg. dissenys: àrab Hija'i, hebreu 1452-2, fonètica hindi, Dargwa (Urakhi), Baishakhi, kurd +* Actu. dissenys +* Suport per combinar accents +* Tecla dividida de la barra d'eines del teclat +* Afeg. finestres emergents .com +* Permet configurar lletra personalitzada +* Afeg. la configuració d'escala de lletra +* Millorar el canvi automàtic d'idioma +* Revisada configuració +* Afeg. paràmetres per ajustar més el farciment del teclat, l'espai automàtic, la correcció automàtica, la fila de nombres +* Més… diff --git a/fastlane/metadata/android/cs-CZ/changelogs/3006.txt b/fastlane/metadata/android/cs-CZ/changelogs/3006.txt new file mode 100644 index 000000000..7b5a3f128 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/3006.txt @@ -0,0 +1,11 @@ +* přidána rozvržení: arabština hidžá'í, hebrejština 1452-2, fonetické hindu, dargwa (urakhi), baishakhi, kurdština +* aktualizace některých rozvržení +* podpora kombinování přízvuků +* klávesa pro rozdělení klávesnice +* přidána nabídka .com +* možnost nastavení vlastního písma +* přidáno nastavení měřítka písma +* zlepšeno automatické přepínání jazyků +* přepracována nastavení +* přidána nastavení pro lepší nastavení odsazení, automatické mezery, automatické opravy, číselné řady +* další funkce a opravy diff --git a/fastlane/metadata/android/en-US/changelogs/3006.txt b/fastlane/metadata/android/en-US/changelogs/3006.txt new file mode 100644 index 000000000..ce0395033 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/3006.txt @@ -0,0 +1,11 @@ +* add layouts: Arabic Hija'i, Hebrew 1452-2, Hindi Phonetic, Dargwa (Urakhi), Baishakhi, Kurdish +* update some layouts +* support combining accents +* split keyboard toolbar key +* add .com popups +* allow setting custom font +* add font scale setting +* improve automatic language switching +* overhaul settings +* add settings for more tuning of keyboard padding, auto-space, auto-correction, number row +* more features and fixes diff --git a/fastlane/metadata/android/et/changelogs/3006.txt b/fastlane/metadata/android/et/changelogs/3006.txt new file mode 100644 index 000000000..f9be70240 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/3006.txt @@ -0,0 +1,11 @@ +* uued klahvipaigustused: araabia hija'i, heebrea 1452-2, hindi foneetiline, dargi (Urahhi), baišaki, kurdi +* mõnede klahvipaigustuste täiendused +* aktsentide kombineerimise tugi +* nupp klahvistiku poolitamiseks +* lisandusid .com hüpikaknad +* oma kirjatüübi valikuvõimalus +* kirjatüübi skaleerimise võimalus +* improve automatic language switching +* seadistuste kohendus +* lisaseadistused klahvide vaheruumi, tühikute lisamise, autokorrektsiooni ja ridade arvu jaoks +* pisitäiendused ja parandused diff --git a/fastlane/metadata/android/it-IT/changelogs/3006.txt b/fastlane/metadata/android/it-IT/changelogs/3006.txt new file mode 100644 index 000000000..16cb2ba25 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/3006.txt @@ -0,0 +1,11 @@ +* layout aggiunti: Arabo Hija'i, Ebraico 1452-2, Hindi fonetico, Dargwa (Urakhi), Baishakhi, Curdo +* alcuni layout aggiornati +* supporto agli accenti combinati +* pulsante 'Tastiera divisa' nella barra degli strumenti +* popup .com aggiunto +* font personalizzato per i tasti +* aggiustamento dimensione per i tasti +* modalità multilingua migliorata +* impostazioni ridisegnate +* aggiunte alcune opzioni per spaziatura automatica, correzione testo e riga dei numeri +* altre funzionalità, migliorie e bugfix diff --git a/fastlane/metadata/android/nl-NL/changelogs/3006.txt b/fastlane/metadata/android/nl-NL/changelogs/3006.txt new file mode 100644 index 000000000..6256f8aeb --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/3006.txt @@ -0,0 +1,11 @@ +* lay-outs toevoegen: Arabisch Hija'i, Hebreeuws 1452-2, Hindi Fonetisch, Dargwa (Urakhi), Baishakhi, Koerdisch +* Update enkele lay-outs +* Ondersteuning voor het combineren van accenten +* Gesplitste toetsenbordwerkbalktoets +* voeg .com pop-ups toe +* Toestaan instellen van aangepast lettertype +* Instelling voor lettertypeschaal toevoegen +* automatische taalomschakeling verbeteren +* Revisie instellingen +* Voeg instellingen toe voor meer afstemming van toetsenbordopvulling, automatische spatie, autocorrectie, cijferrij +* Meer functies en fixes From 54c2c364a0f519442a60652fbc1a2805845730b6 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 27 Apr 2025 15:44:59 +0200 Subject: [PATCH 082/175] close background image dialog when deleting image --- .../keyboard/settings/preferences/BackgroundImagePreference.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/BackgroundImagePreference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/BackgroundImagePreference.kt index 8b70448b8..0f500cdf9 100644 --- a/app/src/main/java/helium314/keyboard/settings/preferences/BackgroundImagePreference.kt +++ b/app/src/main/java/helium314/keyboard/settings/preferences/BackgroundImagePreference.kt @@ -105,6 +105,7 @@ fun BackgroundImagePref(setting: Setting, isLandscape: Boolean) { getFile().delete() Settings.clearCachedBackgroundImages() KeyboardSwitcher.getInstance().setThemeNeedsReload() + showSelectionDialog = false } ) } From bedb9d1517a45797de0afb61651eddf5d3290733 Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Sun, 27 Apr 2025 17:03:18 +0300 Subject: [PATCH 083/175] Fix settings search insets by moving top & horizontal insets to the top of the setting screen. (#1510) --- .../keyboard/settings/SearchScreen.kt | 167 +++++++++--------- .../settings/screens/MainSettingsScreen.kt | 4 +- .../settings/screens/SubtypeScreen.kt | 2 +- 3 files changed, 81 insertions(+), 92 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt b/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt index 7448d01ab..66ba49f64 100644 --- a/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/SearchScreen.kt @@ -64,8 +64,7 @@ fun SearchSettingsScreen( if (content != null) content() else { Scaffold( - contentWindowInsets = WindowInsets.safeDrawing - .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom) + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Bottom) ) { innerPadding -> Column( Modifier.verticalScroll(rememberScrollState()).then(Modifier.padding(innerPadding)) @@ -123,97 +122,89 @@ fun SearchScreen( // keyboard in unexpected situations such as going back from another screen, which is rather annoying var searchText by remember { mutableStateOf(TextFieldValue()) } var showSearch by remember { mutableStateOf(false) } - Column(Modifier.fillMaxSize()) { + Scaffold(contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)) + { innerPadding -> + Column(Modifier.fillMaxSize().padding(innerPadding)) { - fun setShowSearch(value: Boolean) { - showSearch = value - if (!value) searchText = TextFieldValue() - } - BackHandler { - if (showSearch || searchText.text.isNotEmpty()) setShowSearch(false) - else onClickBack() - } - Surface( - color = MaterialTheme.colorScheme.surfaceContainer, - ) { - Column { - TopAppBar( - title = title, - windowInsets = TopAppBarDefaults.windowInsets, - navigationIcon = { - IconButton(onClick = { - if (showSearch) setShowSearch(false) - else onClickBack() - }) { - Icon( - painterResource(R.drawable.ic_arrow_back), - stringResource(R.string.spoken_description_action_previous) - ) - } - }, - actions = { - if (icon == null) - IconButton(onClick = { setShowSearch(!showSearch) }) { SearchIcon() } - else - icon() - if (menu != null) - Box { - var showMenu by remember { mutableStateOf(false) } - IconButton( - onClick = { showMenu = true } - ) { Icon(painterResource(R.drawable.ic_arrow_left), "menu", Modifier.rotate(-90f)) } - DropdownMenu( - expanded = showMenu, - onDismissRequest = { showMenu = false } - ) { - menu.forEach { - DropdownMenuItem( - text = { Text(it.first) }, - onClick = { showMenu = false; it.second() } - ) + fun setShowSearch(value: Boolean) { + showSearch = value + if (!value) searchText = TextFieldValue() + } + BackHandler { + if (showSearch || searchText.text.isNotEmpty()) setShowSearch(false) + else onClickBack() + } + Surface( + color = MaterialTheme.colorScheme.surfaceContainer, + ) { + Column { + TopAppBar( + title = title, + windowInsets = WindowInsets(0), + navigationIcon = { + IconButton(onClick = { + if (showSearch) setShowSearch(false) + else onClickBack() + }) { + Icon( + painterResource(R.drawable.ic_arrow_back), + stringResource(R.string.spoken_description_action_previous) + ) + } + }, + actions = { + if (icon == null) + IconButton(onClick = { setShowSearch(!showSearch) }) { SearchIcon() } + else + icon() + if (menu != null) + Box { + var showMenu by remember { mutableStateOf(false) } + IconButton( + onClick = { showMenu = true } + ) { Icon(painterResource(R.drawable.ic_arrow_left), "menu", Modifier.rotate(-90f)) } + DropdownMenu( + expanded = showMenu, + onDismissRequest = { showMenu = false } + ) { + menu.forEach { + DropdownMenuItem( + text = { Text(it.first) }, + onClick = { showMenu = false; it.second() } + ) + } } } - } - }, - ) - ExpandableSearchField( - expanded = showSearch, - onDismiss = { setShowSearch(false) }, - search = searchText, - onSearchChange = { searchText = it }, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 8.dp), - colors = TextFieldDefaults.colors( - focusedContainerColor = MaterialTheme.colorScheme.surface + }, + ) + ExpandableSearchField( + expanded = showSearch, + onDismiss = { setShowSearch(false) }, + search = searchText, + onSearchChange = { searchText = it }, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 8.dp), + colors = TextFieldDefaults.colors( + focusedContainerColor = MaterialTheme.colorScheme.surface + ) ) - ) - } - } - CompositionLocalProvider(LocalTextStyle provides MaterialTheme.typography.bodyLarge) { - if (searchText.text.isBlank() && content != null) { - Column( - // todo: how and where to best deal with insets? - // here? manifest android:windowSoftInputMode="adjustResize"? - // other? -// Modifier -// .windowInsetsPadding( -// WindowInsets.safeDrawing.only( -// WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom -// ) -// ) - ) { - content() } - } else { - val items = filteredItems(searchText.text) - Scaffold( - contentWindowInsets = WindowInsets.safeDrawing - .only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom) - ) { innerPadding -> - LazyColumn(contentPadding = innerPadding) { - items(items) { - itemContent(it) + } + CompositionLocalProvider(LocalTextStyle provides MaterialTheme.typography.bodyLarge) { + if (searchText.text.isBlank() && content != null) { + Column { + content() + } + } else { + val items = filteredItems(searchText.text) + Scaffold( + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Bottom) + ) { innerPadding -> + LazyColumn(contentPadding = innerPadding) { + items(items) { + itemContent(it) + } } } } diff --git a/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt index 7efe23773..67d3a977c 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt @@ -48,9 +48,7 @@ fun MainSettingsScreen( settings = emptyList(), ) { val enabledSubtypes = SubtypeSettings.getEnabledSubtypes(true) - Scaffold( - contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom) - ) { innerPadding -> + Scaffold(contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Bottom)) { innerPadding -> Column( Modifier.verticalScroll(rememberScrollState()).then(Modifier.padding(innerPadding)) ) { diff --git a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt index df1161cbe..d1de9c8be 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt @@ -146,7 +146,7 @@ fun SubtypeScreen( filteredItems = { emptyList() } ) { Scaffold( - contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom) + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Bottom) ) { innerPadding -> Column( modifier = Modifier.verticalScroll(scrollState).padding(horizontal = 12.dp) From 9c727f342d8db72481a6821d1b563dba3c676887 Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Sun, 27 Apr 2025 17:19:26 +0300 Subject: [PATCH 084/175] Remove TLD popup hint (#1511) Co-authored-by: Helium314 --- .../main/assets/layouts/functional/functional_keys.json | 2 +- .../internal/keyboard_parser/floris/TextKeyData.kt | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/assets/layouts/functional/functional_keys.json b/app/src/main/assets/layouts/functional/functional_keys.json index 788e44796..6d28dd24f 100644 --- a/app/src/main/assets/layouts/functional/functional_keys.json +++ b/app/src/main/assets/layouts/functional/functional_keys.json @@ -15,7 +15,7 @@ { "$": "keyboard_state_selector", "emojiKeyEnabled": { "$": "keyboard_state_selector", "alphabet": { "label": "emoji" }}}, { "$": "keyboard_state_selector", "symbols": { "label": "numpad" }}, { "label": "space" }, - { "label": "period" }, + { "label": "period", "labelFlags": 1073741824 }, { "label": "action", "width": 0.15 } ] ] diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt index 757ea9a5a..ae4eacdc4 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt @@ -526,11 +526,8 @@ sealed interface KeyData : AbstractKeyData { return when (label) { KeyLabel.ALPHA, KeyLabel.SYMBOL_ALPHA, KeyLabel.SYMBOL -> Key.LABEL_FLAGS_PRESERVE_CASE or Key.LABEL_FLAGS_FOLLOW_FUNCTIONAL_TEXT_COLOR KeyLabel.COMMA -> Key.LABEL_FLAGS_HAS_POPUP_HINT - // essentially the first term only changes the appearance of the armenian period key in holo theme - KeyLabel.PERIOD -> (Key.LABEL_FLAGS_HAS_POPUP_HINT and - if (params.mId.isAlphabetKeyboard) params.mLocaleKeyboardInfos.labelFlags else 0) or - (if (shouldShowTldPopups(params)) 0 else Key.LABEL_FLAGS_DISABLE_HINT_LABEL) or - Key.LABEL_FLAGS_PRESERVE_CASE + // essentially this only changes the appearance of the armenian period key in holo theme + KeyLabel.PERIOD -> Key.LABEL_FLAGS_HAS_POPUP_HINT and if (params.mId.isAlphabetKeyboard) params.mLocaleKeyboardInfos.labelFlags else 0 KeyLabel.ACTION -> { Key.LABEL_FLAGS_PRESERVE_CASE or Key.LABEL_FLAGS_AUTO_X_SCALE or Key.LABEL_FLAGS_FOLLOW_KEY_LABEL_RATIO or Key.LABEL_FLAGS_FOLLOW_FUNCTIONAL_TEXT_COLOR or From 1d441a8ca68db2d2444a78a744bd1a20eff3d869 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 27 Apr 2025 18:59:29 +0200 Subject: [PATCH 085/175] more workarounds for Korean not just space might delete text, but also other separators now this problem is avoided in a more generic way fixes GH-1447 --- .../keyboard/latin/WordComposer.java | 5 +++ .../keyboard/latin/inputlogic/InputLogic.java | 35 ++++++++++++------- .../keyboard/latin/InputLogicTest.kt | 8 +++++ 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/WordComposer.java b/app/src/main/java/helium314/keyboard/latin/WordComposer.java index 203eb205c..a5b50f353 100644 --- a/app/src/main/java/helium314/keyboard/latin/WordComposer.java +++ b/app/src/main/java/helium314/keyboard/latin/WordComposer.java @@ -218,6 +218,11 @@ public final class WordComposer { // TODO: compute where that puts us inside the events } + public void resetInvalidCursorPosition() { + if (mCursorPositionWithinWord > mCodePointSize) + mCursorPositionWithinWord = 0; + } + public boolean isCursorFrontOrMiddleOfComposingWord() { if (DebugFlags.DEBUG_ENABLED && mCursorPositionWithinWord > mCodePointSize) { throw new RuntimeException("Wrong cursor position : " + mCursorPositionWithinWord diff --git a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java index 79464dee3..4b1bd4df2 100644 --- a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java @@ -440,19 +440,28 @@ public final class InputLogic { mWordBeingCorrectedByCursor = null; mJustRevertedACommit = false; final Event processedEvent; - if (currentKeyboardScript.equals(ScriptUtils.SCRIPT_HANGUL) - // only use the Hangul chain if codepoint may actually be Hangul - // todo: this whole hangul-related logic should probably be somewhere else - // need to use hangul combiner for whitespace, because otherwise the current word - // seems to get deleted / replaced by space during mConnection.endBatchEdit() - // similar for functional keys (codePoint -1) - && (event.getMCodePoint() >= 0x1100 || Character.isWhitespace(event.getMCodePoint()) || event.getMCodePoint() == -1)) { - mWordComposer.setHangul(true); - final Event hangulDecodedEvent = HangulEventDecoder.decodeSoftwareKeyEvent(event); - // todo: here hangul combiner does already consume the event, and appends typed codepoint - // to the current word instead of considering the cursor position - // position is actually not visible to the combiner, how to fix? - processedEvent = mWordComposer.processEvent(hangulDecodedEvent); + if (currentKeyboardScript.equals(ScriptUtils.SCRIPT_HANGUL)) { + // only use the Hangul chain if codepoint may actually be Hangul + // todo: this whole hangul-related logic should probably be somewhere else + // need to use hangul combiner for functional keys (codePoint -1), because otherwise the current word + // seems to get deleted / replaced by space during mConnection.endBatchEdit() + if (event.getMCodePoint() >= 0x1100 || event.getMCodePoint() == -1) { + mWordComposer.setHangul(true); + final Event hangulDecodedEvent = HangulEventDecoder.decodeSoftwareKeyEvent(event); + // todo: here hangul combiner does already consume the event, and appends typed codepoint + // to the current word instead of considering the cursor position + // position is actually not visible to the combiner, how to fix? + processedEvent = mWordComposer.processEvent(hangulDecodedEvent); + } else { + mWordComposer.setHangul(false); + final boolean wasComposingWord = mWordComposer.isComposingWord(); + processedEvent = mWordComposer.processEvent(event); + // workaround for space and some other separators deleting / replacing the word + if (wasComposingWord && !mWordComposer.isComposingWord()) { + mWordComposer.resetInvalidCursorPosition(); + mConnection.finishComposingText(); + } + } } else { mWordComposer.setHangul(false); processedEvent = mWordComposer.processEvent(event); diff --git a/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt b/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt index 4f75173e5..1fd8dea0b 100644 --- a/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt +++ b/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt @@ -152,6 +152,14 @@ class InputLogicTest { assertEquals(4, cursor) } + // see issue 1447 + @Test fun separatorAfterHangul() { + reset() + currentScript = ScriptUtils.SCRIPT_HANGUL + chainInput("ㅛ.") + assertEquals("ㅛ.", text) + } + @Test fun separatorUnselectsWord() { reset() setText("hello") From b5dece2ff446ed34be901e889f0a79048681f078 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 28 Apr 2025 13:56:36 +0200 Subject: [PATCH 086/175] improve behvavior of slider preference using onConfirm instead of always onValueChange (which is called when sliding, but we're mostly interested in changed settings) --- .../settings/preferences/SliderPreference.kt | 12 +++++++++--- .../keyboard/settings/screens/AdvancedScreen.kt | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/SliderPreference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/SliderPreference.kt index 8a52a914d..97138672a 100644 --- a/app/src/main/java/helium314/keyboard/settings/preferences/SliderPreference.kt +++ b/app/src/main/java/helium314/keyboard/settings/preferences/SliderPreference.kt @@ -27,6 +27,7 @@ fun SliderPreference( range: ClosedFloatingPointRange, stepSize: Int? = null, onValueChanged: (Float?) -> Unit = { }, + onConfirmed: (T) -> Unit = { }, ) { val ctx = LocalContext.current val prefs = ctx.prefs() @@ -48,8 +49,13 @@ fun SliderPreference( SliderDialog( onDismissRequest = { showDialog = false }, onDone = { - if (default is Int) prefs.edit().putInt(key, it.toInt()).apply() - else prefs.edit().putFloat(key, it).apply() + if (default is Int) { + prefs.edit().putInt(key, it.toInt()).apply() + onConfirmed(it.toInt() as T) + } else { + prefs.edit().putFloat(key, it).apply() + onConfirmed(it as T) + } }, initialValue = initialValue.toFloat(), range = range, @@ -59,7 +65,7 @@ fun SliderPreference( }, onValueChanged = onValueChanged, showDefault = true, - onDefault = { prefs.edit().remove(key).apply(); onValueChanged(null) }, + onDefault = { prefs.edit().remove(key).apply(); onConfirmed(default) }, intermediateSteps = stepSize?.let { // this is not nice, but slider wants it like this... ((range.endInclusive - range.start) / it - 1).toInt() diff --git a/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt index badc404d3..59b137d37 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt @@ -233,7 +233,7 @@ fun createAdvancedSettings(context: Context) = listOf( else -> "version unknown" } }, - onValueChanged = { KeyboardSwitcher.getInstance().setThemeNeedsReload() } + onConfirmed = { KeyboardSwitcher.getInstance().setThemeNeedsReload() } ) }, Setting(context, Settings.PREF_URL_DETECTION, R.string.url_detection_title, R.string.url_detection_summary) { From 5eff3b992bd9fd68f172c8d850dcd4b4fdc5ba8e Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Mon, 28 Apr 2025 15:27:36 +0300 Subject: [PATCH 087/175] Restore `Key.LABEL_FLAGS_PRESERVE_CASE`, to fix uppercase TLDs in popup (#1517) --- .../keyboard/internal/keyboard_parser/floris/TextKeyData.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt index ae4eacdc4..7aa161328 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt @@ -526,8 +526,10 @@ sealed interface KeyData : AbstractKeyData { return when (label) { KeyLabel.ALPHA, KeyLabel.SYMBOL_ALPHA, KeyLabel.SYMBOL -> Key.LABEL_FLAGS_PRESERVE_CASE or Key.LABEL_FLAGS_FOLLOW_FUNCTIONAL_TEXT_COLOR KeyLabel.COMMA -> Key.LABEL_FLAGS_HAS_POPUP_HINT - // essentially this only changes the appearance of the armenian period key in holo theme - KeyLabel.PERIOD -> Key.LABEL_FLAGS_HAS_POPUP_HINT and if (params.mId.isAlphabetKeyboard) params.mLocaleKeyboardInfos.labelFlags else 0 + // essentially the first term only changes the appearance of the armenian period key in holo theme + KeyLabel.PERIOD -> (Key.LABEL_FLAGS_HAS_POPUP_HINT and + if (params.mId.isAlphabetKeyboard) params.mLocaleKeyboardInfos.labelFlags else 0) or + Key.LABEL_FLAGS_PRESERVE_CASE KeyLabel.ACTION -> { Key.LABEL_FLAGS_PRESERVE_CASE or Key.LABEL_FLAGS_AUTO_X_SCALE or Key.LABEL_FLAGS_FOLLOW_KEY_LABEL_RATIO or Key.LABEL_FLAGS_FOLLOW_FUNCTIONAL_TEXT_COLOR or From 8b36ff1c54fe1a48c5af5a5dd1864a8d27de9858 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 28 Apr 2025 19:25:28 +0200 Subject: [PATCH 088/175] skip early on empty hint labels --- .../java/helium314/keyboard/latin/utils/PopupKeysUtils.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/PopupKeysUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/PopupKeysUtils.kt index 5d47d27b8..6bd810d05 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/PopupKeysUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/PopupKeysUtils.kt @@ -72,10 +72,10 @@ fun getHintLabel(popupSet: PopupSet<*>?, params: KeyboardParams, label: String): } if (hintLabel != null) break } - if (hintLabel in toolbarKeyStrings.values) - hintLabel = null // better show nothing instead of the toolbar key label + if (hintLabel in toolbarKeyStrings.values || hintLabel.isNullOrEmpty()) + return null // better show nothing instead of the toolbar key label - return hintLabel?.let { KeySpecParser.getLabel(transformLabel(it, params)) } + return KeySpecParser.getLabel(transformLabel(hintLabel!!, params)) // avoid e.g. !autoColumnOrder! as label // this will avoid having labels on comma and period keys ?.takeIf { !it.startsWith("!") || it.count { it == '!' } != 2 } // excluding the special labels From 38547b0c81fbece22289e23423cc59003a5c146f Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 28 Apr 2025 19:50:31 +0200 Subject: [PATCH 089/175] fallback to default layouts on parsing errors --- .../keyboard/keyboard/KeyboardSwitcher.java | 9 ++++----- .../keyboard/latin/utils/SubtypeUtilsAdditional.kt | 13 +++++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java index defdbe5e7..aba763679 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java @@ -157,10 +157,9 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { } catch (KeyboardLayoutSetException e) { Log.e(TAG, "loading keyboard failed: " + e.mKeyboardId, e.getCause()); try { - final InputMethodSubtype qwerty = SubtypeUtilsAdditional.INSTANCE - .createEmojiCapableAdditionalSubtype(mRichImm.getCurrentSubtypeLocale(), SubtypeLocaleUtils.QWERTY, true); + final InputMethodSubtype defaults = SubtypeUtilsAdditional.INSTANCE.createDefaultSubtype(mRichImm.getCurrentSubtypeLocale()); mKeyboardLayoutSet = builder.setKeyboardGeometry(keyboardWidth, keyboardHeight) - .setSubtype(RichInputMethodSubtype.Companion.get(qwerty)) + .setSubtype(RichInputMethodSubtype.Companion.get(defaults)) .setVoiceInputKeyEnabled(settingsValues.mShowsVoiceInputKey) .setNumberRowEnabled(settingsValues.mShowsNumberRow) .setLanguageSwitchKeyEnabled(settingsValues.isLanguageSwitchKeyEnabled()) @@ -169,9 +168,9 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { .setOneHandedModeEnabled(oneHandedModeEnabled) .build(); mState.onLoadKeyboard(currentAutoCapsState, currentRecapitalizeState, oneHandedModeEnabled); - showToast("error loading the keyboard, falling back to qwerty", false); + showToast("error loading the keyboard, falling back to defaults", false); } catch (KeyboardLayoutSetException e2) { - Log.e(TAG, "even fallback to qwerty failed: " + e2.mKeyboardId, e2.getCause()); + Log.e(TAG, "even fallback to defaults failed: " + e2.mKeyboardId, e2.getCause()); } } } diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt index 95875bac2..8c9527f1e 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt @@ -9,9 +9,13 @@ import helium314.keyboard.latin.common.Constants import helium314.keyboard.latin.common.Constants.Separators import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue import helium314.keyboard.latin.settings.Defaults +import helium314.keyboard.latin.settings.Defaults.default import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.settings.SettingsSubtype import helium314.keyboard.latin.settings.SettingsSubtype.Companion.toSettingsSubtype +import helium314.keyboard.latin.utils.LayoutType.Companion.toExtraValue +import helium314.keyboard.latin.utils.ScriptUtils.script +import java.util.EnumMap import java.util.Locale object SubtypeUtilsAdditional { @@ -46,9 +50,18 @@ object SubtypeUtilsAdditional { fun createDummyAdditionalSubtype(locale: Locale, mainLayoutName: String) = createAdditionalSubtype(locale, "${ExtraValue.KEYBOARD_LAYOUT_SET}=MAIN${Separators.KV}$mainLayoutName", false, false) + // only used in tests fun createEmojiCapableAdditionalSubtype(locale: Locale, mainLayoutName: String, asciiCapable: Boolean) = createAdditionalSubtype(locale, "${ExtraValue.KEYBOARD_LAYOUT_SET}=MAIN${Separators.KV}$mainLayoutName", asciiCapable, true) + /** creates a subtype with every layout being the default for its type */ + fun createDefaultSubtype(locale: Locale): InputMethodSubtype { + val layouts = LayoutType.entries.associateWithTo(LayoutType.getLayoutMap(null)) { it.default } + SubtypeSettings.getResourceSubtypesForLocale(locale).firstOrNull()?.mainLayoutName()?.let { layouts[LayoutType.MAIN] = it } + val extra = ExtraValue.KEYBOARD_LAYOUT_SET + "=" + layouts.toExtraValue() + return createAdditionalSubtype(locale, extra, locale.script() == ScriptUtils.SCRIPT_LATIN, true) + } + fun removeAdditionalSubtype(context: Context, subtype: InputMethodSubtype) { val prefs = context.prefs() SubtypeSettings.removeEnabledSubtype(context, subtype) From da62457c90cec40673d90013eb87aea56ccc7cc5 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 28 Apr 2025 21:20:32 +0200 Subject: [PATCH 090/175] save logs from the internal logger again, but keep logcat for getting older warning and error log entries --- .../keyboard/settings/screens/AboutScreen.kt | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt index 6f5c2daf6..36a5cb734 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/AboutScreen.kt @@ -31,17 +31,16 @@ import helium314.keyboard.latin.utils.Log import helium314.keyboard.latin.utils.SpannableStringUtils import helium314.keyboard.latin.utils.getActivity import helium314.keyboard.latin.utils.prefs -import helium314.keyboard.settings.SearchSettingsScreen -import helium314.keyboard.settings.Setting -import helium314.keyboard.settings.SettingsActivity import helium314.keyboard.settings.SettingsContainer import helium314.keyboard.settings.SettingsWithoutKey -import helium314.keyboard.settings.Theme +import helium314.keyboard.settings.Setting import helium314.keyboard.settings.preferences.Preference +import helium314.keyboard.settings.SearchSettingsScreen +import helium314.keyboard.settings.SettingsActivity +import helium314.keyboard.settings.Theme import helium314.keyboard.settings.previewDark import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import java.io.OutputStream import java.text.SimpleDateFormat import java.util.Calendar @@ -143,24 +142,20 @@ fun createAboutSettings(context: Context) = listOf( icon = R.drawable.ic_settings_about_github ) }, - saveLog(context, SettingsWithoutKey.SAVE_LOG, R.string.save_log) { - val inputStream = Runtime.getRuntime().exec("logcat -d -b all").inputStream - inputStream.copyTo(it) - inputStream.close() - } -) - -private fun saveLog(context: Context, key: String, titleId: Int, writer: (OutputStream) -> Unit) = - Setting(context, key, titleId) { setting -> + Setting(context, SettingsWithoutKey.SAVE_LOG, R.string.save_log) { setting -> val ctx = LocalContext.current val scope = rememberCoroutineScope() val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode != Activity.RESULT_OK) return@rememberLauncherForActivityResult val uri = result.data?.data ?: return@rememberLauncherForActivityResult scope.launch(Dispatchers.IO) { - val outputStream = ctx.getActivity()?.contentResolver?.openOutputStream(uri) - outputStream?.use(writer) - outputStream?.close() + ctx.getActivity()?.contentResolver?.openOutputStream(uri)?.use { os -> + os.writer().use { + val logcat = Runtime.getRuntime().exec("logcat -d -b all *:W").inputStream.use { it.reader().readText() } + val internal = Log.getLog().joinToString("\n") + it.write(logcat + "\n\n" + internal) + } + } } } Preference( @@ -180,7 +175,8 @@ private fun saveLog(context: Context, key: String, titleId: Int, writer: (Output }, icon = R.drawable.ic_settings_about_log ) - } + }, +) @Preview @Composable From 011bc96ec99637fbb39ca5d2d371e3ced4f64a7a Mon Sep 17 00:00:00 2001 From: Helium314 Date: Tue, 29 Apr 2025 16:17:28 +0200 Subject: [PATCH 091/175] consider padding when adding keyboard split fixes GH-1520 --- .../helium314/keyboard/keyboard/internal/KeyboardBuilder.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardBuilder.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardBuilder.kt index f28aaecfb..169894f3d 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardBuilder.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardBuilder.kt @@ -176,7 +176,7 @@ open class KeyboardBuilder(protected val mContext: Context, val relativeWidthSumNew = row.sumOf { it.mWidth } val widthFactor = relativeWidthSum / relativeWidthSumNew // re-calculate absolute sizes and positions - var currentX = 0f + var currentX = mParams.mLeftPadding.toFloat() row.forEach { it.mWidth *= widthFactor it.setAbsoluteDimensions(currentX, y) From ad375cc3a372d2411affbc0ead8d571ba9da8c96 Mon Sep 17 00:00:00 2001 From: Froingo Date: Tue, 29 Apr 2025 18:32:03 +0100 Subject: [PATCH 092/175] Add korean phonetic layout (#1500) --- .../assets/layouts/main/korean_phonetic.json | 55 +++++++++++++++++++ app/src/main/res/xml/method.xml | 9 +++ 2 files changed, 64 insertions(+) create mode 100644 app/src/main/assets/layouts/main/korean_phonetic.json diff --git a/app/src/main/assets/layouts/main/korean_phonetic.json b/app/src/main/assets/layouts/main/korean_phonetic.json new file mode 100644 index 000000000..b2c2a6bb2 --- /dev/null +++ b/app/src/main/assets/layouts/main/korean_phonetic.json @@ -0,0 +1,55 @@ +[ + [ + { "label": "\u3147" }, + { "label": "\u3161" }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "\u3156" }, + "default": { "label": "\u3154", "popup": { "main": { "label": "\u3156" } } } + }, + { "label": "\u3139" }, + { "label": "\u314c" }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "\u3152" }, + "default": { "label": "\u3150", "popup": { "main": { "label": "\u3152" } } } + }, + { "label": "\u315c" }, + { "label": "\u3163" }, + { "label": "\u3157" }, + { "label": "\u314d" } + ], + [ + { "label": "\u314f" }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "\u3146" }, + "default": { "label": "\u3145", "popup": { "main": { "label": "\u3146" } } } + }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "\u3138" }, + "default": { "label": "\u3137", "popup": { "main": { "label": "\u3138" } } } + }, + { "label": "\u3151" }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "\u3132" }, + "default": { "label": "\u3131", "popup": { "main": { "label": "\u3132" } } } + }, + { "label": "\u314e" }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "\u3149" }, + "default": { "label": "\u3148", "popup": { "main": { "label": "\u3149" } } } + }, + { "label": "\u314b" }, + { "label": "\u315b" } + ], + [ + { "label": "\u3155" }, + { "label": "\u3160" }, + { "label": "\u314a" }, + { "label": "\u3153" }, + { "$": "shift_state_selector", + "manualOrLocked": { "label": "\u3143" }, + "default": { "label": "\u3142", "popup": { "main": { "label": "\u3143" } } } + }, + { "label": "\u3134" }, + { "label": "\u3141" } + ] +] diff --git a/app/src/main/res/xml/method.xml b/app/src/main/res/xml/method.xml index 4f3b370b1..ce3e1de58 100644 --- a/app/src/main/res/xml/method.xml +++ b/app/src/main/res/xml/method.xml @@ -765,6 +765,15 @@ android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:korean,SupportTouchPositionCorrection,EmojiCapable" android:isAsciiCapable="false" + /> + Date: Tue, 29 Apr 2025 19:36:47 +0200 Subject: [PATCH 093/175] consistent indent --- app/src/main/res/xml/method.xml | 1716 +++++++++++++++---------------- 1 file changed, 858 insertions(+), 858 deletions(-) diff --git a/app/src/main/res/xml/method.xml b/app/src/main/res/xml/method.xml index ce3e1de58..23a73dd1a 100644 --- a/app/src/main/res/xml/method.xml +++ b/app/src/main/res/xml/method.xml @@ -141,184 +141,184 @@ android:supportsInlineSuggestions="true" tools:targetApi="r"> - + - - - - + + + + This isn't based on the final specification. + Was disabled because there is no LM yet, and this layout does not offer anything different. --> - + - + - - + + + This isn't based on the final specification. --> + This isn't based on the final specification. --> + android:label="@string/subtype_generic" + android:subtypeId="0x1e8349fc" + android:imeSubtypeLocale="ur_PK" + android:languageTag="ur-PK" + android:imeSubtypeMode="keyboard" + android:imeSubtypeExtraValue="KeyboardLayoutSet=MAIN:urdu|SYMBOLS:symbols_arabic,EmojiCapable" + android:isAsciiCapable="false" + /> + This isn't based on the final specification. --> - + From 875491a0e19e15265b69995c003529499c75b9d2 Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Thu, 1 May 2025 21:17:41 +0300 Subject: [PATCH 094/175] Recognize the `he` language code as Hebrew (#1529) in addition to outdated `iw` that is used on Android 14 and older --- .../keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt | 4 ++-- .../main/java/helium314/keyboard/latin/utils/ScriptUtils.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt index 637056c06..ac3f9fc77 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt @@ -266,7 +266,7 @@ private fun getCurrencyKey(locale: Locale): Pair> { return euro if (locale.language.matches("ca|eu|lb|mt|pms".toRegex())) return euro - if (locale.language.matches("ak|dag|ee|fa|gaa|ha|ig|iw|lo|ko|km|mn|ne|si|th|uk|vi|yo".toRegex())) + if (locale.language.matches("ak|dag|ee|fa|gaa|ha|he|ig|iw|lo|ko|km|mn|ne|si|th|uk|vi|yo".toRegex())) return genericCurrencyKey(getCurrency(locale)) if (locale.language == "hy") return dram @@ -299,7 +299,7 @@ private fun getCurrency(locale: Locale): String { "gaa" -> "¢" "ha" -> "₦" "ig" -> "₦" - "iw" -> "₪" + "iw", "he" -> "₪" "lo" -> "₭" "km" -> "៛" "ko" -> "₩" diff --git a/app/src/main/java/helium314/keyboard/latin/utils/ScriptUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/ScriptUtils.kt index f66c76aba..a93683780 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/ScriptUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/ScriptUtils.kt @@ -168,7 +168,7 @@ object ScriptUtils { "sr", "mk", "ru", "uk", "mn", "be", "kk", "ky", "bg", "xdq", "cv", "mhr", "mns", "dru" -> SCRIPT_CYRILLIC "ka" -> SCRIPT_GEORGIAN "el" -> SCRIPT_GREEK - "iw" -> SCRIPT_HEBREW + "iw", "he" -> SCRIPT_HEBREW "km" -> SCRIPT_KHMER "lo" -> SCRIPT_LAO "ml" -> SCRIPT_MALAYALAM From 2a7ac3cf7905574f47e8c8699f0d4ad68dcfa500 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Thu, 1 May 2025 20:27:56 +0200 Subject: [PATCH 095/175] use default font for titles --- .../java/helium314/keyboard/settings/Theme.kt | 20 +++---------------- .../dialogs/ThreeButtonAlertDialog.kt | 2 +- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/Theme.kt b/app/src/main/java/helium314/keyboard/settings/Theme.kt index e8924a300..32d8121b9 100644 --- a/app/src/main/java/helium314/keyboard/settings/Theme.kt +++ b/app/src/main/java/helium314/keyboard/settings/Theme.kt @@ -12,9 +12,6 @@ import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.colorResource -import androidx.compose.ui.text.font.DeviceFontFamilyName -import androidx.compose.ui.text.font.Font -import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import helium314.keyboard.latin.R @@ -36,20 +33,9 @@ fun Theme(dark: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit MaterialTheme( colorScheme = colorScheme, typography = Typography( - headlineMedium = material3.headlineMedium.copy(fontWeight = FontWeight.Bold), - headlineSmall = material3.headlineSmall.copy(fontWeight = FontWeight.Bold), - titleLarge = material3.titleLarge.copy( - fontWeight = FontWeight.Bold, - fontFamily = FontFamily(Font(DeviceFontFamilyName("sans-serif-condensed"), FontWeight.Bold)) - ), - titleMedium = material3.titleMedium.copy( - fontWeight = FontWeight.Bold, - fontFamily = FontFamily(Font(DeviceFontFamilyName("sans-serif-condensed"), FontWeight.Bold)) - ), - titleSmall = material3.titleSmall.copy( - fontWeight = FontWeight.Bold, - fontFamily = FontFamily(Font(DeviceFontFamilyName("sans-serif-condensed"), FontWeight.Bold)) - ) + titleLarge = material3.titleLarge.copy(fontWeight = FontWeight.Bold), + titleMedium = material3.titleMedium.copy(fontWeight = FontWeight.Bold), + titleSmall = material3.titleSmall.copy(fontWeight = FontWeight.Bold) ), //shapes = Shapes(), content = content diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/ThreeButtonAlertDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/ThreeButtonAlertDialog.kt index 2b34bcd89..a299c90ba 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/ThreeButtonAlertDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/ThreeButtonAlertDialog.kt @@ -64,7 +64,7 @@ fun ThreeButtonAlertDialog( bottom = if (reducePadding) 2.dp else 6.dp )) { title?.let { - CompositionLocalProvider(LocalTextStyle provides MaterialTheme.typography.titleLarge) { + CompositionLocalProvider(LocalTextStyle provides MaterialTheme.typography.titleMedium) { Box(Modifier.padding(PaddingValues(bottom = if (reducePadding) 4.dp else 16.dp))) { title() } From d8bf27f180b0b52b5937488ca28f69a004248111 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Fri, 2 May 2025 05:35:27 +0200 Subject: [PATCH 096/175] add missing items in v31 dialog theme resolves GH-1518 --- app/src/main/res/values-v31/platform-theme.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/res/values-v31/platform-theme.xml b/app/src/main/res/values-v31/platform-theme.xml index 5014fc748..6f6ade775 100644 --- a/app/src/main/res/values-v31/platform-theme.xml +++ b/app/src/main/res/values-v31/platform-theme.xml @@ -26,6 +26,11 @@ From 60a5fe1e03e3bdd4a58f009a95b584aa3544e5ed Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Sat, 3 May 2025 00:11:58 +0300 Subject: [PATCH 097/175] Go back to `setFitsSystemWindows`, with an added workaround that seems to make it reliable. (#1536) --- .../keyboard/keyboard/KeyboardView.java | 1 + .../clipboard/ClipboardHistoryView.kt | 1 + .../keyboard/emoji/EmojiPalettesView.java | 1 + .../helium314/keyboard/latin/InputView.java | 82 +------------------ 4 files changed, 5 insertions(+), 80 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java index 6fbf8238b..d5d14c92e 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java @@ -148,6 +148,7 @@ public class KeyboardView extends View { mPaint.setAntiAlias(true); mTypeface = Settings.getInstance().getCustomTypeface(); + setFitsSystemWindows(true); } @Nullable diff --git a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt index 284616b44..0f0cb756f 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/clipboard/ClipboardHistoryView.kt @@ -71,6 +71,7 @@ class ClipboardHistoryView @JvmOverloads constructor( getEnabledClipboardToolbarKeys(context.prefs()) .forEach { toolbarKeys.add(createToolbarKey(context, KeyboardIconsSet.instance, it)) } keyboardAttr.recycle() + fitsSystemWindows = true } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java index 5074b6b40..8428f842d 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java @@ -106,6 +106,7 @@ public final class EmojiPalettesView extends LinearLayout R.styleable.EmojiPalettesView_categoryPageIndicatorColor, 0); emojiPalettesViewAttr.recycle(); mEmojiLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false); + setFitsSystemWindows(true); } @Override diff --git a/app/src/main/java/helium314/keyboard/latin/InputView.java b/app/src/main/java/helium314/keyboard/latin/InputView.java index aca0353b1..fe2645766 100644 --- a/app/src/main/java/helium314/keyboard/latin/InputView.java +++ b/app/src/main/java/helium314/keyboard/latin/InputView.java @@ -6,22 +6,13 @@ package helium314.keyboard.latin; -import java.util.function.BiFunction; - -import android.annotation.SuppressLint; import android.content.Context; -import android.graphics.Insets; import android.graphics.Rect; -import android.os.Build; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; -import android.view.WindowInsets; -import android.view.WindowManager; -import android.view.WindowMetrics; import android.widget.FrameLayout; -import androidx.annotation.RequiresApi; import androidx.core.view.ViewKt; import helium314.keyboard.accessibility.AccessibilityUtils; @@ -30,13 +21,10 @@ import helium314.keyboard.latin.common.ColorType; import helium314.keyboard.latin.settings.Settings; import helium314.keyboard.latin.suggestions.PopupSuggestionsView; import helium314.keyboard.latin.suggestions.SuggestionStripView; -import helium314.keyboard.latin.utils.Log; import kotlin.Unit; public final class InputView extends FrameLayout { - private static final int[] LOCATION = new int[2]; - private final Rect mInputViewRect = new Rect(); private MainKeyboardView mMainKeyboardView; private KeyboardTopPaddingForwarder mKeyboardTopPaddingForwarder; @@ -118,77 +106,11 @@ public final class InputView extends FrameLayout { private Unit onNextLayout(View v) { Settings.getValues().mColors.setBackground(findViewById(R.id.main_keyboard_frame), ColorType.MAIN_BACKGROUND); - if (Build.VERSION.SDK_INT >= 30) { - WindowManager wm = getContext().getSystemService(WindowManager.class); - WindowMetrics windowMetrics = wm.getCurrentWindowMetrics(); - - if (Build.VERSION.SDK_INT >= 35 || isEdgeToEdge(windowMetrics)) { - // Edge-to-edge mode - logInsets(wm.getMaximumWindowMetrics(), "max-metrics"); - logInsets(wm.getCurrentWindowMetrics(), "current-metrics"); - - WindowInsets windowInsets = windowMetrics.getWindowInsets(); - int insetTypes = WindowInsets.Type.systemBars() | WindowInsets.Type.displayCutout() - | WindowInsets.Type.systemGestures(); - Insets insets = windowInsets.getInsetsIgnoringVisibility(insetTypes); - - // Can't set padding on this view, since it results in an overlap with window above the keyboard. - mMainKeyboardView.setPadding(0, 0, 0, insets.bottom); - findViewById(R.id.emoji_palettes_view).setPadding(0, 0, 0, insets.bottom); - findViewById(R.id.clipboard_history_view).setPadding(0, 0, 0, insets.bottom); - } - } - + // Work around inset application being unreliable + requestApplyInsets(); return null; } - @SuppressLint("DefaultLocale") - @RequiresApi(api = 30) - private boolean isEdgeToEdge(WindowMetrics windowMetrics) { - getLocationOnScreen(LOCATION); - Log.i("insets", String.format("Keyboard bottom: %d, screen height: %d.", LOCATION[1] + getHeight(), - windowMetrics.getBounds().height())); - return LOCATION[1] + getHeight() == windowMetrics.getBounds().height(); - } - - @RequiresApi(api = 30) - private static void logInsets(WindowMetrics metrics, String metricsType) { - logInsets(metrics, metricsType, WindowInsets::getInsets, "insets"); - logInsets(metrics, metricsType, WindowInsets::getInsetsIgnoringVisibility, "insetsIgnoringVisibility"); - } - - @RequiresApi(api = 30) - private static void logInsets(WindowMetrics metrics, String metricsType, - BiFunction insetsGetter, String visibility) { - logInsets(metrics, metricsType, WindowInsets.Type.navigationBars(),"navigationBars", - insetsGetter, visibility); - logInsets(metrics, metricsType, WindowInsets.Type.systemBars(), "systemBars", insetsGetter, visibility); - logInsets(metrics, metricsType, WindowInsets.Type.statusBars(), "statusBars", insetsGetter, visibility); - logInsets(metrics, metricsType, WindowInsets.Type.displayCutout(),"displayCutout", - insetsGetter, visibility); - logInsets(metrics, metricsType, WindowInsets.Type.systemGestures(),"systemGestures", - insetsGetter, visibility); - logInsets(metrics, metricsType, WindowInsets.Type.mandatorySystemGestures(), "mandatorySystemGestures", - insetsGetter, visibility); - logInsets(metrics, metricsType, WindowInsets.Type.tappableElement(),"tappableElement", - insetsGetter, visibility); - - if (Build.VERSION.SDK_INT >= 34) { - logInsets(metrics, metricsType, WindowInsets.Type.systemOverlays(), "systemOverlays", - insetsGetter, visibility); - } - } - - @RequiresApi(api = 30) - @SuppressLint("DefaultLocale") - private static void logInsets(WindowMetrics metrics, String metricsType, int insetTypes, String insetsType, - BiFunction insetsGetter, String visibility) { - WindowInsets windowInsets = metrics.getWindowInsets(); - Insets insets = insetsGetter.apply(windowInsets, insetTypes); - Log.i("insets", String.format("%s, %s, %s, bottom %d, top %d", metricsType, insetsType, visibility, - insets.bottom, insets.top)); - } - /** * This class forwards series of {@link MotionEvent}s from SenderView to * ReceiverView. From 4f356086d7c7c4a098654165204f66889e3dc7bc Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Sat, 3 May 2025 08:02:38 +0300 Subject: [PATCH 098/175] Fix direction of word-left & word-right with RTL scripts (#1530) --- .../helium314/keyboard/latin/RichInputMethodSubtype.kt | 7 ++++--- .../helium314/keyboard/latin/common/LocaleUtils.kt | 10 ---------- .../keyboard/latin/inputlogic/InputLogic.java | 6 ++++-- .../java/helium314/keyboard/latin/utils/ScriptUtils.kt | 8 ++++++++ 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt b/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt index 5764bd2d5..ce68511b5 100644 --- a/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt +++ b/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt @@ -10,10 +10,11 @@ import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder import helium314.keyboard.latin.common.Constants import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET import helium314.keyboard.latin.common.LocaleUtils.constructLocale -import helium314.keyboard.latin.common.LocaleUtils.isRtlLanguage import helium314.keyboard.latin.utils.LayoutType import helium314.keyboard.latin.utils.LayoutUtilsCustom import helium314.keyboard.latin.utils.Log +import helium314.keyboard.latin.utils.ScriptUtils +import helium314.keyboard.latin.utils.ScriptUtils.script import helium314.keyboard.latin.utils.SubtypeLocaleUtils import helium314.keyboard.latin.utils.locale import java.util.Locale @@ -25,7 +26,7 @@ class RichInputMethodSubtype private constructor(val rawSubtype: InputMethodSubt val locale: Locale = rawSubtype.locale() // The subtype is considered RTL if the language of the main subtype is RTL. - val isRtlSubtype: Boolean = isRtlLanguage(locale) + val isRtlSubtype: Boolean = ScriptUtils.isScriptRtl(locale.script()) fun getExtraValueOf(key: String): String? = rawSubtype.getExtraValueOf(key) @@ -132,4 +133,4 @@ class RichInputMethodSubtype private constructor(val rawSubtype: InputMethodSubt return DUMMY_NO_LANGUAGE_SUBTYPE } } -} \ No newline at end of file +} diff --git a/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt b/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt index ab37a9adb..b007dd48c 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt @@ -171,16 +171,6 @@ object LocaleUtils { } } - @JvmStatic - fun isRtlLanguage(locale: Locale): Boolean { - val displayName = locale.getDisplayName(locale) - if (displayName.isEmpty()) return false - return when (Character.getDirectionality(displayName.codePointAt(0))) { - Character.DIRECTIONALITY_RIGHT_TO_LEFT, Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC -> true - else -> false - } - } - fun Locale.localizedDisplayName(context: Context) = getLocaleDisplayNameInLocale(this, context.resources, context.resources.configuration.locale()) diff --git a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java index 4b1bd4df2..8e3282cc4 100644 --- a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java @@ -765,10 +765,12 @@ public final class InputLogic { } break; case KeyCode.WORD_LEFT: - sendDownUpKeyEventWithMetaState(KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.META_CTRL_ON); + sendDownUpKeyEventWithMetaState(ScriptUtils.isScriptRtl(currentKeyboardScript)? + KeyEvent.KEYCODE_DPAD_RIGHT : KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.META_CTRL_ON); break; case KeyCode.WORD_RIGHT: - sendDownUpKeyEventWithMetaState(KeyEvent.KEYCODE_DPAD_RIGHT, KeyEvent.META_CTRL_ON); + sendDownUpKeyEventWithMetaState(ScriptUtils.isScriptRtl(currentKeyboardScript)? + KeyEvent.KEYCODE_DPAD_LEFT : KeyEvent.KEYCODE_DPAD_RIGHT, KeyEvent.META_CTRL_ON); break; case KeyCode.MOVE_START_OF_PAGE: sendDownUpKeyEventWithMetaState(KeyEvent.KEYCODE_MOVE_HOME, KeyEvent.META_CTRL_ON); diff --git a/app/src/main/java/helium314/keyboard/latin/utils/ScriptUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/ScriptUtils.kt index a93683780..ba0fca550 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/ScriptUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/ScriptUtils.kt @@ -184,4 +184,12 @@ object ScriptUtils { else -> SCRIPT_LATIN // use as fallback } } + + @JvmStatic + fun isScriptRtl(script: String): Boolean { + return when (script) { + SCRIPT_ARABIC, SCRIPT_HEBREW -> true + else -> false + } + } } From 91b177d2049f539d75e56f8249517697c3cff794 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 3 May 2025 07:52:16 +0200 Subject: [PATCH 099/175] update version, translations and dependencies --- app/build.gradle.kts | 14 +- app/src/main/res/values-ar/strings.xml | 2 + app/src/main/res/values-it/strings.xml | 14 +- app/src/main/res/values-pt-rBR/strings.xml | 26 +- app/src/main/res/values-pt-rPT/strings.xml | 241 ++++++++++++++++-- app/src/main/res/values-zh-rTW/strings.xml | 61 ++++- .../metadata/android/ar/changelogs/3007.txt | 11 + .../metadata/android/ca/changelogs/3007.txt | 11 + .../android/cs-CZ/changelogs/3007.txt | 11 + .../android/en-US/changelogs/3007.txt | 11 + .../metadata/android/et/changelogs/3007.txt | 11 + .../android/fr-FR/changelogs/1001.txt | 20 ++ .../android/fr-FR/changelogs/1003.txt | 9 + .../android/fr-FR/changelogs/1004.txt | 7 + .../android/fr-FR/changelogs/2000.txt | 10 + .../android/it-IT/changelogs/3007.txt | 11 + .../android/iw-IL/changelogs/3004.txt | 11 + .../android/iw-IL/changelogs/3005.txt | 11 + .../android/iw-IL/changelogs/3006.txt | 11 + .../android/iw-IL/changelogs/3007.txt | 11 + .../android/nl-NL/changelogs/3007.txt | 11 + 21 files changed, 480 insertions(+), 45 deletions(-) create mode 100644 fastlane/metadata/android/ar/changelogs/3007.txt create mode 100644 fastlane/metadata/android/ca/changelogs/3007.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/3007.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/3007.txt create mode 100644 fastlane/metadata/android/et/changelogs/3007.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/1001.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/1003.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/1004.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/2000.txt create mode 100644 fastlane/metadata/android/it-IT/changelogs/3007.txt create mode 100644 fastlane/metadata/android/iw-IL/changelogs/3004.txt create mode 100644 fastlane/metadata/android/iw-IL/changelogs/3005.txt create mode 100644 fastlane/metadata/android/iw-IL/changelogs/3006.txt create mode 100644 fastlane/metadata/android/iw-IL/changelogs/3007.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/3007.txt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 18a378456..e156709df 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,8 +13,8 @@ android { applicationId = "helium314.keyboard" minSdk = 21 targetSdk = 35 - versionCode = 3006 - versionName = "3.0-beta3" + versionCode = 3007 + versionName = "3.0-beta4" ndk { abiFilters.clear() abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) @@ -105,27 +105,27 @@ android { dependencies { // androidx - implementation("androidx.core:core-ktx:1.15.0") + implementation("androidx.core:core-ktx:1.16.0") implementation("androidx.recyclerview:recyclerview:1.4.0") implementation("androidx.autofill:autofill:1.1.0") // kotlin - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1") // compose coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5") - implementation(platform("androidx.compose:compose-bom:2025.02.00")) + implementation(platform("androidx.compose:compose-bom:2025.04.01")) implementation("androidx.compose.material3:material3") implementation("androidx.compose.ui:ui-tooling-preview") debugImplementation("androidx.compose.ui:ui-tooling") - implementation("androidx.navigation:navigation-compose:2.8.8") + implementation("androidx.navigation:navigation-compose:2.8.9") implementation("sh.calvin.reorderable:reorderable:2.4.3") // for easier re-ordering implementation("com.github.skydoves:colorpicker-compose:1.1.2") // for user-defined colors // test testImplementation(kotlin("test")) testImplementation("junit:junit:4.13.2") - testImplementation("org.mockito:mockito-core:5.15.2") + testImplementation("org.mockito:mockito-core:5.17.0") testImplementation("org.robolectric:robolectric:4.14.1") testImplementation("androidx.test:runner:1.6.2") testImplementation("androidx.test:core:1.6.1") diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 7d5516ec0..77d6ecba7 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -488,4 +488,6 @@ يعود المسافة الخلفية إلى التصحيح التلقائي لا مسافة تلقائية عند الضغط على تحويل تنسيق لمفتاح الطابع الزمني + دغبانية + السوتية diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 950cfeccb..97a914ecc 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -71,7 +71,7 @@ "Layout" Durata vibrazione tasti Volume del suono dei tasti - Pressione lunga per input secondario + Durata della pressione lunga dei tasti Tasto fisico per passare alle emoji Il tasto ALT di una tastiera collegata apre il pannello emoji "Predefinito" @@ -79,13 +79,13 @@ con digitazione gestuale "Inizia" "Passaggio successivo" - Configurazione di %s + Configura %s Attiva %s Scegli %s nelle impostazioni \'Lingua e immissione\' per autorizzare l\'app. %s è già attiva nelle impostazioni Lingua e immissione.\" Attiva nelle impostazioni Passa a %s - Infine, attiva \\%s come metodo di immissione di testo. + Infine, attiva %s come metodo di immissione di testo. "Cambia metodo di immissione" Tutto pronto! Puoi usare %s per digitare in qualsiasi app. @@ -304,7 +304,7 @@ Il dizionario è stato creato per la lingua %1$s, ma lo stai aggiungendo a %2$s. Confermi? Chiudi Traccia dell\'input gestuale - Tocca lingua → Impostazioni + Tocca la lingua per impostazioni Salva log Holo bianco Dizionario interno principale @@ -329,7 +329,7 @@ Taglia Inverte la direzione quando la tastiera è di tipo destra-sinistra Direzione della barra degli strumenti - Colore accento + Colore di risalto ► La pressione prolungata dei tasti fissati sulla barra degli strumenti attiva delle funzionalità aggiuntive: <br>\n\t• Appunti &#65515; Incolla<br> \n\t• Cursore a sinistra/destra &#65515; Parola a sinistra/destra<br> \n\t• Cursore su/giù &#65515; Pagina su/giù<br> \n\t• Parola a sinistra/destra &#65515; Inizio/fine riga<br> \n\t• Pagina su/giù &#65515; Inizio/fine documento<br> \n\t• Copia &#65515; Taglia<br> \n\t• Seleziona parola &#8596; Seleziona tutto<br> \n\t• Annulla &#8596; Ripeti<br><br> \n► La pressione prolungata dei tasti nella barra dei suggerimenti li blocca sulla barra. <br> <br>\n► Con la pressione prolungata del tasto virgola si accede alle funzionalità appunti, emoji, modalità a una mano, impostazioni e cambio lingua: <br>\n\t• Le funzionalità emoji e cambio lingua non saranno visibili se il tasto corrispondente è abilitato. <br> \n\t• Per alcuni layout non è il tasto virgola, ma quello presente nella stessa posizione (ad es. \"q\" per il layout Dvorak). <br> <br> \n► Quando è abilitata la modalità incognito, l\'apprendimento delle parole è sospeso e le emoji recenti non sono memorizzate. <br> <br>\n► In modalità incognito, si accede alla barra degli strumenti toccando l\'icona \"Incognito\". <br> <br>\n► Scorrimento da \"Maiuscolo\": lo scorrimento dal tasto \"Maiuscolo\" a una lettera permette di digitare in maiuscolo solo il carattere scelto. <br> <br>\n► È possibile tenere premuto il tasto \"Maiuscolo\" o \"Simboli\", digitare uno o più caratteri e rilasciare per tornare alla tastiera precedente. <br> <br>\n► La pressione lunga su un suggerimento mostra altri suggerimenti, più un tasto \"Elimina\" per rimuovere il suggerimento stesso. <br> <br>\n► È possibile scorrere verso l\'alto da un suggerimento per aprire altri suggerimenti e rilasciare su un suggerimento per selezionarlo. <br> <br>\n► È possibile toccare a lungo una voce della cronologia appunti per fissarla (rimane negli appunti finché non viene rilasciata nello stesso modo). <br> <br>\n► È possibile eliminare facilmente una voce della cronologia appunti trascinandola verso sinistra fuori dallo schermo (tranne quando è fissata). <br> <br>\n► Premendo il tasto \"Maiuscolo\" dopo aver selezionato un testo, è possibile renderlo tutto in maiuscolo, tutto in minuscolo oppure con le iniziali maiuscole. <br> <br>\n► È possibile aggiungere dizionari aprendoli da un qualsiasi gestore file. <br>\n\t• Supporta solo <i>content-uri</i>, non <i>file-uri</i>: potrebbe non funzionare con alcuni gestori di file.<br><br> \n► Per gli utenti che eseguono manualmente il backup con accesso root: <br>\n\t• Su Android 7 e versioni successive, il file delle preferenze non si trova nella cartella predefinita, perché l\'app usa lo %s al fine di permettere il caricamento delle impostazioni prima dello sblocco del dispositivo (per es. all\'avvio del sistema). <br>\n\t• Il file si trova invece nella cartella <i>/data/user_de/0/package_id/shared_prefs/</i> (potrebbe variare in base al dispositivo e alla versione di Android). <br><br> \n<i><b>Modalità debug / APK di debug</b></i><br><br> \n► È possibile premere a lungo un suggerimento per mostrare il dizionario di origine. <br> <br>\n► Quando si utilizza un APK di debug, è possibile trovare le impostazioni di debug nella sezione \"Avanzate\". Non sono particolarmente utili, se non per scaricare i dizionari nel log. <br>\n\t• Nella versione normale (release) dell\'app, è possibile accedervi solo dopo aver toccato più volte la versione dell\'app nella sezione \"Informazioni\". <br>\n\t• Quando si abilita \"Mostra informazioni sui suggerimenti\", sopra ai suggerimenti appariranno alcuni indicatori numerici che mostrano un determinato punteggio interno e il dizionario di origine. <br> <br>\n► In caso di arresto anomalo dell\'app, verrà chiesto se si desidera ottenere i log dell\'arresto anomalo al successivo accesso alle impostazioni. <br> <br>\n► Se è attiva la digitazione multilingue, la barra spaziatrice mostrerà il valore di affidabilità usato per determinare la lingua corrente. <br> <br>\n► Per nascondere gli indicatori numerici accanto ai suggerimenti, disabilitare \"Mostra informazioni sui suggerimenti\". Scegli i tasti permanenti (visibili anche con la barra degli strumenti nascosta) Fissa i tasti alla barra degli strumenti con una pressione lunga @@ -365,7 +365,7 @@ Inizio documento Fine documento Suggerisci il testo copiato - Propone l\'ultimo testo copiato come \'pill\' nella barra dei suggerimenti + Propone l\'ultimo testo copiato nella barra dei suggerimenti Copia negli appunti Torna alla tastiera principale… Dopo l\'inserimento di un\'emoji dalla schermata emoji @@ -409,7 +409,7 @@ Elimina parola dal dizionario utente Vibrazione attiva in modalità \'Non disturbare\' %s (Fonetico) - Forza la versione di emoji + Forza la versione delle emoji Dargwa (Urakhi) Urakhi (%s) Tastiera divisa (orizzontale) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index d98a55512..7867017b8 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -7,8 +7,8 @@ Configurações do HeliBoard Vibrar ao tocar nas teclas Som ao tocar nas teclas - Digitação por Gestos - Correção de Texto + Digitação por gestos + Correção de texto Avançado Tema Entrada @@ -48,11 +48,11 @@ Escala da altura do teclado Sempre mostrar a linha de números Inglês (Reino Unido) - Inglês (EUA) - Espanhol (EUA) - Hindi-Inglês + Inglês (Estados Unidos) + Espanhol (Estados Unidos) + Hinglês Sérvio (Latino) - Espanhol (EUA) (%s) + Espanhol (Estados Unidos) (%s) Sérvio %s Nepali (Nepal) %s (Tradicional) Bengali (Bangladesh) %s (Akkhor) @@ -90,8 +90,8 @@ Mais idiomas… " ABCDEFGHIJKLMNOPQRSTUVWXYZ" Bordas nas teclas - Corretor Ortográfico do HeliBoard - Configurações do corretor ortográfico do HeliBoard + Verificador ortográfico do HeliBoard + Configurações do verificador ortográfico do HeliBoard Buscar por nomes de contatos Mostrar pop-up ao tocar em teclas Preferências @@ -100,7 +100,7 @@ %s ms %s min Sem limite - Padrão do Sistema + Padrão do sistema Dicionário pessoal Dicionário principal Mostrar sugestões de correção @@ -112,8 +112,8 @@ Tempo de retenção do histórico Linha de números Inglês (Reino Unido) %s - Inglês (EUA) %s - Hindi-inglês %s + Inglês (Estados Unidos) %s + Hinglês %s Nenhum idioma (Alfabeto) Alfabeto (QWERTY) %s já está ativado nas configurações de \'Idiomas e Entrada\'. Esta etapa já está concluída. Vamos avançar para a próxima!\" @@ -207,7 +207,7 @@ Aprender de suas comunicações e dados digitados para melhorar sugestões Versão Sempre mostrar sugestões - Aviso: Desativar esta opção limpará dados aprendidos + Alerta: Desativar esta opção limpará dados aprendidos Ignorar a solicitação de outros apps de desativar as sugestões (pode causar problemas) Deseja realmente excluir o layout customizado %s? Definir imagem de fundo @@ -453,4 +453,6 @@ O backspace reverte a autocorreção Espaço automático antes de digitar uma palavra com gestos Formato da tecla de horário + Dagani + Sesoto diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 5940ce6fd..14e7f8178 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -6,12 +6,12 @@ --> "Procurar nomes de contac." "Vibrar ao primir as teclas" - "Som ao premir as teclas" + Som ao premir tecla "Mostrar popup ao premir tecla" "Preferências" - Aparência & Esquemas + Aparência "Escrita com gestos" - "Correção de texto" + Correção de texto "Avançadas" "Tema" "Ativar teclado dividido" @@ -27,7 +27,7 @@ "Maiúscula no início da frase" "Dicionário pessoal" "Dicionário principal" - "Mostrar sugestões de correcção" + Mostrar sugestões de correção "Apresentar sugestões de palavras ao escrever" "Bloquear palavras ofensivas" "Não sugerir palavras potencialmente ofensivas" @@ -103,13 +103,13 @@ "Adicionar" "Adicionar ao dicionário" "Atalho:" - "Idioma:" + Língua: "Escreva uma palavra" "Atalho opcional" "Editar palavra" "Não tem palavras no dicionário do utilizador. Para adicionar uma palavra, toque no botão Adicionar (+)." "Em todos os idiomas" - "Mais idiomas…" + Mais línguas… " ABCDEFGHIJKLMNOPQRSTUVWXYZ" Mostrar dicas com toque longo Deslize para eliminar @@ -118,18 +118,18 @@ Impor modo incógnito Modo diurno/noturno automático Aparência usa as definições do sistema - Verificação ortográfica HeliBoard - Definições HeliBoard + Corretor ortográfico de HeliBoard + Definições de HeliBoard Introdução - Teclas adiccionais - Correcções + Teclas adicionais + Correções Sugestões Experimental Outras Desativar aprendizagem de palavras Mais teclas - Número de linha - Mostrar sempre n.º de linha + Linha de números + Mostrar sempre linha de números Mostrar dicas de teclas Alterar método de introdução com a tecla Espaço Toque longo na tecla Espaço abre menu de seleção do método de introdução @@ -137,12 +137,12 @@ Alfabeto (Colemak Mod-DH) Alfabeto (Workman) Limite das teclas - Definições de verificação ortográfica HeliBoard + Definições do corretor ortográfico de HeliBoard Confiança da correção automática Se desativado, a tecla da área de transferência colará o conteúdo, se houver - "Usar idiomas do sistema" + Usar linguagens do sistema "Escolher o método de entrada" - Tempo de retenção de historio + Tempo de retenção de histórico Espaço automático depois de pontuação %s (Akkhor) Sem limite @@ -226,4 +226,215 @@ Direita Idiomas com dicionários Área de transferência + Fixar tecla da barra de ferramentas em toque longo + Selecionar teclas fixadas da barra de ferramentas + Alfabeto (Bépo) + Conteúdo copiado + Mudar o lado do modo de uma mão + Não foi possível ler o ficheiro + Copiar esquema existente + Texto personalizado na barra de espaço + Mansi + Personalizar moedas + O ficheiro selecionado é para %1$s, mas %2$s era esperado. utilizar ele ainda para %2$s? + Erro: escrita não compatível com este teclado + Branco Holo + Mais escuro + Preto + Texto da dica da tecla + Texto da faixa de sugestão + Fundo da tecla + Escuro + Cores dinâmicas + Índigo + Oceano + Mostrar apenas cores principais + Subtipo personalizado + Noite + Números + Estilo + Fundo da tecla funcional + Escolher cor automaticamente + Selecionar teclas da barra de ferramentas + Teclas com espaços estreitos + Kaitag + Símbolos (Árabe) + Selecionar cores para texto e fundos + Fundo do teclado + Linha inferior de emojis + Linha inferior da área de transferência + Violeta + Não mostrar sempre sugestões para campos de edição web + Os campos de edição na Web (encontrados principalmente nos navegadores) são uma causa muito comum de problemas com a configuração de mostrar sempre sugestões + Detecção de URL + Tenta detetar URLs e similares como uma única palavra + Selecionar fonte de dicas + Escala do espaço inferior + Excluir realmente o layout customizado %s? + Linha de números (básica) + Definir imagem de fundo + Não-conector de zero largura + Fechar histórico da área de transferência + Ainda usar + Claro + Destaque + Adicionar esquema personalizado + Selecionar língua + "Substituir realmente o dicionário \"%1$s\" adicionado pelo utilizador?\n\nDicionário atual:\n%2$s \n\nDicionário novo:\n%3$s" + Selecione um dicionário para adicionar. Dicionários no formato .dict podem ser descarregados%s. + Inverter a direção quando um teclado do subtipo direita-para-esquerda é selecionado + Direção da barra de ferramentas variável + Gesto de deslizar vertical na barra de espaço + Mostrar funções que podem passar despercebidas + Selecionar ordem do popup de teclas + Copiar para a Área de Transferência + Definir nome do layout + Aviso: o layout está em uso atualmente + Erro de layout: %s + Toque para editar o layout bruto + Teclas funcionais (Mais símbolos) + Símbolos + Símbolos de telefone + Dicionário interno principal + Eliminar realmente o dicionário \"%s\" adicionado pelo utilizador? + "Sem um dicionário, irá receber apenas sugestões para o texto introduzido antes.<br>\n Pode descarregar dicionários %1$s, ou verifique se um dicionário para \"%2$s\" pode ser dewscarregado diretamente %3$s." + Erro: O ficheiro selecionado não é um ficheiro de dicionário válido + Peso: + Fundo da barra de espaço + ► Pressionar em teclas da barra de ferramentas resulta em funcionalidade adicional: <br>\n\t• área de transferência &#65515; colar <br>\n\t• mover para esquerda/direita &#65515; palavra para esquerda/direita <br>\n\t• mover para cima/baixo &#65515; página para cima/baixo <br>\n\t• palavra para esquerda/direita &#65515; linha começo/fim <br>\n\t• página para cima/baixo &#65515; página começo/fim <br>\n\t• copiar &#65515; recortar <br>\n\t• selecionar palavra &#8596; selecionar tudo <br>\n\t• desfazer &#8596; refazer <br> <br>\n► Pressionar nas teclas da barra de sugestões fixam as mesmas. <br> <br>\n► Pressionar na tecla da vírgula para acessar a visualização da área de transferência, modo de uma mão, configurações, ou mudar de idioma: <br>\n\t• A Visualização de Emojis e Mudança de Idioma desaparecerão se você tiver a tecla correspondente ativada; <br>\n\t• Para alguns layouts, não é a tecla de vírgula, mas a tecla que seria no mesmo lugar. (ex: \\\'q\'\\ para o layout Dvorak). <br> <br>\n► Quando o modo privado está ativado, nenhuma palavra será aprendida, e nenhum emoji será adicionado aos recentes. <br> <br>\n► Pressione no botão do modo privado para acessar a barra de ferramentas. <br> <br>\n► Digitação por gestos: Deslize do shift até outra tecla para escrevê-la em maiúsculo: <br>\n\t• Isto também funciona para as teclas \\\'?123\\\' para escrever um único símbolo do teclado de símbolos, e para teclas relacionadas. <br> <br>\n► Pressione a tecla shift ou de símbolos, pressione uma ou mais teclas, e então solte a tecla do shift ou de símbolos para retornar ao teclado anterior. <br> <br>\n► Pressione em una sugestão na barra de sugestões para mostrar mais sugestões, e um botão para excluir esta sugestão. <br> <br>\n► Deslize para cima a partir de uma sugestão para abrir mais sugestões, e solte na sugestão que selecionar para usá-la. <br> <br>\n► Pressione em um item no histórico da área de transferência para fixá-lo (mantê-lo na área de transferência até que você o desafixe). <br> <br>\n► Deslize para a esquerda na visualização da área de transferência para remover um item (exceto quando estiver fixado) <br> <br>\n► Selecione texto e pressione shift para alternar entre maiúsculo , minúsculo, e escrever palavras com letra maiúscula. <br> <br>\n► Pode adicionar dicionários abrindo-os em um explorador de ficheiros: <br>\n\t• Isto somente funciona com <i>content-uris></i> e não com <i>file-uris</i>, significando que pode não funcionar com certos exploradores de ficheiros.\n► Para utilizadores a fazer backups manuais com acesso root: <br>\n\t• Começando com o Android 7, o arquivo de preferências compartilhado não está na localização padrão, por que a app está usando %s. Isto é necessário para que as configurações possam ser lidas antes que o dispositivo seja desbloqueado, como por exemplo no boot; <br>>\n\t• O ficheiros está localizado em /data/user_de/0/package_id/shared_prefs/ porém isto pode depender do dispositivo e versão do Android. <br> <br>\n<i><b>Modo de depuração / APK de depuração</b></i> <br> <br>\n► Pressionar em uma sugestão mostrará o dicionário de origem. <br> <br>\n► Ao usar o APK de depuração, pode encontrar configurações de depuração dentro das opções avançadas, porém a utilidade é limitada exceto à exportar dicionários nos registros. <br>\n\t• Para o APK de lançamento, precisará tocar na versão em <i>Sobre</i> várias vezes, e assim você poderá encontrar as opções de depuração em <i>Preferências Avançadas</i>. <br>\n\t• Ao ativar <i>Mostrar informações de sugestão</i>, sugestões terão pequenos números em cima mostrando sua pontuação interna e dicionário de origem. <br> <br>\n► No evento de um crash da aplicaçãp, será perguntado caso queira os registros do crash quando abrir as Configurações. <br> <br>\n► Ao usar digitação multi-linguagem, a barra de espaço mostrará um número de confiança para determinar a linguagem atualmente usada. <br> <br>\n► Sugestões terão pequenos números em cima mostrando sua pontuação interna e dicionário de origem (pode ser desativado). + Código de tecla + Dicionários + Palavra para a esquerda + Início da página + Palavra para a direita + Fim da página + Página para cima + Adicionar dicionário de um ficheiro + Areia + Chocolate + Nublado + Ativar teclado dividido (paisagem) + Distância de separação (paisagem) + Prima longamente a tecla de símbolos para o teclado numérico + Carregar + Espaço + Espaço reverte a correção automática + Mais símbolos + Formato de data e hora + Espaço automático após utilizar uma sugestão + Sem espaço automático ao premir Shift + Shift elimina o espaço automático pendente + Espaço automático antes de digitar uma palavra com gestos + Espaço automática após digitar uma palavra com gestos + Linha de números + Mostrar teclas de TLD + Substituir os popups do ponto final com domínios de topo ao digitar URLs e endereços de e-mail + Teclado dividido + Página para baixo + Selecionar teclas da barra de ferramentas de área de transferência + Isto irá desativar outras ações de toque longo para teclas da barra de ferramentas que não estão fixas + Mostrar dicas funcionais + Mostrar dicas se um toque longo numa tecla ativa funcionalidade adicional + Pressionando enter ou espaço após outras teclas no teclado de números + Essa configuração expõe todas as cores que são usadas internamente. A lista de cores pode mudar a qualquer momento. A cor padrão é aleatória, e os nomes não são traduzidos. + Entrada de gesto + seção de discussão + Sobre + Versão + Ver no GitHub + Guardar log + Barra de Ferramentas + %s (experimental) + Shift (ativado) + Foresta + Esta palavra já está presente no dicionário de utilizador%s. Introduza outra. + Texto da barra de espaço + Mostrar a barra de ferramentas se a digitação começar ou se o texto é selecionado + Apagar %s realmente? + Carregar ficheiro + Definido pelo utilizador + Definido pelo utilizador (noite) + O carregamento irá substituir o tema atual + Mostrar todas as cores + Ocultar barra de ferramentas automaticamente + Ocultar barra de ferramentas quando sugestões ficam disponíveis + Entrada de voz + Modo de uma mão + Inteiramente para a esquerda + Inteiramente para a direita + Cinza azul + Castanho + Gesto de deslizar horizontal na barra de espaço + Não mostrar novamente + Erro ao carregar o ficheiro de dicionário + Fechar + Toque no idioma para abrir configurações + Shift + Maiúsculas + Desativar modo de uma mão + Alterar o tamanho do modo de uma mão + Adicionar palavra + Arredondado + Cores + Cores (noite) + Clique para uma pré-visualização + Licença de código aberto + Altere para o teclado principal depois… + A selecionar emoji no ecrã de emojis + Selecionar um ficheiro em formato compatível. Infomações sobre os formatos estão disponíveis em %s. + Cor da barra de navegação + Texto da tecla + Descrição de funções escondidas + Dagbani + Sesotho + Personalizar códigos de teclas da barra de ferramentas + armazenamento protegido pelo dispositivo + Adicionar variantes muito comuns (padrão) + Remover popups redundantes + Suprimir popups de teclas que já estão presentes no layout base + Defina um símbolo principal e até 6 secundários para moedas, separado com espaço + Repor realmente todos os ícones personalizados? + Pressionar código + Mostrar automaticamente a barra de ferramentas + Layouts secundários + Teclas funcionais (ecrã grande) + Telefone + Teclado númerico + Teclado numérico (paisagem) + A selecionar entrada do histórico da área de transferência + Pressionando enter ou espaço após outras teclas na tela de símbolos + Definir imagem para o modo de dia ou noite? + Dia + Rosa + Nenhuma + Mover cursor + Alternar teclado numérico + Personalizar ícones + Nome inválido + Mostrar mais cores + Teclas funcionais + Teclas funcionais (Símbolos) + Enter + Tab + Delete + Entrada de voz desativada + Mostrar / ocultar barra de ferramentas + Estilo do ícone + Escala do espaço inferior (paisagem) + Escala da fonte do teclado + Escala da fonte na visualização de emoji + Substituir dicionário + Licença Pública Geral GNU v3.0 + Espaço (teclado numérico) + Conector de zero largura + Escala do espaço lateral + Escala do espaço lateral (paisagem) + Reciclagem + Idiomas e Esquemas + Localizar linha de números + Preferir localizados em vez de números latinos + Guardar em ficheiro + aqui + Pode encontrar e partilhar cores em %s. + Pode encontrar e partilhar layouts em %s. diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 0e8c451a8..ca651edb0 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1,10 +1,9 @@ - + - +--> "查詢聯絡人姓名" "按鍵時震動" "按鍵聲音" @@ -89,7 +88,7 @@ "接著,請選取「%s」做為目前使用的文字輸入法。" "切換輸入法" "恭喜,你已完成設定!" - "現在,你可以在自己喜愛的所有應用程式中使用「%s」輸入文字。" + 現在您可以在所有您喜歡的應用程式中使用 %s 輸入。 "完成" "顯示應用程式圖示" "在啟動器中顯示應用程式圖示" @@ -124,4 +123,58 @@ "搜尋" "暫停" "等待" + 樣式 + 字典 + 紫羅蘭 + 外觀 + HeliBoard 設定 + 建議 + 實驗功能 + 雜項 + 還原 + 符號 + 數字鍵盤 + 載入 + 備份 + 版面 + 符號 + Shift + 輸入 + 更正 + + 表情符號 + 顏色 + 電話 + + 數字 + + + 版本 + 淺色 + 深色 + 更深色 + 巧克力色 + 森林 + 海洋 + 粉紅色 + 使用者定義 + 棕色 + 多雲 + 黑色 + 關閉 + 圓角 + 靛藍色 + Enter + Tab + + 語言 + + + + 剪貼簿 + 權重: + 此處 + 關於 + 工具列 + Delete diff --git a/fastlane/metadata/android/ar/changelogs/3007.txt b/fastlane/metadata/android/ar/changelogs/3007.txt new file mode 100644 index 000000000..cb1eb5fde --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/3007.txt @@ -0,0 +1,11 @@ +* إضافة تخطيطات: Hija'i العربية، العبرية 1452-2، الهندية الصوتية، دارغوا (أوراخي)، بايشاخي، الكرديش +* تحديث بعض التخطيطات +* الدعم الجمع بين اللهجات +* مفتاح شريط أدوات لوحة المفاتيح +* إضافة منبثقات .com +* السماح لضبط الخط المخصص +* إضافة إعداد مقياس الخط +* تحسين تبديل اللغة التلقائي +* إعدادات الإصلاح +* أضف إعدادات لمزيد من ضبط حشوة لوحة المفاتيح، والمساحة التلقائية، والتصحيح التلقائي، و صف الأرقام +* المزيد من الميزات والإصلاحات diff --git a/fastlane/metadata/android/ca/changelogs/3007.txt b/fastlane/metadata/android/ca/changelogs/3007.txt new file mode 100644 index 000000000..4f0c8df16 --- /dev/null +++ b/fastlane/metadata/android/ca/changelogs/3007.txt @@ -0,0 +1,11 @@ +* Afeg. dissenys: àrab Hija'i, hebreu 1452-2, fonètica hindi, Dargwa (Urakhi), Baishakhi, kurd +* Actu. dissenys +* Suport per combinar accents +* Tecla dividida de la barra d'eines del teclat +* Afeg. finestres emergents .com +* Permet configurar lletra personalitzada +* Afeg. la configuració d'escala de lletra +* Millorar el canvi automàtic d'idioma +* Revisada configuració +* Afeg. paràmetres per ajustar més el farciment del teclat, l'espai automàtic, la correcció automàtica, la fila de nombres +* Més… diff --git a/fastlane/metadata/android/cs-CZ/changelogs/3007.txt b/fastlane/metadata/android/cs-CZ/changelogs/3007.txt new file mode 100644 index 000000000..7b5a3f128 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/3007.txt @@ -0,0 +1,11 @@ +* přidána rozvržení: arabština hidžá'í, hebrejština 1452-2, fonetické hindu, dargwa (urakhi), baishakhi, kurdština +* aktualizace některých rozvržení +* podpora kombinování přízvuků +* klávesa pro rozdělení klávesnice +* přidána nabídka .com +* možnost nastavení vlastního písma +* přidáno nastavení měřítka písma +* zlepšeno automatické přepínání jazyků +* přepracována nastavení +* přidána nastavení pro lepší nastavení odsazení, automatické mezery, automatické opravy, číselné řady +* další funkce a opravy diff --git a/fastlane/metadata/android/en-US/changelogs/3007.txt b/fastlane/metadata/android/en-US/changelogs/3007.txt new file mode 100644 index 000000000..ce0395033 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/3007.txt @@ -0,0 +1,11 @@ +* add layouts: Arabic Hija'i, Hebrew 1452-2, Hindi Phonetic, Dargwa (Urakhi), Baishakhi, Kurdish +* update some layouts +* support combining accents +* split keyboard toolbar key +* add .com popups +* allow setting custom font +* add font scale setting +* improve automatic language switching +* overhaul settings +* add settings for more tuning of keyboard padding, auto-space, auto-correction, number row +* more features and fixes diff --git a/fastlane/metadata/android/et/changelogs/3007.txt b/fastlane/metadata/android/et/changelogs/3007.txt new file mode 100644 index 000000000..f9be70240 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/3007.txt @@ -0,0 +1,11 @@ +* uued klahvipaigustused: araabia hija'i, heebrea 1452-2, hindi foneetiline, dargi (Urahhi), baišaki, kurdi +* mõnede klahvipaigustuste täiendused +* aktsentide kombineerimise tugi +* nupp klahvistiku poolitamiseks +* lisandusid .com hüpikaknad +* oma kirjatüübi valikuvõimalus +* kirjatüübi skaleerimise võimalus +* improve automatic language switching +* seadistuste kohendus +* lisaseadistused klahvide vaheruumi, tühikute lisamise, autokorrektsiooni ja ridade arvu jaoks +* pisitäiendused ja parandused diff --git a/fastlane/metadata/android/fr-FR/changelogs/1001.txt b/fastlane/metadata/android/fr-FR/changelogs/1001.txt new file mode 100644 index 000000000..2167c1f09 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/1001.txt @@ -0,0 +1,20 @@ +* nouvel icône de @FabianOvrWrt avec la contribution de @the-eclectic-dyslexic (#517, #592) +* plus de customisation de la barre espace du pavé tactile +* ajout du % pour les mises en page des symboles shift (#568, #428) +* amélioration du comportement quand la touche de changement de langue est définie pour changer à la fois la langue et le clavier +* afficher les liens aux dictionnaires existants quand un dctionnaire est ajouté +* ajout de la disposition de clavier Kaïtag par @alkaitagi (#519) +* ajout de la disposition de clavier Probhat par @fahimscirex (#489) +* ordre inversé optionnel de la barre d'outils pour les langues RTL par @codokie (#557, #574) +* autorisation de customisation de mises en page particulières (pavé numérique, téléphone, ...) + * en cours d'expérimentation, car les schémas de base peuvent changer +* mise à jour de spellchecker.xml pour inclure les lieux où les dictionnaires sont disponibles, mais n'est pas inclus dans l'application +* mise à jour des traductions (merci aux traducteur·rices !) +* amélioration du ndk par @Syphyr (#560) +* amélioration du code de remplissage automatique en ligne par @arcarum (#595) +* problème corrigé avec la fenêtre de la touche de la barre d'outils (#505) +* problème corrigé avec la disposition turque (#508) +* correction des mauvais switch states lors de la rotation dans l'écran de personnalisation des couleurs (#563) +* problème corrigé avec les récents émojis qui ne chargent pas (#527) +* problème corrigé avec les numbers qui ne s'affichent pas dans certains champs (#585) +* quelques petites corrections diff --git a/fastlane/metadata/android/fr-FR/changelogs/1003.txt b/fastlane/metadata/android/fr-FR/changelogs/1003.txt new file mode 100644 index 000000000..7481b7f68 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/1003.txt @@ -0,0 +1,9 @@ +* changement des icônes pour l'autocorrection et la sélection de toutes les touches de la barre d'outils par @codokie (#524, #651) +* ajout de la disposition de clavier Tchouvache par @tenextractor (#677) +* ajout de la touche pour couper dans la barre d'outils par @codokie (#678) +* mise à jour de la disposition de clavier Probhat par @fahimscirex (#628) +* affichage des icônes de la barre d'outils dans la fenêtre des touches +* ajout d'un bouton pour fermer dans l'historique du presse-papier par @codokie (#403, #649) +* ajout de la disposition russe (student) par @Zolax9 (#640) +* rendre les appuis longs sur les symboles du pavé numérique optionnels +* corrections et améliorations mineures, en incluant #632, #637, #638 par @RHJihan diff --git a/fastlane/metadata/android/fr-FR/changelogs/1004.txt b/fastlane/metadata/android/fr-FR/changelogs/1004.txt new file mode 100644 index 000000000..7d2651e5c --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/1004.txt @@ -0,0 +1,7 @@ +- mise à jour de la disposition de clavier cyrillique serbe par @markokocic (#704, #705) +- mise à jour de la disposition de clavier estonienne par @tenextractor (#693) +- correction des entrées dupliquées dans l'historique du presse-papier par @codokie (#616, #680) +- ajouter uniquement les entrées de texte dans l'historique du presse-papier par @codokie (#711) +- meilleures images dans les métadatas par @RHJihan (#713) +- réglage correct de la couleur des icônes dans la fenêtre de sélection de la barre d'outils par @codokie (#715, #716) +- autres corrections (#684, #723 and more) diff --git a/fastlane/metadata/android/fr-FR/changelogs/2000.txt b/fastlane/metadata/android/fr-FR/changelogs/2000.txt new file mode 100644 index 000000000..4b3941704 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/2000.txt @@ -0,0 +1,10 @@ +* ajout d'une aide de base pour les modifier keys +* ajout de fonctions d'appuis longs à plus de touches de la barre d'outils +* et plus de touches de la barre d'outils pour l'historique du presse-papier +* rendre la barre d'outils de l'historique du presse-papier personnalisable +* autoriser la customisation de toutes les couleurs +* ajout d'un paramètre pour toujours afficher le mot qui doit être entré en tant que suggestion du milieu +* ajout d'un indicateur de touche majuscule enfoncée +* ajout des dispositions de clavier piémontais, mari de l'est et mansi pour le kannada et l'hongrois +* Correction du texte coupé dans la popup de prévisualisation sur certains appareils +* corrections et améliorations plus lointaines, voir notes de publication diff --git a/fastlane/metadata/android/it-IT/changelogs/3007.txt b/fastlane/metadata/android/it-IT/changelogs/3007.txt new file mode 100644 index 000000000..16cb2ba25 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/3007.txt @@ -0,0 +1,11 @@ +* layout aggiunti: Arabo Hija'i, Ebraico 1452-2, Hindi fonetico, Dargwa (Urakhi), Baishakhi, Curdo +* alcuni layout aggiornati +* supporto agli accenti combinati +* pulsante 'Tastiera divisa' nella barra degli strumenti +* popup .com aggiunto +* font personalizzato per i tasti +* aggiustamento dimensione per i tasti +* modalità multilingua migliorata +* impostazioni ridisegnate +* aggiunte alcune opzioni per spaziatura automatica, correzione testo e riga dei numeri +* altre funzionalità, migliorie e bugfix diff --git a/fastlane/metadata/android/iw-IL/changelogs/3004.txt b/fastlane/metadata/android/iw-IL/changelogs/3004.txt new file mode 100644 index 000000000..674053177 --- /dev/null +++ b/fastlane/metadata/android/iw-IL/changelogs/3004.txt @@ -0,0 +1,11 @@ +* הוספת פריסות: ערבית (הג'אי), עברית 1452-2, הינדית פונטית, דארגווה (אוראקי), באישאקי,כורדית +* עדכון מספר פריסות +* תמיכה בשילוב סימנים דיאקריטיים +* מקש סרגל הכלים למקלדת מפוצלת +* הוספת סיומות .com לחלון צץ +* אפשרות לבחירת גופן מותאם +* הוספת הגדרת סדר-גודל הגופן +* שיפור המעבר האוטומטי בין שפות +* שיפור ההגדרות +* הוספת הגדרות לכיוונון נוסף של שולי המקלדת, רווח אוטומטי, תיקון אוטומטי, שורת המספרים +* תכולות ותיקונים נוספים diff --git a/fastlane/metadata/android/iw-IL/changelogs/3005.txt b/fastlane/metadata/android/iw-IL/changelogs/3005.txt new file mode 100644 index 000000000..674053177 --- /dev/null +++ b/fastlane/metadata/android/iw-IL/changelogs/3005.txt @@ -0,0 +1,11 @@ +* הוספת פריסות: ערבית (הג'אי), עברית 1452-2, הינדית פונטית, דארגווה (אוראקי), באישאקי,כורדית +* עדכון מספר פריסות +* תמיכה בשילוב סימנים דיאקריטיים +* מקש סרגל הכלים למקלדת מפוצלת +* הוספת סיומות .com לחלון צץ +* אפשרות לבחירת גופן מותאם +* הוספת הגדרת סדר-גודל הגופן +* שיפור המעבר האוטומטי בין שפות +* שיפור ההגדרות +* הוספת הגדרות לכיוונון נוסף של שולי המקלדת, רווח אוטומטי, תיקון אוטומטי, שורת המספרים +* תכולות ותיקונים נוספים diff --git a/fastlane/metadata/android/iw-IL/changelogs/3006.txt b/fastlane/metadata/android/iw-IL/changelogs/3006.txt new file mode 100644 index 000000000..674053177 --- /dev/null +++ b/fastlane/metadata/android/iw-IL/changelogs/3006.txt @@ -0,0 +1,11 @@ +* הוספת פריסות: ערבית (הג'אי), עברית 1452-2, הינדית פונטית, דארגווה (אוראקי), באישאקי,כורדית +* עדכון מספר פריסות +* תמיכה בשילוב סימנים דיאקריטיים +* מקש סרגל הכלים למקלדת מפוצלת +* הוספת סיומות .com לחלון צץ +* אפשרות לבחירת גופן מותאם +* הוספת הגדרת סדר-גודל הגופן +* שיפור המעבר האוטומטי בין שפות +* שיפור ההגדרות +* הוספת הגדרות לכיוונון נוסף של שולי המקלדת, רווח אוטומטי, תיקון אוטומטי, שורת המספרים +* תכולות ותיקונים נוספים diff --git a/fastlane/metadata/android/iw-IL/changelogs/3007.txt b/fastlane/metadata/android/iw-IL/changelogs/3007.txt new file mode 100644 index 000000000..674053177 --- /dev/null +++ b/fastlane/metadata/android/iw-IL/changelogs/3007.txt @@ -0,0 +1,11 @@ +* הוספת פריסות: ערבית (הג'אי), עברית 1452-2, הינדית פונטית, דארגווה (אוראקי), באישאקי,כורדית +* עדכון מספר פריסות +* תמיכה בשילוב סימנים דיאקריטיים +* מקש סרגל הכלים למקלדת מפוצלת +* הוספת סיומות .com לחלון צץ +* אפשרות לבחירת גופן מותאם +* הוספת הגדרת סדר-גודל הגופן +* שיפור המעבר האוטומטי בין שפות +* שיפור ההגדרות +* הוספת הגדרות לכיוונון נוסף של שולי המקלדת, רווח אוטומטי, תיקון אוטומטי, שורת המספרים +* תכולות ותיקונים נוספים diff --git a/fastlane/metadata/android/nl-NL/changelogs/3007.txt b/fastlane/metadata/android/nl-NL/changelogs/3007.txt new file mode 100644 index 000000000..6256f8aeb --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/3007.txt @@ -0,0 +1,11 @@ +* lay-outs toevoegen: Arabisch Hija'i, Hebreeuws 1452-2, Hindi Fonetisch, Dargwa (Urakhi), Baishakhi, Koerdisch +* Update enkele lay-outs +* Ondersteuning voor het combineren van accenten +* Gesplitste toetsenbordwerkbalktoets +* voeg .com pop-ups toe +* Toestaan instellen van aangepast lettertype +* Instelling voor lettertypeschaal toevoegen +* automatische taalomschakeling verbeteren +* Revisie instellingen +* Voeg instellingen toe voor meer afstemming van toetsenbordopvulling, automatische spatie, autocorrectie, cijferrij +* Meer functies en fixes From 366ee5ae28e33db0c9fca2597a78d748140b312f Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 4 May 2025 20:33:41 +0200 Subject: [PATCH 100/175] workaround for page start / page end toolbar keys not working in compose text fields fixes GH-1477 --- .../keyboard/latin/inputlogic/InputLogic.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java index 8e3282cc4..76fdf66c6 100644 --- a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java @@ -773,10 +773,27 @@ public final class InputLogic { KeyEvent.KEYCODE_DPAD_LEFT : KeyEvent.KEYCODE_DPAD_RIGHT, KeyEvent.META_CTRL_ON); break; case KeyCode.MOVE_START_OF_PAGE: + final int selectionEnd = mConnection.getExpectedSelectionEnd(); sendDownUpKeyEventWithMetaState(KeyEvent.KEYCODE_MOVE_HOME, KeyEvent.META_CTRL_ON); + if (mConnection.getExpectedSelectionStart() > 0 && mConnection.getExpectedSelectionEnd() == selectionEnd) { + // unchanged, and we're not at the top -> try a different method (necessary for compose fields) + mConnection.setSelection(0, 0); + } break; case KeyCode.MOVE_END_OF_PAGE: + final int selectionStart = mConnection.getExpectedSelectionEnd(); sendDownUpKeyEventWithMetaState(KeyEvent.KEYCODE_MOVE_END, KeyEvent.META_CTRL_ON); + if (mConnection.getExpectedSelectionStart() == selectionStart) { + // unchanged, try fallback e.g. for compose fields that don't care about ctrl + end + // we just move to a very large index, and hope the field is prepared to deal with this + // getting the actual length of the text for setting the correct position can be tricky for some apps... + try { + mConnection.setSelection(Integer.MAX_VALUE, Integer.MAX_VALUE); + } catch (Exception e) { + // better catch potential errors and just do nothing in this case + Log.i(TAG, "error when trying to move cursor to last position: " + e); + } + } break; case KeyCode.UNDO: sendDownUpKeyEventWithMetaState(KeyEvent.KEYCODE_Z, KeyEvent.META_CTRL_ON); From a3dff524cbe06960e65d9dfe61653fad11dc153d Mon Sep 17 00:00:00 2001 From: Helium314 Date: Tue, 6 May 2025 18:58:14 +0200 Subject: [PATCH 101/175] avoid problems with hacky way of saving AllColors theme name see GH-1528 --- .../keyboard/settings/dialogs/ColorThemePickerDialog.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/ColorThemePickerDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/ColorThemePickerDialog.kt index 6c1f84893..24101e86e 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/ColorThemePickerDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/ColorThemePickerDialog.kt @@ -272,7 +272,8 @@ private fun loadColorString(colorString: String, prefs: SharedPreferences): Bool try { allColors[ColorType.valueOf(it.key)] = it.value } catch (_: IllegalArgumentException) { - themeName = decodeBase36(it.key) + if (it.value == 0) // hacky way of storing theme name: put it in a key with value 0 + runCatching { decodeBase36(it.key) }.getOrNull()?.let { themeName = it } } } themeName = KeyboardTheme.getUnusedThemeName(themeName, prefs) From 97db67d7eb4868daff2aad8e2c03a29e5e469fbe Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 7 May 2025 18:23:47 +0200 Subject: [PATCH 102/175] increase contacts dictionary frequency because contacts rarely got suggested, see GH-1361 --- .../helium314/keyboard/latin/ContactsDictionaryConstants.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/ContactsDictionaryConstants.java b/app/src/main/java/helium314/keyboard/latin/ContactsDictionaryConstants.java index 23c3eaf39..dd0ff0e80 100644 --- a/app/src/main/java/helium314/keyboard/latin/ContactsDictionaryConstants.java +++ b/app/src/main/java/helium314/keyboard/latin/ContactsDictionaryConstants.java @@ -20,8 +20,8 @@ public class ContactsDictionaryConstants { /** * Frequency for contacts information into the dictionary */ - public static final int FREQUENCY_FOR_CONTACTS = 40; - public static final int FREQUENCY_FOR_CONTACTS_BIGRAM = 90; + public static final int FREQUENCY_FOR_CONTACTS = 100; // much increased from original frequency because contacts were barely suggested + public static final int FREQUENCY_FOR_CONTACTS_BIGRAM = 200; // todo: seems broken, how to actually get bigrams? /** * Do not attempt to query contacts if there are more than this many entries. From 3c36033acb70f07c80181684a6fcf73575bb3cf7 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Fri, 9 May 2025 05:16:22 +0200 Subject: [PATCH 103/175] add more information to exception when InputMethodInfo is not found apparently this randomly happens, see GH-1521 --- .../helium314/keyboard/latin/RichInputMethodManager.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/RichInputMethodManager.java b/app/src/main/java/helium314/keyboard/latin/RichInputMethodManager.java index 607e30a92..92ac1c73f 100644 --- a/app/src/main/java/helium314/keyboard/latin/RichInputMethodManager.java +++ b/app/src/main/java/helium314/keyboard/latin/RichInputMethodManager.java @@ -25,6 +25,7 @@ import helium314.keyboard.latin.utils.ScriptUtils; import helium314.keyboard.latin.utils.SubtypeLocaleUtils; import helium314.keyboard.latin.utils.SubtypeSettings; import helium314.keyboard.latin.utils.SubtypeUtilsKt; +import kotlin.collections.CollectionsKt; import java.util.Collections; import java.util.HashMap; @@ -148,13 +149,15 @@ public class RichInputMethodManager { if (mCachedThisImeInfo != null) { return mCachedThisImeInfo; } - for (final InputMethodInfo imi : mImm.getInputMethodList()) { + final var inputMethods = mImm.getInputMethodList(); + for (final InputMethodInfo imi : inputMethods) { if (imi.getPackageName().equals(mImePackageName)) { mCachedThisImeInfo = imi; return imi; } } - throw new RuntimeException("Input method id for " + mImePackageName + " not found."); + throw new RuntimeException("Input method id for " + mImePackageName + " not found, only found" + + CollectionsKt.map(inputMethods, InputMethodInfo::getPackageName)); } public synchronized List getEnabledInputMethodSubtypeList( From 1f8a94f2193bacedc7878b9fe1fc782e16ba1833 Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Fri, 9 May 2025 17:49:23 +0300 Subject: [PATCH 104/175] Adjust emoji key size according to emoji font size (#1543) --- .../helium314/keyboard/keyboard/KeyboardView.java | 3 ++- .../keyboard/internal/keyboard_parser/EmojiParser.kt | 12 +++++++++--- .../helium314/keyboard/latin/settings/Defaults.kt | 1 + .../helium314/keyboard/latin/settings/Settings.java | 1 + .../keyboard/latin/settings/SettingsValues.java | 2 ++ .../keyboard/settings/screens/AppearanceScreen.kt | 4 ++++ app/src/main/res/values/strings.xml | 2 ++ 7 files changed, 21 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java index d5d14c92e..77258b2d6 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java @@ -193,7 +193,8 @@ public class KeyboardView extends View { invalidateAllKeys(); requestLayout(); mFontSizeMultiplier = mKeyboard.mId.isEmojiKeyboard() - ? Settings.getValues().mFontSizeMultiplierEmoji + // In the case of EmojiKeyFit, the size of emojis is taken care of by the size of the keys + ? (Settings.getValues().mEmojiKeyFit? 1 : Settings.getValues().mFontSizeMultiplierEmoji) : Settings.getValues().mFontSizeMultiplier; } diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt index 165b506fb..4e9db5422 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt @@ -44,11 +44,17 @@ class EmojiParser(private val params: KeyboardParams, private val context: Conte // this is a bit long, but ensures that emoji size stays the same, independent of these settings // we also ignore side padding for key width, and prefer fewer keys per row over narrower keys val defaultKeyWidth = ResourceUtils.getDefaultKeyboardWidth(context) * params.mDefaultKeyWidth - val keyWidth = defaultKeyWidth * sqrt(Settings.getValues().mKeyboardHeightScale) + var keyWidth = defaultKeyWidth * sqrt(Settings.getValues().mKeyboardHeightScale) val defaultKeyboardHeight = ResourceUtils.getDefaultKeyboardHeight(context.resources, false) val defaultBottomPadding = context.resources.getFraction(R.fraction.config_keyboard_bottom_padding_holo, defaultKeyboardHeight, defaultKeyboardHeight) val emojiKeyboardHeight = ResourceUtils.getDefaultKeyboardHeight(context.resources, false) * 0.75f + params.mVerticalGap - defaultBottomPadding - context.resources.getDimensionPixelSize(R.dimen.config_emoji_category_page_id_height) - val keyHeight = emojiKeyboardHeight * params.mDefaultRowHeight * Settings.getValues().mKeyboardHeightScale // still apply height scale to key + var keyHeight = emojiKeyboardHeight * params.mDefaultRowHeight * Settings.getValues().mKeyboardHeightScale // still apply height scale to key + + if (Settings.getValues().mEmojiKeyFit) { + keyWidth *= Settings.getValues().mFontSizeMultiplierEmoji + keyHeight *= Settings.getValues().mFontSizeMultiplierEmoji + } + emojiArray.forEachIndexed { i, codeArraySpec -> val keyParams = parseEmojiKey(codeArraySpec, popupEmojisArray?.get(i)?.takeIf { it.isNotEmpty() }) ?: return@forEachIndexed @@ -102,4 +108,4 @@ class EmojiParser(private val params: KeyboardParams, private val context: Conte } } -const val EMOJI_HINT_LABEL = "◥" \ No newline at end of file +const val EMOJI_HINT_LABEL = "◥" diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt index 377e19899..4a38c6fc8 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt @@ -89,6 +89,7 @@ object Defaults { const val PREF_SIDE_PADDING_SCALE_LANDSCAPE = 0f const val PREF_FONT_SCALE = SettingsValues.DEFAULT_SIZE_SCALE const val PREF_EMOJI_FONT_SCALE = SettingsValues.DEFAULT_SIZE_SCALE + const val PREF_EMOJI_KEY_FIT = true const val PREF_SPACE_HORIZONTAL_SWIPE = "move_cursor" const val PREF_SPACE_VERTICAL_SWIPE = "none" const val PREF_DELETE_SWIPE = true diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java index 0f9c21ed8..b70d9d840 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -95,6 +95,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_SIDE_PADDING_SCALE_LANDSCAPE = "side_padding_scale_landscape"; public static final String PREF_FONT_SCALE = "font_scale"; public static final String PREF_EMOJI_FONT_SCALE = "emoji_font_scale"; + public static final String PREF_EMOJI_KEY_FIT = "emoji_key_fit"; public static final String PREF_SPACE_HORIZONTAL_SWIPE = "horizontal_space_swipe"; public static final String PREF_SPACE_VERTICAL_SWIPE = "vertical_space_swipe"; public static final String PREF_DELETE_SWIPE = "delete_swipe"; diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java index 9fe0a3725..df015aa84 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java @@ -124,6 +124,7 @@ public class SettingsValues { public final String mSpaceBarText; public final float mFontSizeMultiplier; public final float mFontSizeMultiplierEmoji; + public final boolean mEmojiKeyFit; // From the input box @NonNull @@ -289,6 +290,7 @@ public class SettingsValues { mEmojiMaxSdk = prefs.getInt(Settings.PREF_EMOJI_MAX_SDK, Defaults.PREF_EMOJI_MAX_SDK); mFontSizeMultiplier = prefs.getFloat(Settings.PREF_FONT_SCALE, Defaults.PREF_FONT_SCALE); mFontSizeMultiplierEmoji = prefs.getFloat(Settings.PREF_EMOJI_FONT_SCALE, Defaults.PREF_EMOJI_FONT_SCALE); + mEmojiKeyFit = prefs.getBoolean(Settings.PREF_EMOJI_KEY_FIT, Defaults.PREF_EMOJI_KEY_FIT); } public boolean isApplicationSpecifiedCompletionsOn() { diff --git a/app/src/main/java/helium314/keyboard/settings/screens/AppearanceScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/AppearanceScreen.kt index 2a53c22c0..3b16a48d7 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/AppearanceScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/AppearanceScreen.kt @@ -84,6 +84,7 @@ fun AppearanceScreen( SettingsWithoutKey.CUSTOM_FONT, Settings.PREF_FONT_SCALE, Settings.PREF_EMOJI_FONT_SCALE, + Settings.PREF_EMOJI_KEY_FIT, ) SearchSettingsScreen( onClickBack = onClickBack, @@ -289,6 +290,9 @@ fun createAppearanceSettings(context: Context) = listOf( description = { "${(100 * it).toInt()}%" } ) { KeyboardSwitcher.getInstance().setThemeNeedsReload() } }, + Setting(context, Settings.PREF_EMOJI_KEY_FIT, R.string.prefs_emoji_key_fit) { + SwitchPreference(it, Defaults.PREF_EMOJI_KEY_FIT) { KeyboardSwitcher.getInstance().setThemeNeedsReload() } + }, ) @Preview diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a0f317a99..710fe1f19 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -348,6 +348,8 @@ Keyboard font scale Emoji view font scale + + Scale emoji key size with font size Custom text on space bar From a1e05c847e7c50b199a558e400aa357c1aa62930 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 10 May 2025 09:27:25 +0200 Subject: [PATCH 105/175] no need for full stack trace when system gesture lib is not found --- app/src/main/java/helium314/keyboard/latin/utils/JniUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/JniUtils.java b/app/src/main/java/helium314/keyboard/latin/utils/JniUtils.java index 6bae92d5e..9998d7e26 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/JniUtils.java +++ b/app/src/main/java/helium314/keyboard/latin/utils/JniUtils.java @@ -90,7 +90,7 @@ public final class JniUtils { System.loadLibrary(JNI_LIB_NAME_GOOGLE); sHaveGestureLib = true; } catch (UnsatisfiedLinkError ul) { - Log.w(TAG, "Could not load system glide typing library " + JNI_LIB_NAME_GOOGLE, ul); + Log.w(TAG, "Could not load system glide typing library " + JNI_LIB_NAME_GOOGLE + ": " + ul.getMessage()); } } if (!sHaveGestureLib) { From 549675d8d7727c1128b87a09248bebf59afb241f Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 10 May 2025 15:50:58 +0200 Subject: [PATCH 106/175] change query for other IME packages should fix GH-1340 --- app/src/main/AndroidManifest.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cecae1976..bfd74b9e5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -98,7 +98,9 @@ SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only - + + + From e6ec1c7bca036c5114eb32d384c97a87a8ab5c43 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 10 May 2025 17:37:20 +0200 Subject: [PATCH 107/175] fix debug mode crash sometimes occurring when deleting korean fixes GH-1551 --- .../keyboard/latin/inputlogic/InputLogic.java | 2 ++ .../java/helium314/keyboard/latin/InputLogicTest.kt | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java index 76fdf66c6..9deabf6d0 100644 --- a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java @@ -452,6 +452,8 @@ public final class InputLogic { // to the current word instead of considering the cursor position // position is actually not visible to the combiner, how to fix? processedEvent = mWordComposer.processEvent(hangulDecodedEvent); + if (event.getMKeyCode() == KeyCode.DELETE) + mWordComposer.resetInvalidCursorPosition(); } else { mWordComposer.setHangul(false); final boolean wasComposingWord = mWordComposer.isComposingWord(); diff --git a/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt b/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt index 1fd8dea0b..afef5bbf0 100644 --- a/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt +++ b/app/src/test/java/helium314/keyboard/latin/InputLogicTest.kt @@ -160,6 +160,16 @@ class InputLogicTest { assertEquals("ㅛ.", text) } + // see issue 1551 (debug only) + @Test fun deleteHangul() { + reset() + currentScript = ScriptUtils.SCRIPT_HANGUL + setText("ㅛㅛ ") + functionalKeyPress(KeyCode.DELETE) + functionalKeyPress(KeyCode.DELETE) + functionalKeyPress(KeyCode.DELETE) + } + @Test fun separatorUnselectsWord() { reset() setText("hello") From b5837c338072476663ca4a719ebb118e9c24beaa Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 14 May 2025 15:58:24 +0200 Subject: [PATCH 108/175] try saving crash logs when device is locked --- .../helium314/keyboard/latin/define/DebugFlags.kt | 13 ++++++++++--- .../helium314/keyboard/settings/SettingsActivity.kt | 6 ++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/define/DebugFlags.kt b/app/src/main/java/helium314/keyboard/latin/define/DebugFlags.kt index 6829f71e3..08f54c4f0 100644 --- a/app/src/main/java/helium314/keyboard/latin/define/DebugFlags.kt +++ b/app/src/main/java/helium314/keyboard/latin/define/DebugFlags.kt @@ -11,6 +11,7 @@ import android.os.Build import helium314.keyboard.latin.BuildConfig import helium314.keyboard.latin.settings.DebugSettings import helium314.keyboard.latin.settings.Defaults +import helium314.keyboard.latin.utils.DeviceProtectedUtils import helium314.keyboard.latin.utils.Log import helium314.keyboard.latin.utils.prefs import java.io.File @@ -64,11 +65,17 @@ ${Log.getLog(100).joinToString("\n")} private fun writeCrashReportToFile(text: String) { try { - val dir = appContext.getExternalFilesDir(null) ?: return + val dir = appContext.getExternalFilesDir(null) val date = SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(Calendar.getInstance().time) val crashReportFile = File(dir, "crash_report_$date.txt") - crashReportFile.writeText(text) - } catch (ignored: IOException) { + crashReportFile.appendText(text) + } catch (_: Exception) { + // can't write in external files dir, maybe device just booted and is still locked + // in this case there shouldn't be any sensitive data and we can put crash logs in unprotected files dir + val dir = DeviceProtectedUtils.getFilesDir(appContext) ?: return + val date = SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(Calendar.getInstance().time) + val crashReportFile = File(dir, "crash_report_unprotected_$date.txt") + crashReportFile.appendText(text) } } } diff --git a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt index ec7b33426..d0e9a3030 100644 --- a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt +++ b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt @@ -38,6 +38,7 @@ import helium314.keyboard.latin.R import helium314.keyboard.latin.common.FileUtils import helium314.keyboard.latin.define.DebugFlags import helium314.keyboard.latin.settings.Settings +import helium314.keyboard.latin.utils.DeviceProtectedUtils import helium314.keyboard.latin.utils.ExecutorUtils import helium314.keyboard.latin.utils.UncachedInputMethodManagerUtils import helium314.keyboard.latin.utils.cleanUnusedMainDicts @@ -191,8 +192,9 @@ class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferen private fun findCrashReports(): List { // find crash report files - val dir: File = getExternalFilesDir(null) ?: return emptyList() - val allFiles = dir.listFiles() ?: return emptyList() + val dir = getExternalFilesDir(null) + val unprotectedDir = DeviceProtectedUtils.getFilesDir(this) + val allFiles = dir?.listFiles()?.toList().orEmpty() + unprotectedDir?.listFiles().orEmpty() return allFiles.filter { it.name.startsWith("crash_report") } } From 880c7eaf33236b08fed17796699c587cf5f1350a Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 14 May 2025 16:11:52 +0200 Subject: [PATCH 109/175] update version and translations --- app/build.gradle.kts | 4 ++-- app/src/main/res/values-bg/strings.xml | 1 + app/src/main/res/values-bn/strings.xml | 1 + app/src/main/res/values-ca/strings.xml | 1 + app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-et/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-gl/strings.xml | 11 +++++++++++ app/src/main/res/values-it/strings.xml | 3 ++- app/src/main/res/values-iw/strings.xml | 3 +++ app/src/main/res/values-lv/strings.xml | 18 ++++++++++++++---- app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 7 ++++--- app/src/main/res/values-pt-rPT/strings.xml | 6 ++++-- app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + .../metadata/android/ar/changelogs/3008.txt | 11 +++++++++++ .../metadata/android/ca/changelogs/3008.txt | 11 +++++++++++ .../metadata/android/cs-CZ/changelogs/3008.txt | 11 +++++++++++ .../metadata/android/en-US/changelogs/3008.txt | 11 +++++++++++ .../metadata/android/et/changelogs/3008.txt | 11 +++++++++++ .../metadata/android/it-IT/changelogs/3008.txt | 11 +++++++++++ .../metadata/android/iw-IL/changelogs/3008.txt | 11 +++++++++++ .../metadata/android/lv/changelogs/2002.txt | 4 ++++ .../metadata/android/lv/changelogs/2201.txt | 2 ++ .../metadata/android/lv/short_description.txt | 1 + fastlane/metadata/android/lv/title.txt | 1 + .../metadata/android/nl-NL/changelogs/3008.txt | 11 +++++++++++ 30 files changed, 147 insertions(+), 12 deletions(-) create mode 100644 fastlane/metadata/android/ar/changelogs/3008.txt create mode 100644 fastlane/metadata/android/ca/changelogs/3008.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/3008.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/3008.txt create mode 100644 fastlane/metadata/android/et/changelogs/3008.txt create mode 100644 fastlane/metadata/android/it-IT/changelogs/3008.txt create mode 100644 fastlane/metadata/android/iw-IL/changelogs/3008.txt create mode 100644 fastlane/metadata/android/lv/changelogs/2002.txt create mode 100644 fastlane/metadata/android/lv/changelogs/2201.txt create mode 100644 fastlane/metadata/android/lv/short_description.txt create mode 100644 fastlane/metadata/android/lv/title.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/3008.txt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e156709df..dec28d363 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,8 +13,8 @@ android { applicationId = "helium314.keyboard" minSdk = 21 targetSdk = 35 - versionCode = 3007 - versionName = "3.0-beta4" + versionCode = 3008 + versionName = "3.0" ndk { abiFilters.clear() abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index b3ec60fd4..35ded64ac 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -483,4 +483,5 @@ Формат на клавиша за времево клеймо Сото Дагбани + Мащабиране на размера на клавишите за емотикони с размера на шрифта diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index dbdba51f7..65c189f65 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -447,4 +447,5 @@ টাইমস্ট্যাম্পের ফরম্যাট সেসুতু ডাগবানি + ফন্টের আকারের সাথে ইমোজি বোতামের আকারের সমন্বয় diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 0f77c17d2..d99c42029 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -446,4 +446,5 @@ Format de la clau de marca de temps Dagbani Sesotho + Escala la mida de la tecla emoji amb la de la font diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index a5912e53a..3751f3b09 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -449,4 +449,5 @@ Rozložení můžete najít a sdílet v %s. Sesothština Dagbani + Škálovat velikost kláves emodži velikostí s velikostí písma diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 93229f1a2..4673fe8b8 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -449,4 +449,5 @@ Sesotho Rücktaste macht Autokorrektur rückgängig Automatische Leerzeichen nach Auswählen eines Vorschlags + Skaliere den Emoji-Knopf mit der Schriftgröße diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 3b7fdca5c..9eb091313 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -483,4 +483,5 @@ Ajatempli klahvi vorming dagbani sotho + Kohenda emoji klahvi suurust tavateksti klahvide suuruste järgi diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 1a56c3646..da13165d8 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -453,4 +453,5 @@ Nouveau dictionnaire: Format de la clé d\'horodatage Dagbani Sesotho + Ajuster la taille des touches emoji à la taille de la police diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index d78aab27d..3bddef35a 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -446,4 +446,15 @@ Tes certeza de querer limpar todos os códigos personalizados? Nome non válido Distancia de desprazamento cambio de idioma + Espazo + Espazo automatico despois do xesto escribindo palabra + Non autoespazo ao premer maiúscula + Maiúscula quita o espazo automatico pendente + Formato para a tecla de marca temporal + Espazo automatico despois de elexir suxestión + Espazo automatico antes do xesto escribindo palabra + Dagbani + Sesotho + Escalar tamaño da tecla emoji ao tamaño da letra + Retroceso reverte a autocorrección diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 97a914ecc..1595c4c9d 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -352,7 +352,7 @@ Testo copiato Mansi Mostra i colori estesi - Nella lista completa, i colori sono elencati come stringhe di sistema che non possono essere rinominate o tradotte (e potrebbero essere soggette a variazioni in versioni future). I valori iniziali sono casuali. + Nella lista completa, i colori sono elencati come stringhe di sistema che non possono essere rinominate o tradotte (e potrebbero essere soggette a variazioni in versioni future). Emoji Attesa per l\'inserimento gestuale Nessuna @@ -455,4 +455,5 @@ Formato per il tasto data/ora Dagbani Sesotho + Scala la dimensione dei tasti con la dimensione dei caratteri diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index e381895bb..f1e7427bd 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -453,4 +453,7 @@ ללא רווח אוטומטי בעת לחיצת Shift Shift מבטל את הרווח האוטומטי המיועד פורמט למקש חתימת הזמן + דאגבני + ססוטו + התאמת גודל מקש האמוג\'י לגודל הגופן diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 92516e306..6d20ab598 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -8,7 +8,7 @@ "Vibrēt, nospiežot taustiņu" "Skaņa, nospiežot taustiņu" "Parādās, nospiežot taustiņu" - "Preferences" + Iestatījumi "Ievadīt ar žestiem" "Teksta korekcija" "Papildu" @@ -21,9 +21,9 @@ "Izmantot kontaktpersonu vārdus kā ieteikumus un labojumus" "Personalizēti ieteikumi" "Dubultpiesk. = punkts" - "Divreiz pieskaroties atst. taustiņam, ievada punktu un atstarpi." + Divreiz piesitot atstarpes taustiņu, ievada punktu un atstarpi pēc tā "Automātiska lielo burtu lietošana" - "Katra teikuma pirmo vārdu rakstīt ar lielo burtu." + Automātiski sākt rakstīt teikumu ar lielo burtu "Personiskā vārdnīca" "Galvenā vārdnīca" "Rādīt labojumu ieteikumus" @@ -123,4 +123,14 @@ "Meklēt" "Pauze" "Gaidīt" - \ No newline at end of file + HeliBoard pareizrakstības pārbaudītājs + HeliBoard iestatījumi + HeliBoard pareizrakstības pārbaudītāja iestatījumi + Ieteikumi + Ievade + Papildus taustiņi + Starpliktuves vēsture + Labojumi + Atstarpe + Vibrēt \"Netraucēt\" režīmā + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ee917a98e..c2c7c7250 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -492,4 +492,5 @@ Formaat voor tijdstempeltoetd Dagbani Sesotho + Emoji-toetsgrootte schalen met lettergrootte diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 7867017b8..d6d22f4d3 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -116,7 +116,7 @@ Hinglês %s Nenhum idioma (Alfabeto) Alfabeto (QWERTY) - %s já está ativado nas configurações de \'Idiomas e Entrada\'. Esta etapa já está concluída. Vamos avançar para a próxima!\" + %s já está ativado nas configurações de \'Idiomas e Entrada\'. Esta etapa já está concluída. Vamos avançar para a próxima! Alfabeto (QWERTZ) Alfabeto (AZERTY) Alfabeto (Dvorak) @@ -126,12 +126,12 @@ Bem-vindo ao %s Mostrar a paleta de emojis ao tocar na tecla Alt física Configurando %s - Por favor, ative o \\%s\" em \'Idiomas e Entrada\' nas configurações. Isso permitirá que ele seja usado no seu dispositivo.\" + Por favor, ative o \\%s\" em \'Idiomas e Entrada\' nas configurações. Isso permitirá que ele seja usado no seu dispositivo. Concluído Mostrar o ícone do app na launcher Dicionário disponível Alternar para %s - Em seguida, selecione \\%s\" como o seu método de entrada ativo.\" + Em seguida, selecione \\%s\" como o seu método de entrada ativo. Agora, você pode usar o %s para digitar nos seus apps favoritos. Adicionar ao dicionário Versão %1$s @@ -455,4 +455,5 @@ Formato da tecla de horário Dagani Sesoto + Redimensionar tamanho da tecla de emoji com o tamanho da fonte diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 14e7f8178..2d923cb84 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -301,7 +301,7 @@ Erro: O ficheiro selecionado não é um ficheiro de dicionário válido Peso: Fundo da barra de espaço - ► Pressionar em teclas da barra de ferramentas resulta em funcionalidade adicional: <br>\n\t• área de transferência &#65515; colar <br>\n\t• mover para esquerda/direita &#65515; palavra para esquerda/direita <br>\n\t• mover para cima/baixo &#65515; página para cima/baixo <br>\n\t• palavra para esquerda/direita &#65515; linha começo/fim <br>\n\t• página para cima/baixo &#65515; página começo/fim <br>\n\t• copiar &#65515; recortar <br>\n\t• selecionar palavra &#8596; selecionar tudo <br>\n\t• desfazer &#8596; refazer <br> <br>\n► Pressionar nas teclas da barra de sugestões fixam as mesmas. <br> <br>\n► Pressionar na tecla da vírgula para acessar a visualização da área de transferência, modo de uma mão, configurações, ou mudar de idioma: <br>\n\t• A Visualização de Emojis e Mudança de Idioma desaparecerão se você tiver a tecla correspondente ativada; <br>\n\t• Para alguns layouts, não é a tecla de vírgula, mas a tecla que seria no mesmo lugar. (ex: \\\'q\'\\ para o layout Dvorak). <br> <br>\n► Quando o modo privado está ativado, nenhuma palavra será aprendida, e nenhum emoji será adicionado aos recentes. <br> <br>\n► Pressione no botão do modo privado para acessar a barra de ferramentas. <br> <br>\n► Digitação por gestos: Deslize do shift até outra tecla para escrevê-la em maiúsculo: <br>\n\t• Isto também funciona para as teclas \\\'?123\\\' para escrever um único símbolo do teclado de símbolos, e para teclas relacionadas. <br> <br>\n► Pressione a tecla shift ou de símbolos, pressione uma ou mais teclas, e então solte a tecla do shift ou de símbolos para retornar ao teclado anterior. <br> <br>\n► Pressione em una sugestão na barra de sugestões para mostrar mais sugestões, e um botão para excluir esta sugestão. <br> <br>\n► Deslize para cima a partir de uma sugestão para abrir mais sugestões, e solte na sugestão que selecionar para usá-la. <br> <br>\n► Pressione em um item no histórico da área de transferência para fixá-lo (mantê-lo na área de transferência até que você o desafixe). <br> <br>\n► Deslize para a esquerda na visualização da área de transferência para remover um item (exceto quando estiver fixado) <br> <br>\n► Selecione texto e pressione shift para alternar entre maiúsculo , minúsculo, e escrever palavras com letra maiúscula. <br> <br>\n► Pode adicionar dicionários abrindo-os em um explorador de ficheiros: <br>\n\t• Isto somente funciona com <i>content-uris></i> e não com <i>file-uris</i>, significando que pode não funcionar com certos exploradores de ficheiros.\n► Para utilizadores a fazer backups manuais com acesso root: <br>\n\t• Começando com o Android 7, o arquivo de preferências compartilhado não está na localização padrão, por que a app está usando %s. Isto é necessário para que as configurações possam ser lidas antes que o dispositivo seja desbloqueado, como por exemplo no boot; <br>>\n\t• O ficheiros está localizado em /data/user_de/0/package_id/shared_prefs/ porém isto pode depender do dispositivo e versão do Android. <br> <br>\n<i><b>Modo de depuração / APK de depuração</b></i> <br> <br>\n► Pressionar em uma sugestão mostrará o dicionário de origem. <br> <br>\n► Ao usar o APK de depuração, pode encontrar configurações de depuração dentro das opções avançadas, porém a utilidade é limitada exceto à exportar dicionários nos registros. <br>\n\t• Para o APK de lançamento, precisará tocar na versão em <i>Sobre</i> várias vezes, e assim você poderá encontrar as opções de depuração em <i>Preferências Avançadas</i>. <br>\n\t• Ao ativar <i>Mostrar informações de sugestão</i>, sugestões terão pequenos números em cima mostrando sua pontuação interna e dicionário de origem. <br> <br>\n► No evento de um crash da aplicaçãp, será perguntado caso queira os registros do crash quando abrir as Configurações. <br> <br>\n► Ao usar digitação multi-linguagem, a barra de espaço mostrará um número de confiança para determinar a linguagem atualmente usada. <br> <br>\n► Sugestões terão pequenos números em cima mostrando sua pontuação interna e dicionário de origem (pode ser desativado). + ► Pressionar teclas da barra de ferramentas resulta em funcionalidade adicional: <br>\n\t• área de transferência &#65515; colar <br>\n\t• mover para esquerda/direita &#65515; palavra para esquerda/direita <br>\n\t• mover para cima/baixo &#65515; página para cima/baixo <br>\n\t• palavra para esquerda/direita &#65515; linha início/fim <br>\n\t• página para cima/baixo &#65515; página início/fim <br>\n\t• copiar &#65515; cortar <br>\n\t• selecionar palavra &#8596; selecionar tudo <br>\n\t• desfazer &#8596; refazer <br> <br>\n► Pressionar as teclas da barra de sugestões fixam as mesmas. <br> <br>\n► Pressionar a tecla da vírgula para aceder à visualização da área de transferência, modo de uma mão, configurações, ou mudar de idioma: <br>\n\t• A Visualização de Emojis e Mudança de Idioma desaparecerão se tiver a tecla correspondente ativada; <br>\n\t• Para alguns layouts, não é a tecla de vírgula, mas a tecla que seria no mesmo sítio. (ex: \\\'q\'\\ para o layout Dvorak). <br> <br>\n► Quando o modo privado está ativado, nenhuma palavra será aprendida, e nenhum emoji será adicionado aos recentes. <br> <br>\n► Pressione o botão do modo privado para aceder à barra de ferramentas. <br> <br>\n► Digitação por gestos: Deslize do shift até outra tecla para escrevê-la em maiúscula: <br>\n\t• Isto também funciona para as teclas \\\'?123\\\' para escrever um único símbolo do teclado de símbolos, e para teclas relacionadas. <br> <br>\n► Pressione a tecla shift ou de símbolos, pressione uma ou mais teclas, e então solte a tecla shift ou de símbolos para voltar ao teclado anterior. <br> <br>\n► Pressione uma sugestão na barra de sugestões para mostrar mais sugestões, e um botão para apagar essa sugestão. <br> <br>\n► Deslize para cima a partir de uma sugestão para abrir mais sugestões, e solte na sugestão que selecionar para usá-la. <br> <br>\n► Pressione um item no histórico da área de transferência para fixá-lo (mantê-lo na área de transferência até que o desafixe). <br> <br>\n► Deslize para a esquerda na visualização da área de transferência para remover um item (exceto quando estiver fixado) <br> <br>\n► Selecione texto e pressione shift para alternar entre maiúscula, minúscula, e escrever palavras com letra maiúscula. <br> <br>\n► Pode adicionar dicionários abrindo-os em um explorador de ficheiros: <br>\n\t• Isto apenas funciona com <i>content-uris></i> e não com <i>file-uris</i>, significando que pode não funcionar com certos exploradores de ficheiros.\n► Para utilizadores a fazer backups manuais com acesso root: <br>\n\t• Começando com o Android 7, o ficheiro de preferências compartilhado não está na localização padrão, por que a app está a usar %s. Isso é necessário para que as configurações possam ser lidas antes que o dispositivo seja desbloqueado, como por exemplo no boot; <br>>\n\t• O ficheiros está localizado em /data/user_de/0/package_id/shared_prefs/ porém isso pode depender do dispositivo e versão do Android. <br> <br>\n<i><b>Modo de depuração / APK de depuração</b></i> <br> <br>\n► Pressionar uma sugestão mostrará o dicionário de origem. <br> <br>\n► Ao usar o APK de depuração, pode encontrar configurações de depuração dentro das opções avançadas, porém a utilidade é limitada exceto a exportar dicionários nos registros. <br>\n\t• Para o APK de lançamento, precisará tocar na versão em <i>Sobre</i> várias vezes, e assim poderá encontrar as opções de depuração em <i>Preferências Avançadas</i>. <br>\n\t• Ao ativar <i>Mostrar informações de sugestão</i>, sugestões terão pequenos números em cima a mostrar a sua pontuação interna e dicionário de origem. <br> <br>\n► Num eventual crash da aplicação, será perguntado caso queira os registros do crash quando abrir as Configurações. <br> <br>\n► Ao usar digitação multi-linguagem, a barra de espaço mostrará um número de confiança para determinar a linguagem atualmente usada. <br> <br>\n► Sugestões terão pequenos números em cima a mostrar a sua pontuação interna e dicionário de origem (pode ser desativado). Código de tecla Dicionários Palavra para a esquerda @@ -430,11 +430,13 @@ Escala do espaço lateral Escala do espaço lateral (paisagem) Reciclagem - Idiomas e Esquemas + Idiomas e Layouts Localizar linha de números Preferir localizados em vez de números latinos Guardar em ficheiro aqui Pode encontrar e partilhar cores em %s. Pode encontrar e partilhar layouts em %s. + Configurar o teclado + Escalar tamanho da tecla emoji com o do tipo de letra diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 8e3cc9507..31a03b0f2 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -161,4 +161,5 @@ "Pesquisar" "Pausa" "Esp." + Escalar tamanho da tecla emoji com o do tipo de letra diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 6886e3c3e..c4cb820f7 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -447,4 +447,5 @@ Формат ключа временной метки Дагбани Сесото + Масштабировать размер клавиш эмодзи вместе с размером шрифта diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 161780262..3d83bdd72 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -449,4 +449,5 @@ 时间戳键的格式 索托语 达巴尼语 + 根据字体大小缩放表情符号键大小 diff --git a/fastlane/metadata/android/ar/changelogs/3008.txt b/fastlane/metadata/android/ar/changelogs/3008.txt new file mode 100644 index 000000000..cb1eb5fde --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/3008.txt @@ -0,0 +1,11 @@ +* إضافة تخطيطات: Hija'i العربية، العبرية 1452-2، الهندية الصوتية، دارغوا (أوراخي)، بايشاخي، الكرديش +* تحديث بعض التخطيطات +* الدعم الجمع بين اللهجات +* مفتاح شريط أدوات لوحة المفاتيح +* إضافة منبثقات .com +* السماح لضبط الخط المخصص +* إضافة إعداد مقياس الخط +* تحسين تبديل اللغة التلقائي +* إعدادات الإصلاح +* أضف إعدادات لمزيد من ضبط حشوة لوحة المفاتيح، والمساحة التلقائية، والتصحيح التلقائي، و صف الأرقام +* المزيد من الميزات والإصلاحات diff --git a/fastlane/metadata/android/ca/changelogs/3008.txt b/fastlane/metadata/android/ca/changelogs/3008.txt new file mode 100644 index 000000000..4f0c8df16 --- /dev/null +++ b/fastlane/metadata/android/ca/changelogs/3008.txt @@ -0,0 +1,11 @@ +* Afeg. dissenys: àrab Hija'i, hebreu 1452-2, fonètica hindi, Dargwa (Urakhi), Baishakhi, kurd +* Actu. dissenys +* Suport per combinar accents +* Tecla dividida de la barra d'eines del teclat +* Afeg. finestres emergents .com +* Permet configurar lletra personalitzada +* Afeg. la configuració d'escala de lletra +* Millorar el canvi automàtic d'idioma +* Revisada configuració +* Afeg. paràmetres per ajustar més el farciment del teclat, l'espai automàtic, la correcció automàtica, la fila de nombres +* Més… diff --git a/fastlane/metadata/android/cs-CZ/changelogs/3008.txt b/fastlane/metadata/android/cs-CZ/changelogs/3008.txt new file mode 100644 index 000000000..7b5a3f128 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/3008.txt @@ -0,0 +1,11 @@ +* přidána rozvržení: arabština hidžá'í, hebrejština 1452-2, fonetické hindu, dargwa (urakhi), baishakhi, kurdština +* aktualizace některých rozvržení +* podpora kombinování přízvuků +* klávesa pro rozdělení klávesnice +* přidána nabídka .com +* možnost nastavení vlastního písma +* přidáno nastavení měřítka písma +* zlepšeno automatické přepínání jazyků +* přepracována nastavení +* přidána nastavení pro lepší nastavení odsazení, automatické mezery, automatické opravy, číselné řady +* další funkce a opravy diff --git a/fastlane/metadata/android/en-US/changelogs/3008.txt b/fastlane/metadata/android/en-US/changelogs/3008.txt new file mode 100644 index 000000000..ce0395033 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/3008.txt @@ -0,0 +1,11 @@ +* add layouts: Arabic Hija'i, Hebrew 1452-2, Hindi Phonetic, Dargwa (Urakhi), Baishakhi, Kurdish +* update some layouts +* support combining accents +* split keyboard toolbar key +* add .com popups +* allow setting custom font +* add font scale setting +* improve automatic language switching +* overhaul settings +* add settings for more tuning of keyboard padding, auto-space, auto-correction, number row +* more features and fixes diff --git a/fastlane/metadata/android/et/changelogs/3008.txt b/fastlane/metadata/android/et/changelogs/3008.txt new file mode 100644 index 000000000..f9be70240 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/3008.txt @@ -0,0 +1,11 @@ +* uued klahvipaigustused: araabia hija'i, heebrea 1452-2, hindi foneetiline, dargi (Urahhi), baišaki, kurdi +* mõnede klahvipaigustuste täiendused +* aktsentide kombineerimise tugi +* nupp klahvistiku poolitamiseks +* lisandusid .com hüpikaknad +* oma kirjatüübi valikuvõimalus +* kirjatüübi skaleerimise võimalus +* improve automatic language switching +* seadistuste kohendus +* lisaseadistused klahvide vaheruumi, tühikute lisamise, autokorrektsiooni ja ridade arvu jaoks +* pisitäiendused ja parandused diff --git a/fastlane/metadata/android/it-IT/changelogs/3008.txt b/fastlane/metadata/android/it-IT/changelogs/3008.txt new file mode 100644 index 000000000..16cb2ba25 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/3008.txt @@ -0,0 +1,11 @@ +* layout aggiunti: Arabo Hija'i, Ebraico 1452-2, Hindi fonetico, Dargwa (Urakhi), Baishakhi, Curdo +* alcuni layout aggiornati +* supporto agli accenti combinati +* pulsante 'Tastiera divisa' nella barra degli strumenti +* popup .com aggiunto +* font personalizzato per i tasti +* aggiustamento dimensione per i tasti +* modalità multilingua migliorata +* impostazioni ridisegnate +* aggiunte alcune opzioni per spaziatura automatica, correzione testo e riga dei numeri +* altre funzionalità, migliorie e bugfix diff --git a/fastlane/metadata/android/iw-IL/changelogs/3008.txt b/fastlane/metadata/android/iw-IL/changelogs/3008.txt new file mode 100644 index 000000000..674053177 --- /dev/null +++ b/fastlane/metadata/android/iw-IL/changelogs/3008.txt @@ -0,0 +1,11 @@ +* הוספת פריסות: ערבית (הג'אי), עברית 1452-2, הינדית פונטית, דארגווה (אוראקי), באישאקי,כורדית +* עדכון מספר פריסות +* תמיכה בשילוב סימנים דיאקריטיים +* מקש סרגל הכלים למקלדת מפוצלת +* הוספת סיומות .com לחלון צץ +* אפשרות לבחירת גופן מותאם +* הוספת הגדרת סדר-גודל הגופן +* שיפור המעבר האוטומטי בין שפות +* שיפור ההגדרות +* הוספת הגדרות לכיוונון נוסף של שולי המקלדת, רווח אוטומטי, תיקון אוטומטי, שורת המספרים +* תכולות ותיקונים נוספים diff --git a/fastlane/metadata/android/lv/changelogs/2002.txt b/fastlane/metadata/android/lv/changelogs/2002.txt new file mode 100644 index 000000000..e2d5bc579 --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/2002.txt @@ -0,0 +1,4 @@ +* pievienots emocijzīmju rīkjoslas taustiņš, autors @codokie (#845, #837) +* uzlabojumi, kas saistīti ar dublētiem burtiem (#225 un, iespējams, citi) +* izvairās novietot kursoru emocijzīmju iekšpusē (#859) +* nelieli labojumi nesen pievienotajām funkcijām diff --git a/fastlane/metadata/android/lv/changelogs/2201.txt b/fastlane/metadata/android/lv/changelogs/2201.txt new file mode 100644 index 000000000..cb2f7ae9d --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/2201.txt @@ -0,0 +1,2 @@ +* pievienoti žestu rakstīšanas vizuālie iestatījumi, autors @devycarol (#944) +* atjauninātas dažas ikonas, autors @BlackyHawky (#977) diff --git a/fastlane/metadata/android/lv/short_description.txt b/fastlane/metadata/android/lv/short_description.txt new file mode 100644 index 000000000..711d5026b --- /dev/null +++ b/fastlane/metadata/android/lv/short_description.txt @@ -0,0 +1 @@ +Pielāgojama atvērtā pirmkoda tastatūra diff --git a/fastlane/metadata/android/lv/title.txt b/fastlane/metadata/android/lv/title.txt new file mode 100644 index 000000000..e9841ace0 --- /dev/null +++ b/fastlane/metadata/android/lv/title.txt @@ -0,0 +1 @@ +HeliBoard diff --git a/fastlane/metadata/android/nl-NL/changelogs/3008.txt b/fastlane/metadata/android/nl-NL/changelogs/3008.txt new file mode 100644 index 000000000..6256f8aeb --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/3008.txt @@ -0,0 +1,11 @@ +* lay-outs toevoegen: Arabisch Hija'i, Hebreeuws 1452-2, Hindi Fonetisch, Dargwa (Urakhi), Baishakhi, Koerdisch +* Update enkele lay-outs +* Ondersteuning voor het combineren van accenten +* Gesplitste toetsenbordwerkbalktoets +* voeg .com pop-ups toe +* Toestaan instellen van aangepast lettertype +* Instelling voor lettertypeschaal toevoegen +* automatische taalomschakeling verbeteren +* Revisie instellingen +* Voeg instellingen toe voor meer afstemming van toetsenbordopvulling, automatische spatie, autocorrectie, cijferrij +* Meer functies en fixes From 95d4bfe97c000d8620adc6f9f4708f0e81c1ef20 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 14 May 2025 16:22:50 +0200 Subject: [PATCH 110/175] Update managing emoji categories (#1515) --- app/src/main/assets/emoji/ACTIVITIES.txt | 85 + .../main/assets/emoji/ANIMALS_AND_NATURE.txt | 159 ++ app/src/main/assets/emoji/EMOTICONS.txt | 25 + app/src/main/assets/emoji/FLAGS.txt | 270 ++ app/src/main/assets/emoji/FOOD_AND_DRINK.txt | 131 + app/src/main/assets/emoji/OBJECTS.txt | 264 ++ app/src/main/assets/emoji/PEOPLE_AND_BODY.txt | 386 +++ .../main/assets/emoji/SMILEYS_AND_EMOTION.txt | 169 ++ app/src/main/assets/emoji/SYMBOLS.txt | 250 ++ .../main/assets/emoji/TRAVEL_AND_PLACES.txt | 218 ++ app/src/main/assets/emoji/minApi.txt | 12 + .../keyboard/emoji/DynamicGridKeyboard.java | 11 +- .../keyboard/emoji/SupportedEmojis.kt | 26 + .../keyboard/internal/KeyboardBuilder.kt | 2 +- .../internal/keyboard_parser/EmojiParser.kt | 95 +- .../main/java/helium314/keyboard/latin/App.kt | 2 + .../keyboard/latin/common/Constants.java | 2 + .../keyboard/latin/settings/Defaults.kt | 1 - .../latin/settings/SettingsValues.java | 2 - .../preferences/BackupRestorePreference.kt | 2 + .../settings/screens/AdvancedScreen.kt | 7 +- app/src/main/res/values/emoji-categories.xml | 2440 ----------------- tools/make-emoji-keys/build.gradle | 6 +- .../tools/emoji/EmojiCategoriesResource.kt | 155 -- .../inputmethod/tools/emoji/MakeEmojiKeys.kt | 61 +- .../tools/emoji/model/EmojiSpec.kt | 2 + .../resources/values/emoji-categories.tmpl | 132 - 27 files changed, 2117 insertions(+), 2798 deletions(-) create mode 100644 app/src/main/assets/emoji/ACTIVITIES.txt create mode 100644 app/src/main/assets/emoji/ANIMALS_AND_NATURE.txt create mode 100644 app/src/main/assets/emoji/EMOTICONS.txt create mode 100644 app/src/main/assets/emoji/FLAGS.txt create mode 100644 app/src/main/assets/emoji/FOOD_AND_DRINK.txt create mode 100644 app/src/main/assets/emoji/OBJECTS.txt create mode 100644 app/src/main/assets/emoji/PEOPLE_AND_BODY.txt create mode 100644 app/src/main/assets/emoji/SMILEYS_AND_EMOTION.txt create mode 100644 app/src/main/assets/emoji/SYMBOLS.txt create mode 100644 app/src/main/assets/emoji/TRAVEL_AND_PLACES.txt create mode 100644 app/src/main/assets/emoji/minApi.txt create mode 100644 app/src/main/java/helium314/keyboard/keyboard/emoji/SupportedEmojis.kt delete mode 100644 app/src/main/res/values/emoji-categories.xml delete mode 100644 tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/EmojiCategoriesResource.kt delete mode 100644 tools/make-emoji-keys/src/main/resources/values/emoji-categories.tmpl diff --git a/app/src/main/assets/emoji/ACTIVITIES.txt b/app/src/main/assets/emoji/ACTIVITIES.txt new file mode 100644 index 000000000..416ac152e --- /dev/null +++ b/app/src/main/assets/emoji/ACTIVITIES.txt @@ -0,0 +1,85 @@ +🎃 +🎄 +🎆 +🎇 +🧨 +✨ +🎈 +🎉 +🎊 +🎋 +🎍 +🎎 +🎏 +🎐 +🎑 +🧧 +🎀 +🎁 +🎗️ +🎟️ +🎫 +🎖️ +🏆 +🏅 +🥇 +🥈 +🥉 +⚽ +⚾ +🥎 +🏀 +🏐 +🏈 +🏉 +🎾 +🥏 +🎳 +🏏 +🏑 +🏒 +🥍 +🏓 +🏸 +🥊 +🥋 +🥅 +⛳ +⛸️ +🎣 +🤿 +🎽 +🎿 +🛷 +🥌 +🎯 +🪀 +🪁 +🔫 +🎱 +🔮 +🪄 +🎮 +🕹️ +🎰 +🎲 +🧩 +🧸 +🪅 +🪩 +🪆 +♠️ +♥️ +♦️ +♣️ +♟️ +🃏 +🀄 +🎴 +🎭 +🖼️ +🎨 +🧵 +🪡 +🧶 +🪢 \ No newline at end of file diff --git a/app/src/main/assets/emoji/ANIMALS_AND_NATURE.txt b/app/src/main/assets/emoji/ANIMALS_AND_NATURE.txt new file mode 100644 index 000000000..04b714520 --- /dev/null +++ b/app/src/main/assets/emoji/ANIMALS_AND_NATURE.txt @@ -0,0 +1,159 @@ +🐵 +🐒 +🦍 +🦧 +🐶 +🐕 +🦮 +🐕‍🦺 +🐩 +🐺 +🦊 +🦝 +🐱 +🐈 +🐈‍⬛ +🦁 +🐯 +🐅 +🐆 +🐴 +🫎 +🫏 +🐎 +🦄 +🦓 +🦌 +🦬 +🐮 +🐂 +🐃 +🐄 +🐷 +🐖 +🐗 +🐽 +🐏 +🐑 +🐐 +🐪 +🐫 +🦙 +🦒 +🐘 +🦣 +🦏 +🦛 +🐭 +🐁 +🐀 +🐹 +🐰 +🐇 +🐿️ +🦫 +🦔 +🦇 +🐻 +🐻‍❄️ +🐨 +🐼 +🦥 +🦦 +🦨 +🦘 +🦡 +🐾 +🦃 +🐔 +🐓 +🐣 +🐤 +🐥 +🐦 +🐧 +🕊️ +🦅 +🦆 +🦢 +🦉 +🦤 +🪶 +🦩 +🦚 +🦜 +🪽 +🐦‍⬛ +🪿 +🐦‍🔥 +🐸 +🐊 +🐢 +🦎 +🐍 +🐲 +🐉 +🦕 +🦖 +🐳 +🐋 +🐬 +🦭 +🐟 +🐠 +🐡 +🦈 +🐙 +🐚 +🪸 +🪼 +🦀 +🦞 +🦐 +🦑 +🦪 +🐌 +🦋 +🐛 +🐜 +🐝 +🪲 +🐞 +🦗 +🪳 +🕷️ +🕸️ +🦂 +🦟 +🪰 +🪱 +🦠 +💐 +🌸 +💮 +🪷 +🏵️ +🌹 +🥀 +🌺 +🌻 +🌼 +🌷 +🪻 +🌱 +🪴 +🌲 +🌳 +🌴 +🌵 +🌾 +🌿 +☘️ +🍀 +🍁 +🍂 +🍃 +🪹 +🪺 +🍄 +🪾 \ No newline at end of file diff --git a/app/src/main/assets/emoji/EMOTICONS.txt b/app/src/main/assets/emoji/EMOTICONS.txt new file mode 100644 index 000000000..c2b3d9ddd --- /dev/null +++ b/app/src/main/assets/emoji/EMOTICONS.txt @@ -0,0 +1,25 @@ +:-) +;-) +:-( +:-! +:-$ +B-) +=-O +:-P +:O +:-* +:-D +:\'( +:-\\ +O:-) +:-[ +(╯° +□°) +╯︵ +┻━┻ +¯\\_ +(ツ) +_/¯ +┬─┬ +︵ /( +.□.\\ \ No newline at end of file diff --git a/app/src/main/assets/emoji/FLAGS.txt b/app/src/main/assets/emoji/FLAGS.txt new file mode 100644 index 000000000..c4bd83460 --- /dev/null +++ b/app/src/main/assets/emoji/FLAGS.txt @@ -0,0 +1,270 @@ +🏁 +🚩 +🎌 +🏴 +🏳️ +🏳️‍🌈 +🏳️‍⚧️ +🏴‍☠️ +🇦🇨 +🇦🇩 +🇦🇪 +🇦🇫 +🇦🇬 +🇦🇮 +🇦🇱 +🇦🇲 +🇦🇴 +🇦🇶 +🇦🇷 +🇦🇸 +🇦🇹 +🇦🇺 +🇦🇼 +🇦🇽 +🇦🇿 +🇧🇦 +🇧🇧 +🇧🇩 +🇧🇪 +🇧🇫 +🇧🇬 +🇧🇭 +🇧🇮 +🇧🇯 +🇧🇱 +🇧🇲 +🇧🇳 +🇧🇴 +🇧🇶 +🇧🇷 +🇧🇸 +🇧🇹 +🇧🇻 +🇧🇼 +🇧🇾 +🇧🇿 +🇨🇦 +🇨🇨 +🇨🇩 +🇨🇫 +🇨🇬 +🇨🇭 +🇨🇮 +🇨🇰 +🇨🇱 +🇨🇲 +🇨🇳 +🇨🇴 +🇨🇵 +🇨🇶 +🇨🇷 +🇨🇺 +🇨🇻 +🇨🇼 +🇨🇽 +🇨🇾 +🇨🇿 +🇩🇪 +🇩🇬 +🇩🇯 +🇩🇰 +🇩🇲 +🇩🇴 +🇩🇿 +🇪🇦 +🇪🇨 +🇪🇪 +🇪🇬 +🇪🇭 +🇪🇷 +🇪🇸 +🇪🇹 +🇪🇺 +🇫🇮 +🇫🇯 +🇫🇰 +🇫🇲 +🇫🇴 +🇫🇷 +🇬🇦 +🇬🇧 +🇬🇩 +🇬🇪 +🇬🇫 +🇬🇬 +🇬🇭 +🇬🇮 +🇬🇱 +🇬🇲 +🇬🇳 +🇬🇵 +🇬🇶 +🇬🇷 +🇬🇸 +🇬🇹 +🇬🇺 +🇬🇼 +🇬🇾 +🇭🇰 +🇭🇲 +🇭🇳 +🇭🇷 +🇭🇹 +🇭🇺 +🇮🇨 +🇮🇩 +🇮🇪 +🇮🇱 +🇮🇲 +🇮🇳 +🇮🇴 +🇮🇶 +🇮🇷 +🇮🇸 +🇮🇹 +🇯🇪 +🇯🇲 +🇯🇴 +🇯🇵 +🇰🇪 +🇰🇬 +🇰🇭 +🇰🇮 +🇰🇲 +🇰🇳 +🇰🇵 +🇰🇷 +🇰🇼 +🇰🇾 +🇰🇿 +🇱🇦 +🇱🇧 +🇱🇨 +🇱🇮 +🇱🇰 +🇱🇷 +🇱🇸 +🇱🇹 +🇱🇺 +🇱🇻 +🇱🇾 +🇲🇦 +🇲🇨 +🇲🇩 +🇲🇪 +🇲🇫 +🇲🇬 +🇲🇭 +🇲🇰 +🇲🇱 +🇲🇲 +🇲🇳 +🇲🇴 +🇲🇵 +🇲🇶 +🇲🇷 +🇲🇸 +🇲🇹 +🇲🇺 +🇲🇻 +🇲🇼 +🇲🇽 +🇲🇾 +🇲🇿 +🇳🇦 +🇳🇨 +🇳🇪 +🇳🇫 +🇳🇬 +🇳🇮 +🇳🇱 +🇳🇴 +🇳🇵 +🇳🇷 +🇳🇺 +🇳🇿 +🇴🇲 +🇵🇦 +🇵🇪 +🇵🇫 +🇵🇬 +🇵🇭 +🇵🇰 +🇵🇱 +🇵🇲 +🇵🇳 +🇵🇷 +🇵🇸 +🇵🇹 +🇵🇼 +🇵🇾 +🇶🇦 +🇷🇪 +🇷🇴 +🇷🇸 +🇷🇺 +🇷🇼 +🇸🇦 +🇸🇧 +🇸🇨 +🇸🇩 +🇸🇪 +🇸🇬 +🇸🇭 +🇸🇮 +🇸🇯 +🇸🇰 +🇸🇱 +🇸🇲 +🇸🇳 +🇸🇴 +🇸🇷 +🇸🇸 +🇸🇹 +🇸🇻 +🇸🇽 +🇸🇾 +🇸🇿 +🇹🇦 +🇹🇨 +🇹🇩 +🇹🇫 +🇹🇬 +🇹🇭 +🇹🇯 +🇹🇰 +🇹🇱 +🇹🇲 +🇹🇳 +🇹🇴 +🇹🇷 +🇹🇹 +🇹🇻 +🇹🇼 +🇹🇿 +🇺🇦 +🇺🇬 +🇺🇲 +🇺🇳 +🇺🇸 +🇺🇾 +🇺🇿 +🇻🇦 +🇻🇨 +🇻🇪 +🇻🇬 +🇻🇮 +🇻🇳 +🇻🇺 +🇼🇫 +🇼🇸 +🇽🇰 +🇾🇪 +🇾🇹 +🇿🇦 +🇿🇲 +🇿🇼 +🏴󠁧󠁢󠁥󠁮󠁧󠁿 +🏴󠁧󠁢󠁳󠁣󠁴󠁿 +🏴󠁧󠁢󠁷󠁬󠁳󠁿 \ No newline at end of file diff --git a/app/src/main/assets/emoji/FOOD_AND_DRINK.txt b/app/src/main/assets/emoji/FOOD_AND_DRINK.txt new file mode 100644 index 000000000..cb9b5dd54 --- /dev/null +++ b/app/src/main/assets/emoji/FOOD_AND_DRINK.txt @@ -0,0 +1,131 @@ +🍇 +🍈 +🍉 +🍊 +🍋 +🍋‍🟩 +🍌 +🍍 +🥭 +🍎 +🍏 +🍐 +🍑 +🍒 +🍓 +🫐 +🥝 +🍅 +🫒 +🥥 +🥑 +🍆 +🥔 +🥕 +🌽 +🌶️ +🫑 +🥒 +🥬 +🥦 +🧄 +🧅 +🥜 +🫘 +🌰 +🫚 +🫛 +🍄‍🟫 +🫜 +🍞 +🥐 +🥖 +🫓 +🥨 +🥯 +🥞 +🧇 +🧀 +🍖 +🍗 +🥩 +🥓 +🍔 +🍟 +🍕 +🌭 +🥪 +🌮 +🌯 +🫔 +🥙 +🧆 +🥚 +🍳 +🥘 +🍲 +🫕 +🥣 +🥗 +🍿 +🧈 +🧂 +🥫 +🍱 +🍘 +🍙 +🍚 +🍛 +🍜 +🍝 +🍠 +🍢 +🍣 +🍤 +🍥 +🥮 +🍡 +🥟 +🥠 +🥡 +🍦 +🍧 +🍨 +🍩 +🍪 +🎂 +🍰 +🧁 +🥧 +🍫 +🍬 +🍭 +🍮 +🍯 +🍼 +🥛 +☕ +🫖 +🍵 +🍶 +🍾 +🍷 +🍸 +🍹 +🍺 +🍻 +🥂 +🥃 +🫗 +🥤 +🧋 +🧃 +🧉 +🧊 +🥢 +🍽️ +🍴 +🥄 +🔪 +🫙 +🏺 \ No newline at end of file diff --git a/app/src/main/assets/emoji/OBJECTS.txt b/app/src/main/assets/emoji/OBJECTS.txt new file mode 100644 index 000000000..38b94b0b7 --- /dev/null +++ b/app/src/main/assets/emoji/OBJECTS.txt @@ -0,0 +1,264 @@ +👓 +🕶️ +🥽 +🥼 +🦺 +👔 +👕 +👖 +🧣 +🧤 +🧥 +🧦 +👗 +👘 +🥻 +🩱 +🩲 +🩳 +👙 +👚 +🪭 +👛 +👜 +👝 +🛍️ +🎒 +🩴 +👞 +👟 +🥾 +🥿 +👠 +👡 +🩰 +👢 +🪮 +👑 +👒 +🎩 +🎓 +🧢 +🪖 +⛑️ +📿 +💄 +💍 +💎 +🔇 +🔈 +🔉 +🔊 +📢 +📣 +📯 +🔔 +🔕 +🎼 +🎵 +🎶 +🎙️ +🎚️ +🎛️ +🎤 +🎧 +📻 +🎷 +🪗 +🎸 +🎹 +🎺 +🎻 +🪕 +🥁 +🪘 +🪇 +🪈 +🪉 +📱 +📲 +☎️ +📞 +📟 +📠 +🔋 +🪫 +🔌 +💻 +🖥️ +🖨️ +⌨️ +🖱️ +🖲️ +💽 +💾 +💿 +📀 +🧮 +🎥 +🎞️ +📽️ +🎬 +📺 +📷 +📸 +📹 +📼 +🔍 +🔎 +🕯️ +💡 +🔦 +🏮 +🪔 +📔 +📕 +📖 +📗 +📘 +📙 +📚 +📓 +📒 +📃 +📜 +📄 +📰 +🗞️ +📑 +🔖 +🏷️ +💰 +🪙 +💴 +💵 +💶 +💷 +💸 +💳 +🧾 +💹 +✉️ +📧 +📨 +📩 +📤 +📥 +📦 +📫 +📪 +📬 +📭 +📮 +🗳️ +✏️ +✒️ +🖋️ +🖊️ +🖌️ +🖍️ +📝 +💼 +📁 +📂 +🗂️ +📅 +📆 +🗒️ +🗓️ +📇 +📈 +📉 +📊 +📋 +📌 +📍 +📎 +🖇️ +📏 +📐 +✂️ +🗃️ +🗄️ +🗑️ +🔒 +🔓 +🔏 +🔐 +🔑 +🗝️ +🔨 +🪓 +⛏️ +⚒️ +🛠️ +🗡️ +⚔️ +💣 +🪃 +🏹 +🛡️ +🪚 +🔧 +🪛 +🔩 +⚙️ +🗜️ +⚖️ +🦯 +🔗 +⛓️‍💥 +⛓️ +🪝 +🧰 +🧲 +🪜 +🪏 +⚗️ +🧪 +🧫 +🧬 +🔬 +🔭 +📡 +💉 +🩸 +💊 +🩹 +🩼 +🩺 +🩻 +🚪 +🛗 +🪞 +🪟 +🛏️ +🛋️ +🪑 +🚽 +🪠 +🚿 +🛁 +🪤 +🪒 +🧴 +🧷 +🧹 +🧺 +🧻 +🪣 +🧼 +🫧 +🪥 +🧽 +🧯 +🛒 +🚬 +⚰️ +🪦 +⚱️ +🧿 +🪬 +🗿 +🪧 +🪪 \ No newline at end of file diff --git a/app/src/main/assets/emoji/PEOPLE_AND_BODY.txt b/app/src/main/assets/emoji/PEOPLE_AND_BODY.txt new file mode 100644 index 000000000..734c23a8d --- /dev/null +++ b/app/src/main/assets/emoji/PEOPLE_AND_BODY.txt @@ -0,0 +1,386 @@ +👋 👋🏻 👋🏼 👋🏽 👋🏾 👋🏿 +🤚 🤚🏻 🤚🏼 🤚🏽 🤚🏾 🤚🏿 +🖐️ 🖐🏻 🖐🏼 🖐🏽 🖐🏾 🖐🏿 +✋ ✋🏻 ✋🏼 ✋🏽 ✋🏾 ✋🏿 +🖖 🖖🏻 🖖🏼 🖖🏽 🖖🏾 🖖🏿 +🫱 🫱🏻 🫱🏼 🫱🏽 🫱🏾 🫱🏿 +🫲 🫲🏻 🫲🏼 🫲🏽 🫲🏾 🫲🏿 +🫳 🫳🏻 🫳🏼 🫳🏽 🫳🏾 🫳🏿 +🫴 🫴🏻 🫴🏼 🫴🏽 🫴🏾 🫴🏿 +🫷 🫷🏻 🫷🏼 🫷🏽 🫷🏾 🫷🏿 +🫸 🫸🏻 🫸🏼 🫸🏽 🫸🏾 🫸🏿 +👌 👌🏻 👌🏼 👌🏽 👌🏾 👌🏿 +🤌 🤌🏻 🤌🏼 🤌🏽 🤌🏾 🤌🏿 +🤏 🤏🏻 🤏🏼 🤏🏽 🤏🏾 🤏🏿 +✌️ ✌🏻 ✌🏼 ✌🏽 ✌🏾 ✌🏿 +🤞 🤞🏻 🤞🏼 🤞🏽 🤞🏾 🤞🏿 +🫰 🫰🏻 🫰🏼 🫰🏽 🫰🏾 🫰🏿 +🤟 🤟🏻 🤟🏼 🤟🏽 🤟🏾 🤟🏿 +🤘 🤘🏻 🤘🏼 🤘🏽 🤘🏾 🤘🏿 +🤙 🤙🏻 🤙🏼 🤙🏽 🤙🏾 🤙🏿 +👈 👈🏻 👈🏼 👈🏽 👈🏾 👈🏿 +👉 👉🏻 👉🏼 👉🏽 👉🏾 👉🏿 +👆 👆🏻 👆🏼 👆🏽 👆🏾 👆🏿 +🖕 🖕🏻 🖕🏼 🖕🏽 🖕🏾 🖕🏿 +👇 👇🏻 👇🏼 👇🏽 👇🏾 👇🏿 +☝️ ☝🏻 ☝🏼 ☝🏽 ☝🏾 ☝🏿 +🫵 🫵🏻 🫵🏼 🫵🏽 🫵🏾 🫵🏿 +👍 👍🏻 👍🏼 👍🏽 👍🏾 👍🏿 +👎 👎🏻 👎🏼 👎🏽 👎🏾 👎🏿 +✊ ✊🏻 ✊🏼 ✊🏽 ✊🏾 ✊🏿 +👊 👊🏻 👊🏼 👊🏽 👊🏾 👊🏿 +🤛 🤛🏻 🤛🏼 🤛🏽 🤛🏾 🤛🏿 +🤜 🤜🏻 🤜🏼 🤜🏽 🤜🏾 🤜🏿 +👏 👏🏻 👏🏼 👏🏽 👏🏾 👏🏿 +🙌 🙌🏻 🙌🏼 🙌🏽 🙌🏾 🙌🏿 +🫶 🫶🏻 🫶🏼 🫶🏽 🫶🏾 🫶🏿 +👐 👐🏻 👐🏼 👐🏽 👐🏾 👐🏿 +🤲 🤲🏻 🤲🏼 🤲🏽 🤲🏾 🤲🏿 +🤝 🤝🏻 🤝🏼 🤝🏽 🤝🏾 🤝🏿 +🙏 🙏🏻 🙏🏼 🙏🏽 🙏🏾 🙏🏿 +✍️ ✍🏻 ✍🏼 ✍🏽 ✍🏾 ✍🏿 +💅 💅🏻 💅🏼 💅🏽 💅🏾 💅🏿 +🤳 🤳🏻 🤳🏼 🤳🏽 🤳🏾 🤳🏿 +💪 💪🏻 💪🏼 💪🏽 💪🏾 💪🏿 +🦾 +🦿 +🦵 🦵🏻 🦵🏼 🦵🏽 🦵🏾 🦵🏿 +🦶 🦶🏻 🦶🏼 🦶🏽 🦶🏾 🦶🏿 +👂 👂🏻 👂🏼 👂🏽 👂🏾 👂🏿 +🦻 🦻🏻 🦻🏼 🦻🏽 🦻🏾 🦻🏿 +👃 👃🏻 👃🏼 👃🏽 👃🏾 👃🏿 +🧠 +🫀 +🫁 +🦷 +🦴 +👀 +👁️ +👅 +👄 +🫦 +👶 👶🏻 👶🏼 👶🏽 👶🏾 👶🏿 +🧒 🧒🏻 🧒🏼 🧒🏽 🧒🏾 🧒🏿 +👦 👦🏻 👦🏼 👦🏽 👦🏾 👦🏿 +👧 👧🏻 👧🏼 👧🏽 👧🏾 👧🏿 +🧑 🧑🏻 🧑🏼 🧑🏽 🧑🏾 🧑🏿 +👱 👱🏻 👱🏼 👱🏽 👱🏾 👱🏿 +👨 👨🏻 👨🏼 👨🏽 👨🏾 👨🏿 +🧔 🧔🏻 🧔🏼 🧔🏽 🧔🏾 🧔🏿 +🧔‍♂️ 🧔🏻‍♂️ 🧔🏼‍♂️ 🧔🏽‍♂️ 🧔🏾‍♂️ 🧔🏿‍♂️ +🧔‍♀️ 🧔🏻‍♀️ 🧔🏼‍♀️ 🧔🏽‍♀️ 🧔🏾‍♀️ 🧔🏿‍♀️ +👨‍🦰 👨🏻‍🦰 👨🏼‍🦰 👨🏽‍🦰 👨🏾‍🦰 👨🏿‍🦰 +👨‍🦱 👨🏻‍🦱 👨🏼‍🦱 👨🏽‍🦱 👨🏾‍🦱 👨🏿‍🦱 +👨‍🦳 👨🏻‍🦳 👨🏼‍🦳 👨🏽‍🦳 👨🏾‍🦳 👨🏿‍🦳 +👨‍🦲 👨🏻‍🦲 👨🏼‍🦲 👨🏽‍🦲 👨🏾‍🦲 👨🏿‍🦲 +👩 👩🏻 👩🏼 👩🏽 👩🏾 👩🏿 +👩‍🦰 👩🏻‍🦰 👩🏼‍🦰 👩🏽‍🦰 👩🏾‍🦰 👩🏿‍🦰 +🧑‍🦰 🧑🏻‍🦰 🧑🏼‍🦰 🧑🏽‍🦰 🧑🏾‍🦰 🧑🏿‍🦰 +👩‍🦱 👩🏻‍🦱 👩🏼‍🦱 👩🏽‍🦱 👩🏾‍🦱 👩🏿‍🦱 +🧑‍🦱 🧑🏻‍🦱 🧑🏼‍🦱 🧑🏽‍🦱 🧑🏾‍🦱 🧑🏿‍🦱 +👩‍🦳 👩🏻‍🦳 👩🏼‍🦳 👩🏽‍🦳 👩🏾‍🦳 👩🏿‍🦳 +🧑‍🦳 🧑🏻‍🦳 🧑🏼‍🦳 🧑🏽‍🦳 🧑🏾‍🦳 🧑🏿‍🦳 +👩‍🦲 👩🏻‍🦲 👩🏼‍🦲 👩🏽‍🦲 👩🏾‍🦲 👩🏿‍🦲 +🧑‍🦲 🧑🏻‍🦲 🧑🏼‍🦲 🧑🏽‍🦲 🧑🏾‍🦲 🧑🏿‍🦲 +👱‍♀️ 👱🏻‍♀️ 👱🏼‍♀️ 👱🏽‍♀️ 👱🏾‍♀️ 👱🏿‍♀️ +👱‍♂️ 👱🏻‍♂️ 👱🏼‍♂️ 👱🏽‍♂️ 👱🏾‍♂️ 👱🏿‍♂️ +🧓 🧓🏻 🧓🏼 🧓🏽 🧓🏾 🧓🏿 +👴 👴🏻 👴🏼 👴🏽 👴🏾 👴🏿 +👵 👵🏻 👵🏼 👵🏽 👵🏾 👵🏿 +🙍 🙍🏻 🙍🏼 🙍🏽 🙍🏾 🙍🏿 +🙍‍♂️ 🙍🏻‍♂️ 🙍🏼‍♂️ 🙍🏽‍♂️ 🙍🏾‍♂️ 🙍🏿‍♂️ +🙍‍♀️ 🙍🏻‍♀️ 🙍🏼‍♀️ 🙍🏽‍♀️ 🙍🏾‍♀️ 🙍🏿‍♀️ +🙎 🙎🏻 🙎🏼 🙎🏽 🙎🏾 🙎🏿 +🙎‍♂️ 🙎🏻‍♂️ 🙎🏼‍♂️ 🙎🏽‍♂️ 🙎🏾‍♂️ 🙎🏿‍♂️ +🙎‍♀️ 🙎🏻‍♀️ 🙎🏼‍♀️ 🙎🏽‍♀️ 🙎🏾‍♀️ 🙎🏿‍♀️ +🙅 🙅🏻 🙅🏼 🙅🏽 🙅🏾 🙅🏿 +🙅‍♂️ 🙅🏻‍♂️ 🙅🏼‍♂️ 🙅🏽‍♂️ 🙅🏾‍♂️ 🙅🏿‍♂️ +🙅‍♀️ 🙅🏻‍♀️ 🙅🏼‍♀️ 🙅🏽‍♀️ 🙅🏾‍♀️ 🙅🏿‍♀️ +🙆 🙆🏻 🙆🏼 🙆🏽 🙆🏾 🙆🏿 +🙆‍♂️ 🙆🏻‍♂️ 🙆🏼‍♂️ 🙆🏽‍♂️ 🙆🏾‍♂️ 🙆🏿‍♂️ +🙆‍♀️ 🙆🏻‍♀️ 🙆🏼‍♀️ 🙆🏽‍♀️ 🙆🏾‍♀️ 🙆🏿‍♀️ +💁 💁🏻 💁🏼 💁🏽 💁🏾 💁🏿 +💁‍♂️ 💁🏻‍♂️ 💁🏼‍♂️ 💁🏽‍♂️ 💁🏾‍♂️ 💁🏿‍♂️ +💁‍♀️ 💁🏻‍♀️ 💁🏼‍♀️ 💁🏽‍♀️ 💁🏾‍♀️ 💁🏿‍♀️ +🙋 🙋🏻 🙋🏼 🙋🏽 🙋🏾 🙋🏿 +🙋‍♂️ 🙋🏻‍♂️ 🙋🏼‍♂️ 🙋🏽‍♂️ 🙋🏾‍♂️ 🙋🏿‍♂️ +🙋‍♀️ 🙋🏻‍♀️ 🙋🏼‍♀️ 🙋🏽‍♀️ 🙋🏾‍♀️ 🙋🏿‍♀️ +🧏 🧏🏻 🧏🏼 🧏🏽 🧏🏾 🧏🏿 +🧏‍♂️ 🧏🏻‍♂️ 🧏🏼‍♂️ 🧏🏽‍♂️ 🧏🏾‍♂️ 🧏🏿‍♂️ +🧏‍♀️ 🧏🏻‍♀️ 🧏🏼‍♀️ 🧏🏽‍♀️ 🧏🏾‍♀️ 🧏🏿‍♀️ +🙇 🙇🏻 🙇🏼 🙇🏽 🙇🏾 🙇🏿 +🙇‍♂️ 🙇🏻‍♂️ 🙇🏼‍♂️ 🙇🏽‍♂️ 🙇🏾‍♂️ 🙇🏿‍♂️ +🙇‍♀️ 🙇🏻‍♀️ 🙇🏼‍♀️ 🙇🏽‍♀️ 🙇🏾‍♀️ 🙇🏿‍♀️ +🤦 🤦🏻 🤦🏼 🤦🏽 🤦🏾 🤦🏿 +🤦‍♂️ 🤦🏻‍♂️ 🤦🏼‍♂️ 🤦🏽‍♂️ 🤦🏾‍♂️ 🤦🏿‍♂️ +🤦‍♀️ 🤦🏻‍♀️ 🤦🏼‍♀️ 🤦🏽‍♀️ 🤦🏾‍♀️ 🤦🏿‍♀️ +🤷 🤷🏻 🤷🏼 🤷🏽 🤷🏾 🤷🏿 +🤷‍♂️ 🤷🏻‍♂️ 🤷🏼‍♂️ 🤷🏽‍♂️ 🤷🏾‍♂️ 🤷🏿‍♂️ +🤷‍♀️ 🤷🏻‍♀️ 🤷🏼‍♀️ 🤷🏽‍♀️ 🤷🏾‍♀️ 🤷🏿‍♀️ +🧑‍⚕️ 🧑🏻‍⚕️ 🧑🏼‍⚕️ 🧑🏽‍⚕️ 🧑🏾‍⚕️ 🧑🏿‍⚕️ +👨‍⚕️ 👨🏻‍⚕️ 👨🏼‍⚕️ 👨🏽‍⚕️ 👨🏾‍⚕️ 👨🏿‍⚕️ +👩‍⚕️ 👩🏻‍⚕️ 👩🏼‍⚕️ 👩🏽‍⚕️ 👩🏾‍⚕️ 👩🏿‍⚕️ +🧑‍🎓 🧑🏻‍🎓 🧑🏼‍🎓 🧑🏽‍🎓 🧑🏾‍🎓 🧑🏿‍🎓 +👨‍🎓 👨🏻‍🎓 👨🏼‍🎓 👨🏽‍🎓 👨🏾‍🎓 👨🏿‍🎓 +👩‍🎓 👩🏻‍🎓 👩🏼‍🎓 👩🏽‍🎓 👩🏾‍🎓 👩🏿‍🎓 +🧑‍🏫 🧑🏻‍🏫 🧑🏼‍🏫 🧑🏽‍🏫 🧑🏾‍🏫 🧑🏿‍🏫 +👨‍🏫 👨🏻‍🏫 👨🏼‍🏫 👨🏽‍🏫 👨🏾‍🏫 👨🏿‍🏫 +👩‍🏫 👩🏻‍🏫 👩🏼‍🏫 👩🏽‍🏫 👩🏾‍🏫 👩🏿‍🏫 +🧑‍⚖️ 🧑🏻‍⚖️ 🧑🏼‍⚖️ 🧑🏽‍⚖️ 🧑🏾‍⚖️ 🧑🏿‍⚖️ +👨‍⚖️ 👨🏻‍⚖️ 👨🏼‍⚖️ 👨🏽‍⚖️ 👨🏾‍⚖️ 👨🏿‍⚖️ +👩‍⚖️ 👩🏻‍⚖️ 👩🏼‍⚖️ 👩🏽‍⚖️ 👩🏾‍⚖️ 👩🏿‍⚖️ +🧑‍🌾 🧑🏻‍🌾 🧑🏼‍🌾 🧑🏽‍🌾 🧑🏾‍🌾 🧑🏿‍🌾 +👨‍🌾 👨🏻‍🌾 👨🏼‍🌾 👨🏽‍🌾 👨🏾‍🌾 👨🏿‍🌾 +👩‍🌾 👩🏻‍🌾 👩🏼‍🌾 👩🏽‍🌾 👩🏾‍🌾 👩🏿‍🌾 +🧑‍🍳 🧑🏻‍🍳 🧑🏼‍🍳 🧑🏽‍🍳 🧑🏾‍🍳 🧑🏿‍🍳 +👨‍🍳 👨🏻‍🍳 👨🏼‍🍳 👨🏽‍🍳 👨🏾‍🍳 👨🏿‍🍳 +👩‍🍳 👩🏻‍🍳 👩🏼‍🍳 👩🏽‍🍳 👩🏾‍🍳 👩🏿‍🍳 +🧑‍🔧 🧑🏻‍🔧 🧑🏼‍🔧 🧑🏽‍🔧 🧑🏾‍🔧 🧑🏿‍🔧 +👨‍🔧 👨🏻‍🔧 👨🏼‍🔧 👨🏽‍🔧 👨🏾‍🔧 👨🏿‍🔧 +👩‍🔧 👩🏻‍🔧 👩🏼‍🔧 👩🏽‍🔧 👩🏾‍🔧 👩🏿‍🔧 +🧑‍🏭 🧑🏻‍🏭 🧑🏼‍🏭 🧑🏽‍🏭 🧑🏾‍🏭 🧑🏿‍🏭 +👨‍🏭 👨🏻‍🏭 👨🏼‍🏭 👨🏽‍🏭 👨🏾‍🏭 👨🏿‍🏭 +👩‍🏭 👩🏻‍🏭 👩🏼‍🏭 👩🏽‍🏭 👩🏾‍🏭 👩🏿‍🏭 +🧑‍💼 🧑🏻‍💼 🧑🏼‍💼 🧑🏽‍💼 🧑🏾‍💼 🧑🏿‍💼 +👨‍💼 👨🏻‍💼 👨🏼‍💼 👨🏽‍💼 👨🏾‍💼 👨🏿‍💼 +👩‍💼 👩🏻‍💼 👩🏼‍💼 👩🏽‍💼 👩🏾‍💼 👩🏿‍💼 +🧑‍🔬 🧑🏻‍🔬 🧑🏼‍🔬 🧑🏽‍🔬 🧑🏾‍🔬 🧑🏿‍🔬 +👨‍🔬 👨🏻‍🔬 👨🏼‍🔬 👨🏽‍🔬 👨🏾‍🔬 👨🏿‍🔬 +👩‍🔬 👩🏻‍🔬 👩🏼‍🔬 👩🏽‍🔬 👩🏾‍🔬 👩🏿‍🔬 +🧑‍💻 🧑🏻‍💻 🧑🏼‍💻 🧑🏽‍💻 🧑🏾‍💻 🧑🏿‍💻 +👨‍💻 👨🏻‍💻 👨🏼‍💻 👨🏽‍💻 👨🏾‍💻 👨🏿‍💻 +👩‍💻 👩🏻‍💻 👩🏼‍💻 👩🏽‍💻 👩🏾‍💻 👩🏿‍💻 +🧑‍🎤 🧑🏻‍🎤 🧑🏼‍🎤 🧑🏽‍🎤 🧑🏾‍🎤 🧑🏿‍🎤 +👨‍🎤 👨🏻‍🎤 👨🏼‍🎤 👨🏽‍🎤 👨🏾‍🎤 👨🏿‍🎤 +👩‍🎤 👩🏻‍🎤 👩🏼‍🎤 👩🏽‍🎤 👩🏾‍🎤 👩🏿‍🎤 +🧑‍🎨 🧑🏻‍🎨 🧑🏼‍🎨 🧑🏽‍🎨 🧑🏾‍🎨 🧑🏿‍🎨 +👨‍🎨 👨🏻‍🎨 👨🏼‍🎨 👨🏽‍🎨 👨🏾‍🎨 👨🏿‍🎨 +👩‍🎨 👩🏻‍🎨 👩🏼‍🎨 👩🏽‍🎨 👩🏾‍🎨 👩🏿‍🎨 +🧑‍✈️ 🧑🏻‍✈️ 🧑🏼‍✈️ 🧑🏽‍✈️ 🧑🏾‍✈️ 🧑🏿‍✈️ +👨‍✈️ 👨🏻‍✈️ 👨🏼‍✈️ 👨🏽‍✈️ 👨🏾‍✈️ 👨🏿‍✈️ +👩‍✈️ 👩🏻‍✈️ 👩🏼‍✈️ 👩🏽‍✈️ 👩🏾‍✈️ 👩🏿‍✈️ +🧑‍🚀 🧑🏻‍🚀 🧑🏼‍🚀 🧑🏽‍🚀 🧑🏾‍🚀 🧑🏿‍🚀 +👨‍🚀 👨🏻‍🚀 👨🏼‍🚀 👨🏽‍🚀 👨🏾‍🚀 👨🏿‍🚀 +👩‍🚀 👩🏻‍🚀 👩🏼‍🚀 👩🏽‍🚀 👩🏾‍🚀 👩🏿‍🚀 +🧑‍🚒 🧑🏻‍🚒 🧑🏼‍🚒 🧑🏽‍🚒 🧑🏾‍🚒 🧑🏿‍🚒 +👨‍🚒 👨🏻‍🚒 👨🏼‍🚒 👨🏽‍🚒 👨🏾‍🚒 👨🏿‍🚒 +👩‍🚒 👩🏻‍🚒 👩🏼‍🚒 👩🏽‍🚒 👩🏾‍🚒 👩🏿‍🚒 +👮 👮🏻 👮🏼 👮🏽 👮🏾 👮🏿 +👮‍♂️ 👮🏻‍♂️ 👮🏼‍♂️ 👮🏽‍♂️ 👮🏾‍♂️ 👮🏿‍♂️ +👮‍♀️ 👮🏻‍♀️ 👮🏼‍♀️ 👮🏽‍♀️ 👮🏾‍♀️ 👮🏿‍♀️ +🕵️ 🕵🏻 🕵🏼 🕵🏽 🕵🏾 🕵🏿 +🕵️‍♂️ 🕵🏻‍♂️ 🕵🏼‍♂️ 🕵🏽‍♂️ 🕵🏾‍♂️ 🕵🏿‍♂️ +🕵️‍♀️ 🕵🏻‍♀️ 🕵🏼‍♀️ 🕵🏽‍♀️ 🕵🏾‍♀️ 🕵🏿‍♀️ +💂 💂🏻 💂🏼 💂🏽 💂🏾 💂🏿 +💂‍♂️ 💂🏻‍♂️ 💂🏼‍♂️ 💂🏽‍♂️ 💂🏾‍♂️ 💂🏿‍♂️ +💂‍♀️ 💂🏻‍♀️ 💂🏼‍♀️ 💂🏽‍♀️ 💂🏾‍♀️ 💂🏿‍♀️ +🥷 🥷🏻 🥷🏼 🥷🏽 🥷🏾 🥷🏿 +👷 👷🏻 👷🏼 👷🏽 👷🏾 👷🏿 +👷‍♂️ 👷🏻‍♂️ 👷🏼‍♂️ 👷🏽‍♂️ 👷🏾‍♂️ 👷🏿‍♂️ +👷‍♀️ 👷🏻‍♀️ 👷🏼‍♀️ 👷🏽‍♀️ 👷🏾‍♀️ 👷🏿‍♀️ +🫅 🫅🏻 🫅🏼 🫅🏽 🫅🏾 🫅🏿 +🤴 🤴🏻 🤴🏼 🤴🏽 🤴🏾 🤴🏿 +👸 👸🏻 👸🏼 👸🏽 👸🏾 👸🏿 +👳 👳🏻 👳🏼 👳🏽 👳🏾 👳🏿 +👳‍♂️ 👳🏻‍♂️ 👳🏼‍♂️ 👳🏽‍♂️ 👳🏾‍♂️ 👳🏿‍♂️ +👳‍♀️ 👳🏻‍♀️ 👳🏼‍♀️ 👳🏽‍♀️ 👳🏾‍♀️ 👳🏿‍♀️ +👲 👲🏻 👲🏼 👲🏽 👲🏾 👲🏿 +🧕 🧕🏻 🧕🏼 🧕🏽 🧕🏾 🧕🏿 +🤵 🤵🏻 🤵🏼 🤵🏽 🤵🏾 🤵🏿 +🤵‍♂️ 🤵🏻‍♂️ 🤵🏼‍♂️ 🤵🏽‍♂️ 🤵🏾‍♂️ 🤵🏿‍♂️ +🤵‍♀️ 🤵🏻‍♀️ 🤵🏼‍♀️ 🤵🏽‍♀️ 🤵🏾‍♀️ 🤵🏿‍♀️ +👰 👰🏻 👰🏼 👰🏽 👰🏾 👰🏿 +👰‍♂️ 👰🏻‍♂️ 👰🏼‍♂️ 👰🏽‍♂️ 👰🏾‍♂️ 👰🏿‍♂️ +👰‍♀️ 👰🏻‍♀️ 👰🏼‍♀️ 👰🏽‍♀️ 👰🏾‍♀️ 👰🏿‍♀️ +🤰 🤰🏻 🤰🏼 🤰🏽 🤰🏾 🤰🏿 +🫃 🫃🏻 🫃🏼 🫃🏽 🫃🏾 🫃🏿 +🫄 🫄🏻 🫄🏼 🫄🏽 🫄🏾 🫄🏿 +🤱 🤱🏻 🤱🏼 🤱🏽 🤱🏾 🤱🏿 +👩‍🍼 👩🏻‍🍼 👩🏼‍🍼 👩🏽‍🍼 👩🏾‍🍼 👩🏿‍🍼 +👨‍🍼 👨🏻‍🍼 👨🏼‍🍼 👨🏽‍🍼 👨🏾‍🍼 👨🏿‍🍼 +🧑‍🍼 🧑🏻‍🍼 🧑🏼‍🍼 🧑🏽‍🍼 🧑🏾‍🍼 🧑🏿‍🍼 +👼 👼🏻 👼🏼 👼🏽 👼🏾 👼🏿 +🎅 🎅🏻 🎅🏼 🎅🏽 🎅🏾 🎅🏿 +🤶 🤶🏻 🤶🏼 🤶🏽 🤶🏾 🤶🏿 +🧑‍🎄 🧑🏻‍🎄 🧑🏼‍🎄 🧑🏽‍🎄 🧑🏾‍🎄 🧑🏿‍🎄 +🦸 🦸🏻 🦸🏼 🦸🏽 🦸🏾 🦸🏿 +🦸‍♂️ 🦸🏻‍♂️ 🦸🏼‍♂️ 🦸🏽‍♂️ 🦸🏾‍♂️ 🦸🏿‍♂️ +🦸‍♀️ 🦸🏻‍♀️ 🦸🏼‍♀️ 🦸🏽‍♀️ 🦸🏾‍♀️ 🦸🏿‍♀️ +🦹 🦹🏻 🦹🏼 🦹🏽 🦹🏾 🦹🏿 +🦹‍♂️ 🦹🏻‍♂️ 🦹🏼‍♂️ 🦹🏽‍♂️ 🦹🏾‍♂️ 🦹🏿‍♂️ +🦹‍♀️ 🦹🏻‍♀️ 🦹🏼‍♀️ 🦹🏽‍♀️ 🦹🏾‍♀️ 🦹🏿‍♀️ +🧙 🧙🏻 🧙🏼 🧙🏽 🧙🏾 🧙🏿 +🧙‍♂️ 🧙🏻‍♂️ 🧙🏼‍♂️ 🧙🏽‍♂️ 🧙🏾‍♂️ 🧙🏿‍♂️ +🧙‍♀️ 🧙🏻‍♀️ 🧙🏼‍♀️ 🧙🏽‍♀️ 🧙🏾‍♀️ 🧙🏿‍♀️ +🧚 🧚🏻 🧚🏼 🧚🏽 🧚🏾 🧚🏿 +🧚‍♂️ 🧚🏻‍♂️ 🧚🏼‍♂️ 🧚🏽‍♂️ 🧚🏾‍♂️ 🧚🏿‍♂️ +🧚‍♀️ 🧚🏻‍♀️ 🧚🏼‍♀️ 🧚🏽‍♀️ 🧚🏾‍♀️ 🧚🏿‍♀️ +🧛 🧛🏻 🧛🏼 🧛🏽 🧛🏾 🧛🏿 +🧛‍♂️ 🧛🏻‍♂️ 🧛🏼‍♂️ 🧛🏽‍♂️ 🧛🏾‍♂️ 🧛🏿‍♂️ +🧛‍♀️ 🧛🏻‍♀️ 🧛🏼‍♀️ 🧛🏽‍♀️ 🧛🏾‍♀️ 🧛🏿‍♀️ +🧜 🧜🏻 🧜🏼 🧜🏽 🧜🏾 🧜🏿 +🧜‍♂️ 🧜🏻‍♂️ 🧜🏼‍♂️ 🧜🏽‍♂️ 🧜🏾‍♂️ 🧜🏿‍♂️ +🧜‍♀️ 🧜🏻‍♀️ 🧜🏼‍♀️ 🧜🏽‍♀️ 🧜🏾‍♀️ 🧜🏿‍♀️ +🧝 🧝🏻 🧝🏼 🧝🏽 🧝🏾 🧝🏿 +🧝‍♂️ 🧝🏻‍♂️ 🧝🏼‍♂️ 🧝🏽‍♂️ 🧝🏾‍♂️ 🧝🏿‍♂️ +🧝‍♀️ 🧝🏻‍♀️ 🧝🏼‍♀️ 🧝🏽‍♀️ 🧝🏾‍♀️ 🧝🏿‍♀️ +🧞 +🧞‍♂️ +🧞‍♀️ +🧟 +🧟‍♂️ +🧟‍♀️ +🧌 +💆 💆🏻 💆🏼 💆🏽 💆🏾 💆🏿 +💆‍♂️ 💆🏻‍♂️ 💆🏼‍♂️ 💆🏽‍♂️ 💆🏾‍♂️ 💆🏿‍♂️ +💆‍♀️ 💆🏻‍♀️ 💆🏼‍♀️ 💆🏽‍♀️ 💆🏾‍♀️ 💆🏿‍♀️ +💇 💇🏻 💇🏼 💇🏽 💇🏾 💇🏿 +💇‍♂️ 💇🏻‍♂️ 💇🏼‍♂️ 💇🏽‍♂️ 💇🏾‍♂️ 💇🏿‍♂️ +💇‍♀️ 💇🏻‍♀️ 💇🏼‍♀️ 💇🏽‍♀️ 💇🏾‍♀️ 💇🏿‍♀️ +🚶 🚶🏻 🚶🏼 🚶🏽 🚶🏾 🚶🏿 +🚶‍♂️ 🚶🏻‍♂️ 🚶🏼‍♂️ 🚶🏽‍♂️ 🚶🏾‍♂️ 🚶🏿‍♂️ +🚶‍♀️ 🚶🏻‍♀️ 🚶🏼‍♀️ 🚶🏽‍♀️ 🚶🏾‍♀️ 🚶🏿‍♀️ +🚶‍➡️ 🚶🏻‍➡️ 🚶🏼‍➡️ 🚶🏽‍➡️ 🚶🏾‍➡️ 🚶🏿‍➡️ +🚶‍♀️‍➡️ 🚶🏻‍♀️‍➡️ 🚶🏼‍♀️‍➡️ 🚶🏽‍♀️‍➡️ 🚶🏾‍♀️‍➡️ 🚶🏿‍♀️‍➡️ +🚶‍♂️‍➡️ 🚶🏻‍♂️‍➡️ 🚶🏼‍♂️‍➡️ 🚶🏽‍♂️‍➡️ 🚶🏾‍♂️‍➡️ 🚶🏿‍♂️‍➡️ +🧍 🧍🏻 🧍🏼 🧍🏽 🧍🏾 🧍🏿 +🧍‍♂️ 🧍🏻‍♂️ 🧍🏼‍♂️ 🧍🏽‍♂️ 🧍🏾‍♂️ 🧍🏿‍♂️ +🧍‍♀️ 🧍🏻‍♀️ 🧍🏼‍♀️ 🧍🏽‍♀️ 🧍🏾‍♀️ 🧍🏿‍♀️ +🧎 🧎🏻 🧎🏼 🧎🏽 🧎🏾 🧎🏿 +🧎‍♂️ 🧎🏻‍♂️ 🧎🏼‍♂️ 🧎🏽‍♂️ 🧎🏾‍♂️ 🧎🏿‍♂️ +🧎‍♀️ 🧎🏻‍♀️ 🧎🏼‍♀️ 🧎🏽‍♀️ 🧎🏾‍♀️ 🧎🏿‍♀️ +🧎‍➡️ 🧎🏻‍➡️ 🧎🏼‍➡️ 🧎🏽‍➡️ 🧎🏾‍➡️ 🧎🏿‍➡️ +🧎‍♀️‍➡️ 🧎🏻‍♀️‍➡️ 🧎🏼‍♀️‍➡️ 🧎🏽‍♀️‍➡️ 🧎🏾‍♀️‍➡️ 🧎🏿‍♀️‍➡️ +🧎‍♂️‍➡️ 🧎🏻‍♂️‍➡️ 🧎🏼‍♂️‍➡️ 🧎🏽‍♂️‍➡️ 🧎🏾‍♂️‍➡️ 🧎🏿‍♂️‍➡️ +🧑‍🦯 🧑🏻‍🦯 🧑🏼‍🦯 🧑🏽‍🦯 🧑🏾‍🦯 🧑🏿‍🦯 +🧑‍🦯‍➡️ 🧑🏻‍🦯‍➡️ 🧑🏼‍🦯‍➡️ 🧑🏽‍🦯‍➡️ 🧑🏾‍🦯‍➡️ 🧑🏿‍🦯‍➡️ +👨‍🦯 👨🏻‍🦯 👨🏼‍🦯 👨🏽‍🦯 👨🏾‍🦯 👨🏿‍🦯 +👨‍🦯‍➡️ 👨🏻‍🦯‍➡️ 👨🏼‍🦯‍➡️ 👨🏽‍🦯‍➡️ 👨🏾‍🦯‍➡️ 👨🏿‍🦯‍➡️ +👩‍🦯 👩🏻‍🦯 👩🏼‍🦯 👩🏽‍🦯 👩🏾‍🦯 👩🏿‍🦯 +👩‍🦯‍➡️ 👩🏻‍🦯‍➡️ 👩🏼‍🦯‍➡️ 👩🏽‍🦯‍➡️ 👩🏾‍🦯‍➡️ 👩🏿‍🦯‍➡️ +🧑‍🦼 🧑🏻‍🦼 🧑🏼‍🦼 🧑🏽‍🦼 🧑🏾‍🦼 🧑🏿‍🦼 +🧑‍🦼‍➡️ 🧑🏻‍🦼‍➡️ 🧑🏼‍🦼‍➡️ 🧑🏽‍🦼‍➡️ 🧑🏾‍🦼‍➡️ 🧑🏿‍🦼‍➡️ +👨‍🦼 👨🏻‍🦼 👨🏼‍🦼 👨🏽‍🦼 👨🏾‍🦼 👨🏿‍🦼 +👨‍🦼‍➡️ 👨🏻‍🦼‍➡️ 👨🏼‍🦼‍➡️ 👨🏽‍🦼‍➡️ 👨🏾‍🦼‍➡️ 👨🏿‍🦼‍➡️ +👩‍🦼 👩🏻‍🦼 👩🏼‍🦼 👩🏽‍🦼 👩🏾‍🦼 👩🏿‍🦼 +👩‍🦼‍➡️ 👩🏻‍🦼‍➡️ 👩🏼‍🦼‍➡️ 👩🏽‍🦼‍➡️ 👩🏾‍🦼‍➡️ 👩🏿‍🦼‍➡️ +🧑‍🦽 🧑🏻‍🦽 🧑🏼‍🦽 🧑🏽‍🦽 🧑🏾‍🦽 🧑🏿‍🦽 +🧑‍🦽‍➡️ 🧑🏻‍🦽‍➡️ 🧑🏼‍🦽‍➡️ 🧑🏽‍🦽‍➡️ 🧑🏾‍🦽‍➡️ 🧑🏿‍🦽‍➡️ +👨‍🦽 👨🏻‍🦽 👨🏼‍🦽 👨🏽‍🦽 👨🏾‍🦽 👨🏿‍🦽 +👨‍🦽‍➡️ 👨🏻‍🦽‍➡️ 👨🏼‍🦽‍➡️ 👨🏽‍🦽‍➡️ 👨🏾‍🦽‍➡️ 👨🏿‍🦽‍➡️ +👩‍🦽 👩🏻‍🦽 👩🏼‍🦽 👩🏽‍🦽 👩🏾‍🦽 👩🏿‍🦽 +👩‍🦽‍➡️ 👩🏻‍🦽‍➡️ 👩🏼‍🦽‍➡️ 👩🏽‍🦽‍➡️ 👩🏾‍🦽‍➡️ 👩🏿‍🦽‍➡️ +🏃 🏃🏻 🏃🏼 🏃🏽 🏃🏾 🏃🏿 +🏃‍♂️ 🏃🏻‍♂️ 🏃🏼‍♂️ 🏃🏽‍♂️ 🏃🏾‍♂️ 🏃🏿‍♂️ +🏃‍♀️ 🏃🏻‍♀️ 🏃🏼‍♀️ 🏃🏽‍♀️ 🏃🏾‍♀️ 🏃🏿‍♀️ +🏃‍➡️ 🏃🏻‍➡️ 🏃🏼‍➡️ 🏃🏽‍➡️ 🏃🏾‍➡️ 🏃🏿‍➡️ +🏃‍♀️‍➡️ 🏃🏻‍♀️‍➡️ 🏃🏼‍♀️‍➡️ 🏃🏽‍♀️‍➡️ 🏃🏾‍♀️‍➡️ 🏃🏿‍♀️‍➡️ +🏃‍♂️‍➡️ 🏃🏻‍♂️‍➡️ 🏃🏼‍♂️‍➡️ 🏃🏽‍♂️‍➡️ 🏃🏾‍♂️‍➡️ 🏃🏿‍♂️‍➡️ +💃 💃🏻 💃🏼 💃🏽 💃🏾 💃🏿 +🕺 🕺🏻 🕺🏼 🕺🏽 🕺🏾 🕺🏿 +🕴️ 🕴🏻 🕴🏼 🕴🏽 🕴🏾 🕴🏿 +👯 +👯‍♂️ +👯‍♀️ +🧖 🧖🏻 🧖🏼 🧖🏽 🧖🏾 🧖🏿 +🧖‍♂️ 🧖🏻‍♂️ 🧖🏼‍♂️ 🧖🏽‍♂️ 🧖🏾‍♂️ 🧖🏿‍♂️ +🧖‍♀️ 🧖🏻‍♀️ 🧖🏼‍♀️ 🧖🏽‍♀️ 🧖🏾‍♀️ 🧖🏿‍♀️ +🧗 🧗🏻 🧗🏼 🧗🏽 🧗🏾 🧗🏿 +🧗‍♂️ 🧗🏻‍♂️ 🧗🏼‍♂️ 🧗🏽‍♂️ 🧗🏾‍♂️ 🧗🏿‍♂️ +🧗‍♀️ 🧗🏻‍♀️ 🧗🏼‍♀️ 🧗🏽‍♀️ 🧗🏾‍♀️ 🧗🏿‍♀️ +🤺 +🏇 🏇🏻 🏇🏼 🏇🏽 🏇🏾 🏇🏿 +⛷️ +🏂 🏂🏻 🏂🏼 🏂🏽 🏂🏾 🏂🏿 +🏌️ 🏌🏻 🏌🏼 🏌🏽 🏌🏾 🏌🏿 +🏌️‍♂️ 🏌🏻‍♂️ 🏌🏼‍♂️ 🏌🏽‍♂️ 🏌🏾‍♂️ 🏌🏿‍♂️ +🏌️‍♀️ 🏌🏻‍♀️ 🏌🏼‍♀️ 🏌🏽‍♀️ 🏌🏾‍♀️ 🏌🏿‍♀️ +🏄 🏄🏻 🏄🏼 🏄🏽 🏄🏾 🏄🏿 +🏄‍♂️ 🏄🏻‍♂️ 🏄🏼‍♂️ 🏄🏽‍♂️ 🏄🏾‍♂️ 🏄🏿‍♂️ +🏄‍♀️ 🏄🏻‍♀️ 🏄🏼‍♀️ 🏄🏽‍♀️ 🏄🏾‍♀️ 🏄🏿‍♀️ +🚣 🚣🏻 🚣🏼 🚣🏽 🚣🏾 🚣🏿 +🚣‍♂️ 🚣🏻‍♂️ 🚣🏼‍♂️ 🚣🏽‍♂️ 🚣🏾‍♂️ 🚣🏿‍♂️ +🚣‍♀️ 🚣🏻‍♀️ 🚣🏼‍♀️ 🚣🏽‍♀️ 🚣🏾‍♀️ 🚣🏿‍♀️ +🏊 🏊🏻 🏊🏼 🏊🏽 🏊🏾 🏊🏿 +🏊‍♂️ 🏊🏻‍♂️ 🏊🏼‍♂️ 🏊🏽‍♂️ 🏊🏾‍♂️ 🏊🏿‍♂️ +🏊‍♀️ 🏊🏻‍♀️ 🏊🏼‍♀️ 🏊🏽‍♀️ 🏊🏾‍♀️ 🏊🏿‍♀️ +⛹️ ⛹🏻 ⛹🏼 ⛹🏽 ⛹🏾 ⛹🏿 +⛹️‍♂️ ⛹🏻‍♂️ ⛹🏼‍♂️ ⛹🏽‍♂️ ⛹🏾‍♂️ ⛹🏿‍♂️ +⛹️‍♀️ ⛹🏻‍♀️ ⛹🏼‍♀️ ⛹🏽‍♀️ ⛹🏾‍♀️ ⛹🏿‍♀️ +🏋️ 🏋🏻 🏋🏼 🏋🏽 🏋🏾 🏋🏿 +🏋️‍♂️ 🏋🏻‍♂️ 🏋🏼‍♂️ 🏋🏽‍♂️ 🏋🏾‍♂️ 🏋🏿‍♂️ +🏋️‍♀️ 🏋🏻‍♀️ 🏋🏼‍♀️ 🏋🏽‍♀️ 🏋🏾‍♀️ 🏋🏿‍♀️ +🚴 🚴🏻 🚴🏼 🚴🏽 🚴🏾 🚴🏿 +🚴‍♂️ 🚴🏻‍♂️ 🚴🏼‍♂️ 🚴🏽‍♂️ 🚴🏾‍♂️ 🚴🏿‍♂️ +🚴‍♀️ 🚴🏻‍♀️ 🚴🏼‍♀️ 🚴🏽‍♀️ 🚴🏾‍♀️ 🚴🏿‍♀️ +🚵 🚵🏻 🚵🏼 🚵🏽 🚵🏾 🚵🏿 +🚵‍♂️ 🚵🏻‍♂️ 🚵🏼‍♂️ 🚵🏽‍♂️ 🚵🏾‍♂️ 🚵🏿‍♂️ +🚵‍♀️ 🚵🏻‍♀️ 🚵🏼‍♀️ 🚵🏽‍♀️ 🚵🏾‍♀️ 🚵🏿‍♀️ +🤸 🤸🏻 🤸🏼 🤸🏽 🤸🏾 🤸🏿 +🤸‍♂️ 🤸🏻‍♂️ 🤸🏼‍♂️ 🤸🏽‍♂️ 🤸🏾‍♂️ 🤸🏿‍♂️ +🤸‍♀️ 🤸🏻‍♀️ 🤸🏼‍♀️ 🤸🏽‍♀️ 🤸🏾‍♀️ 🤸🏿‍♀️ +🤼 +🤼‍♂️ +🤼‍♀️ +🤽 🤽🏻 🤽🏼 🤽🏽 🤽🏾 🤽🏿 +🤽‍♂️ 🤽🏻‍♂️ 🤽🏼‍♂️ 🤽🏽‍♂️ 🤽🏾‍♂️ 🤽🏿‍♂️ +🤽‍♀️ 🤽🏻‍♀️ 🤽🏼‍♀️ 🤽🏽‍♀️ 🤽🏾‍♀️ 🤽🏿‍♀️ +🤾 🤾🏻 🤾🏼 🤾🏽 🤾🏾 🤾🏿 +🤾‍♂️ 🤾🏻‍♂️ 🤾🏼‍♂️ 🤾🏽‍♂️ 🤾🏾‍♂️ 🤾🏿‍♂️ +🤾‍♀️ 🤾🏻‍♀️ 🤾🏼‍♀️ 🤾🏽‍♀️ 🤾🏾‍♀️ 🤾🏿‍♀️ +🤹 🤹🏻 🤹🏼 🤹🏽 🤹🏾 🤹🏿 +🤹‍♂️ 🤹🏻‍♂️ 🤹🏼‍♂️ 🤹🏽‍♂️ 🤹🏾‍♂️ 🤹🏿‍♂️ +🤹‍♀️ 🤹🏻‍♀️ 🤹🏼‍♀️ 🤹🏽‍♀️ 🤹🏾‍♀️ 🤹🏿‍♀️ +🧘 🧘🏻 🧘🏼 🧘🏽 🧘🏾 🧘🏿 +🧘‍♂️ 🧘🏻‍♂️ 🧘🏼‍♂️ 🧘🏽‍♂️ 🧘🏾‍♂️ 🧘🏿‍♂️ +🧘‍♀️ 🧘🏻‍♀️ 🧘🏼‍♀️ 🧘🏽‍♀️ 🧘🏾‍♀️ 🧘🏿‍♀️ +🛀 🛀🏻 🛀🏼 🛀🏽 🛀🏾 🛀🏿 +🛌 🛌🏻 🛌🏼 🛌🏽 🛌🏾 🛌🏿 +🧑‍🤝‍🧑 +👭 👭🏻 👭🏼 👭🏽 👭🏾 👭🏿 +👫 👫🏻 👫🏼 👫🏽 👫🏾 👫🏿 +👬 👬🏻 👬🏼 👬🏽 👬🏾 👬🏿 +💏 💏🏻 💏🏼 💏🏽 💏🏾 💏🏿 +👩‍❤️‍💋‍👨 +👨‍❤️‍💋‍👨 +👩‍❤️‍💋‍👩 +💑 💑🏻 💑🏼 💑🏽 💑🏾 💑🏿 +👩‍❤️‍👨 +👨‍❤️‍👨 +👩‍❤️‍👩 +👨‍👩‍👦 +👨‍👩‍👧 +👨‍👩‍👧‍👦 +👨‍👩‍👦‍👦 +👨‍👩‍👧‍👧 +👨‍👨‍👦 +👨‍👨‍👧 +👨‍👨‍👧‍👦 +👨‍👨‍👦‍👦 +👨‍👨‍👧‍👧 +👩‍👩‍👦 +👩‍👩‍👧 +👩‍👩‍👧‍👦 +👩‍👩‍👦‍👦 +👩‍👩‍👧‍👧 +👨‍👦 +👨‍👦‍👦 +👨‍👧 +👨‍👧‍👦 +👨‍👧‍👧 +👩‍👦 +👩‍👦‍👦 +👩‍👧 +👩‍👧‍👦 +👩‍👧‍👧 +🗣️ +👤 +👥 +🫂 +👪 +🧑‍🧑‍🧒 +🧑‍🧑‍🧒‍🧒 +🧑‍🧒 +🧑‍🧒‍🧒 +👣 +🫆 \ No newline at end of file diff --git a/app/src/main/assets/emoji/SMILEYS_AND_EMOTION.txt b/app/src/main/assets/emoji/SMILEYS_AND_EMOTION.txt new file mode 100644 index 000000000..73218d6fe --- /dev/null +++ b/app/src/main/assets/emoji/SMILEYS_AND_EMOTION.txt @@ -0,0 +1,169 @@ +😀 +😃 +😄 +😁 +😆 +😅 +🤣 +😂 +🙂 +🙃 +🫠 +😉 +😊 +😇 +🥰 +😍 +🤩 +😘 +😗 +☺️ +😚 +😙 +🥲 +😋 +😛 +😜 +🤪 +😝 +🤑 +🤗 +🤭 +🫢 +🫣 +🤫 +🤔 +🫡 +🤐 +🤨 +😐 +😑 +😶 +🫥 +😶‍🌫️ +😏 +😒 +🙄 +😬 +😮‍💨 +🤥 +🫨 +🙂‍↔️ +🙂‍↕️ +😌 +😔 +😪 +🤤 +😴 +🫩 +😷 +🤒 +🤕 +🤢 +🤮 +🤧 +🥵 +🥶 +🥴 +😵 +😵‍💫 +🤯 +🤠 +🥳 +🥸 +😎 +🤓 +🧐 +😕 +🫤 +😟 +🙁 +☹️ +😮 +😯 +😲 +😳 +🥺 +🥹 +😦 +😧 +😨 +😰 +😥 +😢 +😭 +😱 +😖 +😣 +😞 +😓 +😩 +😫 +🥱 +😤 +😡 +😠 +🤬 +😈 +👿 +💀 +☠️ +💩 +🤡 +👹 +👺 +👻 +👽 +👾 +🤖 +😺 +😸 +😹 +😻 +😼 +😽 +🙀 +😿 +😾 +🙈 +🙉 +🙊 +💌 +💘 +💝 +💖 +💗 +💓 +💞 +💕 +💟 +❣️ +💔 +❤️‍🔥 +❤️‍🩹 +❤️ +🩷 +🧡 +💛 +💚 +💙 +🩵 +💜 +🤎 +🖤 +🩶 +🤍 +💋 +💯 +💢 +💥 +💫 +💦 +💨 +🕳️ +💬 +👁️‍🗨️ +🗨️ +🗯️ +💭 +💤 \ No newline at end of file diff --git a/app/src/main/assets/emoji/SYMBOLS.txt b/app/src/main/assets/emoji/SYMBOLS.txt new file mode 100644 index 000000000..f85cc13bb --- /dev/null +++ b/app/src/main/assets/emoji/SYMBOLS.txt @@ -0,0 +1,250 @@ +🏧 +🚮 +🚰 +♿ +🚹 +🚺 +🚻 +🚼 +🚾 +🛂 +🛃 +🛄 +🛅 +⚠️ +🚸 +⛔ +🚫 +🚳 +🚭 +🚯 +🚱 +🚷 +📵 +🔞 +☢️ +☣️ +⬆️ +↗️ +➡️ +↘️ +⬇️ +↙️ +⬅️ +↖️ +↕️ +↔️ +↩️ +↪️ +⤴️ +⤵️ +🔃 +🔄 +🔙 +🔚 +🔛 +🔜 +🔝 +🛐 +⚛️ +🕉️ +✡️ +☸️ +☯️ +✝️ +☦️ +☪️ +☮️ +🕎 +🔯 +🪯 +♈ +♉ +♊ +♋ +♌ +♍ +♎ +♏ +♐ +♑ +♒ +♓ +⛎ +🔀 +🔁 +🔂 +▶️ +⏩ +⏭️ +⏯️ +◀️ +⏪ +⏮️ +🔼 +⏫ +🔽 +⏬ +⏸️ +⏹️ +⏺️ +⏏️ +🎦 +🔅 +🔆 +📶 +🛜 +📳 +📴 +♀️ +♂️ +⚧️ +✖️ +➕ +➖ +➗ +🟰 +♾️ +‼️ +⁉️ +❓ +❔ +❕ +❗ +〰️ +💱 +💲 +⚕️ +♻️ +⚜️ +🔱 +📛 +🔰 +⭕ +✅ +☑️ +✔️ +❌ +❎ +➰ +➿ +〽️ +✳️ +✴️ +❇️ +©️ +®️ +™️ +🫟 +🇦 +🇧 +🇨 +🇩 +🇪 +🇫 +🇬 +🇭 +🇮 +🇯 +🇰 +🇱 +🇲 +🇳 +🇴 +🇵 +🇶 +🇷 +🇸 +🇹 +🇺 +🇻 +🇼 +🇽 +🇾 +🇿 +#️⃣ +*️⃣ +0️⃣ +1️⃣ +2️⃣ +3️⃣ +4️⃣ +5️⃣ +6️⃣ +7️⃣ +8️⃣ +9️⃣ +🔟 +🔠 +🔡 +🔢 +🔣 +🔤 +🅰️ +🆎 +🅱️ +🆑 +🆒 +🆓 +ℹ️ +🆔 +Ⓜ️ +🆕 +🆖 +🅾️ +🆗 +🅿️ +🆘 +🆙 +🆚 +🈁 +🈂️ +🈷️ +🈶 +🈯 +🉐 +🈹 +🈚 +🈲 +🉑 +🈸 +🈴 +🈳 +㊗️ +㊙️ +🈺 +🈵 +🔴 +🟠 +🟡 +🟢 +🔵 +🟣 +🟤 +⚫ +⚪ +🟥 +🟧 +🟨 +🟩 +🟦 +🟪 +🟫 +⬛ +⬜ +◼️ +◻️ +◾ +◽ +▪️ +▫️ +🔶 +🔷 +🔸 +🔹 +🔺 +🔻 +💠 +🔘 +🔳 +🔲 \ No newline at end of file diff --git a/app/src/main/assets/emoji/TRAVEL_AND_PLACES.txt b/app/src/main/assets/emoji/TRAVEL_AND_PLACES.txt new file mode 100644 index 000000000..ff1f0ad4a --- /dev/null +++ b/app/src/main/assets/emoji/TRAVEL_AND_PLACES.txt @@ -0,0 +1,218 @@ +🌍 +🌎 +🌏 +🌐 +🗺️ +🗾 +🧭 +🏔️ +⛰️ +🌋 +🗻 +🏕️ +🏖️ +🏜️ +🏝️ +🏞️ +🏟️ +🏛️ +🏗️ +🧱 +🪨 +🪵 +🛖 +🏘️ +🏚️ +🏠 +🏡 +🏢 +🏣 +🏤 +🏥 +🏦 +🏨 +🏩 +🏪 +🏫 +🏬 +🏭 +🏯 +🏰 +💒 +🗼 +🗽 +⛪ +🕌 +🛕 +🕍 +⛩️ +🕋 +⛲ +⛺ +🌁 +🌃 +🏙️ +🌄 +🌅 +🌆 +🌇 +🌉 +♨️ +🎠 +🛝 +🎡 +🎢 +💈 +🎪 +🚂 +🚃 +🚄 +🚅 +🚆 +🚇 +🚈 +🚉 +🚊 +🚝 +🚞 +🚋 +🚌 +🚍 +🚎 +🚐 +🚑 +🚒 +🚓 +🚔 +🚕 +🚖 +🚗 +🚘 +🚙 +🛻 +🚚 +🚛 +🚜 +🏎️ +🏍️ +🛵 +🦽 +🦼 +🛺 +🚲 +🛴 +🛹 +🛼 +🚏 +🛣️ +🛤️ +🛢️ +⛽ +🛞 +🚨 +🚥 +🚦 +🛑 +🚧 +⚓ +🛟 +⛵ +🛶 +🚤 +🛳️ +⛴️ +🛥️ +🚢 +✈️ +🛩️ +🛫 +🛬 +🪂 +💺 +🚁 +🚟 +🚠 +🚡 +🛰️ +🚀 +🛸 +🛎️ +🧳 +⌛ +⏳ +⌚ +⏰ +⏱️ +⏲️ +🕰️ +🕛 +🕧 +🕐 +🕜 +🕑 +🕝 +🕒 +🕞 +🕓 +🕟 +🕔 +🕠 +🕕 +🕡 +🕖 +🕢 +🕗 +🕣 +🕘 +🕤 +🕙 +🕥 +🕚 +🕦 +🌑 +🌒 +🌓 +🌔 +🌕 +🌖 +🌗 +🌘 +🌙 +🌚 +🌛 +🌜 +🌡️ +☀️ +🌝 +🌞 +🪐 +⭐ +🌟 +🌠 +🌌 +☁️ +⛅ +⛈️ +🌤️ +🌥️ +🌦️ +🌧️ +🌨️ +🌩️ +🌪️ +🌫️ +🌬️ +🌀 +🌈 +🌂 +☂️ +☔ +⛱️ +⚡ +❄️ +☃️ +⛄ +☄️ +🔥 +💧 +🌊 \ No newline at end of file diff --git a/app/src/main/assets/emoji/minApi.txt b/app/src/main/assets/emoji/minApi.txt new file mode 100644 index 000000000..c7fec2b86 --- /dev/null +++ b/app/src/main/assets/emoji/minApi.txt @@ -0,0 +1,12 @@ +23 🙂 🙃 🤑 🤗 🤔 🤐 🙄 🤒 🤕 🤓 🙁 ☹️ ☠️ 🤖 ❣️ 🕳️ 👁️‍🗨️ 🗨️ 🗯️ 🖐️ 🖖 🤘 🖕 ✍️ 👁️ 🕵️ 🕴️ ⛷️ 🏌️ ⛹️ 🏋️ 🛌 👨‍❤️‍💋‍👨 👩‍❤️‍💋‍👩 👨‍❤️‍👨 👩‍❤️‍👩 👨‍👩‍👧 👨‍👩‍👧‍👦 👨‍👩‍👦‍👦 👨‍👩‍👧‍👧 👨‍👨‍👦 👨‍👨‍👧 👨‍👨‍👧‍👦 👨‍👨‍👦‍👦 👨‍👨‍👧‍👧 👩‍👩‍👦 👩‍👩‍👧 👩‍👩‍👧‍👦 👩‍👩‍👦‍👦 👩‍👩‍👧‍👧 🗣️ 🦁 🦄 🐿️ 🦃 🕊️ 🦀 🕷️ 🕸️ 🦂 🏵️ ☘️ 🌶️ 🧀 🌭 🌮 🌯 🍿 🍾 🍽️ 🏺 🗺️ 🏔️ ⛰️ 🏕️ 🏖️ 🏜️ 🏝️ 🏞️ 🏟️ 🏛️ 🏗️ 🏘️ 🏚️ 🕌 🕍 ⛩️ 🕋 🏙️ 🏎️ 🏍️ 🛣️ 🛤️ 🛢️ 🛳️ ⛴️ 🛥️ 🛩️ 🛫 🛬 🛰️ 🛎️ ⏱️ ⏲️ 🕰️ 🌡️ ⛈️ 🌤️ 🌥️ 🌦️ 🌧️ 🌨️ 🌩️ 🌪️ 🌫️ 🌬️ ☂️ ⛱️ ☃️ ☄️ 🎗️ 🎟️ 🎖️ 🏅 🏐 🏏 🏑 🏒 🏓 🏸 ⛸️ 🕹️ 🖼️ 🕶️ 🛍️ ⛑️ 📿 🎙️ 🎚️ 🎛️ 🖥️ 🖨️ ⌨️ 🖱️ 🖲️ 🎞️ 📽️ 📸 🕯️ 🗞️ 🏷️ 🗳️ 🖋️ 🖊️ 🖌️ 🖍️ 🗂️ 🗒️ 🗓️ 🖇️ 🗃️ 🗄️ 🗑️ 🗝️ ⛏️ ⚒️ 🛠️ 🗡️ ⚔️ 🏹 🛡️ ⚙️ 🗜️ ⚖️ ⛓️ ⚗️ 🛏️ 🛋️ ⚰️ ⚱️ ☢️ ☣️ 🛐 ⚛️ 🕉️ ✡️ ☸️ ☯️ ✝️ ☦️ ☪️ ☮️ 🕎 ⏭️ ⏯️ ⏮️ ⏸️ ⏹️ ⏺️ ⏏️ ⚜️ *️⃣ 🏴 🏳️ +24 🤣 🤥 🤤 🤢 🤧 🤠 🤡 🖤 👋🏻 👋🏼 👋🏽 👋🏾 👋🏿 🤚 🤚🏻 🤚🏼 🤚🏽 🤚🏾 🤚🏿 🖐🏻 🖐🏼 🖐🏽 🖐🏾 🖐🏿 ✋🏻 ✋🏼 ✋🏽 ✋🏾 ✋🏿 🖖🏻 🖖🏼 🖖🏽 🖖🏾 🖖🏿 👌🏻 👌🏼 👌🏽 👌🏾 👌🏿 ✌🏻 ✌🏼 ✌🏽 ✌🏾 ✌🏿 🤞 🤞🏻 🤞🏼 🤞🏽 🤞🏾 🤞🏿 🤘🏻 🤘🏼 🤘🏽 🤘🏾 🤘🏿 🤙 🤙🏻 🤙🏼 🤙🏽 🤙🏾 🤙🏿 👈🏻 👈🏼 👈🏽 👈🏾 👈🏿 👉🏻 👉🏼 👉🏽 👉🏾 👉🏿 👆🏻 👆🏼 👆🏽 👆🏾 👆🏿 🖕🏻 🖕🏼 🖕🏽 🖕🏾 🖕🏿 👇🏻 👇🏼 👇🏽 👇🏾 👇🏿 ☝🏻 ☝🏼 ☝🏽 ☝🏾 ☝🏿 👍🏻 👍🏼 👍🏽 👍🏾 👍🏿 👎🏻 👎🏼 👎🏽 👎🏾 👎🏿 ✊🏻 ✊🏼 ✊🏽 ✊🏾 ✊🏿 👊🏻 👊🏼 👊🏽 👊🏾 👊🏿 🤛 🤛🏻 🤛🏼 🤛🏽 🤛🏾 🤛🏿 🤜 🤜🏻 🤜🏼 🤜🏽 🤜🏾 🤜🏿 👏🏻 👏🏼 👏🏽 👏🏾 👏🏿 🙌🏻 🙌🏼 🙌🏽 🙌🏾 🙌🏿 👐🏻 👐🏼 👐🏽 👐🏾 👐🏿 🤝 🙏🏻 🙏🏼 🙏🏽 🙏🏾 🙏🏿 ✍🏻 ✍🏼 ✍🏽 ✍🏾 ✍🏿 💅🏻 💅🏼 💅🏽 💅🏾 💅🏿 🤳 🤳🏻 🤳🏼 🤳🏽 🤳🏾 🤳🏿 💪🏻 💪🏼 💪🏽 💪🏾 💪🏿 👂🏻 👂🏼 👂🏽 👂🏾 👂🏿 👃🏻 👃🏼 👃🏽 👃🏾 👃🏿 👶🏻 👶🏼 👶🏽 👶🏾 👶🏿 👦🏻 👦🏼 👦🏽 👦🏾 👦🏿 👧🏻 👧🏼 👧🏽 👧🏾 👧🏿 👱🏻 👱🏼 👱🏽 👱🏾 👱🏿 👨🏻 👨🏼 👨🏽 👨🏾 👨🏿 👩🏻 👩🏼 👩🏽 👩🏾 👩🏿 👴🏻 👴🏼 👴🏽 👴🏾 👴🏿 👵🏻 👵🏼 👵🏽 👵🏾 👵🏿 🙍🏻 🙍🏼 🙍🏽 🙍🏾 🙍🏿 🙎🏻 🙎🏼 🙎🏽 🙎🏾 🙎🏿 🙅🏻 🙅🏼 🙅🏽 🙅🏾 🙅🏿 🙆🏻 🙆🏼 🙆🏽 🙆🏾 🙆🏿 💁🏻 💁🏼 💁🏽 💁🏾 💁🏿 🙋🏻 🙋🏼 🙋🏽 🙋🏾 🙋🏿 🙇🏻 🙇🏼 🙇🏽 🙇🏾 🙇🏿 🤦 🤦🏻 🤦🏼 🤦🏽 🤦🏾 🤦🏿 🤷 🤷🏻 🤷🏼 🤷🏽 🤷🏾 🤷🏿 👮🏻 👮🏼 👮🏽 👮🏾 👮🏿 🕵🏻 🕵🏼 🕵🏽 🕵🏾 🕵🏿 💂🏻 💂🏼 💂🏽 💂🏾 💂🏿 👷🏻 👷🏼 👷🏽 👷🏾 👷🏿 🤴 🤴🏻 🤴🏼 🤴🏽 🤴🏾 🤴🏿 👸🏻 👸🏼 👸🏽 👸🏾 👸🏿 👳🏻 👳🏼 👳🏽 👳🏾 👳🏿 👲🏻 👲🏼 👲🏽 👲🏾 👲🏿 🤵 🤵🏻 🤵🏼 🤵🏽 🤵🏾 🤵🏿 👰🏻 👰🏼 👰🏽 👰🏾 👰🏿 🤰 🤰🏻 🤰🏼 🤰🏽 🤰🏾 🤰🏿 👼🏻 👼🏼 👼🏽 👼🏾 👼🏿 🎅🏻 🎅🏼 🎅🏽 🎅🏾 🎅🏿 🤶 🤶🏻 🤶🏼 🤶🏽 🤶🏾 🤶🏿 💆🏻 💆🏼 💆🏽 💆🏾 💆🏿 💇🏻 💇🏼 💇🏽 💇🏾 💇🏿 🚶🏻 🚶🏼 🚶🏽 🚶🏾 🚶🏿 🏃🏻 🏃🏼 🏃🏽 🏃🏾 🏃🏿 💃🏻 💃🏼 💃🏽 💃🏾 💃🏿 🕺 🕺🏻 🕺🏼 🕺🏽 🕺🏾 🕺🏿 🤺 🏄🏻 🏄🏼 🏄🏽 🏄🏾 🏄🏿 🚣🏻 🚣🏼 🚣🏽 🚣🏾 🚣🏿 🏊🏻 🏊🏼 🏊🏽 🏊🏾 🏊🏿 ⛹🏻 ⛹🏼 ⛹🏽 ⛹🏾 ⛹🏿 🏋🏻 🏋🏼 🏋🏽 🏋🏾 🏋🏿 🚴🏻 🚴🏼 🚴🏽 🚴🏾 🚴🏿 🚵🏻 🚵🏼 🚵🏽 🚵🏾 🚵🏿 🤸 🤸🏻 🤸🏼 🤸🏽 🤸🏾 🤸🏿 🤼 🤽 🤽🏻 🤽🏼 🤽🏽 🤽🏾 🤽🏿 🤾 🤾🏻 🤾🏼 🤾🏽 🤾🏾 🤾🏿 🤹 🤹🏻 🤹🏼 🤹🏽 🤹🏾 🤹🏿 🛀🏻 🛀🏼 🛀🏽 🛀🏾 🛀🏿 🦍 🦊 🦌 🦏 🦇 🦅 🦆 🦉 🦎 🦈 🦐 🦑 🦋 🥀 🥝 🥑 🥔 🥕 🥒 🥜 🥐 🥖 🥞 🥓 🥙 🥚 🥘 🥗 🥛 🥂 🥃 🥄 🛵 🛴 🛑 🛶 🥇 🥈 🥉 🥊 🥋 🥅 🥁 🛒 🇦🇨 🇦🇶 🇧🇻 🇨🇵 🇭🇲 🇮🇨 🇸🇭 🇸🇯 🇹🇦 🇺🇲 +25 🤝🏻 🤝🏼 🤝🏽 🤝🏾 🤝🏿 👱‍♀️ 👱🏻‍♀️ 👱🏼‍♀️ 👱🏽‍♀️ 👱🏾‍♀️ 👱🏿‍♀️ 👱‍♂️ 👱🏻‍♂️ 👱🏼‍♂️ 👱🏽‍♂️ 👱🏾‍♂️ 👱🏿‍♂️ 🙍‍♂️ 🙍🏻‍♂️ 🙍🏼‍♂️ 🙍🏽‍♂️ 🙍🏾‍♂️ 🙍🏿‍♂️ 🙍‍♀️ 🙍🏻‍♀️ 🙍🏼‍♀️ 🙍🏽‍♀️ 🙍🏾‍♀️ 🙍🏿‍♀️ 🙎‍♂️ 🙎🏻‍♂️ 🙎🏼‍♂️ 🙎🏽‍♂️ 🙎🏾‍♂️ 🙎🏿‍♂️ 🙎‍♀️ 🙎🏻‍♀️ 🙎🏼‍♀️ 🙎🏽‍♀️ 🙎🏾‍♀️ 🙎🏿‍♀️ 🙅‍♂️ 🙅🏻‍♂️ 🙅🏼‍♂️ 🙅🏽‍♂️ 🙅🏾‍♂️ 🙅🏿‍♂️ 🙅‍♀️ 🙅🏻‍♀️ 🙅🏼‍♀️ 🙅🏽‍♀️ 🙅🏾‍♀️ 🙅🏿‍♀️ 🙆‍♂️ 🙆🏻‍♂️ 🙆🏼‍♂️ 🙆🏽‍♂️ 🙆🏾‍♂️ 🙆🏿‍♂️ 🙆‍♀️ 🙆🏻‍♀️ 🙆🏼‍♀️ 🙆🏽‍♀️ 🙆🏾‍♀️ 🙆🏿‍♀️ 💁‍♂️ 💁🏻‍♂️ 💁🏼‍♂️ 💁🏽‍♂️ 💁🏾‍♂️ 💁🏿‍♂️ 💁‍♀️ 💁🏻‍♀️ 💁🏼‍♀️ 💁🏽‍♀️ 💁🏾‍♀️ 💁🏿‍♀️ 🙋‍♂️ 🙋🏻‍♂️ 🙋🏼‍♂️ 🙋🏽‍♂️ 🙋🏾‍♂️ 🙋🏿‍♂️ 🙋‍♀️ 🙋🏻‍♀️ 🙋🏼‍♀️ 🙋🏽‍♀️ 🙋🏾‍♀️ 🙋🏿‍♀️ 🙇‍♂️ 🙇🏻‍♂️ 🙇🏼‍♂️ 🙇🏽‍♂️ 🙇🏾‍♂️ 🙇🏿‍♂️ 🙇‍♀️ 🙇🏻‍♀️ 🙇🏼‍♀️ 🙇🏽‍♀️ 🙇🏾‍♀️ 🙇🏿‍♀️ 🤦‍♂️ 🤦🏻‍♂️ 🤦🏼‍♂️ 🤦🏽‍♂️ 🤦🏾‍♂️ 🤦🏿‍♂️ 🤦‍♀️ 🤦🏻‍♀️ 🤦🏼‍♀️ 🤦🏽‍♀️ 🤦🏾‍♀️ 🤦🏿‍♀️ 🤷‍♂️ 🤷🏻‍♂️ 🤷🏼‍♂️ 🤷🏽‍♂️ 🤷🏾‍♂️ 🤷🏿‍♂️ 🤷‍♀️ 🤷🏻‍♀️ 🤷🏼‍♀️ 🤷🏽‍♀️ 🤷🏾‍♀️ 🤷🏿‍♀️ 👨‍⚕️ 👨🏻‍⚕️ 👨🏼‍⚕️ 👨🏽‍⚕️ 👨🏾‍⚕️ 👨🏿‍⚕️ 👩‍⚕️ 👩🏻‍⚕️ 👩🏼‍⚕️ 👩🏽‍⚕️ 👩🏾‍⚕️ 👩🏿‍⚕️ 👨‍🎓 👨🏻‍🎓 👨🏼‍🎓 👨🏽‍🎓 👨🏾‍🎓 👨🏿‍🎓 👩‍🎓 👩🏻‍🎓 👩🏼‍🎓 👩🏽‍🎓 👩🏾‍🎓 👩🏿‍🎓 👨‍🏫 👨🏻‍🏫 👨🏼‍🏫 👨🏽‍🏫 👨🏾‍🏫 👨🏿‍🏫 👩‍🏫 👩🏻‍🏫 👩🏼‍🏫 👩🏽‍🏫 👩🏾‍🏫 👩🏿‍🏫 👨‍⚖️ 👨🏻‍⚖️ 👨🏼‍⚖️ 👨🏽‍⚖️ 👨🏾‍⚖️ 👨🏿‍⚖️ 👩‍⚖️ 👩🏻‍⚖️ 👩🏼‍⚖️ 👩🏽‍⚖️ 👩🏾‍⚖️ 👩🏿‍⚖️ 👨‍🌾 👨🏻‍🌾 👨🏼‍🌾 👨🏽‍🌾 👨🏾‍🌾 👨🏿‍🌾 👩‍🌾 👩🏻‍🌾 👩🏼‍🌾 👩🏽‍🌾 👩🏾‍🌾 👩🏿‍🌾 👨‍🍳 👨🏻‍🍳 👨🏼‍🍳 👨🏽‍🍳 👨🏾‍🍳 👨🏿‍🍳 👩‍🍳 👩🏻‍🍳 👩🏼‍🍳 👩🏽‍🍳 👩🏾‍🍳 👩🏿‍🍳 👨‍🔧 👨🏻‍🔧 👨🏼‍🔧 👨🏽‍🔧 👨🏾‍🔧 👨🏿‍🔧 👩‍🔧 👩🏻‍🔧 👩🏼‍🔧 👩🏽‍🔧 👩🏾‍🔧 👩🏿‍🔧 👨‍🏭 👨🏻‍🏭 👨🏼‍🏭 👨🏽‍🏭 👨🏾‍🏭 👨🏿‍🏭 👩‍🏭 👩🏻‍🏭 👩🏼‍🏭 👩🏽‍🏭 👩🏾‍🏭 👩🏿‍🏭 👨‍💼 👨🏻‍💼 👨🏼‍💼 👨🏽‍💼 👨🏾‍💼 👨🏿‍💼 👩‍💼 👩🏻‍💼 👩🏼‍💼 👩🏽‍💼 👩🏾‍💼 👩🏿‍💼 👨‍🔬 👨🏻‍🔬 👨🏼‍🔬 👨🏽‍🔬 👨🏾‍🔬 👨🏿‍🔬 👩‍🔬 👩🏻‍🔬 👩🏼‍🔬 👩🏽‍🔬 👩🏾‍🔬 👩🏿‍🔬 👨‍💻 👨🏻‍💻 👨🏼‍💻 👨🏽‍💻 👨🏾‍💻 👨🏿‍💻 👩‍💻 👩🏻‍💻 👩🏼‍💻 👩🏽‍💻 👩🏾‍💻 👩🏿‍💻 👨‍🎤 👨🏻‍🎤 👨🏼‍🎤 👨🏽‍🎤 👨🏾‍🎤 👨🏿‍🎤 👩‍🎤 👩🏻‍🎤 👩🏼‍🎤 👩🏽‍🎤 👩🏾‍🎤 👩🏿‍🎤 👨‍🎨 👨🏻‍🎨 👨🏼‍🎨 👨🏽‍🎨 👨🏾‍🎨 👨🏿‍🎨 👩‍🎨 👩🏻‍🎨 👩🏼‍🎨 👩🏽‍🎨 👩🏾‍🎨 👩🏿‍🎨 👨‍✈️ 👨🏻‍✈️ 👨🏼‍✈️ 👨🏽‍✈️ 👨🏾‍✈️ 👨🏿‍✈️ 👩‍✈️ 👩🏻‍✈️ 👩🏼‍✈️ 👩🏽‍✈️ 👩🏾‍✈️ 👩🏿‍✈️ 👨‍🚀 👨🏻‍🚀 👨🏼‍🚀 👨🏽‍🚀 👨🏾‍🚀 👨🏿‍🚀 👩‍🚀 👩🏻‍🚀 👩🏼‍🚀 👩🏽‍🚀 👩🏾‍🚀 👩🏿‍🚀 👨‍🚒 👨🏻‍🚒 👨🏼‍🚒 👨🏽‍🚒 👨🏾‍🚒 👨🏿‍🚒 👩‍🚒 👩🏻‍🚒 👩🏼‍🚒 👩🏽‍🚒 👩🏾‍🚒 👩🏿‍🚒 👮‍♂️ 👮🏻‍♂️ 👮🏼‍♂️ 👮🏽‍♂️ 👮🏾‍♂️ 👮🏿‍♂️ 👮‍♀️ 👮🏻‍♀️ 👮🏼‍♀️ 👮🏽‍♀️ 👮🏾‍♀️ 👮🏿‍♀️ 🕵️‍♂️ 🕵🏻‍♂️ 🕵🏼‍♂️ 🕵🏽‍♂️ 🕵🏾‍♂️ 🕵🏿‍♂️ 🕵️‍♀️ 🕵🏻‍♀️ 🕵🏼‍♀️ 🕵🏽‍♀️ 🕵🏾‍♀️ 🕵🏿‍♀️ 💂‍♂️ 💂🏻‍♂️ 💂🏼‍♂️ 💂🏽‍♂️ 💂🏾‍♂️ 💂🏿‍♂️ 💂‍♀️ 💂🏻‍♀️ 💂🏼‍♀️ 💂🏽‍♀️ 💂🏾‍♀️ 💂🏿‍♀️ 👷‍♂️ 👷🏻‍♂️ 👷🏼‍♂️ 👷🏽‍♂️ 👷🏾‍♂️ 👷🏿‍♂️ 👷‍♀️ 👷🏻‍♀️ 👷🏼‍♀️ 👷🏽‍♀️ 👷🏾‍♀️ 👷🏿‍♀️ 👳‍♂️ 👳🏻‍♂️ 👳🏼‍♂️ 👳🏽‍♂️ 👳🏾‍♂️ 👳🏿‍♂️ 👳‍♀️ 👳🏻‍♀️ 👳🏼‍♀️ 👳🏽‍♀️ 👳🏾‍♀️ 👳🏿‍♀️ 💆‍♂️ 💆🏻‍♂️ 💆🏼‍♂️ 💆🏽‍♂️ 💆🏾‍♂️ 💆🏿‍♂️ 💆‍♀️ 💆🏻‍♀️ 💆🏼‍♀️ 💆🏽‍♀️ 💆🏾‍♀️ 💆🏿‍♀️ 💇‍♂️ 💇🏻‍♂️ 💇🏼‍♂️ 💇🏽‍♂️ 💇🏾‍♂️ 💇🏿‍♂️ 💇‍♀️ 💇🏻‍♀️ 💇🏼‍♀️ 💇🏽‍♀️ 💇🏾‍♀️ 💇🏿‍♀️ 🚶‍♂️ 🚶🏻‍♂️ 🚶🏼‍♂️ 🚶🏽‍♂️ 🚶🏾‍♂️ 🚶🏿‍♂️ 🚶‍♀️ 🚶🏻‍♀️ 🚶🏼‍♀️ 🚶🏽‍♀️ 🚶🏾‍♀️ 🚶🏿‍♀️ 🏃‍♂️ 🏃🏻‍♂️ 🏃🏼‍♂️ 🏃🏽‍♂️ 🏃🏾‍♂️ 🏃🏿‍♂️ 🏃‍♀️ 🏃🏻‍♀️ 🏃🏼‍♀️ 🏃🏽‍♀️ 🏃🏾‍♀️ 🏃🏿‍♀️ 👯‍♂️ 👯‍♀️ 🏌️‍♂️ 🏌️‍♀️ 🏄‍♂️ 🏄🏻‍♂️ 🏄🏼‍♂️ 🏄🏽‍♂️ 🏄🏾‍♂️ 🏄🏿‍♂️ 🏄‍♀️ 🏄🏻‍♀️ 🏄🏼‍♀️ 🏄🏽‍♀️ 🏄🏾‍♀️ 🏄🏿‍♀️ 🚣‍♂️ 🚣🏻‍♂️ 🚣🏼‍♂️ 🚣🏽‍♂️ 🚣🏾‍♂️ 🚣🏿‍♂️ 🚣‍♀️ 🚣🏻‍♀️ 🚣🏼‍♀️ 🚣🏽‍♀️ 🚣🏾‍♀️ 🚣🏿‍♀️ 🏊‍♂️ 🏊🏻‍♂️ 🏊🏼‍♂️ 🏊🏽‍♂️ 🏊🏾‍♂️ 🏊🏿‍♂️ 🏊‍♀️ 🏊🏻‍♀️ 🏊🏼‍♀️ 🏊🏽‍♀️ 🏊🏾‍♀️ 🏊🏿‍♀️ ⛹️‍♂️ ⛹🏻‍♂️ ⛹🏼‍♂️ ⛹🏽‍♂️ ⛹🏾‍♂️ ⛹🏿‍♂️ ⛹️‍♀️ ⛹🏻‍♀️ ⛹🏼‍♀️ ⛹🏽‍♀️ ⛹🏾‍♀️ ⛹🏿‍♀️ 🏋️‍♂️ 🏋🏻‍♂️ 🏋🏼‍♂️ 🏋🏽‍♂️ 🏋🏾‍♂️ 🏋🏿‍♂️ 🏋️‍♀️ 🏋🏻‍♀️ 🏋🏼‍♀️ 🏋🏽‍♀️ 🏋🏾‍♀️ 🏋🏿‍♀️ 🚴‍♂️ 🚴🏻‍♂️ 🚴🏼‍♂️ 🚴🏽‍♂️ 🚴🏾‍♂️ 🚴🏿‍♂️ 🚴‍♀️ 🚴🏻‍♀️ 🚴🏼‍♀️ 🚴🏽‍♀️ 🚴🏾‍♀️ 🚴🏿‍♀️ 🚵‍♂️ 🚵🏻‍♂️ 🚵🏼‍♂️ 🚵🏽‍♂️ 🚵🏾‍♂️ 🚵🏿‍♂️ 🚵‍♀️ 🚵🏻‍♀️ 🚵🏼‍♀️ 🚵🏽‍♀️ 🚵🏾‍♀️ 🚵🏿‍♀️ 🤸‍♂️ 🤸🏻‍♂️ 🤸🏼‍♂️ 🤸🏽‍♂️ 🤸🏾‍♂️ 🤸🏿‍♂️ 🤸‍♀️ 🤸🏻‍♀️ 🤸🏼‍♀️ 🤸🏽‍♀️ 🤸🏾‍♀️ 🤸🏿‍♀️ 🤼‍♂️ 🤼‍♀️ 🤽‍♂️ 🤽🏻‍♂️ 🤽🏼‍♂️ 🤽🏽‍♂️ 🤽🏾‍♂️ 🤽🏿‍♂️ 🤽‍♀️ 🤽🏻‍♀️ 🤽🏼‍♀️ 🤽🏽‍♀️ 🤽🏾‍♀️ 🤽🏿‍♀️ 🤾‍♂️ 🤾🏻‍♂️ 🤾🏼‍♂️ 🤾🏽‍♂️ 🤾🏾‍♂️ 🤾🏿‍♂️ 🤾‍♀️ 🤾🏻‍♀️ 🤾🏼‍♀️ 🤾🏽‍♀️ 🤾🏾‍♀️ 🤾🏿‍♀️ 🤹‍♂️ 🤹🏻‍♂️ 🤹🏼‍♂️ 🤹🏽‍♂️ 🤹🏾‍♂️ 🤹🏿‍♂️ 🤹‍♀️ 🤹🏻‍♀️ 🤹🏼‍♀️ 🤹🏽‍♀️ 🤹🏾‍♀️ 🤹🏿‍♀️ 👨‍👩‍👦 👨‍👦 👨‍👦‍👦 👨‍👧 👨‍👧‍👦 👨‍👧‍👧 👩‍👦 👩‍👦‍👦 👩‍👧 👩‍👧‍👦 👩‍👧‍👧 ♀️ ♂️ ⚕️ 🏳️‍🌈 +26 🤩 🤪 🤭 🤫 🤨 🤮 🤯 🧐 🤬 🧡 🤟 🤟🏻 🤟🏼 🤟🏽 🤟🏾 🤟🏿 🤲 🤲🏻 🤲🏼 🤲🏽 🤲🏾 🤲🏿 🧠 🧒 🧒🏻 🧒🏼 🧒🏽 🧒🏾 🧒🏿 🧑 🧑🏻 🧑🏼 🧑🏽 🧑🏾 🧑🏿 🧔 🧔🏻 🧔🏼 🧔🏽 🧔🏾 🧔🏿 🧓 🧓🏻 🧓🏼 🧓🏽 🧓🏾 🧓🏿 🧕 🧕🏻 🧕🏼 🧕🏽 🧕🏾 🧕🏿 🤱 🤱🏻 🤱🏼 🤱🏽 🤱🏾 🤱🏿 🧙 🧙🏻 🧙🏼 🧙🏽 🧙🏾 🧙🏿 🧙‍♂️ 🧙🏻‍♂️ 🧙🏼‍♂️ 🧙🏽‍♂️ 🧙🏾‍♂️ 🧙🏿‍♂️ 🧙‍♀️ 🧙🏻‍♀️ 🧙🏼‍♀️ 🧙🏽‍♀️ 🧙🏾‍♀️ 🧙🏿‍♀️ 🧚 🧚🏻 🧚🏼 🧚🏽 🧚🏾 🧚🏿 🧚‍♂️ 🧚🏻‍♂️ 🧚🏼‍♂️ 🧚🏽‍♂️ 🧚🏾‍♂️ 🧚🏿‍♂️ 🧚‍♀️ 🧚🏻‍♀️ 🧚🏼‍♀️ 🧚🏽‍♀️ 🧚🏾‍♀️ 🧚🏿‍♀️ 🧛 🧛🏻 🧛🏼 🧛🏽 🧛🏾 🧛🏿 🧛‍♂️ 🧛🏻‍♂️ 🧛🏼‍♂️ 🧛🏽‍♂️ 🧛🏾‍♂️ 🧛🏿‍♂️ 🧛‍♀️ 🧛🏻‍♀️ 🧛🏼‍♀️ 🧛🏽‍♀️ 🧛🏾‍♀️ 🧛🏿‍♀️ 🧜 🧜🏻 🧜🏼 🧜🏽 🧜🏾 🧜🏿 🧜‍♂️ 🧜🏻‍♂️ 🧜🏼‍♂️ 🧜🏽‍♂️ 🧜🏾‍♂️ 🧜🏿‍♂️ 🧜‍♀️ 🧜🏻‍♀️ 🧜🏼‍♀️ 🧜🏽‍♀️ 🧜🏾‍♀️ 🧜🏿‍♀️ 🧝 🧝🏻 🧝🏼 🧝🏽 🧝🏾 🧝🏿 🧝‍♂️ 🧝🏻‍♂️ 🧝🏼‍♂️ 🧝🏽‍♂️ 🧝🏾‍♂️ 🧝🏿‍♂️ 🧝‍♀️ 🧝🏻‍♀️ 🧝🏼‍♀️ 🧝🏽‍♀️ 🧝🏾‍♀️ 🧝🏿‍♀️ 🧞 🧞‍♂️ 🧞‍♀️ 🧟 🧟‍♂️ 🧟‍♀️ 🕴🏻 🕴🏼 🕴🏽 🕴🏾 🕴🏿 🧖 🧖🏻 🧖🏼 🧖🏽 🧖🏾 🧖🏿 🧖‍♂️ 🧖🏻‍♂️ 🧖🏼‍♂️ 🧖🏽‍♂️ 🧖🏾‍♂️ 🧖🏿‍♂️ 🧖‍♀️ 🧖🏻‍♀️ 🧖🏼‍♀️ 🧖🏽‍♀️ 🧖🏾‍♀️ 🧖🏿‍♀️ 🧗 🧗🏻 🧗🏼 🧗🏽 🧗🏾 🧗🏿 🧗‍♂️ 🧗🏻‍♂️ 🧗🏼‍♂️ 🧗🏽‍♂️ 🧗🏾‍♂️ 🧗🏿‍♂️ 🧗‍♀️ 🧗🏻‍♀️ 🧗🏼‍♀️ 🧗🏽‍♀️ 🧗🏾‍♀️ 🧗🏿‍♀️ 🏇🏻 🏇🏼 🏇🏽 🏇🏾 🏇🏿 🏂🏻 🏂🏼 🏂🏽 🏂🏾 🏂🏿 🏌🏻 🏌🏼 🏌🏽 🏌🏾 🏌🏿 🏌🏻‍♂️ 🏌🏼‍♂️ 🏌🏽‍♂️ 🏌🏾‍♂️ 🏌🏿‍♂️ 🏌🏻‍♀️ 🏌🏼‍♀️ 🏌🏽‍♀️ 🏌🏾‍♀️ 🏌🏿‍♀️ 🧘 🧘🏻 🧘🏼 🧘🏽 🧘🏾 🧘🏿 🧘‍♂️ 🧘🏻‍♂️ 🧘🏼‍♂️ 🧘🏽‍♂️ 🧘🏾‍♂️ 🧘🏿‍♂️ 🧘‍♀️ 🧘🏻‍♀️ 🧘🏼‍♀️ 🧘🏽‍♀️ 🧘🏾‍♀️ 🧘🏿‍♀️ 🛌🏻 🛌🏼 🛌🏽 🛌🏾 🛌🏿 👩‍❤️‍💋‍👨 👩‍❤️‍👨 🦓 🦒 🦔 🦕 🦖 🦗 🥥 🥦 🥨 🥩 🥪 🥣 🥫 🥟 🥠 🥡 🥧 🥤 🥢 🛸 🛷 🥌 🧣 🧤 🧥 🧦 🧢 🇺🇳 🏴󠁧󠁢󠁥󠁮󠁧󠁿 🏴󠁧󠁢󠁳󠁣󠁴󠁿 🏴󠁧󠁢󠁷󠁬󠁳󠁿 +28 🥰 🥵 🥶 🥴 🥳 🥺 🦵 🦵🏻 🦵🏼 🦵🏽 🦵🏾 🦵🏿 🦶 🦶🏻 🦶🏼 🦶🏽 🦶🏾 🦶🏿 🦷 🦴 👨‍🦰 👨🏻‍🦰 👨🏼‍🦰 👨🏽‍🦰 👨🏾‍🦰 👨🏿‍🦰 👨‍🦱 👨🏻‍🦱 👨🏼‍🦱 👨🏽‍🦱 👨🏾‍🦱 👨🏿‍🦱 👨‍🦳 👨🏻‍🦳 👨🏼‍🦳 👨🏽‍🦳 👨🏾‍🦳 👨🏿‍🦳 👨‍🦲 👨🏻‍🦲 👨🏼‍🦲 👨🏽‍🦲 👨🏾‍🦲 👨🏿‍🦲 👩‍🦰 👩🏻‍🦰 👩🏼‍🦰 👩🏽‍🦰 👩🏾‍🦰 👩🏿‍🦰 👩‍🦱 👩🏻‍🦱 👩🏼‍🦱 👩🏽‍🦱 👩🏾‍🦱 👩🏿‍🦱 👩‍🦳 👩🏻‍🦳 👩🏼‍🦳 👩🏽‍🦳 👩🏾‍🦳 👩🏿‍🦳 👩‍🦲 👩🏻‍🦲 👩🏼‍🦲 👩🏽‍🦲 👩🏾‍🦲 👩🏿‍🦲 🦸 🦸🏻 🦸🏼 🦸🏽 🦸🏾 🦸🏿 🦸‍♂️ 🦸🏻‍♂️ 🦸🏼‍♂️ 🦸🏽‍♂️ 🦸🏾‍♂️ 🦸🏿‍♂️ 🦸‍♀️ 🦸🏻‍♀️ 🦸🏼‍♀️ 🦸🏽‍♀️ 🦸🏾‍♀️ 🦸🏿‍♀️ 🦹 🦹🏻 🦹🏼 🦹🏽 🦹🏾 🦹🏿 🦹‍♂️ 🦹🏻‍♂️ 🦹🏼‍♂️ 🦹🏽‍♂️ 🦹🏾‍♂️ 🦹🏿‍♂️ 🦹‍♀️ 🦹🏻‍♀️ 🦹🏼‍♀️ 🦹🏽‍♀️ 🦹🏾‍♀️ 🦹🏿‍♀️ 🦝 🦙 🦛 🦘 🦡 🦢 🦚 🦜 🦞 🦟 🦠 🥭 🥬 🥯 🧂 🥮 🧁 🧭 🧱 🛹 🧳 🧨 🧧 🥎 🥏 🥍 🧩 🧸 ♟️ 🧵 🧶 🥽 🥼 🥾 🥿 🧮 🧾 🧰 🧲 🧪 🧫 🧬 🧴 🧷 🧹 🧺 🧻 🧼 🧽 🧯 🧿 ♾️ 🏴‍☠️ +29 🥱 🤎 🤍 🤏 🤏🏻 🤏🏼 🤏🏽 🤏🏾 🤏🏿 🦾 🦿 🦻 🦻🏻 🦻🏼 🦻🏽 🦻🏾 🦻🏿 🧏 🧏🏻 🧏🏼 🧏🏽 🧏🏾 🧏🏿 🧏‍♂️ 🧏🏻‍♂️ 🧏🏼‍♂️ 🧏🏽‍♂️ 🧏🏾‍♂️ 🧏🏿‍♂️ 🧏‍♀️ 🧏🏻‍♀️ 🧏🏼‍♀️ 🧏🏽‍♀️ 🧏🏾‍♀️ 🧏🏿‍♀️ 🧍 🧍🏻 🧍🏼 🧍🏽 🧍🏾 🧍🏿 🧍‍♂️ 🧍🏻‍♂️ 🧍🏼‍♂️ 🧍🏽‍♂️ 🧍🏾‍♂️ 🧍🏿‍♂️ 🧍‍♀️ 🧍🏻‍♀️ 🧍🏼‍♀️ 🧍🏽‍♀️ 🧍🏾‍♀️ 🧍🏿‍♀️ 🧎 🧎🏻 🧎🏼 🧎🏽 🧎🏾 🧎🏿 🧎‍♂️ 🧎🏻‍♂️ 🧎🏼‍♂️ 🧎🏽‍♂️ 🧎🏾‍♂️ 🧎🏿‍♂️ 🧎‍♀️ 🧎🏻‍♀️ 🧎🏼‍♀️ 🧎🏽‍♀️ 🧎🏾‍♀️ 🧎🏿‍♀️ 👨‍🦯 👨🏻‍🦯 👨🏼‍🦯 👨🏽‍🦯 👨🏾‍🦯 👨🏿‍🦯 👩‍🦯 👩🏻‍🦯 👩🏼‍🦯 👩🏽‍🦯 👩🏾‍🦯 👩🏿‍🦯 👨‍🦼 👨🏻‍🦼 👨🏼‍🦼 👨🏽‍🦼 👨🏾‍🦼 👨🏿‍🦼 👩‍🦼 👩🏻‍🦼 👩🏼‍🦼 👩🏽‍🦼 👩🏾‍🦼 👩🏿‍🦼 👨‍🦽 👨🏻‍🦽 👨🏼‍🦽 👨🏽‍🦽 👨🏾‍🦽 👨🏿‍🦽 👩‍🦽 👩🏻‍🦽 👩🏼‍🦽 👩🏽‍🦽 👩🏾‍🦽 👩🏿‍🦽 🧑‍🤝‍🧑 👭🏻 👭🏼 👭🏽 👭🏾 👭🏿 👫🏻 👫🏼 👫🏽 👫🏾 👫🏿 👬🏻 👬🏼 👬🏽 👬🏾 👬🏿 🦧 🦮 🐕‍🦺 🦥 🦦 🦨 🦩 🦪 🧄 🧅 🧇 🧆 🧈 🧃 🧉 🧊 🛕 🦽 🦼 🛺 🪂 🪐 🤿 🪀 🪁 🦺 🥻 🩱 🩲 🩳 🩰 🪕 🪔 🪓 🦯 🩸 🩹 🩺 🪑 🪒 🟠 🟡 🟢 🟣 🟤 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🇧🇱 🇧🇶 🇲🇶 🇷🇪 🇹🇫 🇽🇰 +30 🥲 🥸 🤌 🤌🏻 🤌🏼 🤌🏽 🤌🏾 🤌🏿 🫀 🫁 🧑‍🦰 🧑🏻‍🦰 🧑🏼‍🦰 🧑🏽‍🦰 🧑🏾‍🦰 🧑🏿‍🦰 🧑‍🦱 🧑🏻‍🦱 🧑🏼‍🦱 🧑🏽‍🦱 🧑🏾‍🦱 🧑🏿‍🦱 🧑‍🦳 🧑🏻‍🦳 🧑🏼‍🦳 🧑🏽‍🦳 🧑🏾‍🦳 🧑🏿‍🦳 🧑‍🦲 🧑🏻‍🦲 🧑🏼‍🦲 🧑🏽‍🦲 🧑🏾‍🦲 🧑🏿‍🦲 🧑‍⚕️ 🧑🏻‍⚕️ 🧑🏼‍⚕️ 🧑🏽‍⚕️ 🧑🏾‍⚕️ 🧑🏿‍⚕️ 🧑‍🎓 🧑🏻‍🎓 🧑🏼‍🎓 🧑🏽‍🎓 🧑🏾‍🎓 🧑🏿‍🎓 🧑‍🏫 🧑🏻‍🏫 🧑🏼‍🏫 🧑🏽‍🏫 🧑🏾‍🏫 🧑🏿‍🏫 🧑‍⚖️ 🧑🏻‍⚖️ 🧑🏼‍⚖️ 🧑🏽‍⚖️ 🧑🏾‍⚖️ 🧑🏿‍⚖️ 🧑‍🌾 🧑🏻‍🌾 🧑🏼‍🌾 🧑🏽‍🌾 🧑🏾‍🌾 🧑🏿‍🌾 🧑‍🍳 🧑🏻‍🍳 🧑🏼‍🍳 🧑🏽‍🍳 🧑🏾‍🍳 🧑🏿‍🍳 🧑‍🔧 🧑🏻‍🔧 🧑🏼‍🔧 🧑🏽‍🔧 🧑🏾‍🔧 🧑🏿‍🔧 🧑‍🏭 🧑🏻‍🏭 🧑🏼‍🏭 🧑🏽‍🏭 🧑🏾‍🏭 🧑🏿‍🏭 🧑‍💼 🧑🏻‍💼 🧑🏼‍💼 🧑🏽‍💼 🧑🏾‍💼 🧑🏿‍💼 🧑‍🔬 🧑🏻‍🔬 🧑🏼‍🔬 🧑🏽‍🔬 🧑🏾‍🔬 🧑🏿‍🔬 🧑‍💻 🧑🏻‍💻 🧑🏼‍💻 🧑🏽‍💻 🧑🏾‍💻 🧑🏿‍💻 🧑‍🎤 🧑🏻‍🎤 🧑🏼‍🎤 🧑🏽‍🎤 🧑🏾‍🎤 🧑🏿‍🎤 🧑‍🎨 🧑🏻‍🎨 🧑🏼‍🎨 🧑🏽‍🎨 🧑🏾‍🎨 🧑🏿‍🎨 🧑‍✈️ 🧑🏻‍✈️ 🧑🏼‍✈️ 🧑🏽‍✈️ 🧑🏾‍✈️ 🧑🏿‍✈️ 🧑‍🚀 🧑🏻‍🚀 🧑🏼‍🚀 🧑🏽‍🚀 🧑🏾‍🚀 🧑🏿‍🚀 🧑‍🚒 🧑🏻‍🚒 🧑🏼‍🚒 🧑🏽‍🚒 🧑🏾‍🚒 🧑🏿‍🚒 🥷 🥷🏻 🥷🏼 🥷🏽 🥷🏾 🥷🏿 🤵‍♂️ 🤵🏻‍♂️ 🤵🏼‍♂️ 🤵🏽‍♂️ 🤵🏾‍♂️ 🤵🏿‍♂️ 🤵‍♀️ 🤵🏻‍♀️ 🤵🏼‍♀️ 🤵🏽‍♀️ 🤵🏾‍♀️ 🤵🏿‍♀️ 👰‍♂️ 👰🏻‍♂️ 👰🏼‍♂️ 👰🏽‍♂️ 👰🏾‍♂️ 👰🏿‍♂️ 👰‍♀️ 👰🏻‍♀️ 👰🏼‍♀️ 👰🏽‍♀️ 👰🏾‍♀️ 👰🏿‍♀️ 👩‍🍼 👩🏻‍🍼 👩🏼‍🍼 👩🏽‍🍼 👩🏾‍🍼 👩🏿‍🍼 👨‍🍼 👨🏻‍🍼 👨🏼‍🍼 👨🏽‍🍼 👨🏾‍🍼 👨🏿‍🍼 🧑‍🍼 🧑🏻‍🍼 🧑🏼‍🍼 🧑🏽‍🍼 🧑🏾‍🍼 🧑🏿‍🍼 🧑‍🎄 🧑🏻‍🎄 🧑🏼‍🎄 🧑🏽‍🎄 🧑🏾‍🎄 🧑🏿‍🎄 🧑‍🦯 🧑🏻‍🦯 🧑🏼‍🦯 🧑🏽‍🦯 🧑🏾‍🦯 🧑🏿‍🦯 🧑‍🦼 🧑🏻‍🦼 🧑🏼‍🦼 🧑🏽‍🦼 🧑🏾‍🦼 🧑🏿‍🦼 🧑‍🦽 🧑🏻‍🦽 🧑🏼‍🦽 🧑🏽‍🦽 🧑🏾‍🦽 🧑🏿‍🦽 🫂 🐈‍⬛ 🦬 🦣 🦫 🐻‍❄️ 🦤 🪶 🦭 🪲 🪳 🪰 🪱 🪴 🫐 🫒 🫑 🫓 🫔 🫕 🫖 🧋 🪨 🪵 🛖 🛻 🛼 🪄 🪅 🪆 🪡 🪢 🩴 🪖 🪗 🪘 🪙 🪃 🪚 🪛 🪝 🪜 🛗 🪞 🪟 🪠 🪤 🪣 🪥 🪦 🪧 ⚧️ 🏳️‍⚧️ 🇩🇬 🇪🇦 🇪🇭 🇫🇰 🇬🇫 🇬🇵 🇬🇸 🇲🇫 🇳🇨 🇵🇲 🇼🇫 🇾🇹 +31 😶‍🌫️ 😮‍💨 😵‍💫 ❤️‍🔥 ❤️‍🩹 🧔‍♂️ 🧔🏻‍♂️ 🧔🏼‍♂️ 🧔🏽‍♂️ 🧔🏾‍♂️ 🧔🏿‍♂️ 🧔‍♀️ 🧔🏻‍♀️ 🧔🏼‍♀️ 🧔🏽‍♀️ 🧔🏾‍♀️ 🧔🏿‍♀️ 💏🏻 💏🏼 💏🏽 💏🏾 💏🏿 💑🏻 💑🏼 💑🏽 💑🏾 💑🏿 +32 🫠 🫢 🫣 🫡 🫥 🫤 🥹 🫱 🫱🏻 🫱🏼 🫱🏽 🫱🏾 🫱🏿 🫲 🫲🏻 🫲🏼 🫲🏽 🫲🏾 🫲🏿 🫳 🫳🏻 🫳🏼 🫳🏽 🫳🏾 🫳🏿 🫴 🫴🏻 🫴🏼 🫴🏽 🫴🏾 🫴🏿 🫰 🫰🏻 🫰🏼 🫰🏽 🫰🏾 🫰🏿 🫵 🫵🏻 🫵🏼 🫵🏽 🫵🏾 🫵🏿 🫶 🫶🏻 🫶🏼 🫶🏽 🫶🏾 🫶🏿 🫦 🫅 🫅🏻 🫅🏼 🫅🏽 🫅🏾 🫅🏿 🫃 🫃🏻 🫃🏼 🫃🏽 🫃🏾 🫃🏿 🫄 🫄🏻 🫄🏼 🫄🏽 🫄🏾 🫄🏿 🧌 🪸 🪷 🪹 🪺 🫘 🫗 🫙 🛝 🛞 🛟 🪩 🪫 🩼 🩻 🫧 🪬 🪪 🟰 +33 🫨 🩷 🩵 🩶 🫷 🫷🏻 🫷🏼 🫷🏽 🫷🏾 🫷🏿 🫸 🫸🏻 🫸🏼 🫸🏽 🫸🏾 🫸🏿 🫎 🫏 🪽 🐦‍⬛ 🪿 🪼 🪻 🫚 🫛 🪭 🪮 🪇 🪈 🪯 🛜 +34 🙂‍↔️ 🙂‍↕️ 🚶‍➡️ 🚶🏻‍➡️ 🚶🏼‍➡️ 🚶🏽‍➡️ 🚶🏾‍➡️ 🚶🏿‍➡️ 🚶‍♀️‍➡️ 🚶🏻‍♀️‍➡️ 🚶🏼‍♀️‍➡️ 🚶🏽‍♀️‍➡️ 🚶🏾‍♀️‍➡️ 🚶🏿‍♀️‍➡️ 🚶‍♂️‍➡️ 🚶🏻‍♂️‍➡️ 🚶🏼‍♂️‍➡️ 🚶🏽‍♂️‍➡️ 🚶🏾‍♂️‍➡️ 🚶🏿‍♂️‍➡️ 🧎‍➡️ 🧎🏻‍➡️ 🧎🏼‍➡️ 🧎🏽‍➡️ 🧎🏾‍➡️ 🧎🏿‍➡️ 🧎‍♀️‍➡️ 🧎🏻‍♀️‍➡️ 🧎🏼‍♀️‍➡️ 🧎🏽‍♀️‍➡️ 🧎🏾‍♀️‍➡️ 🧎🏿‍♀️‍➡️ 🧎‍♂️‍➡️ 🧎🏻‍♂️‍➡️ 🧎🏼‍♂️‍➡️ 🧎🏽‍♂️‍➡️ 🧎🏾‍♂️‍➡️ 🧎🏿‍♂️‍➡️ 🧑‍🦯‍➡️ 🧑🏻‍🦯‍➡️ 🧑🏼‍🦯‍➡️ 🧑🏽‍🦯‍➡️ 🧑🏾‍🦯‍➡️ 🧑🏿‍🦯‍➡️ 👨‍🦯‍➡️ 👨🏻‍🦯‍➡️ 👨🏼‍🦯‍➡️ 👨🏽‍🦯‍➡️ 👨🏾‍🦯‍➡️ 👨🏿‍🦯‍➡️ 👩‍🦯‍➡️ 👩🏻‍🦯‍➡️ 👩🏼‍🦯‍➡️ 👩🏽‍🦯‍➡️ 👩🏾‍🦯‍➡️ 👩🏿‍🦯‍➡️ 🧑‍🦼‍➡️ 🧑🏻‍🦼‍➡️ 🧑🏼‍🦼‍➡️ 🧑🏽‍🦼‍➡️ 🧑🏾‍🦼‍➡️ 🧑🏿‍🦼‍➡️ 👨‍🦼‍➡️ 👨🏻‍🦼‍➡️ 👨🏼‍🦼‍➡️ 👨🏽‍🦼‍➡️ 👨🏾‍🦼‍➡️ 👨🏿‍🦼‍➡️ 👩‍🦼‍➡️ 👩🏻‍🦼‍➡️ 👩🏼‍🦼‍➡️ 👩🏽‍🦼‍➡️ 👩🏾‍🦼‍➡️ 👩🏿‍🦼‍➡️ 🧑‍🦽‍➡️ 🧑🏻‍🦽‍➡️ 🧑🏼‍🦽‍➡️ 🧑🏽‍🦽‍➡️ 🧑🏾‍🦽‍➡️ 🧑🏿‍🦽‍➡️ 👨‍🦽‍➡️ 👨🏻‍🦽‍➡️ 👨🏼‍🦽‍➡️ 👨🏽‍🦽‍➡️ 👨🏾‍🦽‍➡️ 👨🏿‍🦽‍➡️ 👩‍🦽‍➡️ 👩🏻‍🦽‍➡️ 👩🏼‍🦽‍➡️ 👩🏽‍🦽‍➡️ 👩🏾‍🦽‍➡️ 👩🏿‍🦽‍➡️ 🏃‍➡️ 🏃🏻‍➡️ 🏃🏼‍➡️ 🏃🏽‍➡️ 🏃🏾‍➡️ 🏃🏿‍➡️ 🏃‍♀️‍➡️ 🏃🏻‍♀️‍➡️ 🏃🏼‍♀️‍➡️ 🏃🏽‍♀️‍➡️ 🏃🏾‍♀️‍➡️ 🏃🏿‍♀️‍➡️ 🏃‍♂️‍➡️ 🏃🏻‍♂️‍➡️ 🏃🏼‍♂️‍➡️ 🏃🏽‍♂️‍➡️ 🏃🏾‍♂️‍➡️ 🏃🏿‍♂️‍➡️ 🧑‍🧑‍🧒 🧑‍🧑‍🧒‍🧒 🧑‍🧒 🧑‍🧒‍🧒 🐦‍🔥 🍋‍🟩 🍄‍🟫 ⛓️‍💥 +35 🫩 🫆 🪾 🫜 🪉 🪏 🫟 🇨🇶 \ No newline at end of file diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/DynamicGridKeyboard.java b/app/src/main/java/helium314/keyboard/keyboard/emoji/DynamicGridKeyboard.java index 599895a6c..6e9c4a36c 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/DynamicGridKeyboard.java +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/DynamicGridKeyboard.java @@ -11,6 +11,7 @@ import static helium314.keyboard.keyboard.internal.keyboard_parser.EmojiParserKt import android.content.SharedPreferences; import android.text.TextUtils; +import helium314.keyboard.latin.common.Constants; import helium314.keyboard.latin.settings.Defaults; import helium314.keyboard.latin.utils.Log; @@ -34,8 +35,6 @@ import java.util.List; */ final class DynamicGridKeyboard extends Keyboard { private static final String TAG = DynamicGridKeyboard.class.getSimpleName(); - private static final int TEMPLATE_KEY_CODE_0 = 0x30; - private static final int TEMPLATE_KEY_CODE_1 = 0x31; private final Object mLock = new Object(); private final SharedPreferences mPrefs; @@ -60,8 +59,8 @@ final class DynamicGridKeyboard extends Keyboard { mBaseWidth = width - paddingWidth; mOccupiedWidth = width; final float spacerWidth = Settings.getValues().mSplitKeyboardSpacerRelativeWidth * mBaseWidth; - final Key key0 = getTemplateKey(TEMPLATE_KEY_CODE_0); - final Key key1 = getTemplateKey(TEMPLATE_KEY_CODE_1); + final Key key0 = getTemplateKey(Constants.RECENTS_TEMPLATE_KEY_CODE_0); + final Key key1 = getTemplateKey(Constants.RECENTS_TEMPLATE_KEY_CODE_1); final int horizontalGap = Math.abs(key1.getX() - key0.getX()) - key0.getWidth(); final float widthScale = determineWidthScale(key0.getWidth() + horizontalGap); mHorizontalGap = (int) (horizontalGap * widthScale); @@ -213,7 +212,7 @@ final class DynamicGridKeyboard extends Keyboard { } // fall back to creating the key - return new Key(getTemplateKey(TEMPLATE_KEY_CODE_0), null, null, Key.BACKGROUND_TYPE_EMPTY, code, null); + return new Key(getTemplateKey(Constants.RECENTS_TEMPLATE_KEY_CODE_0), null, null, Key.BACKGROUND_TYPE_EMPTY, code, null); } private Key getKeyByOutputText(final Collection keyboards, @@ -227,7 +226,7 @@ final class DynamicGridKeyboard extends Keyboard { } // fall back to creating the key - return new Key(getTemplateKey(TEMPLATE_KEY_CODE_0), null, null, Key.BACKGROUND_TYPE_EMPTY, 0, outputText); + return new Key(getTemplateKey(Constants.RECENTS_TEMPLATE_KEY_CODE_0), null, null, Key.BACKGROUND_TYPE_EMPTY, 0, outputText); } public void loadRecentKeys(final Collection keyboards) { diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/SupportedEmojis.kt b/app/src/main/java/helium314/keyboard/keyboard/emoji/SupportedEmojis.kt new file mode 100644 index 000000000..fcc304ebe --- /dev/null +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/SupportedEmojis.kt @@ -0,0 +1,26 @@ +package helium314.keyboard.keyboard.emoji + +import android.content.Context +import helium314.keyboard.latin.settings.Defaults +import helium314.keyboard.latin.settings.Settings +import helium314.keyboard.latin.utils.Log +import helium314.keyboard.latin.utils.prefs + +object SupportedEmojis { + private val unsupportedEmojis = hashSetOf() + + fun load(context: Context) { + val maxSdk = context.prefs().getInt(Settings.PREF_EMOJI_MAX_SDK, Defaults.PREF_EMOJI_MAX_SDK) + Log.i("test", "max $maxSdk") + unsupportedEmojis.clear() + context.assets.open("emoji/minApi.txt").reader().readLines().forEach { + val s = it.split(" ") + val minApi = s.first().toInt() + if (minApi > maxSdk) + unsupportedEmojis.addAll(s.drop(1)) + } + Log.i("test", "have ${unsupportedEmojis.size}, longest emoji: ${unsupportedEmojis.maxOfOrNull { it.length }}") + } + + fun isSupported(emoji: String) = emoji !in unsupportedEmojis +} diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardBuilder.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardBuilder.kt index 169894f3d..a8e43f294 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardBuilder.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardBuilder.kt @@ -48,7 +48,7 @@ open class KeyboardBuilder(protected val mContext: Context, if (id.isEmojiKeyboard) { mParams.mAllowRedundantPopupKeys = true readAttributes(R.xml.kbd_emoji) - keysInRows = EmojiParser(mParams, mContext, Settings.getValues().mEmojiMaxSdk).parse() + keysInRows = EmojiParser(mParams, mContext).parse() } else { try { setupParams() diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt index 4e9db5422..414f7cc2b 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt @@ -5,38 +5,45 @@ import android.content.Context import helium314.keyboard.keyboard.Key import helium314.keyboard.keyboard.Key.KeyParams import helium314.keyboard.keyboard.KeyboardId +import helium314.keyboard.keyboard.emoji.SupportedEmojis import helium314.keyboard.keyboard.internal.KeyboardParams import helium314.keyboard.keyboard.internal.keyboard_parser.floris.KeyCode import helium314.keyboard.latin.R +import helium314.keyboard.latin.common.Constants import helium314.keyboard.latin.common.StringUtils import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.utils.ResourceUtils import kotlin.math.sqrt -class EmojiParser(private val params: KeyboardParams, private val context: Context, private val maxSdk: Int) { +class EmojiParser(private val params: KeyboardParams, private val context: Context) { fun parse(): ArrayList> { - val emojiArrayId = when (params.mId.mElementId) { - KeyboardId.ELEMENT_EMOJI_RECENTS -> R.array.emoji_recents - KeyboardId.ELEMENT_EMOJI_CATEGORY1 -> R.array.emoji_smileys_emotion - KeyboardId.ELEMENT_EMOJI_CATEGORY2 -> R.array.emoji_people_body - KeyboardId.ELEMENT_EMOJI_CATEGORY3 -> R.array.emoji_animals_nature - KeyboardId.ELEMENT_EMOJI_CATEGORY4 -> R.array.emoji_food_drink - KeyboardId.ELEMENT_EMOJI_CATEGORY5 -> R.array.emoji_travel_places - KeyboardId.ELEMENT_EMOJI_CATEGORY6 -> R.array.emoji_activities - KeyboardId.ELEMENT_EMOJI_CATEGORY7 -> R.array.emoji_objects - KeyboardId.ELEMENT_EMOJI_CATEGORY8 -> R.array.emoji_symbols - KeyboardId.ELEMENT_EMOJI_CATEGORY9 -> R.array.emoji_flags - KeyboardId.ELEMENT_EMOJI_CATEGORY10 -> R.array.emoji_emoticons - else -> throw(IllegalStateException("can only parse emoji categories where an array exists")) + val emojiFileName = when (params.mId.mElementId) { + KeyboardId.ELEMENT_EMOJI_CATEGORY1 -> "SMILEYS_AND_EMOTION.txt" + KeyboardId.ELEMENT_EMOJI_CATEGORY2 -> "PEOPLE_AND_BODY.txt" + KeyboardId.ELEMENT_EMOJI_CATEGORY3 -> "ANIMALS_AND_NATURE.txt" + KeyboardId.ELEMENT_EMOJI_CATEGORY4 -> "FOOD_AND_DRINK.txt" + KeyboardId.ELEMENT_EMOJI_CATEGORY5 -> "TRAVEL_AND_PLACES.txt" + KeyboardId.ELEMENT_EMOJI_CATEGORY6 -> "ACTIVITIES.txt" + KeyboardId.ELEMENT_EMOJI_CATEGORY7 -> "OBJECTS.txt" + KeyboardId.ELEMENT_EMOJI_CATEGORY8 -> "SYMBOLS.txt" + KeyboardId.ELEMENT_EMOJI_CATEGORY9 -> "FLAGS.txt" + KeyboardId.ELEMENT_EMOJI_CATEGORY10 -> "EMOTICONS.txt" + else -> null } - val emojiArray = context.resources.getStringArray(emojiArrayId) - val popupEmojisArray = if (params.mId.mElementId != KeyboardId.ELEMENT_EMOJI_CATEGORY2) null - else context.resources.getStringArray(R.array.emoji_people_body_more) - if (popupEmojisArray != null && emojiArray.size != popupEmojisArray.size) - throw(IllegalStateException("Inconsistent array size between codesArray and popupKeysArray")) + val emojiLines = if (emojiFileName == null) { + listOf( // special template keys for recents category + StringUtils.newSingleCodePointString(Constants.RECENTS_TEMPLATE_KEY_CODE_0), + StringUtils.newSingleCodePointString(Constants.RECENTS_TEMPLATE_KEY_CODE_1), + ) + } else { + context.assets.open("emoji/$emojiFileName").reader().use { it.readLines() } + } + return parseLines(emojiLines) + } - val row = ArrayList(emojiArray.size) + private fun parseLines(lines: List): ArrayList> { + val row = ArrayList(lines.size) var currentX = params.mLeftPadding.toFloat() val currentY = params.mTopPadding.toFloat() // no need to ever change, assignment to rows into rows is done in DynamicGridKeyboard @@ -56,8 +63,8 @@ class EmojiParser(private val params: KeyboardParams, private val context: Conte } - emojiArray.forEachIndexed { i, codeArraySpec -> - val keyParams = parseEmojiKey(codeArraySpec, popupEmojisArray?.get(i)?.takeIf { it.isNotEmpty() }) ?: return@forEachIndexed + lines.forEach { line -> + val keyParams = parseEmojiKeyNew(line) ?: return@forEach keyParams.xPos = currentX keyParams.yPos = currentY keyParams.mAbsoluteWidth = keyWidth @@ -68,44 +75,30 @@ class EmojiParser(private val params: KeyboardParams, private val context: Conte return arrayListOf(row) } - private fun getLabelAndCode(spec: String): Pair? { - val specAndSdk = spec.split("||") - if (specAndSdk.getOrNull(1)?.toIntOrNull()?.let { it > maxSdk } == true) return null - if ("," !in specAndSdk.first()) { - val code = specAndSdk.first().toIntOrNull(16) ?: return specAndSdk.first() to KeyCode.MULTIPLE_CODE_POINTS // text emojis - val label = StringUtils.newSingleCodePointString(code) - return label to code + private fun parseEmojiKeyNew(line: String): KeyParams? { + if (!line.contains(" ") || params.mId.mElementId == KeyboardId.ELEMENT_EMOJI_CATEGORY10) { + // single emoji without popups, or emoticons (there is one that contains space...) + return if (!SupportedEmojis.isSupported(line)) null + else KeyParams(line, line.getCode(), null, null, Key.LABEL_FLAGS_FONT_NORMAL, params) } - val labelBuilder = StringBuilder() - for (codePointString in specAndSdk.first().split(",")) { - val cp = codePointString.toInt(16) - labelBuilder.appendCodePoint(cp) - } - return labelBuilder.toString() to KeyCode.MULTIPLE_CODE_POINTS - } - - private fun parseEmojiKey(spec: String, popupKeysString: String? = null): KeyParams? { - val (label, code) = getLabelAndCode(spec) ?: return null - val sb = StringBuilder() - popupKeysString?.split(";")?.let { popupKeys -> - popupKeys.forEach { - val (mkLabel, _) = getLabelAndCode(it) ?: return@forEach - sb.append(mkLabel).append(",") - } - } - val popupKeysSpec = if (sb.isNotEmpty()) { - sb.deleteCharAt(sb.length - 1) - sb.toString() - } else null + val split = line.split(" ") + val label = split.first() + if (!SupportedEmojis.isSupported(label)) return null + val popupKeysSpec = split.drop(1).filter { SupportedEmojis.isSupported(it) } + .takeIf { it.isNotEmpty() }?.joinToString(",") return KeyParams( label, - code, + label.getCode(), if (popupKeysSpec != null) EMOJI_HINT_LABEL else null, popupKeysSpec, Key.LABEL_FLAGS_FONT_NORMAL, params ) } + + private fun String.getCode(): Int = + if (StringUtils.codePointCount(this) != 1) KeyCode.MULTIPLE_CODE_POINTS + else Character.codePointAt(this, 0) } const val EMOJI_HINT_LABEL = "◥" diff --git a/app/src/main/java/helium314/keyboard/latin/App.kt b/app/src/main/java/helium314/keyboard/latin/App.kt index 904cc028b..2f0920399 100644 --- a/app/src/main/java/helium314/keyboard/latin/App.kt +++ b/app/src/main/java/helium314/keyboard/latin/App.kt @@ -6,6 +6,7 @@ import android.content.Context import androidx.core.content.edit import helium314.keyboard.keyboard.ColorSetting import helium314.keyboard.keyboard.KeyboardTheme +import helium314.keyboard.keyboard.emoji.SupportedEmojis import helium314.keyboard.keyboard.internal.keyboard_parser.floris.KeyCode.checkAndConvertCode import helium314.keyboard.latin.common.ColorType import helium314.keyboard.latin.common.Constants.Separators @@ -52,6 +53,7 @@ class App : Application() { app = this Defaults.initDynamicDefaults(this) LayoutUtilsCustom.removeMissingLayouts(this) // only after version upgrade + SupportedEmojis.load(this) val packageInfo = packageManager.getPackageInfo(packageName, 0) @Suppress("DEPRECATION") diff --git a/app/src/main/java/helium314/keyboard/latin/common/Constants.java b/app/src/main/java/helium314/keyboard/latin/common/Constants.java index 4dedec0ec..65df85cec 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/Constants.java +++ b/app/src/main/java/helium314/keyboard/latin/common/Constants.java @@ -197,6 +197,8 @@ public final class Constants { public static final int CODE_GRAVE_ACCENT = '`'; public static final int CODE_CIRCUMFLEX_ACCENT = '^'; public static final int CODE_TILDE = '~'; + public static final int RECENTS_TEMPLATE_KEY_CODE_0 = 0x30; + public static final int RECENTS_TEMPLATE_KEY_CODE_1 = 0x31; public static final String REGEXP_PERIOD = "\\."; public static final String STRING_SPACE = " "; diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt index 4a38c6fc8..9f84c43fa 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt @@ -156,7 +156,6 @@ object Defaults { const val PREF_REMOVE_REDUNDANT_POPUPS = false const val PREF_SPACE_BAR_TEXT = "" const val PREF_TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss" - @JvmField val PREF_EMOJI_MAX_SDK = Build.VERSION.SDK_INT const val PREF_EMOJI_RECENT_KEYS = "" const val PREF_LAST_SHOWN_EMOJI_CATEGORY_PAGE_ID = 0 diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java index df015aa84..862609c08 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java @@ -145,7 +145,6 @@ public class SettingsValues { public final SettingsValuesForSuggestion mSettingsValuesForSuggestion; public final boolean mIncognitoModeEnabled; public final boolean mLongPressSymbolsForNumpad; - public final int mEmojiMaxSdk; // User-defined colors public final Colors mColors; @@ -287,7 +286,6 @@ public class SettingsValues { mAlphaAfterNumpadAndSpace = prefs.getBoolean(Settings.PREF_ABC_AFTER_NUMPAD_SPACE, Defaults.PREF_ABC_AFTER_NUMPAD_SPACE); mRemoveRedundantPopups = prefs.getBoolean(Settings.PREF_REMOVE_REDUNDANT_POPUPS, Defaults.PREF_REMOVE_REDUNDANT_POPUPS); mSpaceBarText = prefs.getString(Settings.PREF_SPACE_BAR_TEXT, Defaults.PREF_SPACE_BAR_TEXT); - mEmojiMaxSdk = prefs.getInt(Settings.PREF_EMOJI_MAX_SDK, Defaults.PREF_EMOJI_MAX_SDK); mFontSizeMultiplier = prefs.getFloat(Settings.PREF_FONT_SCALE, Defaults.PREF_FONT_SCALE); mFontSizeMultiplierEmoji = prefs.getFloat(Settings.PREF_EMOJI_FONT_SCALE, Defaults.PREF_EMOJI_FONT_SCALE); mEmojiKeyFit = prefs.getBoolean(Settings.PREF_EMOJI_KEY_FIT, Defaults.PREF_EMOJI_KEY_FIT); diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt index 40bfa4a38..1e263a5aa 100644 --- a/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt +++ b/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt @@ -13,6 +13,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import helium314.keyboard.dictionarypack.DictionaryPackConstants import helium314.keyboard.keyboard.KeyboardSwitcher +import helium314.keyboard.keyboard.emoji.SupportedEmojis import helium314.keyboard.latin.R import helium314.keyboard.latin.checkVersionUpgrade import helium314.keyboard.latin.common.FileUtils @@ -166,6 +167,7 @@ fun BackupRestorePreference(setting: Setting) { LayoutUtilsCustom.onLayoutFileChanged() LayoutUtilsCustom.removeMissingLayouts(ctx) (ctx.getActivity() as? SettingsActivity)?.prefChanged() + SupportedEmojis.load(ctx) KeyboardSwitcher.getInstance().setThemeNeedsReload() } Preference(name = setting.title, onClick = { showDialog = true }) diff --git a/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt index 59b137d37..e57f6a5ca 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/AdvancedScreen.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.tooling.preview.Preview import helium314.keyboard.keyboard.KeyboardActionListener import helium314.keyboard.keyboard.KeyboardLayoutSet import helium314.keyboard.keyboard.KeyboardSwitcher +import helium314.keyboard.keyboard.emoji.SupportedEmojis import helium314.keyboard.keyboard.internal.keyboard_parser.POPUP_KEYS_ALL import helium314.keyboard.keyboard.internal.keyboard_parser.POPUP_KEYS_MAIN import helium314.keyboard.keyboard.internal.keyboard_parser.POPUP_KEYS_MORE @@ -208,6 +209,7 @@ fun createAdvancedSettings(context: Context) = listOf( ) { NextScreenIcon() } }, Setting(context, Settings.PREF_EMOJI_MAX_SDK, R.string.prefs_key_emoji_max_sdk) { setting -> + val ctx = LocalContext.current SliderPreference( name = setting.title, key = setting.key, @@ -233,7 +235,10 @@ fun createAdvancedSettings(context: Context) = listOf( else -> "version unknown" } }, - onConfirmed = { KeyboardSwitcher.getInstance().setThemeNeedsReload() } + onConfirmed = { + SupportedEmojis.load(ctx) + KeyboardSwitcher.getInstance().setThemeNeedsReload() + } ) }, Setting(context, Settings.PREF_URL_DETECTION, R.string.url_detection_title, R.string.url_detection_summary) { diff --git a/app/src/main/res/values/emoji-categories.xml b/app/src/main/res/values/emoji-categories.xml deleted file mode 100644 index 3fd482dc2..000000000 --- a/app/src/main/res/values/emoji-categories.xml +++ /dev/null @@ -1,2440 +0,0 @@ - - - - - - - - - - 1F600 - 1F603 - 1F604 - 1F601 - 1F606 - 1F605 - 1F923||24 - 1F602 - 1F642||23 - 1F643||23 - 1FAE0||32 - 1F609 - 1F60A - 1F607 - 1F970||28 - 1F60D - 1F929||26 - 1F618 - 1F617 - 263A,FE0F - 1F61A - 1F619 - 1F972||30 - 1F60B - 1F61B - 1F61C - 1F92A||26 - 1F61D - 1F911||23 - 1F917||23 - 1F92D||26 - 1FAE2||32 - 1FAE3||32 - 1F92B||26 - 1F914||23 - 1FAE1||32 - 1F910||23 - 1F928||26 - 1F610 - 1F611 - 1F636 - 1FAE5||32 - 1F636,200D,1F32B,FE0F||31 - 1F60F - 1F612 - 1F644||23 - 1F62C - 1F62E,200D,1F4A8||31 - 1F925||24 - 1FAE8||33 - 1F642,200D,2194,FE0F||34 - 1F642,200D,2195,FE0F||34 - 1F60C - 1F614 - 1F62A - 1F924||24 - 1F634 - 1FAE9||35 - 1F637 - 1F912||23 - 1F915||23 - 1F922||24 - 1F92E||26 - 1F927||24 - 1F975||28 - 1F976||28 - 1F974||28 - 1F635 - 1F635,200D,1F4AB||31 - 1F92F||26 - 1F920||24 - 1F973||28 - 1F978||30 - 1F60E - 1F913||23 - 1F9D0||26 - 1F615 - 1FAE4||32 - 1F61F - 1F641||23 - 2639,FE0F||23 - 1F62E - 1F62F - 1F632 - 1F633 - 1F97A||28 - 1F979||32 - 1F626 - 1F627 - 1F628 - 1F630 - 1F625 - 1F622 - 1F62D - 1F631 - 1F616 - 1F623 - 1F61E - 1F613 - 1F629 - 1F62B - 1F971||29 - 1F624 - 1F621 - 1F620 - 1F92C||26 - 1F608 - 1F47F - 1F480 - 2620,FE0F||23 - 1F4A9 - 1F921||24 - 1F479 - 1F47A - 1F47B - 1F47D - 1F47E - 1F916||23 - 1F63A - 1F638 - 1F639 - 1F63B - 1F63C - 1F63D - 1F640 - 1F63F - 1F63E - 1F648 - 1F649 - 1F64A - 1F48C - 1F498 - 1F49D - 1F496 - 1F497 - 1F493 - 1F49E - 1F495 - 1F49F - 2763,FE0F||23 - 1F494 - 2764,FE0F,200D,1F525||31 - 2764,FE0F,200D,1FA79||31 - 2764,FE0F - 1FA77||33 - 1F9E1||26 - 1F49B - 1F49A - 1F499 - 1FA75||33 - 1F49C - 1F90E||29 - 1F5A4||24 - 1FA76||33 - 1F90D||29 - 1F48B - 1F4AF - 1F4A2 - 1F4A5 - 1F4AB - 1F4A6 - 1F4A8 - 1F573,FE0F||23 - 1F4AC - 1F441,FE0F,200D,1F5E8,FE0F||23 - 1F5E8,FE0F||23 - 1F5EF,FE0F||23 - 1F4AD - 1F4A4 - - - - 1F44B - 1F91A||24 - 1F590,FE0F||23 - 270B - 1F596||23 - 1FAF1||32 - 1FAF2||32 - 1FAF3||32 - 1FAF4||32 - 1FAF7||33 - 1FAF8||33 - 1F44C - 1F90C||30 - 1F90F||29 - 270C,FE0F - 1F91E||24 - 1FAF0||32 - 1F91F||26 - 1F918||23 - 1F919||24 - 1F448 - 1F449 - 1F446 - 1F595||23 - 1F447 - 261D,FE0F - 1FAF5||32 - 1F44D - 1F44E - 270A - 1F44A - 1F91B||24 - 1F91C||24 - 1F44F - 1F64C - 1FAF6||32 - 1F450 - 1F932||26 - 1F91D||24 - 1F64F - 270D,FE0F||23 - 1F485 - 1F933||24 - 1F4AA - 1F9BE||29 - 1F9BF||29 - 1F9B5||28 - 1F9B6||28 - 1F442 - 1F9BB||29 - 1F443 - 1F9E0||26 - 1FAC0||30 - 1FAC1||30 - 1F9B7||28 - 1F9B4||28 - 1F440 - 1F441,FE0F||23 - 1F445 - 1F444 - 1FAE6||32 - 1F476 - 1F9D2||26 - 1F466 - 1F467 - 1F9D1||26 - 1F471 - 1F468 - 1F9D4||26 - 1F9D4,200D,2642,FE0F||31 - 1F9D4,200D,2640,FE0F||31 - 1F468,200D,1F9B0||28 - 1F468,200D,1F9B1||28 - 1F468,200D,1F9B3||28 - 1F468,200D,1F9B2||28 - 1F469 - 1F469,200D,1F9B0||28 - 1F9D1,200D,1F9B0||30 - 1F469,200D,1F9B1||28 - 1F9D1,200D,1F9B1||30 - 1F469,200D,1F9B3||28 - 1F9D1,200D,1F9B3||30 - 1F469,200D,1F9B2||28 - 1F9D1,200D,1F9B2||30 - 1F471,200D,2640,FE0F||25 - 1F471,200D,2642,FE0F||25 - 1F9D3||26 - 1F474 - 1F475 - 1F64D - 1F64D,200D,2642,FE0F||25 - 1F64D,200D,2640,FE0F||25 - 1F64E - 1F64E,200D,2642,FE0F||25 - 1F64E,200D,2640,FE0F||25 - 1F645 - 1F645,200D,2642,FE0F||25 - 1F645,200D,2640,FE0F||25 - 1F646 - 1F646,200D,2642,FE0F||25 - 1F646,200D,2640,FE0F||25 - 1F481 - 1F481,200D,2642,FE0F||25 - 1F481,200D,2640,FE0F||25 - 1F64B - 1F64B,200D,2642,FE0F||25 - 1F64B,200D,2640,FE0F||25 - 1F9CF||29 - 1F9CF,200D,2642,FE0F||29 - 1F9CF,200D,2640,FE0F||29 - 1F647 - 1F647,200D,2642,FE0F||25 - 1F647,200D,2640,FE0F||25 - 1F926||24 - 1F926,200D,2642,FE0F||25 - 1F926,200D,2640,FE0F||25 - 1F937||24 - 1F937,200D,2642,FE0F||25 - 1F937,200D,2640,FE0F||25 - 1F9D1,200D,2695,FE0F||30 - 1F468,200D,2695,FE0F||25 - 1F469,200D,2695,FE0F||25 - 1F9D1,200D,1F393||30 - 1F468,200D,1F393||25 - 1F469,200D,1F393||25 - 1F9D1,200D,1F3EB||30 - 1F468,200D,1F3EB||25 - 1F469,200D,1F3EB||25 - 1F9D1,200D,2696,FE0F||30 - 1F468,200D,2696,FE0F||25 - 1F469,200D,2696,FE0F||25 - 1F9D1,200D,1F33E||30 - 1F468,200D,1F33E||25 - 1F469,200D,1F33E||25 - 1F9D1,200D,1F373||30 - 1F468,200D,1F373||25 - 1F469,200D,1F373||25 - 1F9D1,200D,1F527||30 - 1F468,200D,1F527||25 - 1F469,200D,1F527||25 - 1F9D1,200D,1F3ED||30 - 1F468,200D,1F3ED||25 - 1F469,200D,1F3ED||25 - 1F9D1,200D,1F4BC||30 - 1F468,200D,1F4BC||25 - 1F469,200D,1F4BC||25 - 1F9D1,200D,1F52C||30 - 1F468,200D,1F52C||25 - 1F469,200D,1F52C||25 - 1F9D1,200D,1F4BB||30 - 1F468,200D,1F4BB||25 - 1F469,200D,1F4BB||25 - 1F9D1,200D,1F3A4||30 - 1F468,200D,1F3A4||25 - 1F469,200D,1F3A4||25 - 1F9D1,200D,1F3A8||30 - 1F468,200D,1F3A8||25 - 1F469,200D,1F3A8||25 - 1F9D1,200D,2708,FE0F||30 - 1F468,200D,2708,FE0F||25 - 1F469,200D,2708,FE0F||25 - 1F9D1,200D,1F680||30 - 1F468,200D,1F680||25 - 1F469,200D,1F680||25 - 1F9D1,200D,1F692||30 - 1F468,200D,1F692||25 - 1F469,200D,1F692||25 - 1F46E - 1F46E,200D,2642,FE0F||25 - 1F46E,200D,2640,FE0F||25 - 1F575,FE0F||23 - 1F575,FE0F,200D,2642,FE0F||25 - 1F575,FE0F,200D,2640,FE0F||25 - 1F482 - 1F482,200D,2642,FE0F||25 - 1F482,200D,2640,FE0F||25 - 1F977||30 - 1F477 - 1F477,200D,2642,FE0F||25 - 1F477,200D,2640,FE0F||25 - 1FAC5||32 - 1F934||24 - 1F478 - 1F473 - 1F473,200D,2642,FE0F||25 - 1F473,200D,2640,FE0F||25 - 1F472 - 1F9D5||26 - 1F935||24 - 1F935,200D,2642,FE0F||30 - 1F935,200D,2640,FE0F||30 - 1F470 - 1F470,200D,2642,FE0F||30 - 1F470,200D,2640,FE0F||30 - 1F930||24 - 1FAC3||32 - 1FAC4||32 - 1F931||26 - 1F469,200D,1F37C||30 - 1F468,200D,1F37C||30 - 1F9D1,200D,1F37C||30 - 1F47C - 1F385 - 1F936||24 - 1F9D1,200D,1F384||30 - 1F9B8||28 - 1F9B8,200D,2642,FE0F||28 - 1F9B8,200D,2640,FE0F||28 - 1F9B9||28 - 1F9B9,200D,2642,FE0F||28 - 1F9B9,200D,2640,FE0F||28 - 1F9D9||26 - 1F9D9,200D,2642,FE0F||26 - 1F9D9,200D,2640,FE0F||26 - 1F9DA||26 - 1F9DA,200D,2642,FE0F||26 - 1F9DA,200D,2640,FE0F||26 - 1F9DB||26 - 1F9DB,200D,2642,FE0F||26 - 1F9DB,200D,2640,FE0F||26 - 1F9DC||26 - 1F9DC,200D,2642,FE0F||26 - 1F9DC,200D,2640,FE0F||26 - 1F9DD||26 - 1F9DD,200D,2642,FE0F||26 - 1F9DD,200D,2640,FE0F||26 - 1F9DE||26 - 1F9DE,200D,2642,FE0F||26 - 1F9DE,200D,2640,FE0F||26 - 1F9DF||26 - 1F9DF,200D,2642,FE0F||26 - 1F9DF,200D,2640,FE0F||26 - 1F9CC||32 - 1F486 - 1F486,200D,2642,FE0F||25 - 1F486,200D,2640,FE0F||25 - 1F487 - 1F487,200D,2642,FE0F||25 - 1F487,200D,2640,FE0F||25 - 1F6B6 - 1F6B6,200D,2642,FE0F||25 - 1F6B6,200D,2640,FE0F||25 - 1F6B6,200D,27A1,FE0F||34 - 1F6B6,200D,2640,FE0F,200D,27A1,FE0F||34 - 1F6B6,200D,2642,FE0F,200D,27A1,FE0F||34 - 1F9CD||29 - 1F9CD,200D,2642,FE0F||29 - 1F9CD,200D,2640,FE0F||29 - 1F9CE||29 - 1F9CE,200D,2642,FE0F||29 - 1F9CE,200D,2640,FE0F||29 - 1F9CE,200D,27A1,FE0F||34 - 1F9CE,200D,2640,FE0F,200D,27A1,FE0F||34 - 1F9CE,200D,2642,FE0F,200D,27A1,FE0F||34 - 1F9D1,200D,1F9AF||30 - 1F9D1,200D,1F9AF,200D,27A1,FE0F||34 - 1F468,200D,1F9AF||29 - 1F468,200D,1F9AF,200D,27A1,FE0F||34 - 1F469,200D,1F9AF||29 - 1F469,200D,1F9AF,200D,27A1,FE0F||34 - 1F9D1,200D,1F9BC||30 - 1F9D1,200D,1F9BC,200D,27A1,FE0F||34 - 1F468,200D,1F9BC||29 - 1F468,200D,1F9BC,200D,27A1,FE0F||34 - 1F469,200D,1F9BC||29 - 1F469,200D,1F9BC,200D,27A1,FE0F||34 - 1F9D1,200D,1F9BD||30 - 1F9D1,200D,1F9BD,200D,27A1,FE0F||34 - 1F468,200D,1F9BD||29 - 1F468,200D,1F9BD,200D,27A1,FE0F||34 - 1F469,200D,1F9BD||29 - 1F469,200D,1F9BD,200D,27A1,FE0F||34 - 1F3C3 - 1F3C3,200D,2642,FE0F||25 - 1F3C3,200D,2640,FE0F||25 - 1F3C3,200D,27A1,FE0F||34 - 1F3C3,200D,2640,FE0F,200D,27A1,FE0F||34 - 1F3C3,200D,2642,FE0F,200D,27A1,FE0F||34 - 1F483 - 1F57A||24 - 1F574,FE0F||23 - 1F46F - 1F46F,200D,2642,FE0F||25 - 1F46F,200D,2640,FE0F||25 - 1F9D6||26 - 1F9D6,200D,2642,FE0F||26 - 1F9D6,200D,2640,FE0F||26 - 1F9D7||26 - 1F9D7,200D,2642,FE0F||26 - 1F9D7,200D,2640,FE0F||26 - 1F93A||24 - 1F3C7 - 26F7,FE0F||23 - 1F3C2 - 1F3CC,FE0F||23 - 1F3CC,FE0F,200D,2642,FE0F||25 - 1F3CC,FE0F,200D,2640,FE0F||25 - 1F3C4 - 1F3C4,200D,2642,FE0F||25 - 1F3C4,200D,2640,FE0F||25 - 1F6A3 - 1F6A3,200D,2642,FE0F||25 - 1F6A3,200D,2640,FE0F||25 - 1F3CA - 1F3CA,200D,2642,FE0F||25 - 1F3CA,200D,2640,FE0F||25 - 26F9,FE0F||23 - 26F9,FE0F,200D,2642,FE0F||25 - 26F9,FE0F,200D,2640,FE0F||25 - 1F3CB,FE0F||23 - 1F3CB,FE0F,200D,2642,FE0F||25 - 1F3CB,FE0F,200D,2640,FE0F||25 - 1F6B4 - 1F6B4,200D,2642,FE0F||25 - 1F6B4,200D,2640,FE0F||25 - 1F6B5 - 1F6B5,200D,2642,FE0F||25 - 1F6B5,200D,2640,FE0F||25 - 1F938||24 - 1F938,200D,2642,FE0F||25 - 1F938,200D,2640,FE0F||25 - 1F93C||24 - 1F93C,200D,2642,FE0F||25 - 1F93C,200D,2640,FE0F||25 - 1F93D||24 - 1F93D,200D,2642,FE0F||25 - 1F93D,200D,2640,FE0F||25 - 1F93E||24 - 1F93E,200D,2642,FE0F||25 - 1F93E,200D,2640,FE0F||25 - 1F939||24 - 1F939,200D,2642,FE0F||25 - 1F939,200D,2640,FE0F||25 - 1F9D8||26 - 1F9D8,200D,2642,FE0F||26 - 1F9D8,200D,2640,FE0F||26 - 1F6C0 - 1F6CC||23 - 1F9D1,200D,1F91D,200D,1F9D1||29 - 1F46D - 1F46B - 1F46C - 1F48F - 1F469,200D,2764,FE0F,200D,1F48B,200D,1F468||26 - 1F468,200D,2764,FE0F,200D,1F48B,200D,1F468||23 - 1F469,200D,2764,FE0F,200D,1F48B,200D,1F469||23 - 1F491 - 1F469,200D,2764,FE0F,200D,1F468||26 - 1F468,200D,2764,FE0F,200D,1F468||23 - 1F469,200D,2764,FE0F,200D,1F469||23 - 1F468,200D,1F469,200D,1F466||25 - 1F468,200D,1F469,200D,1F467||23 - 1F468,200D,1F469,200D,1F467,200D,1F466||23 - 1F468,200D,1F469,200D,1F466,200D,1F466||23 - 1F468,200D,1F469,200D,1F467,200D,1F467||23 - 1F468,200D,1F468,200D,1F466||23 - 1F468,200D,1F468,200D,1F467||23 - 1F468,200D,1F468,200D,1F467,200D,1F466||23 - 1F468,200D,1F468,200D,1F466,200D,1F466||23 - 1F468,200D,1F468,200D,1F467,200D,1F467||23 - 1F469,200D,1F469,200D,1F466||23 - 1F469,200D,1F469,200D,1F467||23 - 1F469,200D,1F469,200D,1F467,200D,1F466||23 - 1F469,200D,1F469,200D,1F466,200D,1F466||23 - 1F469,200D,1F469,200D,1F467,200D,1F467||23 - 1F468,200D,1F466||25 - 1F468,200D,1F466,200D,1F466||25 - 1F468,200D,1F467||25 - 1F468,200D,1F467,200D,1F466||25 - 1F468,200D,1F467,200D,1F467||25 - 1F469,200D,1F466||25 - 1F469,200D,1F466,200D,1F466||25 - 1F469,200D,1F467||25 - 1F469,200D,1F467,200D,1F466||25 - 1F469,200D,1F467,200D,1F467||25 - 1F5E3,FE0F||23 - 1F464 - 1F465 - 1FAC2||30 - 1F46A - 1F9D1,200D,1F9D1,200D,1F9D2||34 - 1F9D1,200D,1F9D1,200D,1F9D2,200D,1F9D2||34 - 1F9D1,200D,1F9D2||34 - 1F9D1,200D,1F9D2,200D,1F9D2||34 - 1F463 - 1FAC6||35 - - - - 1F44B,1F3FB||24;1F44B,1F3FC||24;1F44B,1F3FD||24;1F44B,1F3FE||24;1F44B,1F3FF||24 - 1F91A,1F3FB||24;1F91A,1F3FC||24;1F91A,1F3FD||24;1F91A,1F3FE||24;1F91A,1F3FF||24 - 1F590,1F3FB||24;1F590,1F3FC||24;1F590,1F3FD||24;1F590,1F3FE||24;1F590,1F3FF||24 - 270B,1F3FB||24;270B,1F3FC||24;270B,1F3FD||24;270B,1F3FE||24;270B,1F3FF||24 - 1F596,1F3FB||24;1F596,1F3FC||24;1F596,1F3FD||24;1F596,1F3FE||24;1F596,1F3FF||24 - 1FAF1,1F3FB||32;1FAF1,1F3FC||32;1FAF1,1F3FD||32;1FAF1,1F3FE||32;1FAF1,1F3FF||32 - 1FAF2,1F3FB||32;1FAF2,1F3FC||32;1FAF2,1F3FD||32;1FAF2,1F3FE||32;1FAF2,1F3FF||32 - 1FAF3,1F3FB||32;1FAF3,1F3FC||32;1FAF3,1F3FD||32;1FAF3,1F3FE||32;1FAF3,1F3FF||32 - 1FAF4,1F3FB||32;1FAF4,1F3FC||32;1FAF4,1F3FD||32;1FAF4,1F3FE||32;1FAF4,1F3FF||32 - 1FAF7,1F3FB||33;1FAF7,1F3FC||33;1FAF7,1F3FD||33;1FAF7,1F3FE||33;1FAF7,1F3FF||33 - 1FAF8,1F3FB||33;1FAF8,1F3FC||33;1FAF8,1F3FD||33;1FAF8,1F3FE||33;1FAF8,1F3FF||33 - 1F44C,1F3FB||24;1F44C,1F3FC||24;1F44C,1F3FD||24;1F44C,1F3FE||24;1F44C,1F3FF||24 - 1F90C,1F3FB||30;1F90C,1F3FC||30;1F90C,1F3FD||30;1F90C,1F3FE||30;1F90C,1F3FF||30 - 1F90F,1F3FB||29;1F90F,1F3FC||29;1F90F,1F3FD||29;1F90F,1F3FE||29;1F90F,1F3FF||29 - 270C,1F3FB||24;270C,1F3FC||24;270C,1F3FD||24;270C,1F3FE||24;270C,1F3FF||24 - 1F91E,1F3FB||24;1F91E,1F3FC||24;1F91E,1F3FD||24;1F91E,1F3FE||24;1F91E,1F3FF||24 - 1FAF0,1F3FB||32;1FAF0,1F3FC||32;1FAF0,1F3FD||32;1FAF0,1F3FE||32;1FAF0,1F3FF||32 - 1F91F,1F3FB||26;1F91F,1F3FC||26;1F91F,1F3FD||26;1F91F,1F3FE||26;1F91F,1F3FF||26 - 1F918,1F3FB||24;1F918,1F3FC||24;1F918,1F3FD||24;1F918,1F3FE||24;1F918,1F3FF||24 - 1F919,1F3FB||24;1F919,1F3FC||24;1F919,1F3FD||24;1F919,1F3FE||24;1F919,1F3FF||24 - 1F448,1F3FB||24;1F448,1F3FC||24;1F448,1F3FD||24;1F448,1F3FE||24;1F448,1F3FF||24 - 1F449,1F3FB||24;1F449,1F3FC||24;1F449,1F3FD||24;1F449,1F3FE||24;1F449,1F3FF||24 - 1F446,1F3FB||24;1F446,1F3FC||24;1F446,1F3FD||24;1F446,1F3FE||24;1F446,1F3FF||24 - 1F595,1F3FB||24;1F595,1F3FC||24;1F595,1F3FD||24;1F595,1F3FE||24;1F595,1F3FF||24 - 1F447,1F3FB||24;1F447,1F3FC||24;1F447,1F3FD||24;1F447,1F3FE||24;1F447,1F3FF||24 - 261D,1F3FB||24;261D,1F3FC||24;261D,1F3FD||24;261D,1F3FE||24;261D,1F3FF||24 - 1FAF5,1F3FB||32;1FAF5,1F3FC||32;1FAF5,1F3FD||32;1FAF5,1F3FE||32;1FAF5,1F3FF||32 - 1F44D,1F3FB||24;1F44D,1F3FC||24;1F44D,1F3FD||24;1F44D,1F3FE||24;1F44D,1F3FF||24 - 1F44E,1F3FB||24;1F44E,1F3FC||24;1F44E,1F3FD||24;1F44E,1F3FE||24;1F44E,1F3FF||24 - 270A,1F3FB||24;270A,1F3FC||24;270A,1F3FD||24;270A,1F3FE||24;270A,1F3FF||24 - 1F44A,1F3FB||24;1F44A,1F3FC||24;1F44A,1F3FD||24;1F44A,1F3FE||24;1F44A,1F3FF||24 - 1F91B,1F3FB||24;1F91B,1F3FC||24;1F91B,1F3FD||24;1F91B,1F3FE||24;1F91B,1F3FF||24 - 1F91C,1F3FB||24;1F91C,1F3FC||24;1F91C,1F3FD||24;1F91C,1F3FE||24;1F91C,1F3FF||24 - 1F44F,1F3FB||24;1F44F,1F3FC||24;1F44F,1F3FD||24;1F44F,1F3FE||24;1F44F,1F3FF||24 - 1F64C,1F3FB||24;1F64C,1F3FC||24;1F64C,1F3FD||24;1F64C,1F3FE||24;1F64C,1F3FF||24 - 1FAF6,1F3FB||32;1FAF6,1F3FC||32;1FAF6,1F3FD||32;1FAF6,1F3FE||32;1FAF6,1F3FF||32 - 1F450,1F3FB||24;1F450,1F3FC||24;1F450,1F3FD||24;1F450,1F3FE||24;1F450,1F3FF||24 - 1F932,1F3FB||26;1F932,1F3FC||26;1F932,1F3FD||26;1F932,1F3FE||26;1F932,1F3FF||26 - 1F91D,1F3FB||25;1F91D,1F3FC||25;1F91D,1F3FD||25;1F91D,1F3FE||25;1F91D,1F3FF||25 - 1F64F,1F3FB||24;1F64F,1F3FC||24;1F64F,1F3FD||24;1F64F,1F3FE||24;1F64F,1F3FF||24 - 270D,1F3FB||24;270D,1F3FC||24;270D,1F3FD||24;270D,1F3FE||24;270D,1F3FF||24 - 1F485,1F3FB||24;1F485,1F3FC||24;1F485,1F3FD||24;1F485,1F3FE||24;1F485,1F3FF||24 - 1F933,1F3FB||24;1F933,1F3FC||24;1F933,1F3FD||24;1F933,1F3FE||24;1F933,1F3FF||24 - 1F4AA,1F3FB||24;1F4AA,1F3FC||24;1F4AA,1F3FD||24;1F4AA,1F3FE||24;1F4AA,1F3FF||24 - - - 1F9B5,1F3FB||28;1F9B5,1F3FC||28;1F9B5,1F3FD||28;1F9B5,1F3FE||28;1F9B5,1F3FF||28 - 1F9B6,1F3FB||28;1F9B6,1F3FC||28;1F9B6,1F3FD||28;1F9B6,1F3FE||28;1F9B6,1F3FF||28 - 1F442,1F3FB||24;1F442,1F3FC||24;1F442,1F3FD||24;1F442,1F3FE||24;1F442,1F3FF||24 - 1F9BB,1F3FB||29;1F9BB,1F3FC||29;1F9BB,1F3FD||29;1F9BB,1F3FE||29;1F9BB,1F3FF||29 - 1F443,1F3FB||24;1F443,1F3FC||24;1F443,1F3FD||24;1F443,1F3FE||24;1F443,1F3FF||24 - - - - - - - - - - - 1F476,1F3FB||24;1F476,1F3FC||24;1F476,1F3FD||24;1F476,1F3FE||24;1F476,1F3FF||24 - 1F9D2,1F3FB||26;1F9D2,1F3FC||26;1F9D2,1F3FD||26;1F9D2,1F3FE||26;1F9D2,1F3FF||26 - 1F466,1F3FB||24;1F466,1F3FC||24;1F466,1F3FD||24;1F466,1F3FE||24;1F466,1F3FF||24 - 1F467,1F3FB||24;1F467,1F3FC||24;1F467,1F3FD||24;1F467,1F3FE||24;1F467,1F3FF||24 - 1F9D1,1F3FB||26;1F9D1,1F3FC||26;1F9D1,1F3FD||26;1F9D1,1F3FE||26;1F9D1,1F3FF||26 - 1F471,1F3FB||24;1F471,1F3FC||24;1F471,1F3FD||24;1F471,1F3FE||24;1F471,1F3FF||24 - 1F468,1F3FB||24;1F468,1F3FC||24;1F468,1F3FD||24;1F468,1F3FE||24;1F468,1F3FF||24 - 1F9D4,1F3FB||26;1F9D4,1F3FC||26;1F9D4,1F3FD||26;1F9D4,1F3FE||26;1F9D4,1F3FF||26 - 1F9D4,1F3FB,200D,2642,FE0F||31;1F9D4,1F3FC,200D,2642,FE0F||31;1F9D4,1F3FD,200D,2642,FE0F||31;1F9D4,1F3FE,200D,2642,FE0F||31;1F9D4,1F3FF,200D,2642,FE0F||31 - 1F9D4,1F3FB,200D,2640,FE0F||31;1F9D4,1F3FC,200D,2640,FE0F||31;1F9D4,1F3FD,200D,2640,FE0F||31;1F9D4,1F3FE,200D,2640,FE0F||31;1F9D4,1F3FF,200D,2640,FE0F||31 - 1F468,1F3FB,200D,1F9B0||28;1F468,1F3FC,200D,1F9B0||28;1F468,1F3FD,200D,1F9B0||28;1F468,1F3FE,200D,1F9B0||28;1F468,1F3FF,200D,1F9B0||28 - 1F468,1F3FB,200D,1F9B1||28;1F468,1F3FC,200D,1F9B1||28;1F468,1F3FD,200D,1F9B1||28;1F468,1F3FE,200D,1F9B1||28;1F468,1F3FF,200D,1F9B1||28 - 1F468,1F3FB,200D,1F9B3||28;1F468,1F3FC,200D,1F9B3||28;1F468,1F3FD,200D,1F9B3||28;1F468,1F3FE,200D,1F9B3||28;1F468,1F3FF,200D,1F9B3||28 - 1F468,1F3FB,200D,1F9B2||28;1F468,1F3FC,200D,1F9B2||28;1F468,1F3FD,200D,1F9B2||28;1F468,1F3FE,200D,1F9B2||28;1F468,1F3FF,200D,1F9B2||28 - 1F469,1F3FB||24;1F469,1F3FC||24;1F469,1F3FD||24;1F469,1F3FE||24;1F469,1F3FF||24 - 1F469,1F3FB,200D,1F9B0||28;1F469,1F3FC,200D,1F9B0||28;1F469,1F3FD,200D,1F9B0||28;1F469,1F3FE,200D,1F9B0||28;1F469,1F3FF,200D,1F9B0||28 - 1F9D1,1F3FB,200D,1F9B0||30;1F9D1,1F3FC,200D,1F9B0||30;1F9D1,1F3FD,200D,1F9B0||30;1F9D1,1F3FE,200D,1F9B0||30;1F9D1,1F3FF,200D,1F9B0||30 - 1F469,1F3FB,200D,1F9B1||28;1F469,1F3FC,200D,1F9B1||28;1F469,1F3FD,200D,1F9B1||28;1F469,1F3FE,200D,1F9B1||28;1F469,1F3FF,200D,1F9B1||28 - 1F9D1,1F3FB,200D,1F9B1||30;1F9D1,1F3FC,200D,1F9B1||30;1F9D1,1F3FD,200D,1F9B1||30;1F9D1,1F3FE,200D,1F9B1||30;1F9D1,1F3FF,200D,1F9B1||30 - 1F469,1F3FB,200D,1F9B3||28;1F469,1F3FC,200D,1F9B3||28;1F469,1F3FD,200D,1F9B3||28;1F469,1F3FE,200D,1F9B3||28;1F469,1F3FF,200D,1F9B3||28 - 1F9D1,1F3FB,200D,1F9B3||30;1F9D1,1F3FC,200D,1F9B3||30;1F9D1,1F3FD,200D,1F9B3||30;1F9D1,1F3FE,200D,1F9B3||30;1F9D1,1F3FF,200D,1F9B3||30 - 1F469,1F3FB,200D,1F9B2||28;1F469,1F3FC,200D,1F9B2||28;1F469,1F3FD,200D,1F9B2||28;1F469,1F3FE,200D,1F9B2||28;1F469,1F3FF,200D,1F9B2||28 - 1F9D1,1F3FB,200D,1F9B2||30;1F9D1,1F3FC,200D,1F9B2||30;1F9D1,1F3FD,200D,1F9B2||30;1F9D1,1F3FE,200D,1F9B2||30;1F9D1,1F3FF,200D,1F9B2||30 - 1F471,1F3FB,200D,2640,FE0F||25;1F471,1F3FC,200D,2640,FE0F||25;1F471,1F3FD,200D,2640,FE0F||25;1F471,1F3FE,200D,2640,FE0F||25;1F471,1F3FF,200D,2640,FE0F||25 - 1F471,1F3FB,200D,2642,FE0F||25;1F471,1F3FC,200D,2642,FE0F||25;1F471,1F3FD,200D,2642,FE0F||25;1F471,1F3FE,200D,2642,FE0F||25;1F471,1F3FF,200D,2642,FE0F||25 - 1F9D3,1F3FB||26;1F9D3,1F3FC||26;1F9D3,1F3FD||26;1F9D3,1F3FE||26;1F9D3,1F3FF||26 - 1F474,1F3FB||24;1F474,1F3FC||24;1F474,1F3FD||24;1F474,1F3FE||24;1F474,1F3FF||24 - 1F475,1F3FB||24;1F475,1F3FC||24;1F475,1F3FD||24;1F475,1F3FE||24;1F475,1F3FF||24 - 1F64D,1F3FB||24;1F64D,1F3FC||24;1F64D,1F3FD||24;1F64D,1F3FE||24;1F64D,1F3FF||24 - 1F64D,1F3FB,200D,2642,FE0F||25;1F64D,1F3FC,200D,2642,FE0F||25;1F64D,1F3FD,200D,2642,FE0F||25;1F64D,1F3FE,200D,2642,FE0F||25;1F64D,1F3FF,200D,2642,FE0F||25 - 1F64D,1F3FB,200D,2640,FE0F||25;1F64D,1F3FC,200D,2640,FE0F||25;1F64D,1F3FD,200D,2640,FE0F||25;1F64D,1F3FE,200D,2640,FE0F||25;1F64D,1F3FF,200D,2640,FE0F||25 - 1F64E,1F3FB||24;1F64E,1F3FC||24;1F64E,1F3FD||24;1F64E,1F3FE||24;1F64E,1F3FF||24 - 1F64E,1F3FB,200D,2642,FE0F||25;1F64E,1F3FC,200D,2642,FE0F||25;1F64E,1F3FD,200D,2642,FE0F||25;1F64E,1F3FE,200D,2642,FE0F||25;1F64E,1F3FF,200D,2642,FE0F||25 - 1F64E,1F3FB,200D,2640,FE0F||25;1F64E,1F3FC,200D,2640,FE0F||25;1F64E,1F3FD,200D,2640,FE0F||25;1F64E,1F3FE,200D,2640,FE0F||25;1F64E,1F3FF,200D,2640,FE0F||25 - 1F645,1F3FB||24;1F645,1F3FC||24;1F645,1F3FD||24;1F645,1F3FE||24;1F645,1F3FF||24 - 1F645,1F3FB,200D,2642,FE0F||25;1F645,1F3FC,200D,2642,FE0F||25;1F645,1F3FD,200D,2642,FE0F||25;1F645,1F3FE,200D,2642,FE0F||25;1F645,1F3FF,200D,2642,FE0F||25 - 1F645,1F3FB,200D,2640,FE0F||25;1F645,1F3FC,200D,2640,FE0F||25;1F645,1F3FD,200D,2640,FE0F||25;1F645,1F3FE,200D,2640,FE0F||25;1F645,1F3FF,200D,2640,FE0F||25 - 1F646,1F3FB||24;1F646,1F3FC||24;1F646,1F3FD||24;1F646,1F3FE||24;1F646,1F3FF||24 - 1F646,1F3FB,200D,2642,FE0F||25;1F646,1F3FC,200D,2642,FE0F||25;1F646,1F3FD,200D,2642,FE0F||25;1F646,1F3FE,200D,2642,FE0F||25;1F646,1F3FF,200D,2642,FE0F||25 - 1F646,1F3FB,200D,2640,FE0F||25;1F646,1F3FC,200D,2640,FE0F||25;1F646,1F3FD,200D,2640,FE0F||25;1F646,1F3FE,200D,2640,FE0F||25;1F646,1F3FF,200D,2640,FE0F||25 - 1F481,1F3FB||24;1F481,1F3FC||24;1F481,1F3FD||24;1F481,1F3FE||24;1F481,1F3FF||24 - 1F481,1F3FB,200D,2642,FE0F||25;1F481,1F3FC,200D,2642,FE0F||25;1F481,1F3FD,200D,2642,FE0F||25;1F481,1F3FE,200D,2642,FE0F||25;1F481,1F3FF,200D,2642,FE0F||25 - 1F481,1F3FB,200D,2640,FE0F||25;1F481,1F3FC,200D,2640,FE0F||25;1F481,1F3FD,200D,2640,FE0F||25;1F481,1F3FE,200D,2640,FE0F||25;1F481,1F3FF,200D,2640,FE0F||25 - 1F64B,1F3FB||24;1F64B,1F3FC||24;1F64B,1F3FD||24;1F64B,1F3FE||24;1F64B,1F3FF||24 - 1F64B,1F3FB,200D,2642,FE0F||25;1F64B,1F3FC,200D,2642,FE0F||25;1F64B,1F3FD,200D,2642,FE0F||25;1F64B,1F3FE,200D,2642,FE0F||25;1F64B,1F3FF,200D,2642,FE0F||25 - 1F64B,1F3FB,200D,2640,FE0F||25;1F64B,1F3FC,200D,2640,FE0F||25;1F64B,1F3FD,200D,2640,FE0F||25;1F64B,1F3FE,200D,2640,FE0F||25;1F64B,1F3FF,200D,2640,FE0F||25 - 1F9CF,1F3FB||29;1F9CF,1F3FC||29;1F9CF,1F3FD||29;1F9CF,1F3FE||29;1F9CF,1F3FF||29 - 1F9CF,1F3FB,200D,2642,FE0F||29;1F9CF,1F3FC,200D,2642,FE0F||29;1F9CF,1F3FD,200D,2642,FE0F||29;1F9CF,1F3FE,200D,2642,FE0F||29;1F9CF,1F3FF,200D,2642,FE0F||29 - 1F9CF,1F3FB,200D,2640,FE0F||29;1F9CF,1F3FC,200D,2640,FE0F||29;1F9CF,1F3FD,200D,2640,FE0F||29;1F9CF,1F3FE,200D,2640,FE0F||29;1F9CF,1F3FF,200D,2640,FE0F||29 - 1F647,1F3FB||24;1F647,1F3FC||24;1F647,1F3FD||24;1F647,1F3FE||24;1F647,1F3FF||24 - 1F647,1F3FB,200D,2642,FE0F||25;1F647,1F3FC,200D,2642,FE0F||25;1F647,1F3FD,200D,2642,FE0F||25;1F647,1F3FE,200D,2642,FE0F||25;1F647,1F3FF,200D,2642,FE0F||25 - 1F647,1F3FB,200D,2640,FE0F||25;1F647,1F3FC,200D,2640,FE0F||25;1F647,1F3FD,200D,2640,FE0F||25;1F647,1F3FE,200D,2640,FE0F||25;1F647,1F3FF,200D,2640,FE0F||25 - 1F926,1F3FB||24;1F926,1F3FC||24;1F926,1F3FD||24;1F926,1F3FE||24;1F926,1F3FF||24 - 1F926,1F3FB,200D,2642,FE0F||25;1F926,1F3FC,200D,2642,FE0F||25;1F926,1F3FD,200D,2642,FE0F||25;1F926,1F3FE,200D,2642,FE0F||25;1F926,1F3FF,200D,2642,FE0F||25 - 1F926,1F3FB,200D,2640,FE0F||25;1F926,1F3FC,200D,2640,FE0F||25;1F926,1F3FD,200D,2640,FE0F||25;1F926,1F3FE,200D,2640,FE0F||25;1F926,1F3FF,200D,2640,FE0F||25 - 1F937,1F3FB||24;1F937,1F3FC||24;1F937,1F3FD||24;1F937,1F3FE||24;1F937,1F3FF||24 - 1F937,1F3FB,200D,2642,FE0F||25;1F937,1F3FC,200D,2642,FE0F||25;1F937,1F3FD,200D,2642,FE0F||25;1F937,1F3FE,200D,2642,FE0F||25;1F937,1F3FF,200D,2642,FE0F||25 - 1F937,1F3FB,200D,2640,FE0F||25;1F937,1F3FC,200D,2640,FE0F||25;1F937,1F3FD,200D,2640,FE0F||25;1F937,1F3FE,200D,2640,FE0F||25;1F937,1F3FF,200D,2640,FE0F||25 - 1F9D1,1F3FB,200D,2695,FE0F||30;1F9D1,1F3FC,200D,2695,FE0F||30;1F9D1,1F3FD,200D,2695,FE0F||30;1F9D1,1F3FE,200D,2695,FE0F||30;1F9D1,1F3FF,200D,2695,FE0F||30 - 1F468,1F3FB,200D,2695,FE0F||25;1F468,1F3FC,200D,2695,FE0F||25;1F468,1F3FD,200D,2695,FE0F||25;1F468,1F3FE,200D,2695,FE0F||25;1F468,1F3FF,200D,2695,FE0F||25 - 1F469,1F3FB,200D,2695,FE0F||25;1F469,1F3FC,200D,2695,FE0F||25;1F469,1F3FD,200D,2695,FE0F||25;1F469,1F3FE,200D,2695,FE0F||25;1F469,1F3FF,200D,2695,FE0F||25 - 1F9D1,1F3FB,200D,1F393||30;1F9D1,1F3FC,200D,1F393||30;1F9D1,1F3FD,200D,1F393||30;1F9D1,1F3FE,200D,1F393||30;1F9D1,1F3FF,200D,1F393||30 - 1F468,1F3FB,200D,1F393||25;1F468,1F3FC,200D,1F393||25;1F468,1F3FD,200D,1F393||25;1F468,1F3FE,200D,1F393||25;1F468,1F3FF,200D,1F393||25 - 1F469,1F3FB,200D,1F393||25;1F469,1F3FC,200D,1F393||25;1F469,1F3FD,200D,1F393||25;1F469,1F3FE,200D,1F393||25;1F469,1F3FF,200D,1F393||25 - 1F9D1,1F3FB,200D,1F3EB||30;1F9D1,1F3FC,200D,1F3EB||30;1F9D1,1F3FD,200D,1F3EB||30;1F9D1,1F3FE,200D,1F3EB||30;1F9D1,1F3FF,200D,1F3EB||30 - 1F468,1F3FB,200D,1F3EB||25;1F468,1F3FC,200D,1F3EB||25;1F468,1F3FD,200D,1F3EB||25;1F468,1F3FE,200D,1F3EB||25;1F468,1F3FF,200D,1F3EB||25 - 1F469,1F3FB,200D,1F3EB||25;1F469,1F3FC,200D,1F3EB||25;1F469,1F3FD,200D,1F3EB||25;1F469,1F3FE,200D,1F3EB||25;1F469,1F3FF,200D,1F3EB||25 - 1F9D1,1F3FB,200D,2696,FE0F||30;1F9D1,1F3FC,200D,2696,FE0F||30;1F9D1,1F3FD,200D,2696,FE0F||30;1F9D1,1F3FE,200D,2696,FE0F||30;1F9D1,1F3FF,200D,2696,FE0F||30 - 1F468,1F3FB,200D,2696,FE0F||25;1F468,1F3FC,200D,2696,FE0F||25;1F468,1F3FD,200D,2696,FE0F||25;1F468,1F3FE,200D,2696,FE0F||25;1F468,1F3FF,200D,2696,FE0F||25 - 1F469,1F3FB,200D,2696,FE0F||25;1F469,1F3FC,200D,2696,FE0F||25;1F469,1F3FD,200D,2696,FE0F||25;1F469,1F3FE,200D,2696,FE0F||25;1F469,1F3FF,200D,2696,FE0F||25 - 1F9D1,1F3FB,200D,1F33E||30;1F9D1,1F3FC,200D,1F33E||30;1F9D1,1F3FD,200D,1F33E||30;1F9D1,1F3FE,200D,1F33E||30;1F9D1,1F3FF,200D,1F33E||30 - 1F468,1F3FB,200D,1F33E||25;1F468,1F3FC,200D,1F33E||25;1F468,1F3FD,200D,1F33E||25;1F468,1F3FE,200D,1F33E||25;1F468,1F3FF,200D,1F33E||25 - 1F469,1F3FB,200D,1F33E||25;1F469,1F3FC,200D,1F33E||25;1F469,1F3FD,200D,1F33E||25;1F469,1F3FE,200D,1F33E||25;1F469,1F3FF,200D,1F33E||25 - 1F9D1,1F3FB,200D,1F373||30;1F9D1,1F3FC,200D,1F373||30;1F9D1,1F3FD,200D,1F373||30;1F9D1,1F3FE,200D,1F373||30;1F9D1,1F3FF,200D,1F373||30 - 1F468,1F3FB,200D,1F373||25;1F468,1F3FC,200D,1F373||25;1F468,1F3FD,200D,1F373||25;1F468,1F3FE,200D,1F373||25;1F468,1F3FF,200D,1F373||25 - 1F469,1F3FB,200D,1F373||25;1F469,1F3FC,200D,1F373||25;1F469,1F3FD,200D,1F373||25;1F469,1F3FE,200D,1F373||25;1F469,1F3FF,200D,1F373||25 - 1F9D1,1F3FB,200D,1F527||30;1F9D1,1F3FC,200D,1F527||30;1F9D1,1F3FD,200D,1F527||30;1F9D1,1F3FE,200D,1F527||30;1F9D1,1F3FF,200D,1F527||30 - 1F468,1F3FB,200D,1F527||25;1F468,1F3FC,200D,1F527||25;1F468,1F3FD,200D,1F527||25;1F468,1F3FE,200D,1F527||25;1F468,1F3FF,200D,1F527||25 - 1F469,1F3FB,200D,1F527||25;1F469,1F3FC,200D,1F527||25;1F469,1F3FD,200D,1F527||25;1F469,1F3FE,200D,1F527||25;1F469,1F3FF,200D,1F527||25 - 1F9D1,1F3FB,200D,1F3ED||30;1F9D1,1F3FC,200D,1F3ED||30;1F9D1,1F3FD,200D,1F3ED||30;1F9D1,1F3FE,200D,1F3ED||30;1F9D1,1F3FF,200D,1F3ED||30 - 1F468,1F3FB,200D,1F3ED||25;1F468,1F3FC,200D,1F3ED||25;1F468,1F3FD,200D,1F3ED||25;1F468,1F3FE,200D,1F3ED||25;1F468,1F3FF,200D,1F3ED||25 - 1F469,1F3FB,200D,1F3ED||25;1F469,1F3FC,200D,1F3ED||25;1F469,1F3FD,200D,1F3ED||25;1F469,1F3FE,200D,1F3ED||25;1F469,1F3FF,200D,1F3ED||25 - 1F9D1,1F3FB,200D,1F4BC||30;1F9D1,1F3FC,200D,1F4BC||30;1F9D1,1F3FD,200D,1F4BC||30;1F9D1,1F3FE,200D,1F4BC||30;1F9D1,1F3FF,200D,1F4BC||30 - 1F468,1F3FB,200D,1F4BC||25;1F468,1F3FC,200D,1F4BC||25;1F468,1F3FD,200D,1F4BC||25;1F468,1F3FE,200D,1F4BC||25;1F468,1F3FF,200D,1F4BC||25 - 1F469,1F3FB,200D,1F4BC||25;1F469,1F3FC,200D,1F4BC||25;1F469,1F3FD,200D,1F4BC||25;1F469,1F3FE,200D,1F4BC||25;1F469,1F3FF,200D,1F4BC||25 - 1F9D1,1F3FB,200D,1F52C||30;1F9D1,1F3FC,200D,1F52C||30;1F9D1,1F3FD,200D,1F52C||30;1F9D1,1F3FE,200D,1F52C||30;1F9D1,1F3FF,200D,1F52C||30 - 1F468,1F3FB,200D,1F52C||25;1F468,1F3FC,200D,1F52C||25;1F468,1F3FD,200D,1F52C||25;1F468,1F3FE,200D,1F52C||25;1F468,1F3FF,200D,1F52C||25 - 1F469,1F3FB,200D,1F52C||25;1F469,1F3FC,200D,1F52C||25;1F469,1F3FD,200D,1F52C||25;1F469,1F3FE,200D,1F52C||25;1F469,1F3FF,200D,1F52C||25 - 1F9D1,1F3FB,200D,1F4BB||30;1F9D1,1F3FC,200D,1F4BB||30;1F9D1,1F3FD,200D,1F4BB||30;1F9D1,1F3FE,200D,1F4BB||30;1F9D1,1F3FF,200D,1F4BB||30 - 1F468,1F3FB,200D,1F4BB||25;1F468,1F3FC,200D,1F4BB||25;1F468,1F3FD,200D,1F4BB||25;1F468,1F3FE,200D,1F4BB||25;1F468,1F3FF,200D,1F4BB||25 - 1F469,1F3FB,200D,1F4BB||25;1F469,1F3FC,200D,1F4BB||25;1F469,1F3FD,200D,1F4BB||25;1F469,1F3FE,200D,1F4BB||25;1F469,1F3FF,200D,1F4BB||25 - 1F9D1,1F3FB,200D,1F3A4||30;1F9D1,1F3FC,200D,1F3A4||30;1F9D1,1F3FD,200D,1F3A4||30;1F9D1,1F3FE,200D,1F3A4||30;1F9D1,1F3FF,200D,1F3A4||30 - 1F468,1F3FB,200D,1F3A4||25;1F468,1F3FC,200D,1F3A4||25;1F468,1F3FD,200D,1F3A4||25;1F468,1F3FE,200D,1F3A4||25;1F468,1F3FF,200D,1F3A4||25 - 1F469,1F3FB,200D,1F3A4||25;1F469,1F3FC,200D,1F3A4||25;1F469,1F3FD,200D,1F3A4||25;1F469,1F3FE,200D,1F3A4||25;1F469,1F3FF,200D,1F3A4||25 - 1F9D1,1F3FB,200D,1F3A8||30;1F9D1,1F3FC,200D,1F3A8||30;1F9D1,1F3FD,200D,1F3A8||30;1F9D1,1F3FE,200D,1F3A8||30;1F9D1,1F3FF,200D,1F3A8||30 - 1F468,1F3FB,200D,1F3A8||25;1F468,1F3FC,200D,1F3A8||25;1F468,1F3FD,200D,1F3A8||25;1F468,1F3FE,200D,1F3A8||25;1F468,1F3FF,200D,1F3A8||25 - 1F469,1F3FB,200D,1F3A8||25;1F469,1F3FC,200D,1F3A8||25;1F469,1F3FD,200D,1F3A8||25;1F469,1F3FE,200D,1F3A8||25;1F469,1F3FF,200D,1F3A8||25 - 1F9D1,1F3FB,200D,2708,FE0F||30;1F9D1,1F3FC,200D,2708,FE0F||30;1F9D1,1F3FD,200D,2708,FE0F||30;1F9D1,1F3FE,200D,2708,FE0F||30;1F9D1,1F3FF,200D,2708,FE0F||30 - 1F468,1F3FB,200D,2708,FE0F||25;1F468,1F3FC,200D,2708,FE0F||25;1F468,1F3FD,200D,2708,FE0F||25;1F468,1F3FE,200D,2708,FE0F||25;1F468,1F3FF,200D,2708,FE0F||25 - 1F469,1F3FB,200D,2708,FE0F||25;1F469,1F3FC,200D,2708,FE0F||25;1F469,1F3FD,200D,2708,FE0F||25;1F469,1F3FE,200D,2708,FE0F||25;1F469,1F3FF,200D,2708,FE0F||25 - 1F9D1,1F3FB,200D,1F680||30;1F9D1,1F3FC,200D,1F680||30;1F9D1,1F3FD,200D,1F680||30;1F9D1,1F3FE,200D,1F680||30;1F9D1,1F3FF,200D,1F680||30 - 1F468,1F3FB,200D,1F680||25;1F468,1F3FC,200D,1F680||25;1F468,1F3FD,200D,1F680||25;1F468,1F3FE,200D,1F680||25;1F468,1F3FF,200D,1F680||25 - 1F469,1F3FB,200D,1F680||25;1F469,1F3FC,200D,1F680||25;1F469,1F3FD,200D,1F680||25;1F469,1F3FE,200D,1F680||25;1F469,1F3FF,200D,1F680||25 - 1F9D1,1F3FB,200D,1F692||30;1F9D1,1F3FC,200D,1F692||30;1F9D1,1F3FD,200D,1F692||30;1F9D1,1F3FE,200D,1F692||30;1F9D1,1F3FF,200D,1F692||30 - 1F468,1F3FB,200D,1F692||25;1F468,1F3FC,200D,1F692||25;1F468,1F3FD,200D,1F692||25;1F468,1F3FE,200D,1F692||25;1F468,1F3FF,200D,1F692||25 - 1F469,1F3FB,200D,1F692||25;1F469,1F3FC,200D,1F692||25;1F469,1F3FD,200D,1F692||25;1F469,1F3FE,200D,1F692||25;1F469,1F3FF,200D,1F692||25 - 1F46E,1F3FB||24;1F46E,1F3FC||24;1F46E,1F3FD||24;1F46E,1F3FE||24;1F46E,1F3FF||24 - 1F46E,1F3FB,200D,2642,FE0F||25;1F46E,1F3FC,200D,2642,FE0F||25;1F46E,1F3FD,200D,2642,FE0F||25;1F46E,1F3FE,200D,2642,FE0F||25;1F46E,1F3FF,200D,2642,FE0F||25 - 1F46E,1F3FB,200D,2640,FE0F||25;1F46E,1F3FC,200D,2640,FE0F||25;1F46E,1F3FD,200D,2640,FE0F||25;1F46E,1F3FE,200D,2640,FE0F||25;1F46E,1F3FF,200D,2640,FE0F||25 - 1F575,1F3FB||24;1F575,1F3FC||24;1F575,1F3FD||24;1F575,1F3FE||24;1F575,1F3FF||24 - 1F575,1F3FB,200D,2642,FE0F||25;1F575,1F3FC,200D,2642,FE0F||25;1F575,1F3FD,200D,2642,FE0F||25;1F575,1F3FE,200D,2642,FE0F||25;1F575,1F3FF,200D,2642,FE0F||25 - 1F575,1F3FB,200D,2640,FE0F||25;1F575,1F3FC,200D,2640,FE0F||25;1F575,1F3FD,200D,2640,FE0F||25;1F575,1F3FE,200D,2640,FE0F||25;1F575,1F3FF,200D,2640,FE0F||25 - 1F482,1F3FB||24;1F482,1F3FC||24;1F482,1F3FD||24;1F482,1F3FE||24;1F482,1F3FF||24 - 1F482,1F3FB,200D,2642,FE0F||25;1F482,1F3FC,200D,2642,FE0F||25;1F482,1F3FD,200D,2642,FE0F||25;1F482,1F3FE,200D,2642,FE0F||25;1F482,1F3FF,200D,2642,FE0F||25 - 1F482,1F3FB,200D,2640,FE0F||25;1F482,1F3FC,200D,2640,FE0F||25;1F482,1F3FD,200D,2640,FE0F||25;1F482,1F3FE,200D,2640,FE0F||25;1F482,1F3FF,200D,2640,FE0F||25 - 1F977,1F3FB||30;1F977,1F3FC||30;1F977,1F3FD||30;1F977,1F3FE||30;1F977,1F3FF||30 - 1F477,1F3FB||24;1F477,1F3FC||24;1F477,1F3FD||24;1F477,1F3FE||24;1F477,1F3FF||24 - 1F477,1F3FB,200D,2642,FE0F||25;1F477,1F3FC,200D,2642,FE0F||25;1F477,1F3FD,200D,2642,FE0F||25;1F477,1F3FE,200D,2642,FE0F||25;1F477,1F3FF,200D,2642,FE0F||25 - 1F477,1F3FB,200D,2640,FE0F||25;1F477,1F3FC,200D,2640,FE0F||25;1F477,1F3FD,200D,2640,FE0F||25;1F477,1F3FE,200D,2640,FE0F||25;1F477,1F3FF,200D,2640,FE0F||25 - 1FAC5,1F3FB||32;1FAC5,1F3FC||32;1FAC5,1F3FD||32;1FAC5,1F3FE||32;1FAC5,1F3FF||32 - 1F934,1F3FB||24;1F934,1F3FC||24;1F934,1F3FD||24;1F934,1F3FE||24;1F934,1F3FF||24 - 1F478,1F3FB||24;1F478,1F3FC||24;1F478,1F3FD||24;1F478,1F3FE||24;1F478,1F3FF||24 - 1F473,1F3FB||24;1F473,1F3FC||24;1F473,1F3FD||24;1F473,1F3FE||24;1F473,1F3FF||24 - 1F473,1F3FB,200D,2642,FE0F||25;1F473,1F3FC,200D,2642,FE0F||25;1F473,1F3FD,200D,2642,FE0F||25;1F473,1F3FE,200D,2642,FE0F||25;1F473,1F3FF,200D,2642,FE0F||25 - 1F473,1F3FB,200D,2640,FE0F||25;1F473,1F3FC,200D,2640,FE0F||25;1F473,1F3FD,200D,2640,FE0F||25;1F473,1F3FE,200D,2640,FE0F||25;1F473,1F3FF,200D,2640,FE0F||25 - 1F472,1F3FB||24;1F472,1F3FC||24;1F472,1F3FD||24;1F472,1F3FE||24;1F472,1F3FF||24 - 1F9D5,1F3FB||26;1F9D5,1F3FC||26;1F9D5,1F3FD||26;1F9D5,1F3FE||26;1F9D5,1F3FF||26 - 1F935,1F3FB||24;1F935,1F3FC||24;1F935,1F3FD||24;1F935,1F3FE||24;1F935,1F3FF||24 - 1F935,1F3FB,200D,2642,FE0F||30;1F935,1F3FC,200D,2642,FE0F||30;1F935,1F3FD,200D,2642,FE0F||30;1F935,1F3FE,200D,2642,FE0F||30;1F935,1F3FF,200D,2642,FE0F||30 - 1F935,1F3FB,200D,2640,FE0F||30;1F935,1F3FC,200D,2640,FE0F||30;1F935,1F3FD,200D,2640,FE0F||30;1F935,1F3FE,200D,2640,FE0F||30;1F935,1F3FF,200D,2640,FE0F||30 - 1F470,1F3FB||24;1F470,1F3FC||24;1F470,1F3FD||24;1F470,1F3FE||24;1F470,1F3FF||24 - 1F470,1F3FB,200D,2642,FE0F||30;1F470,1F3FC,200D,2642,FE0F||30;1F470,1F3FD,200D,2642,FE0F||30;1F470,1F3FE,200D,2642,FE0F||30;1F470,1F3FF,200D,2642,FE0F||30 - 1F470,1F3FB,200D,2640,FE0F||30;1F470,1F3FC,200D,2640,FE0F||30;1F470,1F3FD,200D,2640,FE0F||30;1F470,1F3FE,200D,2640,FE0F||30;1F470,1F3FF,200D,2640,FE0F||30 - 1F930,1F3FB||24;1F930,1F3FC||24;1F930,1F3FD||24;1F930,1F3FE||24;1F930,1F3FF||24 - 1FAC3,1F3FB||32;1FAC3,1F3FC||32;1FAC3,1F3FD||32;1FAC3,1F3FE||32;1FAC3,1F3FF||32 - 1FAC4,1F3FB||32;1FAC4,1F3FC||32;1FAC4,1F3FD||32;1FAC4,1F3FE||32;1FAC4,1F3FF||32 - 1F931,1F3FB||26;1F931,1F3FC||26;1F931,1F3FD||26;1F931,1F3FE||26;1F931,1F3FF||26 - 1F469,1F3FB,200D,1F37C||30;1F469,1F3FC,200D,1F37C||30;1F469,1F3FD,200D,1F37C||30;1F469,1F3FE,200D,1F37C||30;1F469,1F3FF,200D,1F37C||30 - 1F468,1F3FB,200D,1F37C||30;1F468,1F3FC,200D,1F37C||30;1F468,1F3FD,200D,1F37C||30;1F468,1F3FE,200D,1F37C||30;1F468,1F3FF,200D,1F37C||30 - 1F9D1,1F3FB,200D,1F37C||30;1F9D1,1F3FC,200D,1F37C||30;1F9D1,1F3FD,200D,1F37C||30;1F9D1,1F3FE,200D,1F37C||30;1F9D1,1F3FF,200D,1F37C||30 - 1F47C,1F3FB||24;1F47C,1F3FC||24;1F47C,1F3FD||24;1F47C,1F3FE||24;1F47C,1F3FF||24 - 1F385,1F3FB||24;1F385,1F3FC||24;1F385,1F3FD||24;1F385,1F3FE||24;1F385,1F3FF||24 - 1F936,1F3FB||24;1F936,1F3FC||24;1F936,1F3FD||24;1F936,1F3FE||24;1F936,1F3FF||24 - 1F9D1,1F3FB,200D,1F384||30;1F9D1,1F3FC,200D,1F384||30;1F9D1,1F3FD,200D,1F384||30;1F9D1,1F3FE,200D,1F384||30;1F9D1,1F3FF,200D,1F384||30 - 1F9B8,1F3FB||28;1F9B8,1F3FC||28;1F9B8,1F3FD||28;1F9B8,1F3FE||28;1F9B8,1F3FF||28 - 1F9B8,1F3FB,200D,2642,FE0F||28;1F9B8,1F3FC,200D,2642,FE0F||28;1F9B8,1F3FD,200D,2642,FE0F||28;1F9B8,1F3FE,200D,2642,FE0F||28;1F9B8,1F3FF,200D,2642,FE0F||28 - 1F9B8,1F3FB,200D,2640,FE0F||28;1F9B8,1F3FC,200D,2640,FE0F||28;1F9B8,1F3FD,200D,2640,FE0F||28;1F9B8,1F3FE,200D,2640,FE0F||28;1F9B8,1F3FF,200D,2640,FE0F||28 - 1F9B9,1F3FB||28;1F9B9,1F3FC||28;1F9B9,1F3FD||28;1F9B9,1F3FE||28;1F9B9,1F3FF||28 - 1F9B9,1F3FB,200D,2642,FE0F||28;1F9B9,1F3FC,200D,2642,FE0F||28;1F9B9,1F3FD,200D,2642,FE0F||28;1F9B9,1F3FE,200D,2642,FE0F||28;1F9B9,1F3FF,200D,2642,FE0F||28 - 1F9B9,1F3FB,200D,2640,FE0F||28;1F9B9,1F3FC,200D,2640,FE0F||28;1F9B9,1F3FD,200D,2640,FE0F||28;1F9B9,1F3FE,200D,2640,FE0F||28;1F9B9,1F3FF,200D,2640,FE0F||28 - 1F9D9,1F3FB||26;1F9D9,1F3FC||26;1F9D9,1F3FD||26;1F9D9,1F3FE||26;1F9D9,1F3FF||26 - 1F9D9,1F3FB,200D,2642,FE0F||26;1F9D9,1F3FC,200D,2642,FE0F||26;1F9D9,1F3FD,200D,2642,FE0F||26;1F9D9,1F3FE,200D,2642,FE0F||26;1F9D9,1F3FF,200D,2642,FE0F||26 - 1F9D9,1F3FB,200D,2640,FE0F||26;1F9D9,1F3FC,200D,2640,FE0F||26;1F9D9,1F3FD,200D,2640,FE0F||26;1F9D9,1F3FE,200D,2640,FE0F||26;1F9D9,1F3FF,200D,2640,FE0F||26 - 1F9DA,1F3FB||26;1F9DA,1F3FC||26;1F9DA,1F3FD||26;1F9DA,1F3FE||26;1F9DA,1F3FF||26 - 1F9DA,1F3FB,200D,2642,FE0F||26;1F9DA,1F3FC,200D,2642,FE0F||26;1F9DA,1F3FD,200D,2642,FE0F||26;1F9DA,1F3FE,200D,2642,FE0F||26;1F9DA,1F3FF,200D,2642,FE0F||26 - 1F9DA,1F3FB,200D,2640,FE0F||26;1F9DA,1F3FC,200D,2640,FE0F||26;1F9DA,1F3FD,200D,2640,FE0F||26;1F9DA,1F3FE,200D,2640,FE0F||26;1F9DA,1F3FF,200D,2640,FE0F||26 - 1F9DB,1F3FB||26;1F9DB,1F3FC||26;1F9DB,1F3FD||26;1F9DB,1F3FE||26;1F9DB,1F3FF||26 - 1F9DB,1F3FB,200D,2642,FE0F||26;1F9DB,1F3FC,200D,2642,FE0F||26;1F9DB,1F3FD,200D,2642,FE0F||26;1F9DB,1F3FE,200D,2642,FE0F||26;1F9DB,1F3FF,200D,2642,FE0F||26 - 1F9DB,1F3FB,200D,2640,FE0F||26;1F9DB,1F3FC,200D,2640,FE0F||26;1F9DB,1F3FD,200D,2640,FE0F||26;1F9DB,1F3FE,200D,2640,FE0F||26;1F9DB,1F3FF,200D,2640,FE0F||26 - 1F9DC,1F3FB||26;1F9DC,1F3FC||26;1F9DC,1F3FD||26;1F9DC,1F3FE||26;1F9DC,1F3FF||26 - 1F9DC,1F3FB,200D,2642,FE0F||26;1F9DC,1F3FC,200D,2642,FE0F||26;1F9DC,1F3FD,200D,2642,FE0F||26;1F9DC,1F3FE,200D,2642,FE0F||26;1F9DC,1F3FF,200D,2642,FE0F||26 - 1F9DC,1F3FB,200D,2640,FE0F||26;1F9DC,1F3FC,200D,2640,FE0F||26;1F9DC,1F3FD,200D,2640,FE0F||26;1F9DC,1F3FE,200D,2640,FE0F||26;1F9DC,1F3FF,200D,2640,FE0F||26 - 1F9DD,1F3FB||26;1F9DD,1F3FC||26;1F9DD,1F3FD||26;1F9DD,1F3FE||26;1F9DD,1F3FF||26 - 1F9DD,1F3FB,200D,2642,FE0F||26;1F9DD,1F3FC,200D,2642,FE0F||26;1F9DD,1F3FD,200D,2642,FE0F||26;1F9DD,1F3FE,200D,2642,FE0F||26;1F9DD,1F3FF,200D,2642,FE0F||26 - 1F9DD,1F3FB,200D,2640,FE0F||26;1F9DD,1F3FC,200D,2640,FE0F||26;1F9DD,1F3FD,200D,2640,FE0F||26;1F9DD,1F3FE,200D,2640,FE0F||26;1F9DD,1F3FF,200D,2640,FE0F||26 - - - - - - - - 1F486,1F3FB||24;1F486,1F3FC||24;1F486,1F3FD||24;1F486,1F3FE||24;1F486,1F3FF||24 - 1F486,1F3FB,200D,2642,FE0F||25;1F486,1F3FC,200D,2642,FE0F||25;1F486,1F3FD,200D,2642,FE0F||25;1F486,1F3FE,200D,2642,FE0F||25;1F486,1F3FF,200D,2642,FE0F||25 - 1F486,1F3FB,200D,2640,FE0F||25;1F486,1F3FC,200D,2640,FE0F||25;1F486,1F3FD,200D,2640,FE0F||25;1F486,1F3FE,200D,2640,FE0F||25;1F486,1F3FF,200D,2640,FE0F||25 - 1F487,1F3FB||24;1F487,1F3FC||24;1F487,1F3FD||24;1F487,1F3FE||24;1F487,1F3FF||24 - 1F487,1F3FB,200D,2642,FE0F||25;1F487,1F3FC,200D,2642,FE0F||25;1F487,1F3FD,200D,2642,FE0F||25;1F487,1F3FE,200D,2642,FE0F||25;1F487,1F3FF,200D,2642,FE0F||25 - 1F487,1F3FB,200D,2640,FE0F||25;1F487,1F3FC,200D,2640,FE0F||25;1F487,1F3FD,200D,2640,FE0F||25;1F487,1F3FE,200D,2640,FE0F||25;1F487,1F3FF,200D,2640,FE0F||25 - 1F6B6,1F3FB||24;1F6B6,1F3FC||24;1F6B6,1F3FD||24;1F6B6,1F3FE||24;1F6B6,1F3FF||24 - 1F6B6,1F3FB,200D,2642,FE0F||25;1F6B6,1F3FC,200D,2642,FE0F||25;1F6B6,1F3FD,200D,2642,FE0F||25;1F6B6,1F3FE,200D,2642,FE0F||25;1F6B6,1F3FF,200D,2642,FE0F||25 - 1F6B6,1F3FB,200D,2640,FE0F||25;1F6B6,1F3FC,200D,2640,FE0F||25;1F6B6,1F3FD,200D,2640,FE0F||25;1F6B6,1F3FE,200D,2640,FE0F||25;1F6B6,1F3FF,200D,2640,FE0F||25 - 1F6B6,1F3FB,200D,27A1,FE0F||34;1F6B6,1F3FC,200D,27A1,FE0F||34;1F6B6,1F3FD,200D,27A1,FE0F||34;1F6B6,1F3FE,200D,27A1,FE0F||34;1F6B6,1F3FF,200D,27A1,FE0F||34 - 1F6B6,1F3FB,200D,2640,FE0F,200D,27A1,FE0F||34;1F6B6,1F3FC,200D,2640,FE0F,200D,27A1,FE0F||34;1F6B6,1F3FD,200D,2640,FE0F,200D,27A1,FE0F||34;1F6B6,1F3FE,200D,2640,FE0F,200D,27A1,FE0F||34;1F6B6,1F3FF,200D,2640,FE0F,200D,27A1,FE0F||34 - 1F6B6,1F3FB,200D,2642,FE0F,200D,27A1,FE0F||34;1F6B6,1F3FC,200D,2642,FE0F,200D,27A1,FE0F||34;1F6B6,1F3FD,200D,2642,FE0F,200D,27A1,FE0F||34;1F6B6,1F3FE,200D,2642,FE0F,200D,27A1,FE0F||34;1F6B6,1F3FF,200D,2642,FE0F,200D,27A1,FE0F||34 - 1F9CD,1F3FB||29;1F9CD,1F3FC||29;1F9CD,1F3FD||29;1F9CD,1F3FE||29;1F9CD,1F3FF||29 - 1F9CD,1F3FB,200D,2642,FE0F||29;1F9CD,1F3FC,200D,2642,FE0F||29;1F9CD,1F3FD,200D,2642,FE0F||29;1F9CD,1F3FE,200D,2642,FE0F||29;1F9CD,1F3FF,200D,2642,FE0F||29 - 1F9CD,1F3FB,200D,2640,FE0F||29;1F9CD,1F3FC,200D,2640,FE0F||29;1F9CD,1F3FD,200D,2640,FE0F||29;1F9CD,1F3FE,200D,2640,FE0F||29;1F9CD,1F3FF,200D,2640,FE0F||29 - 1F9CE,1F3FB||29;1F9CE,1F3FC||29;1F9CE,1F3FD||29;1F9CE,1F3FE||29;1F9CE,1F3FF||29 - 1F9CE,1F3FB,200D,2642,FE0F||29;1F9CE,1F3FC,200D,2642,FE0F||29;1F9CE,1F3FD,200D,2642,FE0F||29;1F9CE,1F3FE,200D,2642,FE0F||29;1F9CE,1F3FF,200D,2642,FE0F||29 - 1F9CE,1F3FB,200D,2640,FE0F||29;1F9CE,1F3FC,200D,2640,FE0F||29;1F9CE,1F3FD,200D,2640,FE0F||29;1F9CE,1F3FE,200D,2640,FE0F||29;1F9CE,1F3FF,200D,2640,FE0F||29 - 1F9CE,1F3FB,200D,27A1,FE0F||34;1F9CE,1F3FC,200D,27A1,FE0F||34;1F9CE,1F3FD,200D,27A1,FE0F||34;1F9CE,1F3FE,200D,27A1,FE0F||34;1F9CE,1F3FF,200D,27A1,FE0F||34 - 1F9CE,1F3FB,200D,2640,FE0F,200D,27A1,FE0F||34;1F9CE,1F3FC,200D,2640,FE0F,200D,27A1,FE0F||34;1F9CE,1F3FD,200D,2640,FE0F,200D,27A1,FE0F||34;1F9CE,1F3FE,200D,2640,FE0F,200D,27A1,FE0F||34;1F9CE,1F3FF,200D,2640,FE0F,200D,27A1,FE0F||34 - 1F9CE,1F3FB,200D,2642,FE0F,200D,27A1,FE0F||34;1F9CE,1F3FC,200D,2642,FE0F,200D,27A1,FE0F||34;1F9CE,1F3FD,200D,2642,FE0F,200D,27A1,FE0F||34;1F9CE,1F3FE,200D,2642,FE0F,200D,27A1,FE0F||34;1F9CE,1F3FF,200D,2642,FE0F,200D,27A1,FE0F||34 - 1F9D1,1F3FB,200D,1F9AF||30;1F9D1,1F3FC,200D,1F9AF||30;1F9D1,1F3FD,200D,1F9AF||30;1F9D1,1F3FE,200D,1F9AF||30;1F9D1,1F3FF,200D,1F9AF||30 - 1F9D1,1F3FB,200D,1F9AF,200D,27A1,FE0F||34;1F9D1,1F3FC,200D,1F9AF,200D,27A1,FE0F||34;1F9D1,1F3FD,200D,1F9AF,200D,27A1,FE0F||34;1F9D1,1F3FE,200D,1F9AF,200D,27A1,FE0F||34;1F9D1,1F3FF,200D,1F9AF,200D,27A1,FE0F||34 - 1F468,1F3FB,200D,1F9AF||29;1F468,1F3FC,200D,1F9AF||29;1F468,1F3FD,200D,1F9AF||29;1F468,1F3FE,200D,1F9AF||29;1F468,1F3FF,200D,1F9AF||29 - 1F468,1F3FB,200D,1F9AF,200D,27A1,FE0F||34;1F468,1F3FC,200D,1F9AF,200D,27A1,FE0F||34;1F468,1F3FD,200D,1F9AF,200D,27A1,FE0F||34;1F468,1F3FE,200D,1F9AF,200D,27A1,FE0F||34;1F468,1F3FF,200D,1F9AF,200D,27A1,FE0F||34 - 1F469,1F3FB,200D,1F9AF||29;1F469,1F3FC,200D,1F9AF||29;1F469,1F3FD,200D,1F9AF||29;1F469,1F3FE,200D,1F9AF||29;1F469,1F3FF,200D,1F9AF||29 - 1F469,1F3FB,200D,1F9AF,200D,27A1,FE0F||34;1F469,1F3FC,200D,1F9AF,200D,27A1,FE0F||34;1F469,1F3FD,200D,1F9AF,200D,27A1,FE0F||34;1F469,1F3FE,200D,1F9AF,200D,27A1,FE0F||34;1F469,1F3FF,200D,1F9AF,200D,27A1,FE0F||34 - 1F9D1,1F3FB,200D,1F9BC||30;1F9D1,1F3FC,200D,1F9BC||30;1F9D1,1F3FD,200D,1F9BC||30;1F9D1,1F3FE,200D,1F9BC||30;1F9D1,1F3FF,200D,1F9BC||30 - 1F9D1,1F3FB,200D,1F9BC,200D,27A1,FE0F||34;1F9D1,1F3FC,200D,1F9BC,200D,27A1,FE0F||34;1F9D1,1F3FD,200D,1F9BC,200D,27A1,FE0F||34;1F9D1,1F3FE,200D,1F9BC,200D,27A1,FE0F||34;1F9D1,1F3FF,200D,1F9BC,200D,27A1,FE0F||34 - 1F468,1F3FB,200D,1F9BC||29;1F468,1F3FC,200D,1F9BC||29;1F468,1F3FD,200D,1F9BC||29;1F468,1F3FE,200D,1F9BC||29;1F468,1F3FF,200D,1F9BC||29 - 1F468,1F3FB,200D,1F9BC,200D,27A1,FE0F||34;1F468,1F3FC,200D,1F9BC,200D,27A1,FE0F||34;1F468,1F3FD,200D,1F9BC,200D,27A1,FE0F||34;1F468,1F3FE,200D,1F9BC,200D,27A1,FE0F||34;1F468,1F3FF,200D,1F9BC,200D,27A1,FE0F||34 - 1F469,1F3FB,200D,1F9BC||29;1F469,1F3FC,200D,1F9BC||29;1F469,1F3FD,200D,1F9BC||29;1F469,1F3FE,200D,1F9BC||29;1F469,1F3FF,200D,1F9BC||29 - 1F469,1F3FB,200D,1F9BC,200D,27A1,FE0F||34;1F469,1F3FC,200D,1F9BC,200D,27A1,FE0F||34;1F469,1F3FD,200D,1F9BC,200D,27A1,FE0F||34;1F469,1F3FE,200D,1F9BC,200D,27A1,FE0F||34;1F469,1F3FF,200D,1F9BC,200D,27A1,FE0F||34 - 1F9D1,1F3FB,200D,1F9BD||30;1F9D1,1F3FC,200D,1F9BD||30;1F9D1,1F3FD,200D,1F9BD||30;1F9D1,1F3FE,200D,1F9BD||30;1F9D1,1F3FF,200D,1F9BD||30 - 1F9D1,1F3FB,200D,1F9BD,200D,27A1,FE0F||34;1F9D1,1F3FC,200D,1F9BD,200D,27A1,FE0F||34;1F9D1,1F3FD,200D,1F9BD,200D,27A1,FE0F||34;1F9D1,1F3FE,200D,1F9BD,200D,27A1,FE0F||34;1F9D1,1F3FF,200D,1F9BD,200D,27A1,FE0F||34 - 1F468,1F3FB,200D,1F9BD||29;1F468,1F3FC,200D,1F9BD||29;1F468,1F3FD,200D,1F9BD||29;1F468,1F3FE,200D,1F9BD||29;1F468,1F3FF,200D,1F9BD||29 - 1F468,1F3FB,200D,1F9BD,200D,27A1,FE0F||34;1F468,1F3FC,200D,1F9BD,200D,27A1,FE0F||34;1F468,1F3FD,200D,1F9BD,200D,27A1,FE0F||34;1F468,1F3FE,200D,1F9BD,200D,27A1,FE0F||34;1F468,1F3FF,200D,1F9BD,200D,27A1,FE0F||34 - 1F469,1F3FB,200D,1F9BD||29;1F469,1F3FC,200D,1F9BD||29;1F469,1F3FD,200D,1F9BD||29;1F469,1F3FE,200D,1F9BD||29;1F469,1F3FF,200D,1F9BD||29 - 1F469,1F3FB,200D,1F9BD,200D,27A1,FE0F||34;1F469,1F3FC,200D,1F9BD,200D,27A1,FE0F||34;1F469,1F3FD,200D,1F9BD,200D,27A1,FE0F||34;1F469,1F3FE,200D,1F9BD,200D,27A1,FE0F||34;1F469,1F3FF,200D,1F9BD,200D,27A1,FE0F||34 - 1F3C3,1F3FB||24;1F3C3,1F3FC||24;1F3C3,1F3FD||24;1F3C3,1F3FE||24;1F3C3,1F3FF||24 - 1F3C3,1F3FB,200D,2642,FE0F||25;1F3C3,1F3FC,200D,2642,FE0F||25;1F3C3,1F3FD,200D,2642,FE0F||25;1F3C3,1F3FE,200D,2642,FE0F||25;1F3C3,1F3FF,200D,2642,FE0F||25 - 1F3C3,1F3FB,200D,2640,FE0F||25;1F3C3,1F3FC,200D,2640,FE0F||25;1F3C3,1F3FD,200D,2640,FE0F||25;1F3C3,1F3FE,200D,2640,FE0F||25;1F3C3,1F3FF,200D,2640,FE0F||25 - 1F3C3,1F3FB,200D,27A1,FE0F||34;1F3C3,1F3FC,200D,27A1,FE0F||34;1F3C3,1F3FD,200D,27A1,FE0F||34;1F3C3,1F3FE,200D,27A1,FE0F||34;1F3C3,1F3FF,200D,27A1,FE0F||34 - 1F3C3,1F3FB,200D,2640,FE0F,200D,27A1,FE0F||34;1F3C3,1F3FC,200D,2640,FE0F,200D,27A1,FE0F||34;1F3C3,1F3FD,200D,2640,FE0F,200D,27A1,FE0F||34;1F3C3,1F3FE,200D,2640,FE0F,200D,27A1,FE0F||34;1F3C3,1F3FF,200D,2640,FE0F,200D,27A1,FE0F||34 - 1F3C3,1F3FB,200D,2642,FE0F,200D,27A1,FE0F||34;1F3C3,1F3FC,200D,2642,FE0F,200D,27A1,FE0F||34;1F3C3,1F3FD,200D,2642,FE0F,200D,27A1,FE0F||34;1F3C3,1F3FE,200D,2642,FE0F,200D,27A1,FE0F||34;1F3C3,1F3FF,200D,2642,FE0F,200D,27A1,FE0F||34 - 1F483,1F3FB||24;1F483,1F3FC||24;1F483,1F3FD||24;1F483,1F3FE||24;1F483,1F3FF||24 - 1F57A,1F3FB||24;1F57A,1F3FC||24;1F57A,1F3FD||24;1F57A,1F3FE||24;1F57A,1F3FF||24 - 1F574,1F3FB||26;1F574,1F3FC||26;1F574,1F3FD||26;1F574,1F3FE||26;1F574,1F3FF||26 - - - - 1F9D6,1F3FB||26;1F9D6,1F3FC||26;1F9D6,1F3FD||26;1F9D6,1F3FE||26;1F9D6,1F3FF||26 - 1F9D6,1F3FB,200D,2642,FE0F||26;1F9D6,1F3FC,200D,2642,FE0F||26;1F9D6,1F3FD,200D,2642,FE0F||26;1F9D6,1F3FE,200D,2642,FE0F||26;1F9D6,1F3FF,200D,2642,FE0F||26 - 1F9D6,1F3FB,200D,2640,FE0F||26;1F9D6,1F3FC,200D,2640,FE0F||26;1F9D6,1F3FD,200D,2640,FE0F||26;1F9D6,1F3FE,200D,2640,FE0F||26;1F9D6,1F3FF,200D,2640,FE0F||26 - 1F9D7,1F3FB||26;1F9D7,1F3FC||26;1F9D7,1F3FD||26;1F9D7,1F3FE||26;1F9D7,1F3FF||26 - 1F9D7,1F3FB,200D,2642,FE0F||26;1F9D7,1F3FC,200D,2642,FE0F||26;1F9D7,1F3FD,200D,2642,FE0F||26;1F9D7,1F3FE,200D,2642,FE0F||26;1F9D7,1F3FF,200D,2642,FE0F||26 - 1F9D7,1F3FB,200D,2640,FE0F||26;1F9D7,1F3FC,200D,2640,FE0F||26;1F9D7,1F3FD,200D,2640,FE0F||26;1F9D7,1F3FE,200D,2640,FE0F||26;1F9D7,1F3FF,200D,2640,FE0F||26 - - 1F3C7,1F3FB||26;1F3C7,1F3FC||26;1F3C7,1F3FD||26;1F3C7,1F3FE||26;1F3C7,1F3FF||26 - - 1F3C2,1F3FB||26;1F3C2,1F3FC||26;1F3C2,1F3FD||26;1F3C2,1F3FE||26;1F3C2,1F3FF||26 - 1F3CC,1F3FB||26;1F3CC,1F3FC||26;1F3CC,1F3FD||26;1F3CC,1F3FE||26;1F3CC,1F3FF||26 - 1F3CC,1F3FB,200D,2642,FE0F||26;1F3CC,1F3FC,200D,2642,FE0F||26;1F3CC,1F3FD,200D,2642,FE0F||26;1F3CC,1F3FE,200D,2642,FE0F||26;1F3CC,1F3FF,200D,2642,FE0F||26 - 1F3CC,1F3FB,200D,2640,FE0F||26;1F3CC,1F3FC,200D,2640,FE0F||26;1F3CC,1F3FD,200D,2640,FE0F||26;1F3CC,1F3FE,200D,2640,FE0F||26;1F3CC,1F3FF,200D,2640,FE0F||26 - 1F3C4,1F3FB||24;1F3C4,1F3FC||24;1F3C4,1F3FD||24;1F3C4,1F3FE||24;1F3C4,1F3FF||24 - 1F3C4,1F3FB,200D,2642,FE0F||25;1F3C4,1F3FC,200D,2642,FE0F||25;1F3C4,1F3FD,200D,2642,FE0F||25;1F3C4,1F3FE,200D,2642,FE0F||25;1F3C4,1F3FF,200D,2642,FE0F||25 - 1F3C4,1F3FB,200D,2640,FE0F||25;1F3C4,1F3FC,200D,2640,FE0F||25;1F3C4,1F3FD,200D,2640,FE0F||25;1F3C4,1F3FE,200D,2640,FE0F||25;1F3C4,1F3FF,200D,2640,FE0F||25 - 1F6A3,1F3FB||24;1F6A3,1F3FC||24;1F6A3,1F3FD||24;1F6A3,1F3FE||24;1F6A3,1F3FF||24 - 1F6A3,1F3FB,200D,2642,FE0F||25;1F6A3,1F3FC,200D,2642,FE0F||25;1F6A3,1F3FD,200D,2642,FE0F||25;1F6A3,1F3FE,200D,2642,FE0F||25;1F6A3,1F3FF,200D,2642,FE0F||25 - 1F6A3,1F3FB,200D,2640,FE0F||25;1F6A3,1F3FC,200D,2640,FE0F||25;1F6A3,1F3FD,200D,2640,FE0F||25;1F6A3,1F3FE,200D,2640,FE0F||25;1F6A3,1F3FF,200D,2640,FE0F||25 - 1F3CA,1F3FB||24;1F3CA,1F3FC||24;1F3CA,1F3FD||24;1F3CA,1F3FE||24;1F3CA,1F3FF||24 - 1F3CA,1F3FB,200D,2642,FE0F||25;1F3CA,1F3FC,200D,2642,FE0F||25;1F3CA,1F3FD,200D,2642,FE0F||25;1F3CA,1F3FE,200D,2642,FE0F||25;1F3CA,1F3FF,200D,2642,FE0F||25 - 1F3CA,1F3FB,200D,2640,FE0F||25;1F3CA,1F3FC,200D,2640,FE0F||25;1F3CA,1F3FD,200D,2640,FE0F||25;1F3CA,1F3FE,200D,2640,FE0F||25;1F3CA,1F3FF,200D,2640,FE0F||25 - 26F9,1F3FB||24;26F9,1F3FC||24;26F9,1F3FD||24;26F9,1F3FE||24;26F9,1F3FF||24 - 26F9,1F3FB,200D,2642,FE0F||25;26F9,1F3FC,200D,2642,FE0F||25;26F9,1F3FD,200D,2642,FE0F||25;26F9,1F3FE,200D,2642,FE0F||25;26F9,1F3FF,200D,2642,FE0F||25 - 26F9,1F3FB,200D,2640,FE0F||25;26F9,1F3FC,200D,2640,FE0F||25;26F9,1F3FD,200D,2640,FE0F||25;26F9,1F3FE,200D,2640,FE0F||25;26F9,1F3FF,200D,2640,FE0F||25 - 1F3CB,1F3FB||24;1F3CB,1F3FC||24;1F3CB,1F3FD||24;1F3CB,1F3FE||24;1F3CB,1F3FF||24 - 1F3CB,1F3FB,200D,2642,FE0F||25;1F3CB,1F3FC,200D,2642,FE0F||25;1F3CB,1F3FD,200D,2642,FE0F||25;1F3CB,1F3FE,200D,2642,FE0F||25;1F3CB,1F3FF,200D,2642,FE0F||25 - 1F3CB,1F3FB,200D,2640,FE0F||25;1F3CB,1F3FC,200D,2640,FE0F||25;1F3CB,1F3FD,200D,2640,FE0F||25;1F3CB,1F3FE,200D,2640,FE0F||25;1F3CB,1F3FF,200D,2640,FE0F||25 - 1F6B4,1F3FB||24;1F6B4,1F3FC||24;1F6B4,1F3FD||24;1F6B4,1F3FE||24;1F6B4,1F3FF||24 - 1F6B4,1F3FB,200D,2642,FE0F||25;1F6B4,1F3FC,200D,2642,FE0F||25;1F6B4,1F3FD,200D,2642,FE0F||25;1F6B4,1F3FE,200D,2642,FE0F||25;1F6B4,1F3FF,200D,2642,FE0F||25 - 1F6B4,1F3FB,200D,2640,FE0F||25;1F6B4,1F3FC,200D,2640,FE0F||25;1F6B4,1F3FD,200D,2640,FE0F||25;1F6B4,1F3FE,200D,2640,FE0F||25;1F6B4,1F3FF,200D,2640,FE0F||25 - 1F6B5,1F3FB||24;1F6B5,1F3FC||24;1F6B5,1F3FD||24;1F6B5,1F3FE||24;1F6B5,1F3FF||24 - 1F6B5,1F3FB,200D,2642,FE0F||25;1F6B5,1F3FC,200D,2642,FE0F||25;1F6B5,1F3FD,200D,2642,FE0F||25;1F6B5,1F3FE,200D,2642,FE0F||25;1F6B5,1F3FF,200D,2642,FE0F||25 - 1F6B5,1F3FB,200D,2640,FE0F||25;1F6B5,1F3FC,200D,2640,FE0F||25;1F6B5,1F3FD,200D,2640,FE0F||25;1F6B5,1F3FE,200D,2640,FE0F||25;1F6B5,1F3FF,200D,2640,FE0F||25 - 1F938,1F3FB||24;1F938,1F3FC||24;1F938,1F3FD||24;1F938,1F3FE||24;1F938,1F3FF||24 - 1F938,1F3FB,200D,2642,FE0F||25;1F938,1F3FC,200D,2642,FE0F||25;1F938,1F3FD,200D,2642,FE0F||25;1F938,1F3FE,200D,2642,FE0F||25;1F938,1F3FF,200D,2642,FE0F||25 - 1F938,1F3FB,200D,2640,FE0F||25;1F938,1F3FC,200D,2640,FE0F||25;1F938,1F3FD,200D,2640,FE0F||25;1F938,1F3FE,200D,2640,FE0F||25;1F938,1F3FF,200D,2640,FE0F||25 - - - - 1F93D,1F3FB||24;1F93D,1F3FC||24;1F93D,1F3FD||24;1F93D,1F3FE||24;1F93D,1F3FF||24 - 1F93D,1F3FB,200D,2642,FE0F||25;1F93D,1F3FC,200D,2642,FE0F||25;1F93D,1F3FD,200D,2642,FE0F||25;1F93D,1F3FE,200D,2642,FE0F||25;1F93D,1F3FF,200D,2642,FE0F||25 - 1F93D,1F3FB,200D,2640,FE0F||25;1F93D,1F3FC,200D,2640,FE0F||25;1F93D,1F3FD,200D,2640,FE0F||25;1F93D,1F3FE,200D,2640,FE0F||25;1F93D,1F3FF,200D,2640,FE0F||25 - 1F93E,1F3FB||24;1F93E,1F3FC||24;1F93E,1F3FD||24;1F93E,1F3FE||24;1F93E,1F3FF||24 - 1F93E,1F3FB,200D,2642,FE0F||25;1F93E,1F3FC,200D,2642,FE0F||25;1F93E,1F3FD,200D,2642,FE0F||25;1F93E,1F3FE,200D,2642,FE0F||25;1F93E,1F3FF,200D,2642,FE0F||25 - 1F93E,1F3FB,200D,2640,FE0F||25;1F93E,1F3FC,200D,2640,FE0F||25;1F93E,1F3FD,200D,2640,FE0F||25;1F93E,1F3FE,200D,2640,FE0F||25;1F93E,1F3FF,200D,2640,FE0F||25 - 1F939,1F3FB||24;1F939,1F3FC||24;1F939,1F3FD||24;1F939,1F3FE||24;1F939,1F3FF||24 - 1F939,1F3FB,200D,2642,FE0F||25;1F939,1F3FC,200D,2642,FE0F||25;1F939,1F3FD,200D,2642,FE0F||25;1F939,1F3FE,200D,2642,FE0F||25;1F939,1F3FF,200D,2642,FE0F||25 - 1F939,1F3FB,200D,2640,FE0F||25;1F939,1F3FC,200D,2640,FE0F||25;1F939,1F3FD,200D,2640,FE0F||25;1F939,1F3FE,200D,2640,FE0F||25;1F939,1F3FF,200D,2640,FE0F||25 - 1F9D8,1F3FB||26;1F9D8,1F3FC||26;1F9D8,1F3FD||26;1F9D8,1F3FE||26;1F9D8,1F3FF||26 - 1F9D8,1F3FB,200D,2642,FE0F||26;1F9D8,1F3FC,200D,2642,FE0F||26;1F9D8,1F3FD,200D,2642,FE0F||26;1F9D8,1F3FE,200D,2642,FE0F||26;1F9D8,1F3FF,200D,2642,FE0F||26 - 1F9D8,1F3FB,200D,2640,FE0F||26;1F9D8,1F3FC,200D,2640,FE0F||26;1F9D8,1F3FD,200D,2640,FE0F||26;1F9D8,1F3FE,200D,2640,FE0F||26;1F9D8,1F3FF,200D,2640,FE0F||26 - 1F6C0,1F3FB||24;1F6C0,1F3FC||24;1F6C0,1F3FD||24;1F6C0,1F3FE||24;1F6C0,1F3FF||24 - 1F6CC,1F3FB||26;1F6CC,1F3FC||26;1F6CC,1F3FD||26;1F6CC,1F3FE||26;1F6CC,1F3FF||26 - - 1F46D,1F3FB||29;1F46D,1F3FC||29;1F46D,1F3FD||29;1F46D,1F3FE||29;1F46D,1F3FF||29 - 1F46B,1F3FB||29;1F46B,1F3FC||29;1F46B,1F3FD||29;1F46B,1F3FE||29;1F46B,1F3FF||29 - 1F46C,1F3FB||29;1F46C,1F3FC||29;1F46C,1F3FD||29;1F46C,1F3FE||29;1F46C,1F3FF||29 - 1F48F,1F3FB||31;1F48F,1F3FC||31;1F48F,1F3FD||31;1F48F,1F3FE||31;1F48F,1F3FF||31 - - - - 1F491,1F3FB||31;1F491,1F3FC||31;1F491,1F3FD||31;1F491,1F3FE||31;1F491,1F3FF||31 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1F435 - 1F412 - 1F98D||24 - 1F9A7||29 - 1F436 - 1F415 - 1F9AE||29 - 1F415,200D,1F9BA||29 - 1F429 - 1F43A - 1F98A||24 - 1F99D||28 - 1F431 - 1F408 - 1F408,200D,2B1B||30 - 1F981||23 - 1F42F - 1F405 - 1F406 - 1F434 - 1FACE||33 - 1FACF||33 - 1F40E - 1F984||23 - 1F993||26 - 1F98C||24 - 1F9AC||30 - 1F42E - 1F402 - 1F403 - 1F404 - 1F437 - 1F416 - 1F417 - 1F43D - 1F40F - 1F411 - 1F410 - 1F42A - 1F42B - 1F999||28 - 1F992||26 - 1F418 - 1F9A3||30 - 1F98F||24 - 1F99B||28 - 1F42D - 1F401 - 1F400 - 1F439 - 1F430 - 1F407 - 1F43F,FE0F||23 - 1F9AB||30 - 1F994||26 - 1F987||24 - 1F43B - 1F43B,200D,2744,FE0F||30 - 1F428 - 1F43C - 1F9A5||29 - 1F9A6||29 - 1F9A8||29 - 1F998||28 - 1F9A1||28 - 1F43E - 1F983||23 - 1F414 - 1F413 - 1F423 - 1F424 - 1F425 - 1F426 - 1F427 - 1F54A,FE0F||23 - 1F985||24 - 1F986||24 - 1F9A2||28 - 1F989||24 - 1F9A4||30 - 1FAB6||30 - 1F9A9||29 - 1F99A||28 - 1F99C||28 - 1FABD||33 - 1F426,200D,2B1B||33 - 1FABF||33 - 1F426,200D,1F525||34 - 1F438 - 1F40A - 1F422 - 1F98E||24 - 1F40D - 1F432 - 1F409 - 1F995||26 - 1F996||26 - 1F433 - 1F40B - 1F42C - 1F9AD||30 - 1F41F - 1F420 - 1F421 - 1F988||24 - 1F419 - 1F41A - 1FAB8||32 - 1FABC||33 - 1F980||23 - 1F99E||28 - 1F990||24 - 1F991||24 - 1F9AA||29 - 1F40C - 1F98B||24 - 1F41B - 1F41C - 1F41D - 1FAB2||30 - 1F41E - 1F997||26 - 1FAB3||30 - 1F577,FE0F||23 - 1F578,FE0F||23 - 1F982||23 - 1F99F||28 - 1FAB0||30 - 1FAB1||30 - 1F9A0||28 - 1F490 - 1F338 - 1F4AE - 1FAB7||32 - 1F3F5,FE0F||23 - 1F339 - 1F940||24 - 1F33A - 1F33B - 1F33C - 1F337 - 1FABB||33 - 1F331 - 1FAB4||30 - 1F332 - 1F333 - 1F334 - 1F335 - 1F33E - 1F33F - 2618,FE0F||23 - 1F340 - 1F341 - 1F342 - 1F343 - 1FAB9||32 - 1FABA||32 - 1F344 - 1FABE||35 - - - - 1F347 - 1F348 - 1F349 - 1F34A - 1F34B - 1F34B,200D,1F7E9||34 - 1F34C - 1F34D - 1F96D||28 - 1F34E - 1F34F - 1F350 - 1F351 - 1F352 - 1F353 - 1FAD0||30 - 1F95D||24 - 1F345 - 1FAD2||30 - 1F965||26 - 1F951||24 - 1F346 - 1F954||24 - 1F955||24 - 1F33D - 1F336,FE0F||23 - 1FAD1||30 - 1F952||24 - 1F96C||28 - 1F966||26 - 1F9C4||29 - 1F9C5||29 - 1F95C||24 - 1FAD8||32 - 1F330 - 1FADA||33 - 1FADB||33 - 1F344,200D,1F7EB||34 - 1FADC||35 - 1F35E - 1F950||24 - 1F956||24 - 1FAD3||30 - 1F968||26 - 1F96F||28 - 1F95E||24 - 1F9C7||29 - 1F9C0||23 - 1F356 - 1F357 - 1F969||26 - 1F953||24 - 1F354 - 1F35F - 1F355 - 1F32D||23 - 1F96A||26 - 1F32E||23 - 1F32F||23 - 1FAD4||30 - 1F959||24 - 1F9C6||29 - 1F95A||24 - 1F373 - 1F958||24 - 1F372 - 1FAD5||30 - 1F963||26 - 1F957||24 - 1F37F||23 - 1F9C8||29 - 1F9C2||28 - 1F96B||26 - 1F371 - 1F358 - 1F359 - 1F35A - 1F35B - 1F35C - 1F35D - 1F360 - 1F362 - 1F363 - 1F364 - 1F365 - 1F96E||28 - 1F361 - 1F95F||26 - 1F960||26 - 1F961||26 - 1F366 - 1F367 - 1F368 - 1F369 - 1F36A - 1F382 - 1F370 - 1F9C1||28 - 1F967||26 - 1F36B - 1F36C - 1F36D - 1F36E - 1F36F - 1F37C - 1F95B||24 - 2615 - 1FAD6||30 - 1F375 - 1F376 - 1F37E||23 - 1F377 - 1F378 - 1F379 - 1F37A - 1F37B - 1F942||24 - 1F943||24 - 1FAD7||32 - 1F964||26 - 1F9CB||30 - 1F9C3||29 - 1F9C9||29 - 1F9CA||29 - 1F962||26 - 1F37D,FE0F||23 - 1F374 - 1F944||24 - 1F52A - 1FAD9||32 - 1F3FA||23 - - - - 1F30D - 1F30E - 1F30F - 1F310 - 1F5FA,FE0F||23 - 1F5FE - 1F9ED||28 - 1F3D4,FE0F||23 - 26F0,FE0F||23 - 1F30B - 1F5FB - 1F3D5,FE0F||23 - 1F3D6,FE0F||23 - 1F3DC,FE0F||23 - 1F3DD,FE0F||23 - 1F3DE,FE0F||23 - 1F3DF,FE0F||23 - 1F3DB,FE0F||23 - 1F3D7,FE0F||23 - 1F9F1||28 - 1FAA8||30 - 1FAB5||30 - 1F6D6||30 - 1F3D8,FE0F||23 - 1F3DA,FE0F||23 - 1F3E0 - 1F3E1 - 1F3E2 - 1F3E3 - 1F3E4 - 1F3E5 - 1F3E6 - 1F3E8 - 1F3E9 - 1F3EA - 1F3EB - 1F3EC - 1F3ED - 1F3EF - 1F3F0 - 1F492 - 1F5FC - 1F5FD - 26EA - 1F54C||23 - 1F6D5||29 - 1F54D||23 - 26E9,FE0F||23 - 1F54B||23 - 26F2 - 26FA - 1F301 - 1F303 - 1F3D9,FE0F||23 - 1F304 - 1F305 - 1F306 - 1F307 - 1F309 - 2668,FE0F - 1F3A0 - 1F6DD||32 - 1F3A1 - 1F3A2 - 1F488 - 1F3AA - 1F682 - 1F683 - 1F684 - 1F685 - 1F686 - 1F687 - 1F688 - 1F689 - 1F68A - 1F69D - 1F69E - 1F68B - 1F68C - 1F68D - 1F68E - 1F690 - 1F691 - 1F692 - 1F693 - 1F694 - 1F695 - 1F696 - 1F697 - 1F698 - 1F699 - 1F6FB||30 - 1F69A - 1F69B - 1F69C - 1F3CE,FE0F||23 - 1F3CD,FE0F||23 - 1F6F5||24 - 1F9BD||29 - 1F9BC||29 - 1F6FA||29 - 1F6B2 - 1F6F4||24 - 1F6F9||28 - 1F6FC||30 - 1F68F - 1F6E3,FE0F||23 - 1F6E4,FE0F||23 - 1F6E2,FE0F||23 - 26FD - 1F6DE||32 - 1F6A8 - 1F6A5 - 1F6A6 - 1F6D1||24 - 1F6A7 - 2693 - 1F6DF||32 - 26F5 - 1F6F6||24 - 1F6A4 - 1F6F3,FE0F||23 - 26F4,FE0F||23 - 1F6E5,FE0F||23 - 1F6A2 - 2708,FE0F - 1F6E9,FE0F||23 - 1F6EB||23 - 1F6EC||23 - 1FA82||29 - 1F4BA - 1F681 - 1F69F - 1F6A0 - 1F6A1 - 1F6F0,FE0F||23 - 1F680 - 1F6F8||26 - 1F6CE,FE0F||23 - 1F9F3||28 - 231B - 23F3 - 231A - 23F0 - 23F1,FE0F||23 - 23F2,FE0F||23 - 1F570,FE0F||23 - 1F55B - 1F567 - 1F550 - 1F55C - 1F551 - 1F55D - 1F552 - 1F55E - 1F553 - 1F55F - 1F554 - 1F560 - 1F555 - 1F561 - 1F556 - 1F562 - 1F557 - 1F563 - 1F558 - 1F564 - 1F559 - 1F565 - 1F55A - 1F566 - 1F311 - 1F312 - 1F313 - 1F314 - 1F315 - 1F316 - 1F317 - 1F318 - 1F319 - 1F31A - 1F31B - 1F31C - 1F321,FE0F||23 - 2600,FE0F - 1F31D - 1F31E - 1FA90||29 - 2B50 - 1F31F - 1F320 - 1F30C - 2601,FE0F - 26C5 - 26C8,FE0F||23 - 1F324,FE0F||23 - 1F325,FE0F||23 - 1F326,FE0F||23 - 1F327,FE0F||23 - 1F328,FE0F||23 - 1F329,FE0F||23 - 1F32A,FE0F||23 - 1F32B,FE0F||23 - 1F32C,FE0F||23 - 1F300 - 1F308 - 1F302 - 2602,FE0F||23 - 2614 - 26F1,FE0F||23 - 26A1 - 2744,FE0F - 2603,FE0F||23 - 26C4 - 2604,FE0F||23 - 1F525 - 1F4A7 - 1F30A - - - - 1F383 - 1F384 - 1F386 - 1F387 - 1F9E8||28 - 2728 - 1F388 - 1F389 - 1F38A - 1F38B - 1F38D - 1F38E - 1F38F - 1F390 - 1F391 - 1F9E7||28 - 1F380 - 1F381 - 1F397,FE0F||23 - 1F39F,FE0F||23 - 1F3AB - 1F396,FE0F||23 - 1F3C6 - 1F3C5||23 - 1F947||24 - 1F948||24 - 1F949||24 - 26BD - 26BE - 1F94E||28 - 1F3C0 - 1F3D0||23 - 1F3C8 - 1F3C9 - 1F3BE - 1F94F||28 - 1F3B3 - 1F3CF||23 - 1F3D1||23 - 1F3D2||23 - 1F94D||28 - 1F3D3||23 - 1F3F8||23 - 1F94A||24 - 1F94B||24 - 1F945||24 - 26F3 - 26F8,FE0F||23 - 1F3A3 - 1F93F||29 - 1F3BD - 1F3BF - 1F6F7||26 - 1F94C||26 - 1F3AF - 1FA80||29 - 1FA81||29 - 1F52B - 1F3B1 - 1F52E - 1FA84||30 - 1F3AE - 1F579,FE0F||23 - 1F3B0 - 1F3B2 - 1F9E9||28 - 1F9F8||28 - 1FA85||30 - 1FAA9||32 - 1FA86||30 - 2660,FE0F - 2665,FE0F - 2666,FE0F - 2663,FE0F - 265F,FE0F||28 - 1F0CF - 1F004 - 1F3B4 - 1F3AD - 1F5BC,FE0F||23 - 1F3A8 - 1F9F5||28 - 1FAA1||30 - 1F9F6||28 - 1FAA2||30 - - - - 1F453 - 1F576,FE0F||23 - 1F97D||28 - 1F97C||28 - 1F9BA||29 - 1F454 - 1F455 - 1F456 - 1F9E3||26 - 1F9E4||26 - 1F9E5||26 - 1F9E6||26 - 1F457 - 1F458 - 1F97B||29 - 1FA71||29 - 1FA72||29 - 1FA73||29 - 1F459 - 1F45A - 1FAAD||33 - 1F45B - 1F45C - 1F45D - 1F6CD,FE0F||23 - 1F392 - 1FA74||30 - 1F45E - 1F45F - 1F97E||28 - 1F97F||28 - 1F460 - 1F461 - 1FA70||29 - 1F462 - 1FAAE||33 - 1F451 - 1F452 - 1F3A9 - 1F393 - 1F9E2||26 - 1FA96||30 - 26D1,FE0F||23 - 1F4FF||23 - 1F484 - 1F48D - 1F48E - 1F507 - 1F508 - 1F509 - 1F50A - 1F4E2 - 1F4E3 - 1F4EF - 1F514 - 1F515 - 1F3BC - 1F3B5 - 1F3B6 - 1F399,FE0F||23 - 1F39A,FE0F||23 - 1F39B,FE0F||23 - 1F3A4 - 1F3A7 - 1F4FB - 1F3B7 - 1FA97||30 - 1F3B8 - 1F3B9 - 1F3BA - 1F3BB - 1FA95||29 - 1F941||24 - 1FA98||30 - 1FA87||33 - 1FA88||33 - 1FA89||35 - 1F4F1 - 1F4F2 - 260E,FE0F - 1F4DE - 1F4DF - 1F4E0 - 1F50B - 1FAAB||32 - 1F50C - 1F4BB - 1F5A5,FE0F||23 - 1F5A8,FE0F||23 - 2328,FE0F||23 - 1F5B1,FE0F||23 - 1F5B2,FE0F||23 - 1F4BD - 1F4BE - 1F4BF - 1F4C0 - 1F9EE||28 - 1F3A5 - 1F39E,FE0F||23 - 1F4FD,FE0F||23 - 1F3AC - 1F4FA - 1F4F7 - 1F4F8||23 - 1F4F9 - 1F4FC - 1F50D - 1F50E - 1F56F,FE0F||23 - 1F4A1 - 1F526 - 1F3EE - 1FA94||29 - 1F4D4 - 1F4D5 - 1F4D6 - 1F4D7 - 1F4D8 - 1F4D9 - 1F4DA - 1F4D3 - 1F4D2 - 1F4C3 - 1F4DC - 1F4C4 - 1F4F0 - 1F5DE,FE0F||23 - 1F4D1 - 1F516 - 1F3F7,FE0F||23 - 1F4B0 - 1FA99||30 - 1F4B4 - 1F4B5 - 1F4B6 - 1F4B7 - 1F4B8 - 1F4B3 - 1F9FE||28 - 1F4B9 - 2709,FE0F - 1F4E7 - 1F4E8 - 1F4E9 - 1F4E4 - 1F4E5 - 1F4E6 - 1F4EB - 1F4EA - 1F4EC - 1F4ED - 1F4EE - 1F5F3,FE0F||23 - 270F,FE0F - 2712,FE0F - 1F58B,FE0F||23 - 1F58A,FE0F||23 - 1F58C,FE0F||23 - 1F58D,FE0F||23 - 1F4DD - 1F4BC - 1F4C1 - 1F4C2 - 1F5C2,FE0F||23 - 1F4C5 - 1F4C6 - 1F5D2,FE0F||23 - 1F5D3,FE0F||23 - 1F4C7 - 1F4C8 - 1F4C9 - 1F4CA - 1F4CB - 1F4CC - 1F4CD - 1F4CE - 1F587,FE0F||23 - 1F4CF - 1F4D0 - 2702,FE0F - 1F5C3,FE0F||23 - 1F5C4,FE0F||23 - 1F5D1,FE0F||23 - 1F512 - 1F513 - 1F50F - 1F510 - 1F511 - 1F5DD,FE0F||23 - 1F528 - 1FA93||29 - 26CF,FE0F||23 - 2692,FE0F||23 - 1F6E0,FE0F||23 - 1F5E1,FE0F||23 - 2694,FE0F||23 - 1F4A3 - 1FA83||30 - 1F3F9||23 - 1F6E1,FE0F||23 - 1FA9A||30 - 1F527 - 1FA9B||30 - 1F529 - 2699,FE0F||23 - 1F5DC,FE0F||23 - 2696,FE0F||23 - 1F9AF||29 - 1F517 - 26D3,FE0F,200D,1F4A5||34 - 26D3,FE0F||23 - 1FA9D||30 - 1F9F0||28 - 1F9F2||28 - 1FA9C||30 - 1FA8F||35 - 2697,FE0F||23 - 1F9EA||28 - 1F9EB||28 - 1F9EC||28 - 1F52C - 1F52D - 1F4E1 - 1F489 - 1FA78||29 - 1F48A - 1FA79||29 - 1FA7C||32 - 1FA7A||29 - 1FA7B||32 - 1F6AA - 1F6D7||30 - 1FA9E||30 - 1FA9F||30 - 1F6CF,FE0F||23 - 1F6CB,FE0F||23 - 1FA91||29 - 1F6BD - 1FAA0||30 - 1F6BF - 1F6C1 - 1FAA4||30 - 1FA92||29 - 1F9F4||28 - 1F9F7||28 - 1F9F9||28 - 1F9FA||28 - 1F9FB||28 - 1FAA3||30 - 1F9FC||28 - 1FAE7||32 - 1FAA5||30 - 1F9FD||28 - 1F9EF||28 - 1F6D2||24 - 1F6AC - 26B0,FE0F||23 - 1FAA6||30 - 26B1,FE0F||23 - 1F9FF||28 - 1FAAC||32 - 1F5FF - 1FAA7||30 - 1FAAA||32 - - - - 1F3E7 - 1F6AE - 1F6B0 - 267F - 1F6B9 - 1F6BA - 1F6BB - 1F6BC - 1F6BE - 1F6C2 - 1F6C3 - 1F6C4 - 1F6C5 - 26A0,FE0F - 1F6B8 - 26D4 - 1F6AB - 1F6B3 - 1F6AD - 1F6AF - 1F6B1 - 1F6B7 - 1F4F5 - 1F51E - 2622,FE0F||23 - 2623,FE0F||23 - 2B06,FE0F - 2197,FE0F - 27A1,FE0F - 2198,FE0F - 2B07,FE0F - 2199,FE0F - 2B05,FE0F - 2196,FE0F - 2195,FE0F - 2194,FE0F - 21A9,FE0F - 21AA,FE0F - 2934,FE0F - 2935,FE0F - 1F503 - 1F504 - 1F519 - 1F51A - 1F51B - 1F51C - 1F51D - 1F6D0||23 - 269B,FE0F||23 - 1F549,FE0F||23 - 2721,FE0F||23 - 2638,FE0F||23 - 262F,FE0F||23 - 271D,FE0F||23 - 2626,FE0F||23 - 262A,FE0F||23 - 262E,FE0F||23 - 1F54E||23 - 1F52F - 1FAAF||33 - 2648 - 2649 - 264A - 264B - 264C - 264D - 264E - 264F - 2650 - 2651 - 2652 - 2653 - 26CE - 1F500 - 1F501 - 1F502 - 25B6,FE0F - 23E9 - 23ED,FE0F||23 - 23EF,FE0F||23 - 25C0,FE0F - 23EA - 23EE,FE0F||23 - 1F53C - 23EB - 1F53D - 23EC - 23F8,FE0F||23 - 23F9,FE0F||23 - 23FA,FE0F||23 - 23CF,FE0F||23 - 1F3A6 - 1F505 - 1F506 - 1F4F6 - 1F6DC||33 - 1F4F3 - 1F4F4 - 2640,FE0F||25 - 2642,FE0F||25 - 26A7,FE0F||30 - 2716,FE0F - 2795 - 2796 - 2797 - 1F7F0||32 - 267E,FE0F||28 - 203C,FE0F - 2049,FE0F - 2753 - 2754 - 2755 - 2757 - 3030,FE0F - 1F4B1 - 1F4B2 - 2695,FE0F||25 - 267B,FE0F - 269C,FE0F||23 - 1F531 - 1F4DB - 1F530 - 2B55 - 2705 - 2611,FE0F - 2714,FE0F - 274C - 274E - 27B0 - 27BF - 303D,FE0F - 2733,FE0F - 2734,FE0F - 2747,FE0F - A9,FE0F - AE,FE0F - 2122,FE0F - 1FADF||35 - 1F1E6 - 1F1E7 - 1F1E8 - 1F1E9 - 1F1EA - 1F1EB - 1F1EC - 1F1ED - 1F1EE - 1F1EF - 1F1F0 - 1F1F1 - 1F1F2 - 1F1F3 - 1F1F4 - 1F1F5 - 1F1F6 - 1F1F7 - 1F1F8 - 1F1F9 - 1F1FA - 1F1FB - 1F1FC - 1F1FD - 1F1FE - 1F1FF - 23,FE0F,20E3 - 2A,FE0F,20E3||23 - 30,FE0F,20E3 - 31,FE0F,20E3 - 32,FE0F,20E3 - 33,FE0F,20E3 - 34,FE0F,20E3 - 35,FE0F,20E3 - 36,FE0F,20E3 - 37,FE0F,20E3 - 38,FE0F,20E3 - 39,FE0F,20E3 - 1F51F - 1F520 - 1F521 - 1F522 - 1F523 - 1F524 - 1F170,FE0F - 1F18E - 1F171,FE0F - 1F191 - 1F192 - 1F193 - 2139,FE0F - 1F194 - 24C2,FE0F - 1F195 - 1F196 - 1F17E,FE0F - 1F197 - 1F17F,FE0F - 1F198 - 1F199 - 1F19A - 1F201 - 1F202,FE0F - 1F237,FE0F - 1F236 - 1F22F - 1F250 - 1F239 - 1F21A - 1F232 - 1F251 - 1F238 - 1F234 - 1F233 - 3297,FE0F - 3299,FE0F - 1F23A - 1F235 - 1F534 - 1F7E0||29 - 1F7E1||29 - 1F7E2||29 - 1F535 - 1F7E3||29 - 1F7E4||29 - 26AB - 26AA - 1F7E5||29 - 1F7E7||29 - 1F7E8||29 - 1F7E9||29 - 1F7E6||29 - 1F7EA||29 - 1F7EB||29 - 2B1B - 2B1C - 25FC,FE0F - 25FB,FE0F - 25FE - 25FD - 25AA,FE0F - 25AB,FE0F - 1F536 - 1F537 - 1F538 - 1F539 - 1F53A - 1F53B - 1F4A0 - 1F518 - 1F533 - 1F532 - - - - 1F3C1 - 1F6A9 - 1F38C - 1F3F4||23 - 1F3F3,FE0F||23 - 1F3F3,FE0F,200D,1F308||25 - 1F3F3,FE0F,200D,26A7,FE0F||30 - 1F3F4,200D,2620,FE0F||28 - 1F1E6,1F1E8||24 - 1F1E6,1F1E9 - 1F1E6,1F1EA - 1F1E6,1F1EB - 1F1E6,1F1EC - 1F1E6,1F1EE - 1F1E6,1F1F1 - 1F1E6,1F1F2 - 1F1E6,1F1F4 - 1F1E6,1F1F6||24 - 1F1E6,1F1F7 - 1F1E6,1F1F8 - 1F1E6,1F1F9 - 1F1E6,1F1FA - 1F1E6,1F1FC - 1F1E6,1F1FD - 1F1E6,1F1FF - 1F1E7,1F1E6 - 1F1E7,1F1E7 - 1F1E7,1F1E9 - 1F1E7,1F1EA - 1F1E7,1F1EB - 1F1E7,1F1EC - 1F1E7,1F1ED - 1F1E7,1F1EE - 1F1E7,1F1EF - 1F1E7,1F1F1||29 - 1F1E7,1F1F2 - 1F1E7,1F1F3 - 1F1E7,1F1F4 - 1F1E7,1F1F6||29 - 1F1E7,1F1F7 - 1F1E7,1F1F8 - 1F1E7,1F1F9 - 1F1E7,1F1FB||24 - 1F1E7,1F1FC - 1F1E7,1F1FE - 1F1E7,1F1FF - 1F1E8,1F1E6 - 1F1E8,1F1E8 - 1F1E8,1F1E9 - 1F1E8,1F1EB - 1F1E8,1F1EC - 1F1E8,1F1ED - 1F1E8,1F1EE - 1F1E8,1F1F0 - 1F1E8,1F1F1 - 1F1E8,1F1F2 - 1F1E8,1F1F3 - 1F1E8,1F1F4 - 1F1E8,1F1F5||24 - 1F1E8,1F1F6||35 - 1F1E8,1F1F7 - 1F1E8,1F1FA - 1F1E8,1F1FB - 1F1E8,1F1FC - 1F1E8,1F1FD - 1F1E8,1F1FE - 1F1E8,1F1FF - 1F1E9,1F1EA - 1F1E9,1F1EC||30 - 1F1E9,1F1EF - 1F1E9,1F1F0 - 1F1E9,1F1F2 - 1F1E9,1F1F4 - 1F1E9,1F1FF - 1F1EA,1F1E6||30 - 1F1EA,1F1E8 - 1F1EA,1F1EA - 1F1EA,1F1EC - 1F1EA,1F1ED||30 - 1F1EA,1F1F7 - 1F1EA,1F1F8 - 1F1EA,1F1F9 - 1F1EA,1F1FA - 1F1EB,1F1EE - 1F1EB,1F1EF - 1F1EB,1F1F0||30 - 1F1EB,1F1F2 - 1F1EB,1F1F4 - 1F1EB,1F1F7 - 1F1EC,1F1E6 - 1F1EC,1F1E7 - 1F1EC,1F1E9 - 1F1EC,1F1EA - 1F1EC,1F1EB||30 - 1F1EC,1F1EC - 1F1EC,1F1ED - 1F1EC,1F1EE - 1F1EC,1F1F1 - 1F1EC,1F1F2 - 1F1EC,1F1F3 - 1F1EC,1F1F5||30 - 1F1EC,1F1F6 - 1F1EC,1F1F7 - 1F1EC,1F1F8||30 - 1F1EC,1F1F9 - 1F1EC,1F1FA - 1F1EC,1F1FC - 1F1EC,1F1FE - 1F1ED,1F1F0 - 1F1ED,1F1F2||24 - 1F1ED,1F1F3 - 1F1ED,1F1F7 - 1F1ED,1F1F9 - 1F1ED,1F1FA - 1F1EE,1F1E8||24 - 1F1EE,1F1E9 - 1F1EE,1F1EA - 1F1EE,1F1F1 - 1F1EE,1F1F2 - 1F1EE,1F1F3 - 1F1EE,1F1F4 - 1F1EE,1F1F6 - 1F1EE,1F1F7 - 1F1EE,1F1F8 - 1F1EE,1F1F9 - 1F1EF,1F1EA - 1F1EF,1F1F2 - 1F1EF,1F1F4 - 1F1EF,1F1F5 - 1F1F0,1F1EA - 1F1F0,1F1EC - 1F1F0,1F1ED - 1F1F0,1F1EE - 1F1F0,1F1F2 - 1F1F0,1F1F3 - 1F1F0,1F1F5 - 1F1F0,1F1F7 - 1F1F0,1F1FC - 1F1F0,1F1FE - 1F1F0,1F1FF - 1F1F1,1F1E6 - 1F1F1,1F1E7 - 1F1F1,1F1E8 - 1F1F1,1F1EE - 1F1F1,1F1F0 - 1F1F1,1F1F7 - 1F1F1,1F1F8 - 1F1F1,1F1F9 - 1F1F1,1F1FA - 1F1F1,1F1FB - 1F1F1,1F1FE - 1F1F2,1F1E6 - 1F1F2,1F1E8 - 1F1F2,1F1E9 - 1F1F2,1F1EA - 1F1F2,1F1EB||30 - 1F1F2,1F1EC - 1F1F2,1F1ED - 1F1F2,1F1F0 - 1F1F2,1F1F1 - 1F1F2,1F1F2 - 1F1F2,1F1F3 - 1F1F2,1F1F4 - 1F1F2,1F1F5 - 1F1F2,1F1F6||29 - 1F1F2,1F1F7 - 1F1F2,1F1F8 - 1F1F2,1F1F9 - 1F1F2,1F1FA - 1F1F2,1F1FB - 1F1F2,1F1FC - 1F1F2,1F1FD - 1F1F2,1F1FE - 1F1F2,1F1FF - 1F1F3,1F1E6 - 1F1F3,1F1E8||30 - 1F1F3,1F1EA - 1F1F3,1F1EB - 1F1F3,1F1EC - 1F1F3,1F1EE - 1F1F3,1F1F1 - 1F1F3,1F1F4 - 1F1F3,1F1F5 - 1F1F3,1F1F7 - 1F1F3,1F1FA - 1F1F3,1F1FF - 1F1F4,1F1F2 - 1F1F5,1F1E6 - 1F1F5,1F1EA - 1F1F5,1F1EB - 1F1F5,1F1EC - 1F1F5,1F1ED - 1F1F5,1F1F0 - 1F1F5,1F1F1 - 1F1F5,1F1F2||30 - 1F1F5,1F1F3 - 1F1F5,1F1F7 - 1F1F5,1F1F8 - 1F1F5,1F1F9 - 1F1F5,1F1FC - 1F1F5,1F1FE - 1F1F6,1F1E6 - 1F1F7,1F1EA||29 - 1F1F7,1F1F4 - 1F1F7,1F1F8 - 1F1F7,1F1FA - 1F1F7,1F1FC - 1F1F8,1F1E6 - 1F1F8,1F1E7 - 1F1F8,1F1E8 - 1F1F8,1F1E9 - 1F1F8,1F1EA - 1F1F8,1F1EC - 1F1F8,1F1ED||24 - 1F1F8,1F1EE - 1F1F8,1F1EF||24 - 1F1F8,1F1F0 - 1F1F8,1F1F1 - 1F1F8,1F1F2 - 1F1F8,1F1F3 - 1F1F8,1F1F4 - 1F1F8,1F1F7 - 1F1F8,1F1F8 - 1F1F8,1F1F9 - 1F1F8,1F1FB - 1F1F8,1F1FD - 1F1F8,1F1FE - 1F1F8,1F1FF - 1F1F9,1F1E6||24 - 1F1F9,1F1E8 - 1F1F9,1F1E9 - 1F1F9,1F1EB||29 - 1F1F9,1F1EC - 1F1F9,1F1ED - 1F1F9,1F1EF - 1F1F9,1F1F0 - 1F1F9,1F1F1 - 1F1F9,1F1F2 - 1F1F9,1F1F3 - 1F1F9,1F1F4 - 1F1F9,1F1F7 - 1F1F9,1F1F9 - 1F1F9,1F1FB - 1F1F9,1F1FC - 1F1F9,1F1FF - 1F1FA,1F1E6 - 1F1FA,1F1EC - 1F1FA,1F1F2||24 - 1F1FA,1F1F3||26 - 1F1FA,1F1F8 - 1F1FA,1F1FE - 1F1FA,1F1FF - 1F1FB,1F1E6 - 1F1FB,1F1E8 - 1F1FB,1F1EA - 1F1FB,1F1EC - 1F1FB,1F1EE - 1F1FB,1F1F3 - 1F1FB,1F1FA - 1F1FC,1F1EB||30 - 1F1FC,1F1F8 - 1F1FD,1F1F0||29 - 1F1FE,1F1EA - 1F1FE,1F1F9||30 - 1F1FF,1F1E6 - 1F1FF,1F1F2 - 1F1FF,1F1FC - 1F3F4,E0067,E0062,E0065,E006E,E0067,E007F||26 - 1F3F4,E0067,E0062,E0073,E0063,E0074,E007F||26 - 1F3F4,E0067,E0062,E0077,E006C,E0073,E007F||26 - - - - - - 30 - 31 - - - - :-) - ;-) - :-( - :-! - :-$ - B-) - =-O - :-P - :O - :-* - :-D - :\'( - :-\\ - O:-) - :-[ - (╯° - □°) - ╯︵ - ┻━┻ - ¯\\_ - (ツ) - _/¯ - ┬─┬ - ︵ /( - .□.\\ - - - - diff --git a/tools/make-emoji-keys/build.gradle b/tools/make-emoji-keys/build.gradle index dde20660e..c621ce362 100644 --- a/tools/make-emoji-keys/build.gradle +++ b/tools/make-emoji-keys/build.gradle @@ -19,13 +19,13 @@ jar { task makeEmoji(type: JavaExec, dependsOn: ['jar']) { main = '-jar' args jar.archiveFile.get() - args '-res' + args '-assets' args project.rootProject.project('app').projectDir.path + File.separator + 'src' + - File.separator + 'main' + File.separator + 'res' + File.separator + 'main' + File.separator + 'assets' + File.separator + 'emoji' } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:2.0.21" + implementation "org.jetbrains.kotlin:kotlin-stdlib:2.1.10" } java { diff --git a/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/EmojiCategoriesResource.kt b/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/EmojiCategoriesResource.kt deleted file mode 100644 index 223a93a92..000000000 --- a/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/EmojiCategoriesResource.kt +++ /dev/null @@ -1,155 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only - -package com.majeur.inputmethod.tools.emoji - -import com.majeur.inputmethod.tools.emoji.model.EmojiData -import com.majeur.inputmethod.tools.emoji.model.EmojiGroup -import java.io.* -import java.nio.charset.Charset -import java.util.jar.JarFile - -class EmojiCategoriesResource(private val jarFile: JarFile) { - - fun writeToAndroidRes(outDir: String?, emojiData: EmojiData, supportData: Map) { - val template = JarUtils.getAndroidResTemplateResource(jarFile) - val resourceDir = template.substring(0, template.lastIndexOf('/')) - var ps: PrintStream? = null - var lnr: LineNumberReader? = null - try { - ps = if (outDir == null) { - System.out - } else { - val outDir = File(outDir, resourceDir) - val outputFile = File(outDir, - ANDROID_RES_TEMPLATE.replace(".tmpl", ".xml")) - outDir.mkdirs() - println("Building android resource file into ${outputFile.absoluteFile}") - PrintStream(outputFile, Charset.forName("UTF-8")) - } - lnr = LineNumberReader(InputStreamReader(JarUtils.openResource(template), Charset.forName("UTF-8"))) - inflateTemplate(lnr, ps!!, emojiData, supportData) - } catch (e: IOException) { - throw RuntimeException(e) - } finally { - JarUtils.close(lnr) - JarUtils.close(ps) - } - } - - @Throws(IOException::class) - private fun inflateTemplate(reader: LineNumberReader, out: PrintStream, - emojis: EmojiData, supportData: Map) { - reader.lines().forEach { - when { - it.contains(MARK_UNICODE_VER) -> - out.println(it.replace(MARK_UNICODE_VER, emojis.unicodeVersion)) - it.contains(MARK_API_LEVEL) -> - out.println(it.replace(MARK_API_LEVEL, supportData.values.maxOrNull().toString())) - it.contains(MARK_SMILEYS_AND_EMOTION) -> - dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.SMILEYS_AND_EMOTION) - it.contains(MARK_PEOPLE_AND_BODY) -> - dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.PEOPLE_AND_BODY) - it.contains(MARK_ANIMALS_AND_NATURE) -> - dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.ANIMALS_AND_NATURE) - it.contains(MARK_FOOD_AND_DRINK) -> - dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.FOOD_AND_DRINK) - it.contains(MARK_TRAVEL_AND_PLACES) -> - dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.TRAVEL_AND_PLACES) - it.contains(MARK_ACTIVITIES) -> - dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.ACTIVITIES) - it.contains(MARK_OBJECTS) -> - dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.OBJECTS) - it.contains(MARK_SYMBOLS) -> - dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.SYMBOLS) - it.contains(MARK_FLAGS) -> - dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.FLAGS) - it.contains(MARK_PEOPLE_AND_BODY_MORE) -> - dumpEmojiSpecsVariant(out, emojis, supportData,EmojiGroup.PEOPLE_AND_BODY) - else -> out.println(it) - } - } - } - - private fun dumpEmojiSpecs(out: PrintStream, emojiData: EmojiData, supportData: Map, - group: EmojiGroup) { - emojiData[group].forEach { emoji -> - val minApi = getMinApi(emoji.codes, supportData) - if (minApi < 0) { - // We have no clue of which android version supports this emoji, - // so we ignore it. - printCompatNotFound(emoji.codes) - return@forEach - } - val text = makeEmojiKey(emoji.codes, minApi) - out.println(" $text") - } - } - - private fun dumpEmojiSpecsVariant(out: PrintStream, emojiData: EmojiData, supportData: Map, - group: EmojiGroup) { - emojiData[group].forEach { baseEmoji -> - val minApi = getMinApi(baseEmoji.codes, supportData) - if (minApi < 0) { - // Same thing, we already encountered it when dumping base emoji, - // ignoring this one silently. - return@forEach - } - - val text = baseEmoji.variants.filter { emoji -> - if (getMinApi(emoji.codes, supportData) < 0) { - // Again - printCompatNotFound(emoji.codes) - return@filter false - } - true - }.map { emoji -> - // Not very efficient, minApi is accessed twice, - // but hey, we are making tooling here - makeEmojiKey(emoji.codes, getMinApi(emoji.codes, supportData)) - }.filter { key -> - key.isNotBlank() - }.joinToString(separator = ";") - - if (text.isNotBlank()) out.println(" $text") - else out.println(" ") - } - } - - private fun makeEmojiKey(codes: IntArray, minApi: Int): String { - val cps = codes - .joinToString(separator = ",") { - it.toString(radix = 16) - .uppercase() - } - return if (minApi > 21) "$cps||$minApi" else cps - } - - private fun getMinApi(codes: IntArray, supportData: Map): Int { - val hash = codes - .joinToString(separator = "") - .hashCode() - return supportData[hash] ?: -1 - } - - private fun printCompatNotFound(codes: IntArray) { - val formattedCps = codes.joinToString(" ") { "U+" + it.toString(radix = 16).uppercase() } - println(" - No android compatibility found for emoji $formattedCps, ignoring...") - } - - companion object { - private const val ANDROID_RES_TEMPLATE = "emoji-categories.tmpl" - private const val MARK_UNICODE_VER = "@UNICODE_VERSION@" - private const val MARK_API_LEVEL = "@ANDROID_API_LEVEL@" - private const val MARK_SMILEYS_AND_EMOTION = "@SMILEYS_AND_EMOTION@" - private const val MARK_PEOPLE_AND_BODY = "@PEOPLE_AND_BODY@" - private const val MARK_PEOPLE_AND_BODY_MORE = "@PEOPLE_AND_BODY MORE@" - private const val MARK_ANIMALS_AND_NATURE = "@ANIMALS_AND_NATURE@" - private const val MARK_FOOD_AND_DRINK = "@FOOD_AND_DRINKS@" - private const val MARK_TRAVEL_AND_PLACES = "@TRAVEL_AND_PLACES@" - private const val MARK_ACTIVITIES = "@ACTIVITIES@" - private const val MARK_OBJECTS = "@OBJECTS@" - private const val MARK_SYMBOLS = "@SYMBOLS@" - private const val MARK_FLAGS = "@FLAGS@" - } - -} \ No newline at end of file diff --git a/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/MakeEmojiKeys.kt b/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/MakeEmojiKeys.kt index 7dd2975af..f76223a63 100644 --- a/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/MakeEmojiKeys.kt +++ b/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/MakeEmojiKeys.kt @@ -2,6 +2,11 @@ package com.majeur.inputmethod.tools.emoji +import com.majeur.inputmethod.tools.emoji.model.EmojiData +import com.majeur.inputmethod.tools.emoji.model.EmojiGroup +import com.majeur.inputmethod.tools.emoji.model.EmojiSpec +import java.io.File +import java.nio.charset.Charset import java.util.* import kotlin.system.exitProcess @@ -9,9 +14,9 @@ class MakeEmojiKeys { class Options(argsArray: Array) { - private val OPTION_RES = "-res" + private val OPTION_ASSETS = "-assets" - var resPath: String? = null + var assetPath: String? = null init { val args = listOf(*argsArray).toMutableList() @@ -19,8 +24,8 @@ class MakeEmojiKeys { try { while (args.isNotEmpty()) { arg = args.removeFirst() - if (arg == OPTION_RES) { - resPath = args.removeFirst() + if (arg == OPTION_ASSETS) { + assetPath = args.removeFirst() } else { usage("Unknown option: $arg") } @@ -32,7 +37,7 @@ class MakeEmojiKeys { fun usage(message: String?) { message?.let { System.err.println(it) } - System.err.println("usage: make-emoji-keys $OPTION_RES ") + System.err.println("usage: make-emoji-keys $OPTION_ASSETS ") exitProcess(1) } } @@ -51,8 +56,52 @@ class MakeEmojiKeys { parser2.parse(JarUtils.getEmojiSupportResource(jar)) val supportData = parser2.getParsedData() - EmojiCategoriesResource(jar).writeToAndroidRes(options.resPath, emojis, supportData) + if (options.assetPath != null) { + writeMinApiLevels(options.assetPath!!, emojis, supportData) + writeEmojis(options.assetPath!!, emojis) + } } + private fun writeMinApiLevels(outDir: String, emojiData: EmojiData, supportData: Map) { + val minApiLevels = mutableMapOf>() + fun addMinLevel(emoji: EmojiSpec) { + val minApi = getMinApi(emoji.codes, supportData) + if (minApi < 0) + throw Exception("unknown min SDK for ${emoji.name}") + if (minApi > 21) + minApiLevels.getOrPut(minApi) { mutableSetOf() }.add(emoji.text) + } + + EmojiGroup.entries.filterNot { it == EmojiGroup.COMPONENT }.forEach { group -> + emojiData[group].forEach { emoji -> + addMinLevel(emoji) + emoji.variants.forEach { addMinLevel(it) } + } + } + if (minApiLevels.any { it.value.any { it.contains(" ") } }) + throw Exception("emoji contains space") + val text = minApiLevels.map { "${it.key} ${it.value.joinToString(" ")}" } + .sorted().joinToString("\n") + File(outDir, "minApi.txt").writeText(text, Charset.forName("UTF-8")) + } + + private fun writeEmojis(outDir: String, emojiData: EmojiData) { + // each category gets a file, one main emoji per line, followed by popups + EmojiGroup.entries.filterNot { it == EmojiGroup.COMPONENT } + .forEach { writeEmojiGroup(File(outDir, it.name + ".txt"), emojiData[it]) } + } + + private fun writeEmojiGroup(outFile: File, emojis: List) { + val text = emojis.map { emoji -> + if (emoji.variants.isEmpty()) emoji.text + else "${emoji.text} ${emoji.variants.joinToString(" ") { it.text }}" + }.joinToString("\n") + outFile.writeText(text, Charset.forName("UTF-8")) + } + + private fun getMinApi(codes: IntArray, supportData: Map): Int { + val hash = codes.joinToString("").hashCode() + return supportData[hash] ?: -1 + } } } \ No newline at end of file diff --git a/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/model/EmojiSpec.kt b/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/model/EmojiSpec.kt index 7c892a25e..db4d63d8a 100644 --- a/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/model/EmojiSpec.kt +++ b/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/model/EmojiSpec.kt @@ -19,5 +19,7 @@ data class EmojiSpec(val codes: IntArray, val unicodeVer: Float, val name: Strin return codes contentEquals other.codes } + val text get() = codes.joinToString("") { Character.toString(it) } + override fun hashCode() = codes.contentHashCode() } \ No newline at end of file diff --git a/tools/make-emoji-keys/src/main/resources/values/emoji-categories.tmpl b/tools/make-emoji-keys/src/main/resources/values/emoji-categories.tmpl deleted file mode 100644 index 8e04989d8..000000000 --- a/tools/make-emoji-keys/src/main/resources/values/emoji-categories.tmpl +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 30 - 31 - - - - :-) - ;-) - :-( - :-! - :-$ - B-) - =-O - :-P - :O - :-* - :-D - :\'( - :-\\ - O:-) - :-[ - (╯° - □°) - ╯︵ - ┻━┻ - ¯\\_ - (ツ) - _/¯ - ┬─┬ - ︵ /( - .□.\\ - - - - From c4386df186fbd75f121eeedace068fee5148706b Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Wed, 14 May 2025 17:23:39 +0300 Subject: [PATCH 111/175] Display a toast after restoring a backup. Seems like useful feedback. (#1531) --- .../keyboard/settings/preferences/BackupRestorePreference.kt | 5 +++++ app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 7 insertions(+) diff --git a/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt b/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt index 1e263a5aa..e156a5d21 100644 --- a/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt +++ b/app/src/main/java/helium314/keyboard/settings/preferences/BackupRestorePreference.kt @@ -3,6 +3,8 @@ package helium314.keyboard.settings.preferences import android.content.Intent import android.content.SharedPreferences +import android.os.Looper +import android.widget.Toast import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -151,6 +153,9 @@ fun BackupRestorePreference(setting: Setting) { } } } + + Looper.prepare() + Toast.makeText(ctx, ctx.getString(R.string.backup_restored), Toast.LENGTH_LONG).show() } catch (t: Throwable) { error = "r" + t.message Log.w("AdvancedScreen", "error during restore", t) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 710fe1f19..295922b86 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -196,6 +196,8 @@ Backup Restore + + Backup restored Format for timestamp key From 2fe87eea9bcd0b60c2369835bec9dcac98446ba2 Mon Sep 17 00:00:00 2001 From: Devy Ballard <69347329+devycarol@users.noreply.github.com> Date: Wed, 14 May 2025 08:24:21 -0600 Subject: [PATCH 112/175] Inline code point loops (#1408) --- .../keyboard/KeyboardActionListenerImpl.kt | 104 ++++++++++-------- .../keyboard/latin/common/StringUtils.kt | 86 +++++++-------- 2 files changed, 99 insertions(+), 91 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt b/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt index 759a0c403..b01d162aa 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt @@ -14,9 +14,12 @@ import helium314.keyboard.latin.common.loopOverCodePointsBackwards import helium314.keyboard.latin.inputlogic.InputLogic import helium314.keyboard.latin.settings.Settings import kotlin.math.abs +import kotlin.math.min class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inputLogic: InputLogic) : KeyboardActionListener { + private val connection = inputLogic.mConnection + private val keyboardSwitcher = KeyboardSwitcher.getInstance() private val settings = Settings.getInstance() private var metaState = 0 // is this enough, or are there threading issues with the different PointerTrackers? @@ -71,8 +74,9 @@ class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inp keyboardSwitcher.onFinishSlidingInput(latinIME.currentAutoCapsState, latinIME.currentRecapitalizeState) override fun onCustomRequest(requestCode: Int): Boolean { - if (requestCode == Constants.CUSTOM_CODE_SHOW_INPUT_METHOD_PICKER) + if (requestCode == Constants.CUSTOM_CODE_SHOW_INPUT_METHOD_PICKER) { return latinIME.showInputPickerDialog() + } return false } @@ -102,30 +106,34 @@ class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inp override fun onMoveDeletePointer(steps: Int) { inputLogic.finishInput() - val end = inputLogic.mConnection.expectedSelectionEnd - var actualSteps = 0 // corrected steps to avoid splitting chars belonging to the same codepoint + val end = connection.expectedSelectionEnd + val actualSteps = actualSteps(steps) + val start = connection.expectedSelectionStart + actualSteps + if (start > end) return + connection.setSelection(start, end) + } + + private fun actualSteps(steps: Int): Int { + var actualSteps = 0 + // corrected steps to avoid splitting chars belonging to the same codepoint if (steps > 0) { - val text = inputLogic.mConnection.getSelectedText(0) - if (text == null) actualSteps = steps - else loopOverCodePoints(text) { - actualSteps += Character.charCount(it) + val text = connection.getSelectedText(0) ?: return steps + loopOverCodePoints(text) { cp, charCount -> + actualSteps += charCount actualSteps >= steps } } else { - val text = inputLogic.mConnection.getTextBeforeCursor(-steps * 4, 0) - if (text == null) actualSteps = steps - else loopOverCodePointsBackwards(text) { - actualSteps -= Character.charCount(it) + val text = connection.getTextBeforeCursor(-steps * 4, 0) ?: return steps + loopOverCodePointsBackwards(text) { cp, charCount -> + actualSteps -= charCount actualSteps <= steps } } - val start = inputLogic.mConnection.expectedSelectionStart + actualSteps - if (start > end) return - inputLogic.mConnection.setSelection(start, end) + return actualSteps } override fun onUpWithDeletePointerActive() { - if (!inputLogic.mConnection.hasSelection()) return + if (!connection.hasSelection()) return inputLogic.finishInput() onCodeInput(KeyCode.DELETE, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, false) } @@ -144,16 +152,17 @@ class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inp val current = RichInputMethodManager.getInstance().currentSubtype.rawSubtype var wantedIndex = subtypes.indexOf(current) + if (steps > 0) 1 else -1 wantedIndex %= subtypes.size - if (wantedIndex < 0) + if (wantedIndex < 0) { wantedIndex += subtypes.size + } val newSubtype = subtypes[wantedIndex] // do not switch if we would switch to the initial subtype after cycling all other subtypes - if (initialSubtype == null) - initialSubtype = current + if (initialSubtype == null) initialSubtype = current if (initialSubtype == newSubtype) { - if ((subtypeSwitchCount > 0 && steps > 0) || ((subtypeSwitchCount < 0 && steps < 0))) + if ((subtypeSwitchCount > 0 && steps > 0) || (subtypeSwitchCount < 0 && steps < 0)) { return true + } } if (steps > 0) subtypeSwitchCount++ else subtypeSwitchCount-- @@ -174,17 +183,8 @@ class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inp val steps = if (RichInputMethodManager.getInstance().currentSubtype.isRtlSubtype) -rawSteps else rawSteps val moveSteps: Int if (steps < 0) { - var actualSteps = 0 // corrected steps to avoid splitting chars belonging to the same codepoint - val text = inputLogic.mConnection.getTextBeforeCursor(-steps * 4, 0) ?: return false - loopOverCodePointsBackwards(text) { - if (StringUtils.mightBeEmoji(it)) { - actualSteps = 0 - return@loopOverCodePointsBackwards true - } - actualSteps -= Character.charCount(it) - actualSteps <= steps - } - moveSteps = -text.length.coerceAtMost(abs(actualSteps)) + val text = connection.getTextBeforeCursor(-steps * 4, 0) ?: return false + moveSteps = negativeMoveSteps(text, steps) if (moveSteps == 0) { // some apps don't return any text via input connection, and the cursor can't be moved // we fall back to virtually pressing the left/right key one or more times instead @@ -194,18 +194,11 @@ class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inp return true } } else { - var actualSteps = 0 // corrected steps to avoid splitting chars belonging to the same codepoint - val text = inputLogic.mConnection.getTextAfterCursor(steps * 4, 0) ?: return false - loopOverCodePoints(text) { - if (StringUtils.mightBeEmoji(it)) { - actualSteps = 0 - return@loopOverCodePoints true - } - actualSteps += Character.charCount(it) - actualSteps >= steps - } - moveSteps = text.length.coerceAtMost(actualSteps) + val text = connection.getTextAfterCursor(steps * 4, 0) ?: return false + moveSteps = positiveMoveSteps(text, steps) if (moveSteps == 0) { + // some apps don't return any text via input connection, and the cursor can't be moved + // we fall back to virtually pressing the left/right key one or more times instead repeat(steps) { onCodeInput(KeyCode.ARROW_RIGHT, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, false) } @@ -225,16 +218,37 @@ class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inp if (variation != 0 && inputLogic.moveCursorByAndReturnIfInsideComposingWord(moveSteps)) { // no need to finish input and restart suggestions if we're still in the word // this is a noticeable performance improvement when moving through long words - val newPosition = inputLogic.mConnection.expectedSelectionStart + moveSteps - inputLogic.mConnection.setSelection(newPosition, newPosition) + val newPosition = connection.expectedSelectionStart + moveSteps + connection.setSelection(newPosition, newPosition) return true } inputLogic.finishInput() - val newPosition = inputLogic.mConnection.expectedSelectionStart + moveSteps - inputLogic.mConnection.setSelection(newPosition, newPosition) + val newPosition = connection.expectedSelectionStart + moveSteps + connection.setSelection(newPosition, newPosition) inputLogic.restartSuggestionsOnWordTouchedByCursor(settings.current, keyboardSwitcher.currentKeyboardScript) return true } + private fun positiveMoveSteps(text: CharSequence, steps: Int): Int { + var actualSteps = 0 + // corrected steps to avoid splitting chars belonging to the same codepoint + loopOverCodePoints(text) { cp, charCount -> + if (StringUtils.mightBeEmoji(cp)) return 0 + actualSteps += charCount + actualSteps >= steps + } + return min(actualSteps, text.length) + } + + private fun negativeMoveSteps(text: CharSequence, steps: Int): Int { + var actualSteps = 0 + // corrected steps to avoid splitting chars belonging to the same codepoint + loopOverCodePointsBackwards(text) { cp, charCount -> + if (StringUtils.mightBeEmoji(cp)) return 0 + actualSteps -= charCount + actualSteps <= steps + } + return -min(-actualSteps, text.length) + } } diff --git a/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt b/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt index 5b8af87c3..5ea7003a0 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt @@ -9,64 +9,62 @@ import helium314.keyboard.latin.settings.SpacingAndPunctuations import java.math.BigInteger import java.util.Locale -fun loopOverCodePoints(s: CharSequence, run: (Int) -> Boolean) { - val text = if (s is String) s else s.toString() +fun CharSequence.codePointAt(offset: Int) = Character.codePointAt(this, offset) +fun CharSequence.codePointBefore(offset: Int) = Character.codePointBefore(this, offset) + +inline fun loopOverCodePoints(text: CharSequence, loop: (cp: Int, charCount: Int) -> Boolean) { var offset = 0 while (offset < text.length) { - val codepoint = text.codePointAt(offset) - if (run(codepoint)) return - offset += Character.charCount(codepoint) + val cp = text.codePointAt(offset) + val charCount = Character.charCount(cp) + if (loop(cp, charCount)) return + offset += charCount } } -fun loopOverCodePointsBackwards(s: CharSequence, run: (Int) -> Boolean) { - val text = if (s is String) s else s.toString() +inline fun loopOverCodePointsBackwards(text: CharSequence, loop: (cp: Int, charCount: Int) -> Boolean) { var offset = text.length while (offset > 0) { - val codepoint = text.codePointBefore(offset) - if (run(codepoint)) return - offset -= Character.charCount(codepoint) + val cp = text.codePointBefore(offset) + val charCount = Character.charCount(cp) + if (loop(cp, charCount)) return + offset -= charCount } } -fun nonWordCodePointAndNoSpaceBeforeCursor(s: CharSequence, spacingAndPunctuations: SpacingAndPunctuations): Boolean { +fun nonWordCodePointAndNoSpaceBeforeCursor(text: CharSequence, spacingAndPunctuations: SpacingAndPunctuations): Boolean { var space = false var nonWordCodePoint = false - loopOverCodePointsBackwards(s) { - if (!space && Character.isWhitespace(it)) - space = true - // treat double quote like a word codepoint for the purpose of this function (not great, maybe clarify name, or extend list of chars?) - if (!nonWordCodePoint && !spacingAndPunctuations.isWordCodePoint(it) && it != '"'.code) + loopOverCodePointsBackwards(text) { cp, _ -> + if (!space && Character.isWhitespace(cp)) space = true + // treat double quote like a word codepoint for this function (not great, maybe clarify name or extend list of chars?) + if (!nonWordCodePoint && !spacingAndPunctuations.isWordCodePoint(cp) && cp != '"'.code) { nonWordCodePoint = true + } space && nonWordCodePoint // stop if both are found } - return nonWordCodePoint && !space // return true if an non-word codepoint and no space was found + return nonWordCodePoint && !space // return true if a non-word codepoint and no space was found } -fun hasLetterBeforeLastSpaceBeforeCursor(s: CharSequence): Boolean { - var letter = false - loopOverCodePointsBackwards(s) { - if (Character.isWhitespace(it)) true - else if (Character.isLetter(it)) { - letter = true - true - } - else false +fun hasLetterBeforeLastSpaceBeforeCursor(text: CharSequence): Boolean { + loopOverCodePointsBackwards(text) { cp, _ -> + if (Character.isWhitespace(cp)) return false + else if (Character.isLetter(cp)) return true + false // continue } - return letter + return false } -/** get the complete emoji at end of [s], considering that emojis can be joined with ZWJ resulting in different emojis */ -fun getFullEmojiAtEnd(s: CharSequence): String { - val text = if (s is String) s else s.toString() - var offset = text.length +/** get the complete emoji at end of [text], considering that emojis can be joined with ZWJ resulting in different emojis */ +fun getFullEmojiAtEnd(text: CharSequence): String { + val s = text.toString() + var offset = s.length while (offset > 0) { - val codepoint = text.codePointBefore(offset) + val codepoint = s.codePointBefore(offset) // stop if codepoint can't be emoji - if (!mightBeEmoji(codepoint)) - return text.substring(offset) + if (!mightBeEmoji(codepoint)) return text.substring(offset) offset -= Character.charCount(codepoint) - if (offset > 0 && text[offset - 1].code == KeyCode.ZWJ) { + if (offset > 0 && s[offset - 1].code == KeyCode.ZWJ) { // todo: this appends ZWJ in weird cases like text, ZWJ, emoji // and detects single ZWJ as emoji (at least irrelevant for current use of getFullEmojiAtEnd) offset -= 1 @@ -76,19 +74,17 @@ fun getFullEmojiAtEnd(s: CharSequence): String { if (codepoint in 0x1F3FB..0x1F3FF) { // Skin tones are not added with ZWJ, but just appended. This is not nice as they can be emojis on their own, // but that's how it is done. Assume that an emoji before the skin tone will get merged (usually correct in practice) - val codepointBefore = text.codePointBefore(offset) + val codepointBefore = s.codePointBefore(offset) if (isEmoji(codepointBefore)) { offset -= Character.charCount(codepointBefore) continue } } // check the whole text after offset - val textToCheck = text.substring(offset) - if (isEmoji(textToCheck)) { - return textToCheck - } + val textToCheck = s.substring(offset) + if (isEmoji(textToCheck)) return textToCheck } - return text.substring(offset) + return s.substring(offset) } /** split the string on the first of consecutive space only, further consecutive spaces are added to the next split */ @@ -110,8 +106,7 @@ fun String.splitOnFirstSpacesOnly(): List { sb.append(c) } } - if (sb.isNotBlank()) - out.add(sb.toString()) + if (sb.isNotBlank()) out.add(sb.toString()) return out } @@ -120,8 +115,7 @@ fun CharSequence.isValidNumber(): Boolean { } fun String.decapitalize(locale: Locale): String { - if (isEmpty() || !this[0].isUpperCase()) - return this + if (isEmpty() || !this[0].isUpperCase()) return this return replaceFirstChar { it.lowercase(locale) } } @@ -136,7 +130,7 @@ fun containsValueWhenSplit(string: String?, value: String, split: String): Boole fun isEmoji(c: Int): Boolean = mightBeEmoji(c) && isEmoji(newSingleCodePointString(c)) -fun isEmoji(s: CharSequence): Boolean = mightBeEmoji(s) && s.matches(emoRegex) +fun isEmoji(text: CharSequence): Boolean = mightBeEmoji(text) && text.matches(emoRegex) fun String.splitOnWhitespace() = split(whitespaceSplitRegex) From c9059f3616cca4803281fbe26cb90b2a6c058662 Mon Sep 17 00:00:00 2001 From: Devy Ballard <69347329+devycarol@users.noreply.github.com> Date: Wed, 14 May 2025 08:41:50 -0600 Subject: [PATCH 113/175] Apps dictionary (#1361) --- app/src/main/AndroidManifest.xml | 6 ++ .../keyboard/latin/AppsBinaryDictionary.java | 94 +++++++++++++++++++ .../helium314/keyboard/latin/AppsManager.kt | 30 ++++++ .../helium314/keyboard/latin/Dictionary.java | 30 +++--- .../keyboard/latin/DictionaryFacilitator.java | 4 + .../latin/DictionaryFacilitatorImpl.java | 74 +++++++++------ .../latin/DictionaryFacilitatorLruCache.java | 15 ++- .../helium314/keyboard/latin/LatinIME.java | 7 +- .../keyboard/latin/settings/Defaults.kt | 1 + .../keyboard/latin/settings/Settings.java | 1 + .../latin/settings/SettingsValues.java | 7 +- .../AndroidSpellCheckerService.java | 13 ++- .../keyboard/latin/utils/SpacedTokens.kt | 38 ++++++++ .../keyboard/settings/SettingsActivity.kt | 1 + .../settings/screens/TextCorrectionScreen.kt | 6 ++ app/src/main/res/values/strings.xml | 4 + 16 files changed, 279 insertions(+), 52 deletions(-) create mode 100644 app/src/main/java/helium314/keyboard/latin/AppsBinaryDictionary.java create mode 100644 app/src/main/java/helium314/keyboard/latin/AppsManager.kt create mode 100644 app/src/main/java/helium314/keyboard/latin/utils/SpacedTokens.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bfd74b9e5..a7dcab1e6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -102,5 +102,11 @@ SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only + + + + + + diff --git a/app/src/main/java/helium314/keyboard/latin/AppsBinaryDictionary.java b/app/src/main/java/helium314/keyboard/latin/AppsBinaryDictionary.java new file mode 100644 index 000000000..6d7ebe441 --- /dev/null +++ b/app/src/main/java/helium314/keyboard/latin/AppsBinaryDictionary.java @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: GPL-3.0-only + +package helium314.keyboard.latin; + +import android.content.Context; + +import androidx.annotation.Nullable; + +import com.android.inputmethod.latin.BinaryDictionary; + +import java.io.File; +import java.util.Locale; + +import helium314.keyboard.latin.common.StringUtils; +import helium314.keyboard.latin.utils.Log; +import helium314.keyboard.latin.utils.SpacedTokens; + +public class AppsBinaryDictionary extends ExpandableBinaryDictionary { + private static final String TAG = AppsBinaryDictionary.class.getSimpleName(); + private static final String NAME = "apps"; + + private static final int FREQUENCY_FOR_APPS = 100; + private static final int FREQUENCY_FOR_APPS_BIGRAM = 200; + + private static final boolean DEBUG = false; + private static final boolean DEBUG_DUMP = false; + + private final AppsManager mAppsManager; + + protected AppsBinaryDictionary(final Context ctx, final Locale locale, + final File dictFile, final String name) { + super(ctx, getDictName(name, locale, dictFile), locale, Dictionary.TYPE_APPS, dictFile); + mAppsManager = new AppsManager(ctx); + reloadDictionaryIfRequired(); + } + + public static AppsBinaryDictionary getDictionary(final Context context, final Locale locale, + final File dictFile, final String dictNamePrefix, @Nullable final String account) { + return new AppsBinaryDictionary(context, locale, dictFile, dictNamePrefix + NAME); + } + + /** + * Typically called whenever the dictionary is created for the first time or recreated when we + * think that there are updates to the dictionary. This is called asynchronously. + */ + @Override + public void loadInitialContentsLocked() { + loadDictionaryLocked(); + } + + /** + * Loads app names to the dictionary. + */ + private void loadDictionaryLocked() { + for (final String name : mAppsManager.getNames()) { + addNameLocked(name); + } + } + + /** + * Adds the words in an app label to the binary dictionary along with their n-grams. + */ + private void addNameLocked(final String appLabel) { + NgramContext ngramContext = NgramContext.getEmptyPrevWordsContext( + BinaryDictionary.MAX_PREV_WORD_COUNT_FOR_N_GRAM); + // TODO: Better tokenization for non-Latin writing systems + for (final String word : new SpacedTokens(appLabel)) { + if (DEBUG_DUMP) { + Log.d(TAG, "addName word = " + word); + } + final int wordLen = StringUtils.codePointCount(word); + // Don't add single letter words, possibly confuses capitalization of i. + if (1 < wordLen && wordLen <= MAX_WORD_LENGTH) { + if (DEBUG) { + Log.d(TAG, "addName " + appLabel + ", " + word + ", " + ngramContext); + } + runGCIfRequiredLocked(true /* mindsBlockByGC */); + addUnigramLocked(word, FREQUENCY_FOR_APPS, + null /* shortcut */, 0 /* shortcutFreq */, false /* isNotAWord */, + false /* isPossiblyOffensive */, + BinaryDictionary.NOT_A_VALID_TIMESTAMP); + if (ngramContext.isValid()) { + runGCIfRequiredLocked(true /* mindsBlockByGC */); + addNgramEntryLocked(ngramContext, + word, + FREQUENCY_FOR_APPS_BIGRAM, + BinaryDictionary.NOT_A_VALID_TIMESTAMP); + } + ngramContext = ngramContext.getNextNgramContext( + new NgramContext.WordInfo(word)); + } + } + } +} diff --git a/app/src/main/java/helium314/keyboard/latin/AppsManager.kt b/app/src/main/java/helium314/keyboard/latin/AppsManager.kt new file mode 100644 index 000000000..3c918563b --- /dev/null +++ b/app/src/main/java/helium314/keyboard/latin/AppsManager.kt @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-3.0-only + +package helium314.keyboard.latin + +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.content.pm.ResolveInfo +import java.util.HashSet + +class AppsManager(context: Context) { + private val mPackageManager: PackageManager = context.packageManager + + /** + * Returns all app labels associated with a launcher icon, sorted arbitrarily. + */ + fun getNames(): HashSet { + val filter = Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER) + // activities with an entry/icon for the launcher + val launcherApps: List = mPackageManager.queryIntentActivities(filter, 0) + + val names = HashSet(launcherApps.size) + for (info in launcherApps) { + val name = info.activityInfo.loadLabel(mPackageManager).toString() + names.add(name) + } + + return names + } +} diff --git a/app/src/main/java/helium314/keyboard/latin/Dictionary.java b/app/src/main/java/helium314/keyboard/latin/Dictionary.java index 4c26703ed..2a9c3d190 100644 --- a/app/src/main/java/helium314/keyboard/latin/Dictionary.java +++ b/app/src/main/java/helium314/keyboard/latin/Dictionary.java @@ -6,15 +6,15 @@ package helium314.keyboard.latin; +import androidx.annotation.NonNull; + +import java.util.ArrayList; +import java.util.Locale; + import helium314.keyboard.latin.SuggestedWords.SuggestedWordInfo; import helium314.keyboard.latin.common.ComposedData; import helium314.keyboard.latin.settings.SettingsValuesForSuggestion; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Locale; - /** * Abstract base class for a dictionary that can do a fuzzy search for words based on a set of key * strokes. @@ -48,6 +48,7 @@ public abstract class Dictionary { // phony dictionary instances for them. public static final String TYPE_MAIN = "main"; public static final String TYPE_CONTACTS = "contacts"; + public static final String TYPE_APPS = "apps"; // User dictionary, the system-managed one. public static final String TYPE_USER = "user"; // User history dictionary internal to LatinIME. @@ -56,16 +57,6 @@ public abstract class Dictionary { // The locale for this dictionary. May be null if unknown (phony dictionary for example). public final Locale mLocale; - /** - * Set out of the dictionary types listed above that are based on data specific to the user, - * e.g., the user's contacts. - */ - private static final HashSet sUserSpecificDictionaryTypes = new HashSet<>(Arrays.asList( - TYPE_USER_TYPED, - TYPE_USER, - TYPE_CONTACTS, - TYPE_USER_HISTORY)); - public Dictionary(final String dictType, final Locale locale) { mDictType = dictType; mLocale = locale; @@ -178,7 +169,14 @@ public abstract class Dictionary { * @return Whether this dictionary is specific to the user. */ public boolean isUserSpecific() { - return sUserSpecificDictionaryTypes.contains(mDictType); + return switch (mDictType) { + case TYPE_USER_TYPED, + TYPE_USER, + TYPE_CONTACTS, + TYPE_APPS, + TYPE_USER_HISTORY -> true; + default -> false; + }; } /** diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitator.java b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitator.java index 4d8ca5f6f..783235a1f 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitator.java +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitator.java @@ -32,11 +32,13 @@ public interface DictionaryFacilitator { String[] ALL_DICTIONARY_TYPES = new String[] { Dictionary.TYPE_MAIN, Dictionary.TYPE_CONTACTS, + Dictionary.TYPE_APPS, Dictionary.TYPE_USER_HISTORY, Dictionary.TYPE_USER}; String[] DYNAMIC_DICTIONARY_TYPES = new String[] { Dictionary.TYPE_CONTACTS, + Dictionary.TYPE_APPS, Dictionary.TYPE_USER_HISTORY, Dictionary.TYPE_USER}; @@ -87,6 +89,7 @@ public interface DictionaryFacilitator { boolean usesSameSettings( @NonNull final List locales, final boolean contacts, + final boolean apps, final boolean personalization, @Nullable final String account ); @@ -97,6 +100,7 @@ public interface DictionaryFacilitator { final Context context, final Locale newLocale, final boolean useContactsDict, + final boolean useAppsDict, final boolean usePersonalizedDicts, final boolean forceReloadMainDictionary, @Nullable final String account, diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java index e075b1290..aa96e5b74 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java @@ -16,6 +16,23 @@ import android.view.inputmethod.InputMethodSubtype; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Scanner; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + import helium314.keyboard.keyboard.Keyboard; import helium314.keyboard.latin.NgramContext.WordInfo; import helium314.keyboard.latin.SuggestedWords.SuggestedWordInfo; @@ -35,23 +52,6 @@ import helium314.keyboard.latin.utils.SubtypeSettings; import helium314.keyboard.latin.utils.SubtypeUtilsKt; import helium314.keyboard.latin.utils.SuggestionResults; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Scanner; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - /** * Facilitates interaction with different kinds of dictionaries. Provides APIs * to instantiate and select the correct dictionaries (based on language or account), @@ -274,6 +274,10 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator { return mDictionaryGroups.get(0).getSubDict(Dictionary.TYPE_CONTACTS) != null; } + public boolean usesApps() { + return mDictionaryGroups.get(0).getSubDict(Dictionary.TYPE_APPS) != null; + } + public boolean usesPersonalization() { return mDictionaryGroups.get(0).getSubDict(Dictionary.TYPE_USER_HISTORY) != null; } @@ -285,8 +289,9 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator { @Override public boolean usesSameSettings(@NonNull final List locales, final boolean contacts, - final boolean personalization, @Nullable final String account) { - final boolean first = usesContacts() == contacts && usesPersonalization() == personalization + final boolean apps, final boolean personalization, @Nullable final String account) { + final boolean first = usesContacts() == contacts && usesApps() == apps + && usesPersonalization() == personalization && TextUtils.equals(mDictionaryGroups.get(0).mAccount, account) && locales.size() == mDictionaryGroups.size(); if (!first) return false; @@ -306,6 +311,7 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator { case Dictionary.TYPE_USER_HISTORY -> UserHistoryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account); case Dictionary.TYPE_USER -> UserBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account); case Dictionary.TYPE_CONTACTS -> ContactsBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account); + case Dictionary.TYPE_APPS -> AppsBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account); default -> null; }; } catch (final SecurityException | IllegalArgumentException e) { @@ -332,6 +338,7 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator { final Context context, @NonNull final Locale newLocale, final boolean useContactsDict, + final boolean useAppsDict, final boolean usePersonalizedDicts, final boolean forceReloadMainDictionary, @Nullable final String account, @@ -364,6 +371,9 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator { && PermissionsUtil.checkAllPermissionsGranted(context, Manifest.permission.READ_CONTACTS)) { subDictTypesToUse.add(Dictionary.TYPE_CONTACTS); } + if (useAppsDict) { + subDictTypesToUse.add(Dictionary.TYPE_APPS); + } if (usePersonalizedDicts) { subDictTypesToUse.add(Dictionary.TYPE_USER_HISTORY); } @@ -958,6 +968,7 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator { if (historyDict != null) { historyDict.removeUnigramEntryDynamically(word); } + // and from personal dictionary final ExpandableBinaryDictionary userDict = group.getSubDict(Dictionary.TYPE_USER); if (userDict != null) { @@ -965,19 +976,28 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator { } final ExpandableBinaryDictionary contactsDict = group.getSubDict(Dictionary.TYPE_CONTACTS); - if (contactsDict != null) { - if (contactsDict.isInDictionary(word)) { - contactsDict.removeUnigramEntryDynamically(word); // will be gone until next reload of dict - addToBlacklist(word, group); - return; - } - } - if (!group.hasDict(Dictionary.TYPE_MAIN, null)) + if (contactsDict != null && contactsDict.isInDictionary(word)) { + contactsDict.removeUnigramEntryDynamically(word); // will be gone until next reload of dict + addToBlacklist(word, group); return; + } + + final ExpandableBinaryDictionary appsDict = group.getSubDict(Dictionary.TYPE_APPS); + if (appsDict != null && appsDict.isInDictionary(word)) { + appsDict.removeUnigramEntryDynamically(word); // will be gone until next reload of dict + addToBlacklist(word, group); + return; + } + + if (!group.hasDict(Dictionary.TYPE_MAIN, null)) { + return; + } + if (group.getDict(Dictionary.TYPE_MAIN).isValidWord(word)) { addToBlacklist(word, group); return; } + final String lowercase = word.toLowerCase(group.mLocale); if (group.getDict(Dictionary.TYPE_MAIN).isValidWord(lowercase)) { addToBlacklist(lowercase, group); diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorLruCache.java b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorLruCache.java index 08096413c..28cd88c56 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorLruCache.java +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorLruCache.java @@ -26,6 +26,7 @@ public class DictionaryFacilitatorLruCache { private final Object mLock = new Object(); private final DictionaryFacilitator mDictionaryFacilitator; private boolean mUseContactsDictionary; + private boolean mUseAppsDictionary; private Locale mLocale; public DictionaryFacilitatorLruCache(final Context context, final String dictionaryNamePrefix) { @@ -59,7 +60,7 @@ public class DictionaryFacilitatorLruCache { if (mLocale != null) { // Note: Given that personalized dictionaries are not used here; we can pass null account. mDictionaryFacilitator.resetDictionaries(mContext, mLocale, - mUseContactsDictionary, false /* usePersonalizedDicts */, + mUseContactsDictionary, mUseAppsDictionary, false /* usePersonalizedDicts */, false /* forceReloadMainDictionary */, null /* account */, mDictionaryNamePrefix, null /* listener */); } @@ -77,6 +78,18 @@ public class DictionaryFacilitatorLruCache { } } + public void setUseAppsDictionary(final boolean useAppsDictionary) { + synchronized (mLock) { + if (mUseAppsDictionary == useAppsDictionary) { + // The value has not been changed. + return; + } + mUseAppsDictionary = useAppsDictionary; + resetDictionariesForLocaleLocked(); + waitForLoadingMainDictionary(mDictionaryFacilitator); + } + } + public DictionaryFacilitator get(final Locale locale) { synchronized (mLock) { if (!mDictionaryFacilitator.isForLocale(locale)) { diff --git a/app/src/main/java/helium314/keyboard/latin/LatinIME.java b/app/src/main/java/helium314/keyboard/latin/LatinIME.java index 5913bf701..2969dd9a3 100644 --- a/app/src/main/java/helium314/keyboard/latin/LatinIME.java +++ b/app/src/main/java/helium314/keyboard/latin/LatinIME.java @@ -737,6 +737,7 @@ public class LatinIME extends InputMethodService implements if (mDictionaryFacilitator.usesSameSettings( locales, mSettings.getCurrent().mUseContactsDictionary, + mSettings.getCurrent().mUseAppsDictionary, mSettings.getCurrent().mUsePersonalizedDicts, mSettings.getCurrent().mAccount )) { @@ -755,8 +756,8 @@ public class LatinIME extends InputMethodService implements private void resetDictionaryFacilitator(@NonNull final Locale locale) { final SettingsValues settingsValues = mSettings.getCurrent(); mDictionaryFacilitator.resetDictionaries(this, locale, - settingsValues.mUseContactsDictionary, settingsValues.mUsePersonalizedDicts, - false, settingsValues.mAccount, "", this); + settingsValues.mUseContactsDictionary, settingsValues.mUseAppsDictionary, + settingsValues.mUsePersonalizedDicts, false, settingsValues.mAccount, "", this); mInputLogic.mSuggest.setAutoCorrectionThreshold(settingsValues.mAutoCorrectionThreshold); } @@ -767,7 +768,7 @@ public class LatinIME extends InputMethodService implements final SettingsValues settingsValues = mSettings.getCurrent(); mDictionaryFacilitator.resetDictionaries(this /* context */, mDictionaryFacilitator.getMainLocale(), settingsValues.mUseContactsDictionary, - settingsValues.mUsePersonalizedDicts, + settingsValues.mUseAppsDictionary, settingsValues.mUsePersonalizedDicts, true /* forceReloadMainDictionary */, settingsValues.mAccount, "" /* dictNamePrefix */, this /* DictionaryInitializationListener */); diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt index 9f84c43fa..11d2de4ca 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt @@ -116,6 +116,7 @@ object Defaults { const val PREF_GESTURE_TRAIL_FADEOUT_DURATION = 800 const val PREF_SHOW_SETUP_WIZARD_ICON = true const val PREF_USE_CONTACTS = false + const val PREF_USE_APPS = false const val PREFS_LONG_PRESS_SYMBOLS_FOR_NUMPAD = false const val PREF_ONE_HANDED_MODE = false @SuppressLint("RtlHardcoded") diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java index b70d9d840..1e72e8e05 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -121,6 +121,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_GESTURE_TRAIL_FADEOUT_DURATION = "gesture_trail_fadeout_duration"; public static final String PREF_SHOW_SETUP_WIZARD_ICON = "show_setup_wizard_icon"; public static final String PREF_USE_CONTACTS = "use_contacts"; + public static final String PREF_USE_APPS = "use_apps"; public static final String PREFS_LONG_PRESS_SYMBOLS_FOR_NUMPAD = "long_press_symbols_for_numpad"; // one-handed mode gravity, enablement and scale, stored separately per orientation diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java index 862609c08..b79e06e6e 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java @@ -109,6 +109,7 @@ public class SettingsValues { public final int mScreenMetrics; public final boolean mAddToPersonalDictionary; public final boolean mUseContactsDictionary; + public final boolean mUseAppsDictionary; public final boolean mCustomNavBarColor; public final float mKeyboardHeightScale; public final boolean mUrlDetectionEnabled; @@ -268,6 +269,7 @@ public class SettingsValues { mPopupKeyLabelSources = SubtypeUtilsKt.getPopupKeyLabelSources(selectedSubtype, prefs); mAddToPersonalDictionary = prefs.getBoolean(Settings.PREF_ADD_TO_PERSONAL_DICTIONARY, Defaults.PREF_ADD_TO_PERSONAL_DICTIONARY); mUseContactsDictionary = SettingsValues.readUseContactsEnabled(prefs, context); + mUseAppsDictionary = prefs.getBoolean(Settings.PREF_USE_APPS, Defaults.PREF_USE_APPS); mCustomNavBarColor = prefs.getBoolean(Settings.PREF_NAVBAR_COLOR, Defaults.PREF_NAVBAR_COLOR); mNarrowKeyGaps = prefs.getBoolean(Settings.PREF_NARROW_KEY_GAPS, Defaults.PREF_NARROW_KEY_GAPS); mSettingsValuesForSuggestion = new SettingsValuesForSuggestion( @@ -352,11 +354,12 @@ public class SettingsValues { return mDisplayOrientation == configuration.orientation; } - private static boolean readUseContactsEnabled(final SharedPreferences prefs, final Context context) { + private static boolean readUseContactsEnabled(final SharedPreferences prefs, final Context ctx) { final boolean setting = prefs.getBoolean(Settings.PREF_USE_CONTACTS, Defaults.PREF_USE_CONTACTS); if (!setting) return false; - if (PermissionsUtil.checkAllPermissionsGranted(context, Manifest.permission.READ_CONTACTS)) + if (PermissionsUtil.checkAllPermissionsGranted(ctx, Manifest.permission.READ_CONTACTS)) { return true; + } // disable if permission not granted prefs.edit().putBoolean(Settings.PREF_USE_CONTACTS, false).apply(); return false; diff --git a/app/src/main/java/helium314/keyboard/latin/spellcheck/AndroidSpellCheckerService.java b/app/src/main/java/helium314/keyboard/latin/spellcheck/AndroidSpellCheckerService.java index 807561799..73d66ad30 100644 --- a/app/src/main/java/helium314/keyboard/latin/spellcheck/AndroidSpellCheckerService.java +++ b/app/src/main/java/helium314/keyboard/latin/spellcheck/AndroidSpellCheckerService.java @@ -83,6 +83,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService final SharedPreferences prefs = KtxKt.prefs(this); prefs.registerOnSharedPreferenceChangeListener(this); onSharedPreferenceChanged(prefs, Settings.PREF_USE_CONTACTS); + onSharedPreferenceChanged(prefs, Settings.PREF_USE_APPS); final boolean blockOffensive = prefs.getBoolean(Settings.PREF_BLOCK_POTENTIALLY_OFFENSIVE, Defaults.PREF_BLOCK_POTENTIALLY_OFFENSIVE); mSettingsValuesForSuggestion = new SettingsValuesForSuggestion(blockOffensive, false); } @@ -93,13 +94,19 @@ public final class AndroidSpellCheckerService extends SpellCheckerService @Override public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) { - if (Settings.PREF_USE_CONTACTS.equals(key)) { + if (key != null) switch (key) { + case Settings.PREF_USE_CONTACTS -> { final boolean useContactsDictionary = prefs.getBoolean(Settings.PREF_USE_CONTACTS, Defaults.PREF_USE_CONTACTS); mDictionaryFacilitatorCache.setUseContactsDictionary(useContactsDictionary); - } else if (Settings.PREF_BLOCK_POTENTIALLY_OFFENSIVE.equals(key)) { + } + case Settings.PREF_USE_APPS -> { + final boolean useAppsDictionary = prefs.getBoolean(Settings.PREF_USE_APPS, Defaults.PREF_USE_APPS); + mDictionaryFacilitatorCache.setUseAppsDictionary(useAppsDictionary); + } + case Settings.PREF_BLOCK_POTENTIALLY_OFFENSIVE -> { final boolean blockOffensive = prefs.getBoolean(Settings.PREF_BLOCK_POTENTIALLY_OFFENSIVE, Defaults.PREF_BLOCK_POTENTIALLY_OFFENSIVE); mSettingsValuesForSuggestion = new SettingsValuesForSuggestion(blockOffensive, false); - } + }} } @Override diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SpacedTokens.kt b/app/src/main/java/helium314/keyboard/latin/utils/SpacedTokens.kt new file mode 100644 index 000000000..b760e7bfd --- /dev/null +++ b/app/src/main/java/helium314/keyboard/latin/utils/SpacedTokens.kt @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-3.0-only + +package helium314.keyboard.latin.utils + +/** + * Tokenizes strings by groupings of non-space characters, making them iterable. Note that letters, + * punctuations, etc. are all treated the same by this construct. + */ +class SpacedTokens(phrase: String) : Iterable { + private val mPhrase = phrase + private val mLength = phrase.length + private val mStartPos = phrase.indexOfFirst { !Character.isWhitespace(it) } + // the iterator should start at the first non-whitespace character + + override fun iterator() = object : Iterator { + private var startPos = mStartPos + + override fun hasNext(): Boolean { + return startPos < mLength + } + + override fun next(): String { + var endPos = startPos + + do if (++endPos >= mLength) break + while (!Character.isWhitespace(mPhrase[endPos])) + val word = mPhrase.substring(startPos, endPos) + + if (endPos < mLength) { + do if (++endPos >= mLength) break + while (Character.isWhitespace(mPhrase[endPos])) + } + startPos = endPos + + return word + } + } +} diff --git a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt index d0e9a3030..df7dfa861 100644 --- a/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt +++ b/app/src/main/java/helium314/keyboard/settings/SettingsActivity.kt @@ -112,6 +112,7 @@ class SettingsActivity : ComponentActivity(), SharedPreferences.OnSharedPreferen }, ) settingsContainer[Settings.PREF_USE_CONTACTS]!!.Preference() + settingsContainer[Settings.PREF_USE_APPS]!!.Preference() settingsContainer[Settings.PREF_BLOCK_POTENTIALLY_OFFENSIVE]!!.Preference() } } diff --git a/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt index eea74b919..3d4ae3dc7 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/TextCorrectionScreen.kt @@ -78,6 +78,7 @@ fun TextCorrectionScreen( Settings.PREF_BIGRAM_PREDICTIONS, Settings.PREF_SUGGEST_CLIPBOARD_CONTENT, Settings.PREF_USE_CONTACTS, + Settings.PREF_USE_APPS, if (prefs.getBoolean(Settings.PREF_KEY_USE_PERSONALIZED_DICTS, Defaults.PREF_KEY_USE_PERSONALIZED_DICTS)) Settings.PREF_ADD_TO_PERSONAL_DICTIONARY else null ) @@ -225,6 +226,11 @@ fun createCorrectionSettings(context: Context) = listOf( } ) }, + Setting(context, Settings.PREF_USE_APPS, + R.string.use_apps_dict, R.string.use_apps_dict_summary + ) { setting -> + SwitchPreference(setting, Defaults.PREF_USE_APPS) + }, Setting(context, Settings.PREF_ADD_TO_PERSONAL_DICTIONARY, R.string.add_to_personal_dictionary, R.string.add_to_personal_dictionary_summary ) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 295922b86..38c800ca7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -78,6 +78,10 @@ Look up contact names Use names from Contacts for suggestions and corrections + + Look up app names + + Use names of installed apps for suggestions and corrections Personalized suggestions From c96eec601d5420ff94ad6a610ab489f172a6707b Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 14 May 2025 16:49:37 +0200 Subject: [PATCH 114/175] remove unused code / comments in EmojiPalettesView and related resources --- .../keyboard/emoji/EmojiPalettesView.java | 33 ------------------ ...oji_category_tab_selected_holo_white.9.png | Bin 134 -> 0 bytes ...ji_category_tab_unselected_holo_dark.9.png | Bin 150 -> 0 bytes ...oji_category_tab_selected_holo_white.9.png | Bin 132 -> 0 bytes ...ji_category_tab_unselected_holo_dark.9.png | Bin 138 -> 0 bytes ...oji_category_tab_selected_holo_white.9.png | Bin 135 -> 0 bytes ...ji_category_tab_unselected_holo_dark.9.png | Bin 155 -> 0 bytes ...oji_category_tab_selected_holo_white.9.png | Bin 110 -> 0 bytes ...ji_category_tab_unselected_holo_dark.9.png | Bin 1041 -> 0 bytes app/src/main/res/values/attrs.xml | 4 --- app/src/main/res/values/themes-holo_base.xml | 4 --- app/src/main/res/values/themes-lxx-base.xml | 2 -- .../main/res/values/themes-rounded-base.xml | 2 -- 13 files changed, 45 deletions(-) delete mode 100644 app/src/main/res/drawable-hdpi/emoji_category_tab_selected_holo_white.9.png delete mode 100644 app/src/main/res/drawable-hdpi/emoji_category_tab_unselected_holo_dark.9.png delete mode 100644 app/src/main/res/drawable-mdpi/emoji_category_tab_selected_holo_white.9.png delete mode 100644 app/src/main/res/drawable-mdpi/emoji_category_tab_unselected_holo_dark.9.png delete mode 100644 app/src/main/res/drawable-xhdpi/emoji_category_tab_selected_holo_white.9.png delete mode 100644 app/src/main/res/drawable-xhdpi/emoji_category_tab_unselected_holo_dark.9.png delete mode 100644 app/src/main/res/drawable-xxhdpi/emoji_category_tab_selected_holo_white.9.png delete mode 100644 app/src/main/res/drawable-xxhdpi/emoji_category_tab_unselected_holo_dark.9.png diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java index 8428f842d..f824da5d4 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java @@ -59,11 +59,6 @@ import static helium314.keyboard.latin.common.Constants.NOT_A_COORDINATE; public final class EmojiPalettesView extends LinearLayout implements View.OnClickListener, OnKeyEventListener { private boolean initialized = false; - // keep the indicator in case emoji view is changed to tabs / viewpager - private final boolean mCategoryIndicatorEnabled; - private final int mCategoryIndicatorDrawableResId; - private final int mCategoryIndicatorBackgroundResId; - private final int mCategoryPageIndicatorColor; private final Colors mColors; private EmojiPalettesAdapter mEmojiPalettesAdapter; private final EmojiLayoutParams mEmojiLayoutParams; @@ -77,7 +72,6 @@ public final class EmojiPalettesView extends LinearLayout private final EmojiCategory mEmojiCategory; - private ImageView mCurrentTab = null; public EmojiPalettesView(final Context context, final AttributeSet attrs) { this(context, attrs, R.attr.emojiPalettesViewStyle); @@ -96,14 +90,6 @@ public final class EmojiPalettesView extends LinearLayout final TypedArray emojiPalettesViewAttr = context.obtainStyledAttributes(attrs, R.styleable.EmojiPalettesView, defStyle, R.style.EmojiPalettesView); mEmojiCategory = new EmojiCategory(context, layoutSet, emojiPalettesViewAttr); - mCategoryIndicatorEnabled = emojiPalettesViewAttr.getBoolean( - R.styleable.EmojiPalettesView_categoryIndicatorEnabled, false); - mCategoryIndicatorDrawableResId = emojiPalettesViewAttr.getResourceId( - R.styleable.EmojiPalettesView_categoryIndicatorDrawable, 0); - mCategoryIndicatorBackgroundResId = emojiPalettesViewAttr.getResourceId( - R.styleable.EmojiPalettesView_categoryIndicatorBackground, 0); - mCategoryPageIndicatorColor = emojiPalettesViewAttr.getColor( // todo: remove this and related attr - R.styleable.EmojiPalettesView_categoryPageIndicatorColor, 0); emojiPalettesViewAttr.recycle(); mEmojiLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false); setFitsSystemWindows(true); @@ -122,13 +108,6 @@ public final class EmojiPalettesView extends LinearLayout setMeasuredDimension(width, height); } - // todo (maybe): bring back the holo indicator thing? - // just some 2 dp high strip - // would probably need a vertical linear layout - // better not, would complicate stuff again - // when decided to definitely not bring it back: - // remove mCategoryIndicatorEnabled, mCategoryIndicatorDrawableResId, mCategoryIndicatorBackgroundResId - // and the attrs categoryIndicatorDrawable, categoryIndicatorEnabled, categoryIndicatorBackground (and the connected drawables) private void addTab(final LinearLayout host, final int categoryId) { final ImageView iconView = new ImageView(getContext()); mColors.setBackground(iconView, ColorType.STRIP_BACKGROUND); @@ -150,18 +129,6 @@ public final class EmojiPalettesView extends LinearLayout for (final EmojiCategory.CategoryProperties properties : mEmojiCategory.getShownCategories()) { addTab(mTabStrip, properties.mCategoryId); } -// mTabStrip.setOnTabChangedListener(this); // now onClickListener -/* final TabWidget tabWidget = mTabStrip.getTabWidget(); - tabWidget.setStripEnabled(mCategoryIndicatorEnabled); - if (mCategoryIndicatorEnabled) { - // On TabWidget's strip, what looks like an indicator is actually a background. - // And what looks like a background are actually left and right drawables. - tabWidget.setBackgroundResource(mCategoryIndicatorDrawableResId); - tabWidget.setLeftStripDrawable(mCategoryIndicatorBackgroundResId); - tabWidget.setRightStripDrawable(mCategoryIndicatorBackgroundResId); - tabWidget.setBackgroundColor(mColors.get(ColorType.EMOJI_CATEGORY_SELECTED)); - } -*/ mEmojiPalettesAdapter = new EmojiPalettesAdapter(mEmojiCategory, this); mEmojiRecyclerView = findViewById(R.id.emoji_keyboard_list); diff --git a/app/src/main/res/drawable-hdpi/emoji_category_tab_selected_holo_white.9.png b/app/src/main/res/drawable-hdpi/emoji_category_tab_selected_holo_white.9.png deleted file mode 100644 index 345d05e9d777fde539e8573261ca109939ee4e61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1c!3HD^Kbl$tDaPU;cPEB*=VV?2Ih+L^k;M!Q z+?^oIXnykaTA-k|r;B4q#hj!c|Nq-F3;bzM)R@ocq;#PE63aohgA7hx8jd-BOh9%2 b|1&c@nPz=-76;#3AeX_@)z4*}Q$iB}G+re< diff --git a/app/src/main/res/drawable-hdpi/emoji_category_tab_unselected_holo_dark.9.png b/app/src/main/res/drawable-hdpi/emoji_category_tab_unselected_holo_dark.9.png deleted file mode 100644 index bbcfb2c64a4c430762a0911150a369cfe0383381..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1c!3HD^Kbl$tDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s&X3r`ov5RRF>eWy7Y3`LmKUncz0|1>p$@8`w|hq<`8x>OiXJp1Ic r*W-C(`VEFF#(|-4>t(+dd!{lR=Mzerv94k|&=_6CIA2c diff --git a/app/src/main/res/drawable-mdpi/emoji_category_tab_unselected_holo_dark.9.png b/app/src/main/res/drawable-mdpi/emoji_category_tab_unselected_holo_dark.9.png deleted file mode 100644 index bb45ab96018624b387bb9b841a1b06954da68ded..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c0!3HFsSlX9@1d5$JLpXq-h9ji|$mcBZh%9Dc z;O+!rM)Q-W*8&A~JY5_^IA-SdY~*E75NPR;-td1z#GZ|TUED`mwHg}wjIFo)Sh$Ss egWVPB(3@XO`3_gHoHzi~$KdJe=d#Wzp$PyzbP0l+XkK@*pG| diff --git a/app/src/main/res/drawable-xhdpi/emoji_category_tab_unselected_holo_dark.9.png b/app/src/main/res/drawable-xhdpi/emoji_category_tab_unselected_holo_dark.9.png deleted file mode 100644 index 8cede8d5ea291391adf392c9fae974e7c95ce3eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ#0V1dK=^FznmSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLn2zPZ!4!j+txEZ{$5-AmDWIdCq}<&i6Q`AJR-Z?Yl(5@uQ}|F6m!y w+h^`vwVs*femA4%w7ILK?DIShl^JwOAGH@rao?ig3N(np)78&qol`;+08-{IH~;_u diff --git a/app/src/main/res/drawable-xxhdpi/emoji_category_tab_selected_holo_white.9.png b/app/src/main/res/drawable-xxhdpi/emoji_category_tab_selected_holo_white.9.png deleted file mode 100644 index c81e651ddef1e45c6722424a80009b80435aec6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^96-#+!3HFS!eXZZDaPU;cPEB*=VV?2IU1fWjv*Cu zk`fvk{#zKt2#No&PZ2TrbDUA&R9h1ho6SU4prZf(nHjj9mPab>Fgy(8GI+ZBxvXHV%6t`L-RTZu1*iI*R0g2c?Cw3gGrX)F=Ml>NxA`yuN*S;oJYoD>NO_~7- zHfAOe3m;Pl1|%kiiVY-Km^<(fApV5#oHV6F#eik|-n;w#-q*eNtl7A;w79k?2*Ofr zi?m=}fNyzj9{$Yucm_-q-3%J+9Jzur*3(d(`N7qdl+W zi<`I5#?S-}R_hWk-!4lQwF*91A+mPIsy@I6bM2Gy-MQI#bWX;MDtDHtPNmvBMT zb$k=43RYzWUOk5krly-}5uH6EcuV|UvqhXUU!YlHpYzz1<-uSe4e}C8dNMARN|_B+ z%>g2p9!1<8=Av|cW`WSuOM;jOEJB$@cZVHtON2-^<6=Q6s)}x4Y#3GDv6ZT!IjWt<#>~d0T;gaI)v;Bblrgr|l3i4)1;;59 zQcx>~I^))&l)I5fXMTgs@03ga$u+A9bva8qjP1`lpxI}frF|BoYFkIw>#i3>*~X3R zf~NTrngoZ`cM=w&Nrlbek_Z%RK>u9GTru)CsZ^9g#a3+%qMvg8|EZb`!N^&ATxgfs z7W7~yo;N=z=i@^on3)8I wt=34nv+%(C_M!J`bnVI7%iCWb%jS>cd7*N;{O;}D;}ZZ0HM>FHR~|n719?Y38~^|S diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 8efca7f84..ce545a89a 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -156,10 +156,6 @@ - - - - diff --git a/app/src/main/res/values/themes-holo_base.xml b/app/src/main/res/values/themes-holo_base.xml index 4a8c11ced..f57f237fa 100644 --- a/app/src/main/res/values/themes-holo_base.xml +++ b/app/src/main/res/values/themes-holo_base.xml @@ -68,10 +68,6 @@ name="EmojiPalettesView.HoloBase" parent="MainKeyboardView.HoloBase" > - true - @drawable/emoji_category_tab_selected_holo_white - @drawable/emoji_category_tab_unselected_holo_dark - @color/highlight_color_holo_white @color/emoji_tab_page_indicator_background_holo @drawable/ic_emoji_recents @drawable/ic_emoji_smileys_emotion diff --git a/app/src/main/res/values/themes-lxx-base.xml b/app/src/main/res/values/themes-lxx-base.xml index 40897ca9a..745966275 100644 --- a/app/src/main/res/values/themes-lxx-base.xml +++ b/app/src/main/res/values/themes-lxx-base.xml @@ -54,8 +54,6 @@ name="EmojiPalettesView.LXX_Base" parent="MainKeyboardView.LXX_Base" > - false - @color/highlight_color_lxx_light @color/emoji_tab_page_indicator_background_lxx_base @drawable/ic_emoji_recents_lxx @drawable/ic_emoji_smileys_emotion_lxx diff --git a/app/src/main/res/values/themes-rounded-base.xml b/app/src/main/res/values/themes-rounded-base.xml index 05091c99e..a99077eac 100644 --- a/app/src/main/res/values/themes-rounded-base.xml +++ b/app/src/main/res/values/themes-rounded-base.xml @@ -61,8 +61,6 @@ name="EmojiPalettesView.Rounded_Base" parent="MainKeyboardView.Rounded_Base" > - false - @color/highlight_color_lxx_light @color/emoji_tab_page_indicator_background_lxx_base @drawable/ic_emoji_recents_rounded @drawable/ic_emoji_smileys_emotion_rounded From f48438f30a9ce347c87677213577703c09bf9bd7 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 14 May 2025 17:04:31 +0200 Subject: [PATCH 115/175] use SpacedTokens instead of regex for splitting on whitespace and where possible directly used SpacedTokens to avoid unnecessary list --- .../internal/keyboard_parser/LocaleKeyboardInfos.kt | 7 ++++--- .../java/helium314/keyboard/latin/common/StringUtils.kt | 5 ++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt index ac3f9fc77..93c51b981 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/LocaleKeyboardInfos.kt @@ -11,6 +11,7 @@ import helium314.keyboard.latin.R import helium314.keyboard.latin.common.splitOnFirstSpacesOnly import helium314.keyboard.latin.common.splitOnWhitespace import helium314.keyboard.latin.settings.Settings +import helium314.keyboard.latin.utils.SpacedTokens import helium314.keyboard.latin.utils.SubtypeLocaleUtils import java.io.InputStream import java.util.Locale @@ -83,7 +84,7 @@ class LocaleKeyboardInfos(dataStream: InputStream?, locale: Locale) { READER_MODE_EXTRA_KEYS -> if (!onlyPopupKeys) addExtraKey(line.split(colonSpaceRegex, 2)) READER_MODE_LABELS -> if (!onlyPopupKeys) addLabel(line.split(colonSpaceRegex, 2)) READER_MODE_NUMBER_ROW -> localizedNumberKeys = line.splitOnWhitespace() - READER_MODE_TLD -> line.splitOnWhitespace().forEach { tlds.add(".$it") } + READER_MODE_TLD -> SpacedTokens(line).forEach { tlds.add(".$it") } } } } @@ -226,7 +227,7 @@ private fun getLocaleTlds(locale: Locale): LinkedHashSet { return tlds specialCountryTlds.forEach { if (ccLower != it.first) return@forEach - tlds.addAll(it.second.splitOnWhitespace()) + tlds.addAll(SpacedTokens(it.second)) return@getLocaleTlds tlds } tlds.add(".$ccLower") @@ -235,7 +236,7 @@ private fun getLocaleTlds(locale: Locale): LinkedHashSet { private fun getDefaultTlds(locale: Locale): LinkedHashSet { val tlds = linkedSetOf() - tlds.addAll(defaultTlds.splitOnWhitespace()) + tlds.addAll(SpacedTokens(defaultTlds)) if ((locale.language != "en" && euroLocales.matches(locale.language)) || euroCountries.matches(locale.country)) tlds.add(".eu") return tlds diff --git a/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt b/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt index 5ea7003a0..982be6919 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/StringUtils.kt @@ -6,6 +6,7 @@ import helium314.keyboard.keyboard.internal.keyboard_parser.floris.KeyCode import helium314.keyboard.latin.common.StringUtils.mightBeEmoji import helium314.keyboard.latin.common.StringUtils.newSingleCodePointString import helium314.keyboard.latin.settings.SpacingAndPunctuations +import helium314.keyboard.latin.utils.SpacedTokens import java.math.BigInteger import java.util.Locale @@ -132,9 +133,7 @@ fun isEmoji(c: Int): Boolean = mightBeEmoji(c) && isEmoji(newSingleCodePointStri fun isEmoji(text: CharSequence): Boolean = mightBeEmoji(text) && text.matches(emoRegex) -fun String.splitOnWhitespace() = split(whitespaceSplitRegex) - -private val whitespaceSplitRegex = "\\s+".toRegex() +fun String.splitOnWhitespace() = SpacedTokens(this).toList() // from https://github.com/mathiasbynens/emoji-test-regex-pattern, MIT license // matches single emojis only From 35df3e7bae3d8bd87abe1552621f1cc438d46403 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Fri, 16 May 2025 21:09:16 +0200 Subject: [PATCH 116/175] upgrade dependencies --- app/build.gradle.kts | 7 +++---- build.gradle.kts | 4 ++-- gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 43504 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 7 +++++-- gradlew.bat | 2 ++ 6 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index dec28d363..cbc5a221b 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,13 +1,12 @@ plugins { id("com.android.application") kotlin("android") - kotlin("plugin.serialization") version "2.0.21" + kotlin("plugin.serialization") version "2.1.21" kotlin("plugin.compose") version "2.0.0" } android { compileSdk = 35 - buildToolsVersion = "34.0.0" defaultConfig { applicationId = "helium314.keyboard" @@ -114,11 +113,11 @@ dependencies { // compose coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5") - implementation(platform("androidx.compose:compose-bom:2025.04.01")) + implementation(platform("androidx.compose:compose-bom:2025.05.00")) implementation("androidx.compose.material3:material3") implementation("androidx.compose.ui:ui-tooling-preview") debugImplementation("androidx.compose.ui:ui-tooling") - implementation("androidx.navigation:navigation-compose:2.8.9") + implementation("androidx.navigation:navigation-compose:2.9.0") implementation("sh.calvin.reorderable:reorderable:2.4.3") // for easier re-ordering implementation("com.github.skydoves:colorpicker-compose:1.1.2") // for user-defined colors diff --git a/build.gradle.kts b/build.gradle.kts index b4ff5ee4e..f1a3cec26 100755 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - val kotlinVersion = "2.1.10" + val kotlinVersion = "2.1.21" repositories { mavenCentral() google() } dependencies { - classpath("com.android.tools.build:gradle:8.7.3") + classpath("com.android.tools.build:gradle:8.9.2") classpath(kotlin("gradle-plugin", version = kotlinVersion)) // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..2c3521197d7c4586c843d1d3e9090525f1898cde 100755 GIT binary patch delta 34463 zcmY(qRX`kF)3u#IAjsf0xCD212@LM;?(PINyAue(f;$XO2=4Cg1P$=#e%|lo zKk1`B>Q#GH)wNd-&cI#Hz}3=WfYndTeo)CyX{fOHsQjGa<{e=jamMNwjdatD={CN3>GNchOE9OGPIqr)3v>RcKWR3Z zF-guIMjE2UF0Wqk1)21791y#}ciBI*bAenY*BMW_)AeSuM5}vz_~`+1i!Lo?XAEq{TlK5-efNFgHr6o zD>^vB&%3ZGEWMS>`?tu!@66|uiDvS5`?bF=gIq3rkK(j<_TybyoaDHg8;Y#`;>tXI z=tXo~e9{U!*hqTe#nZjW4z0mP8A9UUv1}C#R*@yu9G3k;`Me0-BA2&Aw6f`{Ozan2 z8c8Cs#dA-7V)ZwcGKH}jW!Ja&VaUc@mu5a@CObzNot?b{f+~+212lwF;!QKI16FDS zodx>XN$sk9;t;)maB^s6sr^L32EbMV(uvW%or=|0@U6cUkE`_!<=LHLlRGJx@gQI=B(nn z-GEjDE}*8>3U$n(t^(b^C$qSTI;}6q&ypp?-2rGpqg7b}pyT zOARu2x>0HB{&D(d3sp`+}ka+Pca5glh|c=M)Ujn_$ly^X6&u z%Q4Y*LtB_>i6(YR!?{Os-(^J`(70lZ&Hp1I^?t@~SFL1!m0x6j|NM!-JTDk)%Q^R< z@e?23FD&9_W{Bgtr&CG&*Oer3Z(Bu2EbV3T9FeQ|-vo5pwzwQ%g&=zFS7b{n6T2ZQ z*!H(=z<{D9@c`KmHO&DbUIzpg`+r5207}4D=_P$ONIc5lsFgn)UB-oUE#{r+|uHc^hzv_df zV`n8&qry%jXQ33}Bjqcim~BY1?KZ}x453Oh7G@fA(}+m(f$)TY%7n=MeLi{jJ7LMB zt(mE*vFnep?YpkT_&WPV9*f>uSi#n#@STJmV&SLZnlLsWYI@y+Bs=gzcqche=&cBH2WL)dkR!a95*Ri)JH_4c*- zl4pPLl^as5_y&6RDE@@7342DNyF&GLJez#eMJjI}#pZN{Y8io{l*D+|f_Y&RQPia@ zNDL;SBERA|B#cjlNC@VU{2csOvB8$HzU$01Q?y)KEfos>W46VMh>P~oQC8k=26-Ku)@C|n^zDP!hO}Y z_tF}0@*Ds!JMt>?4y|l3?`v#5*oV-=vL7}zehMON^=s1%q+n=^^Z{^mTs7}*->#YL z)x-~SWE{e?YCarwU$=cS>VzmUh?Q&7?#Xrcce+jeZ|%0!l|H_=D_`77hBfd4Zqk&! zq-Dnt_?5*$Wsw8zGd@?woEtfYZ2|9L8b>TO6>oMh%`B7iBb)-aCefM~q|S2Cc0t9T zlu-ZXmM0wd$!gd-dTtik{bqyx32%f;`XUvbUWWJmpHfk8^PQIEsByJm+@+-aj4J#D z4#Br3pO6z1eIC>X^yKk|PeVwX_4B+IYJyJyc3B`4 zPrM#raacGIzVOexcVB;fcsxS=s1e&V;Xe$tw&KQ`YaCkHTKe*Al#velxV{3wxx}`7@isG zp6{+s)CG%HF#JBAQ_jM%zCX5X;J%-*%&jVI?6KpYyzGbq7qf;&hFprh?E5Wyo=bZ) z8YNycvMNGp1836!-?nihm6jI`^C`EeGryoNZO1AFTQhzFJOA%Q{X(sMYlzABt!&f{ zoDENSuoJQIg5Q#@BUsNJX2h>jkdx4<+ipUymWKFr;w+s>$laIIkfP6nU}r+?J9bZg zUIxz>RX$kX=C4m(zh-Eg$BsJ4OL&_J38PbHW&7JmR27%efAkqqdvf)Am)VF$+U3WR z-E#I9H6^)zHLKCs7|Zs<7Bo9VCS3@CDQ;{UTczoEprCKL3ZZW!ffmZFkcWU-V|_M2 zUA9~8tE9<5`59W-UgUmDFp11YlORl3mS3*2#ZHjv{*-1#uMV_oVTy{PY(}AqZv#wF zJVks)%N6LaHF$$<6p8S8Lqn+5&t}DmLKiC~lE{jPZ39oj{wR&fe*LX-z0m}9ZnZ{U z>3-5Bh{KKN^n5i!M79Aw5eY=`6fG#aW1_ZG;fw7JM69qk^*(rmO{|Z6rXy?l=K=#_ zE-zd*P|(sskasO(cZ5L~_{Mz&Y@@@Q)5_8l<6vB$@226O+pDvkFaK8b>%2 zfMtgJ@+cN@w>3)(_uR;s8$sGONbYvoEZ3-)zZk4!`tNzd<0lwt{RAgplo*f@Z)uO` zzd`ljSqKfHJOLxya4_}T`k5Ok1Mpo#MSqf~&ia3uIy{zyuaF}pV6 z)@$ZG5LYh8Gge*LqM_|GiT1*J*uKes=Oku_gMj&;FS`*sfpM+ygN&yOla-^WtIU#$ zuw(_-?DS?6DY7IbON7J)p^IM?N>7x^3)(7wR4PZJu(teex%l>zKAUSNL@~{czc}bR z)I{XzXqZBU3a;7UQ~PvAx8g-3q-9AEd}1JrlfS8NdPc+!=HJ6Bs( zCG!0;e0z-22(Uzw>hkEmC&xj?{0p|kc zM}MMXCF%RLLa#5jG`+}{pDL3M&|%3BlwOi?dq!)KUdv5__zR>u^o|QkYiqr(m3HxF z6J*DyN#Jpooc$ok=b7{UAVM@nwGsr6kozSddwulf5g1{B=0#2)zv!zLXQup^BZ4sv*sEsn)+MA?t zEL)}3*R?4(J~CpeSJPM!oZ~8;8s_=@6o`IA%{aEA9!GELRvOuncE`s7sH91 zmF=+T!Q6%){?lJn3`5}oW31(^Of|$r%`~gT{eimT7R~*Mg@x+tWM3KE>=Q>nkMG$U za7r>Yz2LEaA|PsMafvJ(Y>Xzha?=>#B!sYfVob4k5Orb$INFdL@U0(J8Hj&kgWUlO zPm+R07E+oq^4f4#HvEPANGWLL_!uF{nkHYE&BCH%l1FL_r(Nj@M)*VOD5S42Gk-yT z^23oAMvpA57H(fkDGMx86Z}rtQhR^L!T2iS!788E z+^${W1V}J_NwdwdxpXAW8}#6o1(Uu|vhJvubFvQIH1bDl4J4iDJ+181KuDuHwvM?` z%1@Tnq+7>p{O&p=@QT}4wT;HCb@i)&7int<0#bj8j0sfN3s6|a(l7Bj#7$hxX@~iP z1HF8RFH}irky&eCN4T94VyKqGywEGY{Gt0Xl-`|dOU&{Q;Ao;sL>C6N zXx1y^RZSaL-pG|JN;j9ADjo^XR}gce#seM4QB1?S`L*aB&QlbBIRegMnTkTCks7JU z<0(b+^Q?HN1&$M1l&I@>HMS;!&bb()a}hhJzsmB?I`poqTrSoO>m_JE5U4=?o;OV6 zBZjt;*%1P>%2{UL=;a4(aI>PRk|mr&F^=v6Fr&xMj8fRCXE5Z2qdre&;$_RNid5!S zm^XiLK25G6_j4dWkFqjtU7#s;b8h?BYFxV?OE?c~&ME`n`$ix_`mb^AWr+{M9{^^Rl;~KREplwy2q;&xe zUR0SjHzKVYzuqQ84w$NKVPGVHL_4I)Uw<$uL2-Ml#+5r2X{LLqc*p13{;w#E*Kwb*1D|v?e;(<>vl@VjnFB^^Y;;b3 z=R@(uRj6D}-h6CCOxAdqn~_SG=bN%^9(Ac?zfRkO5x2VM0+@_qk?MDXvf=@q_* z3IM@)er6-OXyE1Z4sU3{8$Y$>8NcnU-nkyWD&2ZaqX1JF_JYL8y}>@V8A5%lX#U3E zet5PJM`z79q9u5v(OE~{by|Jzlw2<0h`hKpOefhw=fgLTY9M8h+?37k@TWpzAb2Fc zQMf^aVf!yXlK?@5d-re}!fuAWu0t57ZKSSacwRGJ$0uC}ZgxCTw>cjRk*xCt%w&hh zoeiIgdz__&u~8s|_TZsGvJ7sjvBW<(C@}Y%#l_ID2&C`0;Eg2Z+pk;IK}4T@W6X5H z`s?ayU-iF+aNr5--T-^~K~p;}D(*GWOAYDV9JEw!w8ZYzS3;W6*_`#aZw&9J ziXhBKU3~zd$kKzCAP-=t&cFDeQR*_e*(excIUxKuD@;-twSlP6>wWQU)$|H3Cy+`= z-#7OW!ZlYzZxkdQpfqVDFU3V2B_-eJS)Fi{fLtRz!K{~7TR~XilNCu=Z;{GIf9KYz zf3h=Jo+1#_s>z$lc~e)l93h&RqW1VHYN;Yjwg#Qi0yzjN^M4cuL>Ew`_-_wRhi*!f zLK6vTpgo^Bz?8AsU%#n}^EGigkG3FXen3M;hm#C38P@Zs4{!QZPAU=m7ZV&xKI_HWNt90Ef zxClm)ZY?S|n**2cNYy-xBlLAVZ=~+!|7y`(fh+M$#4zl&T^gV8ZaG(RBD!`3?9xcK zp2+aD(T%QIgrLx5au&TjG1AazI;`8m{K7^!@m>uGCSR;Ut{&?t%3AsF{>0Cm(Kf)2 z?4?|J+!BUg*P~C{?mwPQ#)gDMmro20YVNsVx5oWQMkzQ? zsQ%Y>%7_wkJqnSMuZjB9lBM(o zWut|B7w48cn}4buUBbdPBW_J@H7g=szrKEpb|aE>!4rLm+sO9K%iI75y~2HkUo^iw zJ3se$8$|W>3}?JU@3h@M^HEFNmvCp|+$-0M?RQ8SMoZ@38%!tz8f8-Ptb@106heiJ z^Bx!`0=Im z1!NUhO=9ICM*+||b3a7w*Y#5*Q}K^ar+oMMtekF0JnO>hzHqZKH0&PZ^^M(j;vwf_ z@^|VMBpcw8;4E-9J{(u7sHSyZpQbS&N{VQ%ZCh{c1UA5;?R} z+52*X_tkDQ(s~#-6`z4|Y}3N#a&dgP4S_^tsV=oZr4A1 zaSoPN1czE(UIBrC_r$0HM?RyBGe#lTBL4~JW#A`P^#0wuK)C-2$B6TvMi@@%K@JAT_IB^T7Zfqc8?{wHcSVG_?{(wUG%zhCm=%qP~EqeqKI$9UivF zv+5IUOs|%@ypo6b+i=xsZ=^G1yeWe)z6IX-EC`F=(|_GCNbHbNp(CZ*lpSu5n`FRA zhnrc4w+Vh?r>her@Ba_jv0Omp#-H7avZb=j_A~B%V0&FNi#!S8cwn0(Gg-Gi_LMI{ zCg=g@m{W@u?GQ|yp^yENd;M=W2s-k7Gw2Z(tsD5fTGF{iZ%Ccgjy6O!AB4x z%&=6jB7^}pyftW2YQpOY1w@%wZy%}-l0qJlOSKZXnN2wo3|hujU+-U~blRF!^;Tan z0w;Srh0|Q~6*tXf!5-rCD)OYE(%S|^WTpa1KHtpHZ{!;KdcM^#g8Z^+LkbiBHt85m z;2xv#83lWB(kplfgqv@ZNDcHizwi4-8+WHA$U-HBNqsZ`hKcUI3zV3d1ngJP-AMRET*A{> zb2A>Fk|L|WYV;Eu4>{a6ESi2r3aZL7x}eRc?cf|~bP)6b7%BnsR{Sa>K^0obn?yiJ zCVvaZ&;d_6WEk${F1SN0{_`(#TuOOH1as&#&xN~+JDzX(D-WU_nLEI}T_VaeLA=bc zl_UZS$nu#C1yH}YV>N2^9^zye{rDrn(rS99>Fh&jtNY7PP15q%g=RGnxACdCov47= zwf^9zfJaL{y`R#~tvVL#*<`=`Qe zj_@Me$6sIK=LMFbBrJps7vdaf_HeX?eC+P^{AgSvbEn?n<}NDWiQGQG4^ZOc|GskK z$Ve2_n8gQ-KZ=s(f`_X!+vM5)4+QmOP()2Fe#IL2toZBf+)8gTVgDSTN1CkP<}!j7 z0SEl>PBg{MnPHkj4wj$mZ?m5x!1ePVEYI(L_sb0OZ*=M%yQb?L{UL(2_*CTVbRxBe z@{)COwTK1}!*CK0Vi4~AB;HF(MmQf|dsoy(eiQ>WTKcEQlnKOri5xYsqi61Y=I4kzAjn5~{IWrz_l))|Ls zvq7xgQs?Xx@`N?f7+3XKLyD~6DRJw*uj*j?yvT3}a;(j_?YOe%hUFcPGWRVBXzpMJ zM43g6DLFqS9tcTLSg=^&N-y0dXL816v&-nqC0iXdg7kV|PY+js`F8dm z2PuHw&k+8*&9SPQ6f!^5q0&AH(i+z3I7a?8O+S5`g)>}fG|BM&ZnmL;rk)|u{1!aZ zEZHpAMmK_v$GbrrWNP|^2^s*!0waLW=-h5PZa-4jWYUt(Hr@EA(m3Mc3^uDxwt-me^55FMA9^>hpp26MhqjLg#^Y7OIJ5%ZLdNx&uDgIIqc zZRZl|n6TyV)0^DDyVtw*jlWkDY&Gw4q;k!UwqSL6&sW$B*5Rc?&)dt29bDB*b6IBY z6SY6Unsf6AOQdEf=P1inu6(6hVZ0~v-<>;LAlcQ2u?wRWj5VczBT$Op#8IhppP-1t zfz5H59Aa~yh7EN;BXJsLyjkjqARS5iIhDVPj<=4AJb}m6M@n{xYj3qsR*Q8;hVxDyC4vLI;;?^eENOb5QARj#nII5l$MtBCI@5u~(ylFi$ zw6-+$$XQ}Ca>FWT>q{k)g{Ml(Yv=6aDfe?m|5|kbGtWS}fKWI+})F6`x@||0oJ^(g|+xi zqlPdy5;`g*i*C=Q(aGeDw!eQg&w>UUj^{o?PrlFI=34qAU2u@BgwrBiaM8zoDTFJ< zh7nWpv>dr?q;4ZA?}V}|7qWz4W?6#S&m>hs4IwvCBe@-C>+oohsQZ^JC*RfDRm!?y zS4$7oxcI|##ga*y5hV>J4a%HHl^t$pjY%caL%-FlRb<$A$E!ws?8hf0@(4HdgQ!@> zds{&g$ocr9W4I84TMa9-(&^_B*&R%^=@?Ntxi|Ejnh;z=!|uVj&3fiTngDPg=0=P2 zB)3#%HetD84ayj??qrxsd9nqrBem(8^_u_UY{1@R_vK-0H9N7lBX5K(^O2=0#TtUUGSz{ z%g>qU8#a$DyZ~EMa|8*@`GOhCW3%DN%xuS91T7~iXRr)SG`%=Lfu%U~Z_`1b=lSi?qpD4$vLh$?HU6t0MydaowUpb zQr{>_${AMesCEffZo`}K0^~x>RY_ZIG{(r39MP>@=aiM@C;K)jUcfQV8#?SDvq>9D zI{XeKM%$$XP5`7p3K0T}x;qn)VMo>2t}Ib(6zui;k}<<~KibAb%p)**e>ln<=qyWU zrRDy|UXFi9y~PdEFIAXejLA{K)6<)Q`?;Q5!KsuEw({!#Rl8*5_F{TP?u|5(Hijv( ztAA^I5+$A*+*e0V0R~fc{ET-RAS3suZ}TRk3r)xqj~g_hxB`qIK5z(5wxYboz%46G zq{izIz^5xW1Vq#%lhXaZL&)FJWp0VZNO%2&ADd?+J%K$fM#T_Eke1{dQsx48dUPUY zLS+DWMJeUSjYL453f@HpRGU6Dv)rw+-c6xB>(=p4U%}_p>z^I@Ow9`nkUG21?cMIh9}hN?R-d)*6%pr6d@mcb*ixr7 z)>Lo<&2F}~>WT1ybm^9UO{6P9;m+fU^06_$o9gBWL9_}EMZFD=rLJ~&e?fhDnJNBI zKM=-WR6g7HY5tHf=V~6~QIQ~rakNvcsamU8m28YE=z8+G7K=h%)l6k zmCpiDInKL6*e#)#Pt;ANmjf`8h-nEt&d}(SBZMI_A{BI#ck-_V7nx)K9_D9K-p@?Zh81#b@{wS?wCcJ%og)8RF*-0z+~)6f#T` zWqF7_CBcnn=S-1QykC*F0YTsKMVG49BuKQBH%WuDkEy%E?*x&tt%0m>>5^HCOq|ux zuvFB)JPR-W|%$24eEC^AtG3Gp4qdK%pjRijF5Sg3X}uaKEE z-L5p5aVR!NTM8T`4|2QA@hXiLXRcJveWZ%YeFfV%mO5q#($TJ`*U>hicS+CMj%Ip# zivoL;dd*araeJK9EA<(tihD50FHWbITBgF9E<33A+eMr2;cgI3Gg6<-2o|_g9|> zv5}i932( zYfTE9?4#nQhP@a|zm#9FST2 z!y+p3B;p>KkUzH!K;GkBW}bWssz)9b>Ulg^)EDca;jDl+q=243BddS$hY^fC6lbpM z(q_bo4V8~eVeA?0LFD6ZtKcmOH^75#q$Eo%a&qvE8Zsqg=$p}u^|>DSWUP5i{6)LAYF4E2DfGZuMJ zMwxxmkxQf}Q$V3&2w|$`9_SQS^2NVbTHh;atB>=A%!}k-f4*i$X8m}Ni^ppZXk5_oYF>Gq(& z0wy{LjJOu}69}~#UFPc;$7ka+=gl(FZCy4xEsk);+he>Nnl>hb5Ud-lj!CNicgd^2 z_Qgr_-&S7*#nLAI7r()P$`x~fy)+y=W~6aNh_humoZr7MWGSWJPLk}$#w_1n%(@? z3FnHf1lbxKJbQ9c&i<$(wd{tUTX6DAKs@cXIOBv~!9i{wD@*|kwfX~sjKASrNFGvN zrFc=!0Bb^OhR2f`%hrp2ibv#KUxl)Np1aixD9{^o=)*U%n%rTHX?FSWL^UGpHpY@7 z74U}KoIRwxI#>)Pn4($A`nw1%-D}`sGRZD8Z#lF$6 zOeA5)+W2qvA%m^|$WluUU-O+KtMqd;Pd58?qZj})MbxYGO<{z9U&t4D{S2G>e+J9K ztFZ?}ya>SVOLp9hpW)}G%kTrg*KXXXsLkGdgHb+R-ZXqdkdQC0_)`?6mqo8(EU#d( zy;u&aVPe6C=YgCRPV!mJ6R6kdY*`e+VGM~`VtC>{k27!9vAZT)x2~AiX5|m1Rq}_= z;A9LX^nd$l-9&2%4s~p5r6ad-siV`HtxKF}l&xGSYJmP=z!?Mlwmwef$EQq~7;#OE z)U5eS6dB~~1pkj#9(}T3j!((8Uf%!W49FfUAozijoxInUE7z`~U3Y^}xc3xp){#9D z<^Tz2xw}@o@fdUZ@hnW#dX6gDOj4R8dV}Dw`u!h@*K)-NrxT8%2`T}EvOImNF_N1S zy?uo6_ZS>Qga4Xme3j#aX+1qdFFE{NT0Wfusa$^;eL5xGE_66!5_N8!Z~jCAH2=${ z*goHjl|z|kbmIE{cl-PloSTtD+2=CDm~ZHRgXJ8~1(g4W=1c3=2eF#3tah7ho`zm4 z05P&?nyqq$nC?iJ-nK_iBo=u5l#|Ka3H7{UZ&O`~t-=triw=SE7ynzMAE{Mv-{7E_ zViZtA(0^wD{iCCcg@c{54Ro@U5p1QZq_XlEGtdBAQ9@nT?(zLO0#)q55G8_Ug~Xnu zR-^1~hp|cy&52iogG@o?-^AD8Jb^;@&Ea5jEicDlze6%>?u$-eE};bQ`T6@(bED0J zKYtdc?%9*<<$2LCBzVx9CA4YV|q-qg*-{yQ;|0=KIgI6~z0DKTtajw2Oms3L zn{C%{P`duw!(F@*P)lFy11|Z&x`E2<=$Ln38>UR~z6~za(3r;45kQK_^QTX%!s zNzoIFFH8|Y>YVrUL5#mgA-Jh>j7)n)5}iVM4%_@^GSwEIBA2g-;43* z*)i7u*xc8jo2z8&=8t7qo|B-rsGw)b8UXnu`RgE4u!(J8yIJi(5m3~aYsADcfZ!GG zzqa7p=sg`V_KjiqI*LA-=T;uiNRB;BZZ)~88 z`C%p8%hIev2rxS12@doqsrjgMg3{A&N8A?%Ui5vSHh7!iC^ltF&HqG~;=16=h0{ygy^@HxixUb1XYcR36SB}}o3nxu z_IpEmGh_CK<+sUh@2zbK9MqO!S5cao=8LSQg0Zv4?ju%ww^mvc0WU$q@!oo#2bv24 z+?c}14L2vlDn%Y0!t*z=$*a!`*|uAVu&NO!z_arim$=btpUPR5XGCG0U3YU`v>yMr z^zmTdcEa!APX zYF>^Q-TP11;{VgtMqC}7>B^2gN-3KYl33gS-p%f!X<_Hr?`rG8{jb9jmuQA9U;BeG zHj6Pk(UB5c6zwX%SNi*Py*)gk^?+729$bAN-EUd*RKN7{CM4`Q65a1qF*-QWACA&m zrT)B(M}yih{2r!Tiv5Y&O&=H_OtaHUz96Npo_k0eN|!*s2mLe!Zkuv>^E8Xa43ZwH zOI058AZznYGrRJ+`*GmZzMi6yliFmGMge6^j?|PN%ARns!Eg$ufpcLc#1Ns!1@1 zvC7N8M$mRgnixwEtX{ypBS^n`k@t2cCh#_6L6WtQb8E~*Vu+Rr)YsKZRX~hzLG*BE zaeU#LPo?RLm(Wzltk79Jd1Y$|6aWz1)wf1K1RtqS;qyQMy@H@B805vQ%wfSJB?m&&=^m4i* zYVH`zTTFbFtNFkAI`Khe4e^CdGZw;O0 zqkQe2|NG_y6D%h(|EZNf&77_!NU%0y={^E=*gKGQ=)LdKPM3zUlM@otH2X07Awv8o zY8Y7a1^&Yy%b%m{mNQ5sWNMTIq96Wtr>a(hL>Qi&F(ckgKkyvM0IH<_}v~Fv-GqDapig=3*ZMOx!%cYY)SKzo7ECyem z9Mj3C)tCYM?C9YIlt1?zTJXNOo&oVxu&uXKJs7i+j8p*Qvu2PAnY}b`KStdpi`trk ztAO}T8eOC%x)mu+4ps8sYZ=vYJp16SVWEEgQyFKSfWQ@O5id6GfL`|2<}hMXLPszS zgK>NWOoR zBRyKeUPevpqKKShD|MZ`R;~#PdNMB3LWjqFKNvH9k+;(`;-pyXM55?qaji#nl~K8m z_MifoM*W*X9CQiXAOH{cZcP0;Bn10E1)T@62Um>et2ci!J2$5-_HPy(AGif+BJpJ^ ziHWynC_%-NlrFY+(f7HyVvbDIM$5ci_i3?22ZkF>Y8RPBhgx-7k3M2>6m5R24C|~I z&RPh9xpMGzhN4bii*ryWaN^d(`0 zTOADlU)g`1p+SVMNLztd)c+;XjXox(VHQwqzu>FROvf0`s&|NEv26}(TAe;@=FpZq zaVs6mp>W0rM3Qg*6x5f_bPJd!6dQGmh?&v0rpBNfS$DW-{4L7#_~-eA@7<2BsZV=X zow){3aATmLZOQrs>uzDkXOD=IiX;Ue*B(^4RF%H zeaZ^*MWn4tBDj(wj114r(`)P96EHq4th-;tWiHhkp2rDlrklX}I@ib-nel0slFoQO zOeTc;Rh7sMIebO`1%u)=GlEj+7HU;c|Nj>2j)J-kpR)s3#+9AiB zd$hAk6;3pu9(GCR#)#>aCGPYq%r&i02$0L9=7AlIGYdlUO5%eH&M!ZWD&6^NBAj0Y9ZDcPg@r@8Y&-}e!aq0S(`}NuQ({;aigCPnq75U9cBH&Y7 ze)W0aD>muAepOKgm7uPg3Dz7G%)nEqTUm_&^^3(>+eEI;$ia`m>m0QHEkTt^=cx^JsBC68#H(3zc~Z$E9I)oSrF$3 zUClHXhMBZ|^1ikm3nL$Z@v|JRhud*IhOvx!6X<(YSX(9LG#yYuZeB{=7-MyPF;?_8 zy2i3iVKG2q!=JHN>~!#Bl{cwa6-yB@b<;8LSj}`f9pw7#x3yTD>C=>1S@H)~(n_K4 z2-yr{2?|1b#lS`qG@+823j;&UE5|2+EdU4nVw5=m>o_gj#K>>(*t=xI7{R)lJhLU{ z4IO6!x@1f$aDVIE@1a0lraN9!(j~_uGlks)!&davUFRNYHflp<|ENwAxsp~4Hun$Q z$w>@YzXp#VX~)ZP8`_b_sTg(Gt7?oXJW%^Pf0UW%YM+OGjKS}X`yO~{7WH6nX8S6Z ztl!5AnM2Lo*_}ZLvo%?iV;D2z>#qdpMx*xY2*GGlRzmHCom`VedAoR=(A1nO)Y>;5 zCK-~a;#g5yDgf7_phlkM@)C8s!xOu)N2UnQhif-v5kL$*t=X}L9EyBRq$V(sI{90> z=ghTPGswRVbTW@dS2H|)QYTY&I$ljbpNPTc_T|FEJkSW7MV!JM4I(ksRqQ8)V5>}v z2Sf^Z9_v;dKSp_orZm09jb8;C(vzFFJgoYuWRc|Tt_&3k({wPKiD|*m!+za$(l*!gNRo{xtmqjy1=kGzFkTH=Nc>EL@1Um0BiN1)wBO$i z6rG={bRcT|%A3s3xh!Bw?=L&_-X+6}L9i~xRj2}-)7fsoq0|;;PS%mcn%_#oV#kAp zGw^23c8_0~ ze}v9(p};6HM0+qF5^^>BBEI3d=2DW&O#|(;wg}?3?uO=w+{*)+^l_-gE zSw8GV=4_%U4*OU^hibDV38{Qb7P#Y8zh@BM9pEM_o2FuFc2LWrW2jRRB<+IE)G=Vx zuu?cp2-`hgqlsn|$nx@I%TC!`>bX^G00_oKboOGGXLgyLKXoo$^@L7v;GWqfUFw3< zekKMWo0LR;TaFY}Tt4!O$3MU@pqcw!0w0 zA}SnJ6Lb597|P5W8$OsEHTku2Kw9y4V=hx*K%iSn!#LW9W#~OiWf^dXEP$^2 zaok=UyGwy3GRp)bm6Gqr>8-4h@3=2`Eto2|JE6Sufh?%U6;ut1v1d@#EfcQP2chCt z+mB{Bk5~()7G>wM3KYf7Xh?LGbwg1uWLotmc_}Z_o;XOUDyfU?{9atAT$={v82^w9 z(MW$gINHt4xB3{bdbhRR%T}L?McK?!zkLK3(e>zKyei(yq%Nsijm~LV|9mll-XHavFcc$teX7v);H>=oN-+E_Q{c|! zp
      JV~-9AH}jxf6IF!PxrB9is{_9s@PYth^`pb%DkwghLdAyDREz(csf9)HcVRq z+2Vn~>{(S&_;bq_qA{v7XbU?yR7;~JrLfo;g$Lkm#ufO1P`QW_`zWW+4+7xzQZnO$ z5&GyJs4-VGb5MEDBc5=zxZh9xEVoY(|2yRv&!T7LAlIs@tw+4n?v1T8M>;hBv}2n) zcqi+>M*U@uY>4N3eDSAH2Rg@dsl!1py>kO39GMP#qOHipL~*cCac2_vH^6x@xmO|E zkWeyvl@P$2Iy*mCgVF+b{&|FY*5Ygi8237i)9YW#Fp& z?TJTQW+7U)xCE*`Nsx^yaiJ0KSW}}jc-ub)8Z8x(|K7G>`&l{Y&~W=q#^4Gf{}aJ%6kLXsmv6cr=Hi*uB`V26;dr4C$WrPnHO>g zg1@A%DvIWPDtXzll39kY6#%j;aN7grYJP9AlJgs3FnC?crv$wC7S4_Z?<_s0j;MmE z75yQGul2=bY%`l__1X3jxju2$Ws%hNv75ywfAqjgFO7wFsFDOW^)q2%VIF~WhwEW0 z45z^+r+}sJ{q+>X-w(}OiD(!*&cy4X&yM`!L0Fe+_RUfs@=J{AH#K~gArqT=#DcGE z!FwY(h&+&811rVCVoOuK)Z<-$EX zp`TzcUQC256@YWZ*GkE@P_et4D@qpM92fWA6c$MV=^qTu7&g)U?O~-fUR&xFqNiY1 zRd=|zUs_rmFZhKI|H}dcKhy%Okl(#y#QuMi81zsY56Y@757xBQqDNkd+XhLQhp2BB zBF^aJ__D676wLu|yYo6jNJNw^B+Ce;DYK!f$!dNs1*?D^97u^jKS++7S z5qE%zG#HY-SMUn^_yru=T6v`)CM%K<>_Z>tPe|js`c<|y7?qol&)C=>uLWkg5 zmzNcSAG_sL)E9or;i+O}tY^70@h7+=bG1;YDlX{<4zF_?{)K5B&?^tKZ6<$SD%@>F zY0cl2H7)%zKeDX%Eo7`ky^mzS)s;842cP{_;dzFuyd~Npb4u!bwkkhf8-^C2e3`q8>MuPhgiv0VxHxvrN9_`rJv&GX0fWz-L-Jg^B zrTsm>)-~j0F1sV=^V?UUi{L2cp%YwpvHwwLaSsCIrGI#({{QfbgDxMqR1Z0TcrO*~ z;`z(A$}o+TN+QHHSvsC2`@?YICZ>s8&hY;SlR#|0PKaZIauCMS*cOpAMn@6@g@rZ+ z+GT--(uT6#mL8^*mMf7BE`(AVj?zLY-2$aI%TjtREu}5AWdGlcWLvfz(%wn72tGczwUOgGD3RXpWs%onuMxs9!*D^698AupW z9qTDQu4`!>n|)e35b4t+d(+uOx+>VC#nXCiRex_Fq4fu1f`;C`>g;IuS%6KgEa3NK z<8dsc`?SDP0g~*EC3QU&OZH-QpPowNEUd4rJF9MGAgb@H`mjRGq;?wFRDVQY7mMpm z3yoB7eQ!#O#`XIBDXqU>Pt~tCe{Q#awQI4YOm?Q3muUO6`nZ4^zi5|(wb9R)oyarG?mI|I@A0U!+**&lW7_bYKF2biJ4BDbi~*$h?kQ`rCC(LG-oO(nPxMU zfo#Z#n8t)+3Ph87roL-y2!!U4SEWNCIM16i~-&+f55;kxC2bL$FE@jH{5p$Z8gxOiP%Y`hTTa_!v{AKQz&- ztE+dosg?pN)leO5WpNTS>IKdEEn21zMm&?r28Q52{$e2tGL44^Ys=^?m6p=kOy!gJ zWm*oFGKS@mqj~{|SONA*T2)3XC|J--en+NrnPlNhAmXMqmiXs^*154{EVE{Uc%xqF zrbcQ~sezg;wQkW;dVezGrdC0qf!0|>JG6xErVZ8_?B(25cZrr-sL&=jKwW>zKyYMY zdRn1&@Rid0oIhoRl)+X4)b&e?HUVlOtk^(xldhvgf^7r+@TXa!2`LC9AsB@wEO&eU2mN) z(2^JsyA6qfeOf%LSJx?Y8BU1m=}0P;*H3vVXSjksEcm>#5Xa`}jj5D2fEfH2Xje-M zUYHgYX}1u_p<|fIC+pI5g6KGn%JeZPZ-0!!1})tOab>y=S>3W~x@o{- z6^;@rhHTgRaoor06T(UUbrK4+@5bO?r=!vckDD+nwK+>2{{|{u4N@g}r(r z#3beB`G2`XrO(iR6q2H8yS9v;(z-=*`%fk%CVpj%l#pt?g4*)yP|xS-&NBKOeW5_5 zXkVr;A)BGS=+F;j%O|69F0Lne?{U*t=^g?1HKy7R)R*<>%xD>K zelPqrp$&BF_?^mZ&U<*tWDIuhrw3HJj~--_0)GL8jxYs2@VLev2$;`DG7X6UI9Z)P zq|z`w46OtLJ1=V3U8B%9@FSsRP+Ze)dQ@;zLq|~>(%J5G-n}dRZ6&kyH|cQ!{Vil( zBUvQvj*~0_A1JCtaGZW|?6>KdP}!4A%l>(MnVv>A%d;!|qA>*t&-9-JFU4GZhn`jG z8GrgNsQJ%JSLgNFP`5;(=b+M9GO8cg+ygIz^4i?=eR@IY>IcG?+on?I4+Y47p-DB8 zjrlar)KtoI{#kBcqL&4?ub@Df+zMt*USCD_T8O$J$~oMrC6*TP7j@H5trGV$r0P6I zV7EZ{MWH`5`DrX*wx&`d;C`jjYoc_PMSqNB290QXlRn_4*F{5hBmEE4DHBC$%EsbR zQGb7p;)4MAjY@Bd*2F3L?<8typrrUykb$JXr#}c1|BL*QF|18D{ZTYBZ_=M&Ec6IS ziv{(%>CbeR(9Aog)}hA!xSm1p@K?*ce*-6R%odqGGk?I4@6q3dmHq)4jbw+B?|%#2 zbX;ioJ_tcGO*#d0v?il&mPAi+AKQvsQnPf*?8tX6qfOPsf-ttT+RZX6Dm&RF6beP3 zdotcJDI1Kn7wkq=;Au=BIyoGfXCNVjCKTj+fxU@mxp*d*7aHec0GTUPt`xbN8x%fe zikv87g)u~0cpQaf zd<7Mi9GR0B@*S&l&9pCl-HEaNX?ZY8MoXaYHGDf}733;(88<{E%)< z^k)X#To3=_O2$lKPsc9P-MkDAhJ~{x<=xTJw2aRY5SSZIA6Gij5cFzsGk@S)4@C65 zwN^6CwOI9`5c(3?cqRrH_gSq+ox(wtSBZc-Jr5N%^t3N&WB|TT_i4!i3lxwI=*p)Y zn7fb%HlXhf8OGjhzswj!=Crh~YwQYb+p~UaV@s%YPgiH_);$|Gx3{{v5v?7s<)+cb zxlT0Bb!OwtE!K>gx6c4v^M9mL0F=It*NfQL0J0O$RCpt746=H1pPNG#AZC|Y`SZt( zG`yKMBPV_0I|S?}?$t7GU%;*_39bCGO*x3+R|<=9WNe!8jH- zw5ZJS(k@wws?6w1rejjyZ>08aizReJBo%IRb3b3|VuR6Uo&sL?L5j(isqs%CYe@@b zIID7kF*hyqmy+7D(SPa^xNVm54hVF3{;4I9+mh)F22+_YFP>ux`{F)8l;uRX>1-cH zXqPnGsFRr|UZwJtjG=1x2^l_tF-mS0@sdC38kMi$kDw8W#zceJowZuV=@agQ_#l5w znB`g+sb1mhkrXh$X4y(<-CntwmVwah5#oA_p-U<_5$ zGDc%(b6Z=!QQ%w6YZS&HWovIaN8wMw1B-9N+Vyl=>(yIgy}BrAhpc2}8YL-i*_KY7 ztV+`WKcC?{RKA@t3pu*BtqZJFSd2d)+cc07-Z#4x&7Dnd{yg6)lz@`z%=Sl-`9Z~*io zck_Lshk9JRJs=t>1jmKB~>`6+(J z@(S}J2Q{Q{a-ASTnIViecW(FIagWQ%G41y?zS)gpooM z@c<2$7TykMs4LH*UUYfts(!Ncn`?eZl}f zg)wx@0N0J(X(OJ^=$2()HLn)=Cn~=zx(_9(B@L04%{F_Zn}5!~5Ec5D4ibN6G_AD} zzxY^T_JF##qM8~B%aZ1OC}X^kQu`JDwaRaZnt!YcRrP7fq>eIihJW1UY{Xhkn>NdX zKy|<6-wD*;GtE08sLYryW<-e)?7k;;B>e$u?v!QhU9jPK6*Y$o8{Tl`N`+QvG ze}71rVC)fis9TZ<>EJ2JR`80F^2rkB7dihm$1Ta2bR?&wz>e`)w<4)1{3SfS$uKfV z3R=JT!eY+i7+IIfl3SIgiR|KvBWH*s;OEuF5tq~wLOB^xP_Dc7-BbNjpC|dHYJrZCWj-ucmv4;YS~eN!LvwER`NCd`R4Xh5%zP$V^nU>j zdOkNvbyB_117;mhiTiL_TBcy&Grvl->zO_SlCCX5dFLd`q7x-lBj*&ykj^ zR3@z`y0<8XlBHEhlCk7IV=ofWsuF|d)ECS}qnWf?I#-o~5=JFQM8u+7I!^>dg|wEb zbu4wp#rHGayeYTT>MN+(x3O`nFMpOSERQdpzQv2ui|Z5#Qd zB(+GbXda|>CW55ky@mG13K0wfXAm8yoek3MJG!Hujn$5)Q(6wWb-l4ogu?jj2Q|srw?r z-TG0$OfmDx%(qcX`Fc`D!WS{3dN*V%SZas3$vFXQy98^y3oT~8Yv>$EX0!uiRae?m z_}pvK=rBy5Z_#_!8QEmix_@_*w8E8(2{R5kf^056;GzbLOPr2uqFYaG6Fkrv($n_51%7~QN<>9$WdjE=H}>(a41KM%d2x#e@K3{W|+=-h*mR&2C01e z2sMP;YjU)9h+1kxOKJ+g*W=&D@=$q4jF%@HyRtCwOmEmpS|Rr9V_2br*NOd^ z4LN#oxd5yL=#MPWN{9Vo^X-Wo{a7IF2hvYWB%eUCkAZq+=NQ=iLI9?~@ zr+|ky4Rgm7yEDuc2dIe941~qc8V_$7;?7|XLk6+nbrh}e&Tt20EWZ@dRFDoYbwhkn zjJ$th974Z0F${3wtVLk_Ty;*J-Pi zP0IwrAT!Lj34GcoSB8g?IKPt%!iLD-$s+f_eZg@9q!2Si?`F#fUqY`!{bM0O7V^G%VB|A zyMM>SKNg|KKP}+>>?n6|5MlPK3Vto&;nxppD;yk@z4DXPm0z9hxb+U&Fv4$y&G>q= z799L0$A2&#>CfSgCuu$+9W>s<-&yq3!C{F9N!{d?I|g|+Qd9@*d;GplgY5Fk$LOV+ zoMealKns!!80PWsJ%(}L61B!7l?j1_5P#LRrVv%NBhs{R`;aufHYb&b+mF%A+DGl5 zBemAHtbLFi++KT(wv9*?;awp>ROX~P?e<4#Uf5RKIV{c3NxmUz!LYO#Cxdz*CoRQp zSvX|#NN06=q_eTU5-T!RmUJ?Ht=XQF8t)f+GnY5nY5>-}WLR1+R5pou?l@Y|F@KEX zk=jh-yq=Rn9;riE*;Slo}PfNKhXO#;FrZCf%VZ9h7W z<63YWE^s_SlAVQh6B(En9i<9%4AT|2bTQ4Ph2)pI?f2S`$j?bp`>_3(`Fz&?ig-FJ zoO7KAh@4BDOU>sBXV84Eajr9;>wlbW&OSUt&dug?oAV;`+3oBzpI18%%1wA4blzmb z-{QPYJmn_2-F$A5JI!a8+-p8Bk*^U?^f5j7uZ}jEz0E3;XbahB2iZwS&l4jj4WRS6 z3O&!w=ymQSl~7LUE99noXd2y1)9E>yK`+ouR%sTOQ@Qjt@<;lErGLk1wrw7r zV)M})+amJXs_9hQa++&vrqgU&Xr8T)=G&5Vy6vOnvt37L*nU7&ws&ZO-9`)TGA**t zpby#0X|df;etRud+s~#Y_7zlPZ=_oLg%q&wraF6s>g@;VO#2sUseO=^+3%&Z?61(- z_IKzU`+Kw;Blil&LR#qv&{rzQnG|%i(Q3zLI@gh)2FE^H;~1dx9G|AOj(e%mSwT(C z71Zp!jar*i3S|_ik_3{n0L4KavYWWZ2x3MhyU!66E$h=L+A&-s$9X_w9Q_e;+`-{ZW# z^Zn2H_I~`}!vGeFRRY^DyKK#pORBr{&?X}ut`1a(x__(dt3y_-*Np0pX~q39D{Rns z!iXBWZO~+oZu>($Mrf0rjM>$JZar!n_0_!*e@yT7n=HfVT6#jbYZ0wYEXnTgPDZ0N zVE5?$1-v94G2@1jFyj##-E1Um(naG-8WuGy@rRAg)t9Oe0$RJ3OoWV8X4DXvW+ftx zk%S(O8h?#_3B9-1NHn&@ZAXtr=PXcAATV*GzFBXK>hVb9*`iMM-zvA6RwMH#2^901uxUFh&4fT% zmP?pjNsiRIMD)<6xZyOeThl_DN_ZJ*?KUIHgnx{vz`WKxj&!7HbM8{w?{Rued(M1v zKHsK{_q=YI88@Bf0*RW@cIV@=<{eGsG21xrTrWycT7*KBd!eD2zb1R(O@H~k7>Duv zHPwp=n8;t#1>7~fuM9IaD5w%BpwLtNCe_Sq9eal4oj2DB1#<+(MGR-P&Ig%3t%=!< zS$|KxI1a~an2Q>L$s;1$9nQJal4dk)Box$YsAKgCiEGni##jr|%So6Y4J@pYBF!;~ zhXwpKhc7&QZ$=e~Sb&ABZ4o)&U~N*dSU`2G^eQh-WCe9tA}~Ae369btLlB{GjOKB@yEDH!C7Q&df^#X zi~?{rCuAE|kAjKzt+r#t6s)1h840@A<%i5(O;$Q&tD(opg0)yzgm#=ucf4CSqkqYS zaTdivk5I~#=1Z9K5M*uV6H??6s9*ynT`vzr2@%Tkr4k+Tr_ib40$fPP7$yLA$cwJ@ zF@`94=op)$x^0t+QAsNY$pi!4e7hp~gO=|yD=^8JTvTiC(HAamYEQ}t z+hR~QoKTOz%)IHEg&6iC4vP=3mw&u4wvcSwi$vNBGQE5RoSUs^l+u{A+6s~aMMkXG z+1g4wD8^Y27Oe4f``K{+tm76n(*d6BUA4;pLa26`6RD6?Rq?2K1yMXVAk`&xbks*~{+``Mhg4cQEuw+aM zaI9{}9en8DCh*S9CojIk)qh|k?#iNiCQ}rAmr&iYRJiND ztt+j*c+}Fv&6x&7U~!(Sb1eAz1N@Nf`w?YxGJdhy+seiNNZEYIG1_<^?&pm^P8W?d ze(p@$nWC`Pxqpf8d&AIGNJn#Ty)j z1NbA^Y}pNQ>OfTdiAp+WR>C6390IrFj;YZglitGH8r7(GvVRpWjZd7|r24M{u66B) zs#VS$?R*!1FT&sO-ssvW8s5jh$-O=^9=7^y z75||~QA6zLW}Lu!YOZh1J$j46m zNH|;^a$U_RKgla5h>5(igl^ek(~2nL5a_0}ipvA_Xf0k*E-ExJNld0{LZ;F^DzqAL+IZGJ7<3i1szf zxMRkQ(|@;wj9%I7h{c*{;?g%giylU}Dz{iwb(1vGK<-vlnKs!|Mb9}iTt)Rl&NZka zkkugrMiY(ng3QseY!npaOf1jo3|r35nK+eTYh*`DHabuv@IFy zG7@V!LWE0&)bvqgQ8=-L-(vt#Z-&xaOj3G@Nqw1FfbNQ`!bFEl@z)0)+#Z5e#_hQ|Rd!KrEoRn^aFz zkzYzz%hher>ixcg6fW`=rr>Nx@enQ!sQqYR{<2^|eUfw?e8;B_`T)Kxkp8${U>g?k*VhCd zp^yYLvi}<#5TDjrx@{0U$jx*tQn+mhcXsq2e46a@44^-Sd;C6S2=}sK1LQ_OUhgO` z^4yN+e9Dv9TQ64y1Bw)0i4u)98(^+@R~eUUsG!Ye84 zFa7-?x3cqUXX)$G<2MgYiGWhjq?Q-CE(|sm-68_z>h_O2vME5nX;RodIf)=No(={I z_<&3QJcPg8kAI}_Vd+OH4z{NsFMmjv3;kunMSh94VNnqD?85uOps%nq=q?kU_JT5@ zwih;eQlhxr)7d^K#-~InWlc&<*#?{A(8f^+C_WmRR{B&Yh3pxhLU9-toLz%rCPi}} zE!cw^pQlXB3aACUpacU&ZlBUl(Jo4fxpbDVwDn^m{VG||ar9B)9}@K`(SJxmAWro& z_3yzfUqLoXg`H($!I;FTudPdo6FTJm2@^S|&42H(XbSRW7!)V&=I`{;mWicu@BT7z zQs!)F9t-K|aFaMsoJ_6z-ICrzjW5#yJRs>~)bugki)ST$8T%!D4F@EBliCNSA5!fl zN;OuKbR3m0rj=rrq}5`nq<<%iHIl|euXt6QA}$hFNqV)oR?_Rm4oPnoLy|ru_DQ-= zJTDFa;zjY2p{sg zWqz0I5y>-U{xR1Rl4r{NQ?6Ge&y@N7t~Vsll=-(^?@FF2^Y6JnkbgW==09{7N}eh4 z?h`%x-LM8D}+*41ZA#EG0D9KQjc2#z59Pq zO9u!y^MeiK3jhHB6_epc9Fs0q7m}w4lLmSnf6Gb(F%*XXShZTmYQ1gTje=G?4qg`Z zf*U~;6hT37na-R}qnQiIv@S#+#J6xEf(swOhZ4_JMMMtdob%^9e?s#9@%jc}19Jk8 z4-eKFdIEVQN4T|=j2t&EtMI{9_E$cx)DHN2-1mG28IEdMq557#dRO3U?22M($g zlriC81f!!ELd`)1V?{MBFnGYPgmrGp{4)cn6%<#sg5fMU9E|fi%iTOm9KgiN)zu3o zSD!J}c*e{V&__#si_#}hO9u$51d|3zY5@QM=aUgu9h0?tNPn1w)HWnB7LQ^GRUjeP z(zSg-y4St;3UIQ}ZX?^;ZtL2n4`>^*Y>Trk?aBtSQ(D-o$(D8Px^?ZI-PUB?*1fv! z{YdHme3Fc8%cR@*@zc5A_nq&2=R47Hp@$-JF4Fz*;SLw5}|ID{W__bHvfJIivHmqmPXlPJd^=<$8K97bHK^(i8eAy)&m< zBc1z)P8b<4NOeqgIeTQpaF|x5YV1#`#T`tctbN+b*?N{~O)bV<K z^y>s-s;V!}b2i=5=M-ComP? zju>8FPIq0VrdV5*EH$|!Ot;e=VudJExcb;2wST}N#u?M~TxGC_!?ccCHCjt|F*PgJ zf@kJB`|Ml}cmsyrAjO#Kjr^E5p29w+#>$C`Q|54BoDv$fQ9D?3n32P9LPMIzu?LjNqggOH=1@T{9bMn*u8(GI!;MGs%MKpd@c!?|2x+D-Rsw10~pU|Rn@A}C1xOlxCribxes0~+n26qDaI zA2$?e`opx3_KW!rAgbpzU)gFdjAKXh|5w``#F0R|c)Y)Du0_Ihhz^S?k^pk%P>9|p zIDx)xHH^_~+aA=^$M!<8K~Hy(71nJG(ov0$3Fg{n+QicHk{UcoFg0-esGM}1X@Ad~ zBS?mZCLw;l4W4a+D8qc)XJS`pUJ5X-f^1ytxwr`@si$lAE?{4G|o;O0l>` zrr?;~c;{ZEFJ!!3=7=FdGJ?Q^xfNQh4A?i;IJ4}B+A?4olTK(fN++3CRBP97jTJnI zF!X$o@{%29Dqq5zt&v4zmF$4E8GqYQko@>U1_;EC_6ig|Drn@=DMV9YEUSCaIf$kH zei3(u#zm9I!Jf(4t`Vm1lltJ&lVHy(eIXE8sy9sUpmz%I_gA#8x^Zv8%w?r2{GdkX z1SkzRIr>prRK@rqn9j2wG|rUv%t7pQ!2SrmOQRpAcS|Wp-{6gg=|^e5#DDOQVM?H4 z;eM-QeRFr06@ifV(ocvk?_)~N@1c2ien56UjWXid6W%6i zevIh)>dk|rIs##^kY67ib8Kw%#-oVFaXG7$ERyA9(NSJUvWiOA5H(!{uOpcWg&-?i zqPhds%3%tFspHDqqr;A!N0fU`!IdoMs=lv7E*9NYeVfBht~=W5wtrfcc#o#+l8s8! z(|NMeqjsy@0x{8^j0d00SqRZjp{Kj)&4UHYGxG+z9b-)72I*&J70?+8e?p_@=>-(> zl6z5vYlP~<2%DU02b!mA{7mS)NS_eLe=CB zc62^$j+OeC%Nkvg?0*n6EKlkPQ)EUvvfC=;4M&*|I!w}(@V_)eUKLA_t^%`o0PM9L zV|UKTLnk|?M3u!|f2S0?UqZsEIH9*NJS-8lzu;A6-rr-ot=dg9SASoluZUkFH$7X;P=?kY zX!K?JL-b~<#7wU;b;eS)O;@?h%sPPk{4xEBxb{!sm0AY|>CXVS(_RT9YPMpChUjl310o*$QocjGdf>jS%%kn_+Y;Ztbauie*k&Q@=9;erLneIoel2C zfCMiPTmYnjjxjV!Ar1h1yQ-31h=b@RZt-play?)#cs=ZxOt;5oX)|*e=7k*ASmQ;r zO4_`=Z&gX-C2$fitvq+iGK1U*^*#IW!Bo{nON%KSxQv@MZsO%Lx21x78z740FSW!f zJ%f-?XMgR#xdurqd6mWyUX2uh=Si>bnwg#gssR#jDVN{uEi3n(PZ%PFZ|6J25_rBf z0-u>e4sFe0*Km49ATi7>Kn0f9!uc|rRMR1Dtt6m1LW8^>qFlo}h$@br=Rmpi;mI&> zOF64Ba2v-pj&TB}f&A09bMg?1id{fne%>Q?9GLm{i~p^lAn!%ZtF$I~>39XVZxk0bROh^B zk9cE0AJBLozZIEmy7xG(yHWGztvfnr0(2ro1%>zsGMS^EMu+S$r=_;9WwZkg z)ww}6KOsH_)RkMh?x@N2R^3(SICQNAzP7(RdB{@@`v*GfeSYLv=cfmTC%s2_T@_Cso2168v@AU^NzL&qv?6hZBJEdb)g=X=dVg9? zYf78=0c@!QU6_a$>CPiXT7QAGDM}7Z(0z#_ZA=fmLUj{2z7@Ypo71UDy8GHr-&TLK zf6a5WCf@Adle3VglBt4>Z>;xF}}-S~B7<(%B;Y0QR55 z{z-buw>8ilNM3u6I+D$S%?)(p>=eBx-HpvZj{7c*_?K=d()*7r74N{MulF2dQ*rGJ8Al=QJ~zb`)MPYedy2kVl9jXxdnmn`&r8ut0w>q?93 zus}1dq%FAFYLsW8ZTQ_XZLh`P2*6(NgS}qGcfGXVWpwsp#Rs}IuKbk*`2}&)I^Vsk z6S&Q4@oYS?dJ`NwMVBs6!1v<013>Q(y%%a0i}Y#1 z-F3m;Ieh#Y12UgW?-R)|eX>ZuF-2cc!1>~NS|XSF-6In>zBoZg+ml!6%fk7Uw0LHc zz8VQk(jOJ+Yu)|^|15ufl$KQd_1eUZZzj`aC%umU6F1&D5XVWcUvDqcUtW@*>xfVd z@!G2_v`obR5 zU*UT{eMHfcUo`jw*u?4r2s_$`}U{?NjvEm(u&<>B|%mq$Q3weshzrh!=m4 zH~yPq{qO0O>o|+xpE_i3$yVP%gs2l20HBh&_;PzZtwMPqQDk4~L}0tfu;d4uxUM8h zx$5GP@d7%rg(9Y8!9@i+9&2l=3<|?le_)g9Z)PQ5ESCo?x4680QstTl-CH_ z5m)j*Epfqj7I|G0-*vpm?U#8&k?((2zg;QYNszIUs?zAIGUr9}em3I$Fhb*w9-ci~gV$1;8(U;p&SDZE^3_CNLX1zM3@E|W%A=rX4; zwOlLm!AP*(*Bl0rL_(L=6`Hv5>_8;g?VljGOuMhr8|fxKG|7jrCnCW}AbEe8A8O*a z;rbQWArFQUVyZaIdGyF7WbZ8lvQ6v;yEgG7uqYA&H#G5ad?wWuhnhHBvUGfsN3K^( zewji7_p=ede8DTP$FEa_M(6|&v8m{z@NJ&XsIgEPpP?ss9mYaeWBd+!UX6vy_yzie z8Vi;2C+U(J3ze}%uZ)Gt_+?D`yc!FY@z?1aYAjU7Z=eB`u~3ZJ#|<)8RL1SxrN%;K zoZ+XHo~5{G1p40!tUgK$I7L3rV9Y8@Eg;`_0Z>Z^2tPilXQ&PU0NNXq;YJ*jtBNjv zYflqF6o%gs=t3z%xd|2&*IQdyR=^LH8WYpRgrrep4Mx6Aw}fxhSE$jN z_`x6Gk20R2MM&C)-R$h{nfE#GnVgwFe}DZ3unAM(^yK7C>62cU)*<-~eOtHo^)=lJ zyq4q2*a>{Y3mU}nkX(`x@nlm*hSem0>o7{ZNZ;OQ5dw>RYT0 zOXvK4;<_A&n$p-%65n=wqR{bejviAOu@}cn>s#w3qd~{|=TQiObS+3ii(WV`2`mPo zZQ7x1xMY3^WvfM@Sq*HPLJh+LQwQ=`ny&P1^Hu$TtXM-zVD=*VoC&`n>n>@37!?>f zN*sy>#GXLvspC8GGlAj!USU^YC|}skAcN~^Xqe0(jqx#zAj>muU<=IUs~34|v06u2 zahGbSeT-uAG|Vv*Bw$#pf8#qXFtMfw|VuC{UeT)2WpJ6&O+E6jF; z;~n9>cf~Ip6j-_@&PGFD0%Vu*QJ@Ht`C7Og!xt#L>mqlJGEh<%*ATJUmZc(FfNSB## zfy_`Y-70r{Iv3jEfR|~Ii!xC44vZ(KNj#>kjsE86E3FB*OayD~$|}3Y&(h6^X|1(TcJ}8{Ua3yL1loSfg!2gTekn ztVO7WNyFQCfwF2ti$UvL8C6{{IPBg01XK~$ThIQx{)~aw>(9F2L#G36*kRDPqA$P* znq=!@bbQ#RzDpVIfYc*x9=}2N^*2z1E%3epP)i30>M4^xlbnuWe_MAGRTTb?O*?TC zw6v5$6bS)qZqo=w4J~*9i;eVx4NwO!crrOjhE8U(&P-ZZU9$We^ubqNd73QDTJqqV z55D;u{1?`JQre~$mu9WZ%=z|x?{A;q|NiAy0GH5U*nIM2xww(4aBEe#)zoy#s-^NN z%WJl5hX=Oj8cnY%e+ZYt5!@FfY;fPO8p2xj+f6?;UE_`~@~KwcX!4d}D<7hA<#M$$ zMY^)MV_$1K4gr3H8yA&|Ten>yr0v!TT@%u$ScDfRrzVR=Rjj3cjDj)fWv?wQanp7L zL)Me^LS6EzBMR%1w^~9L%8&g(G;d3f4uLKFIqs5JYKSlle?R1Fyx?%RURbI;6jq>N zh+(uYf`e8J=hO2&ZQCoTU^AKRV>_^&!W{P-3%oVMaQqOcL1!4cYP)vuF~dMQb1#lK zj_HWu4TgBXPYuJQYWv&8km~(7Mlh=5I8HE}*mJ#?mxhx%#+9e>eorO0)eg#m6uhb7 zG^KSg`Cbxlf9XizZH9>B@hZcqJ*7VTp6)w1tHLB11}(?)MI0$rLIUS0;Z^atECLmz zzb6FE#PKdBl;L{}$M%UdWEi4$AS4ew$#8O?ZRr(G4syuHkcGi8a#*gRz@QP|7R93= zj*A$L;eA}9id+JyWjkK`Mod00;{&DlA!QJFR3&ljf1vI*O1ec{(V=0QA?ELLVls-W z``ELsu7M`3`vI4MzhVcpJ!9#^KGjq|#b-J`!F7h${dUEFmBLuMbYu>nV^(S3q+UC; z7s@e_qZG#+N=oo0o$G1>6Y0a{9@&9;EU2+8k|7P6p?HMh|8#X5UnwpxGbHw;%WXHX zn_~8ne zdvw09V+G$(lhoq7L}=qb+OaPSD&;$TuUtG(4;py(h)8|Nord(*d1ZH-Dmw1MqU&RK ziI)26r-hE(pqnmo4uixe^`qea7(_HA_ zR2KjdJ4$g!)7ve&Q^b1Tf+{(Vd6vInCd>i725IomG^(Ez( zD8L!4qlUAX=)EV9!3JfWLB4n1z)!ums&0UuuVLUHP)i30*5f6tnvk?lbhL{|8I78X7|_c zA3p(L9<~X5y1L3{K8Sf*xL|5gToDT;aYig?m8z^zQ`XdEMJqC#*O|ho!7x~+MzT<5 zg$turF~pS;RSY&GR;6TxR)3Q+&%yG`3&ngIwR*qK&t{TERu@0|fDrKKw3=RE&t-)Xh-$i&l5|>BSn5)z)hg3d?<~8msU=ye z>CHWR!9yT;PU|$KP*qADf(V?zj^n^g~nykv^I)Uz3{78Ty81{n~ZsS&7WH)#Ach3%UyVD1s=Ahvw9*%Wt<42vTt%|niux3Zww13+oK)-d~ zG>VKHM0ov>KXKaUH(Cc)#9GFVSc4EoUbnRudxi}T8J!VNY=4g*Y7C*Ho7#^wUVt&< zKN3&ugs1Ur<767&ea4^1oBw%@h^+YZ+eK^VI5573*KZosq? zpMj(u5257?^lBu&LF9`ao`sYf9&zx;uK2iv&$;8{4nFUSFF5$3JHFuHORo5YgFkV{ zCmcNEicdQDvO7NM;484|f=_+6!)x%g1CL;L9DE%%T=1xaKZ8v-+-@x1OZ;|0_a9J8 z2MFd71j+6K002-1li@}jlN6Rde_awnSQ^R>8l%uQO&WF!6qOdxN;eu7Q-nHAUeckH znK(0P3kdECiu+2%6$MdLP?%OK@`LB_gMXCA`(~0RX;Tm9uJ&d7>n%9A~GP*{Zrpyh7B^|a-)|8b<&(!>OhWQ08 z$LV}WQ`RD4Od8d3O-;%vhK7#W<7u;XvbxQo0JX@fY(C0RS6^zcd>jo287k@<4tg;k z3q5e5hLHE@&4ooC)S|`w7N|jm>3tns$G}U4o!(2g=!}xLHp?+qFvj$ztd<%96=4tCKGG@ADSX{=m zNZ@ho6rr?EOQ1(G2i@2;GXb&S#U3YtCuVwc*4rJcPm$kZf2+|!X~X6%(QMj{4u)mZ zOi!(P(dF3hX4ra9l=RKQ$v(kJFS#;ib+z9K^#Gle6LKa>&4oMFJ4C&NBJ7hhPSIjc zOno$M6iq+l;ExpH9rF68@D3-EgCCf}JJSgVPbI1$?JjPPX!_88InA}KX&=#cFH#s3 zIx<6LeY==wf5DK*jP`hqF%u+|sI)3HfyywfAj=0OMNUX2pLR;T(8c+$g&}Z#q9L>( zD~t~l&X^VFXp@&w92f8tq+KXMZ&o!an%$#uo^hJh^9-RjEvqE_s%H8{qw(juo4?SC z{YhO*`|H*ibxm%ZF6r=2QC)bE`d3oZ(~?;a-(mX) zb!|i%p!VVP>DN6tg*Ry97gUPUJj<}OxaYL1nXE}hxs-O{twImUw43Eo6nJ4_RTDIQALB8H!3nq37 zcE6>oNG;jZZhXh!vORPsMKfzJ8_*?O7DfGmcrL8A(_NAhSH+JE?u?`xR1|ZThDb;2 zDt`9hC;UQ%94^20-MA*;<$KO0{3b&9y(ENIe@&xj6>X23)Ftc?ax=4pL5FZ06CPOj zgG%2*F$-x6 z&si`nj955%8LK)caVl1M8?IPaMPtM85o>MvPUn@(X=!wZq0)at}MK|kJ&KJggGx6y?Ey21qiw~76MoISk z+LyUR=2+oJK1IoYOX~R}S1x>iblZ|_oAmqhyU+NpxvjQb;Ht{pO_xn4T+UO<73|gD zaq0Wtdz^7GoZq-Fu+;61dX%|tud0myO`{vHTlP*oes5OaTBV$=y?3V{mRnFLdQ!Hj z)lErp+uBchtEPv?ao=?feR1oRVaUdpIVC}+xkgTxPYSGDyR2Zw++VdTe(-~Oh=P%c zFD5UUvx;?cLREy~~@9BnQ?{+kh7j7^BGZ3r}vC zuRPgbSbFk*%f8<`nm*%=sYP!wJk1uNV$&qN0K`bt|AMMaWeMf&qirQ!Dt0FDJ8`4KXRTiO^HPz`BO1{-ofSrz0YR`9K0lLHorGM!h0O0Z3yut19ieErkD1!7DO zG~nX@7pO{uE-YFOTtaXT=wTxi=Y>zUU+BjIx>jcL#D!u^>AGNjXBL{vAZ}$~KnuVC z1E3-$;H5MCAlFEP4~z$T=^-$HP(wOqa`hr78Te`EKnLicSpL~^a?K*8$-ft=N<+?q zW?-0u5gn^0TQByPK^#BKz~G2th_L-+o5j*dCr4Ycg3q*_+`m|qNyu^Xvc-|obKpm+ zGBD_)==PZ0utaRK!4gv$&;gX1%nS@qfG$9_!NzrRSv~>`eq9tbPbwj5K&x^fX&o_o$H1U~ zqIOd?L@oQ|Bg^Gwz#}riv?K=%D|r-k8@s@c6Ir1u0~(i50a^-LyMmf7oO;2EvR3Fw zgF8gPQ1=7g{c3<>(&5P)SNO;vnvv+PKQakyh~7$L8Bq2Q1{!dbhk-!@#SpP+P(|#M SXRcJ{65?fGI57uQ5&!`B?F@7P delta 34554 zcmX7vV`H6d(}mmEwr$(CZQE$vU^m*aZQE(=WXEZ2+l}qF_w)XN>&rEBu9;)4xt<3b zo(HR^Mh47P)@z^^pH!4#b(O8!;$>N+S+v5K5f8RrQ+Qv0_oH#e!pI2>yt4ij>fI9l zW&-hsVAQg%dpn3NRy$kb_vbM2sr`>bZ48b35m{D=OqX;p8A${^Dp|W&J5mXvUl#_I zN!~GCBUzj~C%K?<7+UZ_q|L)EGG#_*2Zzko-&Kck)Qd2%CpS3{P1co1?$|Sj1?E;PO z7alI9$X(MDly9AIEZ-vDLhpAKd1x4U#w$OvBtaA{fW9)iD#|AkMrsSaNz(69;h1iM1#_ z?u?O_aKa>vk=j;AR&*V-p3SY`CI}Uo%eRO(Dr-Te<99WQhi>y&l%UiS%W2m(d#woD zW?alFl75!1NiUzVqgqY98fSQNjhX3uZ&orB08Y*DFD;sjIddWoJF;S_@{Lx#SQk+9 zvSQ-620z0D7cy8-u_7u?PqYt?R0m2k%PWj%V(L|MCO(@3%l&pzEy7ijNv(VXU9byn z@6=4zL|qk*7!@QWd9imT9i%y}1#6+%w=s%WmsHbw@{UVc^?nL*GsnACaLnTbr9A>B zK)H-$tB`>jt9LSwaY+4!F1q(YO!E7@?SX3X-Ug4r($QrmJnM8m#;#LN`kE>?<{vbCZbhKOrMpux zTU=02hy${;n&ikcP8PqufhT9nJU>s;dyl;&~|Cs+o{9pCu{cRF+0{iyuH~6=tIZXVd zR~pJBC3Hf-g%Y|bhTuGyd~3-sm}kaX5=T?p$V?48h4{h2;_u{b}8s~Jar{39PnL7DsXpxcX#3zx@f9K zkkrw9s2*>)&=fLY{=xeIYVICff2Id5cc*~l7ztSsU@xuXYdV1(lLGZ5)?mXyIDf1- zA7j3P{C5s?$Y-kg60&XML*y93zrir8CNq*EMx)Kw)XA(N({9t-XAdX;rjxk`OF%4-0x?ne@LlBQMJe5+$Ir{Oj`@#qe+_-z!g5qQ2SxKQy1ex_x^Huj%u+S@EfEPP-70KeL@7@PBfadCUBt%`huTknOCj{ z;v?wZ2&wsL@-iBa(iFd)7duJTY8z-q5^HR-R9d*ex2m^A-~uCvz9B-1C$2xXL#>ow z!O<5&jhbM&@m=l_aW3F>vjJyy27gY}!9PSU3kITbrbs#Gm0gD?~Tub8ZFFK$X?pdv-%EeopaGB#$rDQHELW!8bVt`%?&>0 zrZUQ0!yP(uzVK?jWJ8^n915hO$v1SLV_&$-2y(iDIg}GDFRo!JzQF#gJoWu^UW0#? z*OC-SPMEY!LYcIZO95!sv{#-t!3Z!CfomqgzFJld>~CTFKGcr^sUai5s-y^vI5K={ z)cmQthQuKS07e8nLfaIYQ5f}PJQqcmokx?%yzFH*`%k}RyXCt1Chfv5KAeMWbq^2MNft;@`hMyhWg50(!jdAn;Jyx4Yt)^^DVCSu?xRu^$*&&=O6#JVShU_N3?D)|$5pyP8A!f)`| z>t0k&S66T*es5(_cs>0F=twYJUrQMqYa2HQvy)d+XW&rai?m;8nW9tL9Ivp9qi2-` zOQM<}D*g`28wJ54H~1U!+)vQh)(cpuf^&8uteU$G{9BUhOL| zBX{5E1**;hlc0ZAi(r@)IK{Y*ro_UL8Ztf8n{Xnwn=s=qH;fxkK+uL zY)0pvf6-iHfX+{F8&6LzG;&d%^5g`_&GEEx0GU=cJM*}RecV-AqHSK@{TMir1jaFf&R{@?|ieOUnmb?lQxCN!GnAqcii9$ z{a!Y{Vfz)xD!m2VfPH=`bk5m6dG{LfgtA4ITT?Sckn<92rt@pG+sk>3UhTQx9ywF3 z=$|U(bN<=6-B4+UbYWxfQUOe8cmEDY3QL$;mOw&X2;q9x9qNz3J97)3^jb zdlzkDYLKm^5?3IV>t3fdWwNpq3qY;hsj=pk9;P!wVmjP|6Dw^ez7_&DH9X33$T=Q{>Nl zv*a*QMM1-2XQ)O=3n@X+RO~S`N13QM81^ZzljPJIFBh%x<~No?@z_&LAl)ap!AflS zb{yFXU(Uw(dw%NR_l7%eN2VVX;^Ln{I1G+yPQr1AY+0MapBnJ3k1>Zdrw^3aUig*! z?xQe8C0LW;EDY(qe_P!Z#Q^jP3u$Z3hQpy^w7?jI;~XTz0ju$DQNc4LUyX}+S5zh> zGkB%~XU+L?3pw&j!i|x6C+RyP+_XYNm9`rtHpqxvoCdV_MXg847oHhYJqO+{t!xxdbsw4Ugn($Cwkm^+36&goy$vkaFs zrH6F29eMPXyoBha7X^b+N*a!>VZ<&Gf3eeE+Bgz7PB-6X7 z_%2M~{sTwC^iQVjH9#fVa3IO6E4b*S%M;#WhHa^L+=DP%arD_`eW5G0<9Tk=Ci?P@ z6tJXhej{ZWF=idj32x7dp{zmQY;;D2*11&-(~wifGXLmD6C-XR=K3c>S^_+x!3OuB z%D&!EOk;V4Sq6eQcE{UEDsPMtED*;qgcJU^UwLwjE-Ww54d73fQ`9Sv%^H>juEKmxN+*aD=0Q+ZFH1_J(*$~9&JyUJ6!>(Nj zi3Z6zWC%Yz0ZjX>thi~rH+lqv<9nkI3?Ghn7@!u3Ef){G(0Pvwnxc&(YeC=Kg2-7z zr>a^@b_QClXs?Obplq@Lq-l5>W);Y^JbCYk^n8G`8PzCH^rnY5Zk-AN6|7Pn=oF(H zxE#8LkI;;}K7I^UK55Z)c=zn7OX_XVgFlEGSO}~H^y|wd7piw*b1$kA!0*X*DQ~O` z*vFvc5Jy7(fFMRq>XA8Tq`E>EF35{?(_;yAdbO8rrmrlb&LceV%;U3haVV}Koh9C| zTZnR0a(*yN^Hp9u*h+eAdn)d}vPCo3k?GCz1w>OOeme(Mbo*A7)*nEmmUt?eN_vA; z=~2}K_}BtDXJM-y5fn^v>QQo+%*FdZQFNz^j&rYhmZHgDA-TH47#Wjn_@iH4?6R{J z%+C8LYIy>{3~A@|y4kN8YZZp72F8F@dOZWp>N0-DyVb4UQd_t^`P)zsCoygL_>>x| z2Hyu7;n(4G&?wCB4YVUIVg0K!CALjRsb}&4aLS|}0t`C}orYqhFe7N~h9XQ_bIW*f zGlDCIE`&wwyFX1U>}g#P0xRRn2q9%FPRfm{-M7;}6cS(V6;kn@6!$y06lO>8AE_!O z{|W{HEAbI0eD$z9tQvWth7y>qpTKQ0$EDsJkQxAaV2+gE28Al8W%t`Pbh zPl#%_S@a^6Y;lH6BfUfZNRKwS#x_keQ`;Rjg@qj zZRwQXZd-rWngbYC}r6X)VCJ-=D54A+81%(L*8?+&r7(wOxDSNn!t(U}!;5|sjq zc5yF5$V!;%C#T+T3*AD+A({T)#p$H_<$nDd#M)KOLbd*KoW~9E19BBd-UwBX1<0h9 z8lNI&7Z_r4bx;`%5&;ky+y7PD9F^;Qk{`J@z!jJKyJ|s@lY^y!r9p^75D)_TJ6S*T zLA7AA*m}Y|5~)-`cyB+lUE9CS_`iB;MM&0fX**f;$n($fQ1_Zo=u>|n~r$HvkOUK(gv_L&@DE0b4#ya{HN)8bNQMl9hCva zi~j0v&plRsp?_zR zA}uI4n;^_Ko5`N-HCw_1BMLd#OAmmIY#ol4M^UjLL-UAat+xA+zxrFqKc@V5Zqan_ z+LoVX-Ub2mT7Dk_ z<+_3?XWBEM84@J_F}FDe-hl@}x@v-s1AR{_YD!_fMgagH6s9uyi6pW3gdhauG>+H? zi<5^{dp*5-9v`|m*ceT&`Hqv77oBQ+Da!=?dDO&9jo;=JkzrQKx^o$RqAgzL{ zjK@n)JW~lzxB>(o(21ibI}i|r3e;17zTjdEl5c`Cn-KAlR7EPp84M@!8~CywES-`mxKJ@Dsf6B18_!XMIq$Q3rTDeIgJ3X zB1)voa#V{iY^ju>*Cdg&UCbx?d3UMArPRHZauE}c@Fdk;z85OcA&Th>ZN%}=VU%3b9={Q(@M4QaeuGE(BbZ{U z?WPDG+sjJSz1OYFpdImKYHUa@ELn%n&PR9&I7B$<-c3e|{tPH*u@hs)Ci>Z@5$M?lP(#d#QIz}~()P7mt`<2PT4oHH}R&#dIx4uq943D8gVbaa2&FygrSk3*whGr~Jn zR4QnS@83UZ_BUGw;?@T zo5jA#potERcBv+dd8V$xTh)COur`TQ^^Yb&cdBcesjHlA3O8SBeKrVj!-D3+_p6%P zP@e{|^-G-C(}g+=bAuAy8)wcS{$XB?I=|r=&=TvbqeyXiuG43RR>R72Ry7d6RS;n^ zO5J-QIc@)sz_l6%Lg5zA8cgNK^GK_b-Z+M{RLYk5=O|6c%!1u6YMm3jJg{TfS*L%2 zA<*7$@wgJ(M*gyTzz8+7{iRP_e~(CCbGB}FN-#`&1ntct@`5gB-u6oUp3#QDxyF8v zOjxr}pS{5RpK1l7+l(bC)0>M;%7L?@6t}S&a zx0gP8^sXi(g2_g8+8-1~hKO;9Nn%_S%9djd*;nCLadHpVx(S0tixw2{Q}vOPCWvZg zjYc6LQ~nIZ*b0m_uN~l{&2df2*ZmBU8dv`#o+^5p>D5l%9@(Y-g%`|$%nQ|SSRm0c zLZV)45DS8d#v(z6gj&6|ay@MP23leodS8-GWIMH8_YCScX#Xr)mbuvXqSHo*)cY9g z#Ea+NvHIA)@`L+)T|f$Etx;-vrE3;Gk^O@IN@1{lpg&XzU5Eh3!w;6l=Q$k|%7nj^ z|HGu}c59-Ilzu^w<93il$cRf@C(4Cr2S!!E&7#)GgUH@py?O;Vl&joXrep=2A|3Vn zH+e$Ctmdy3B^fh%12D$nQk^j|v=>_3JAdKPt2YVusbNW&CL?M*?`K1mK*!&-9Ecp~>V1w{EK(429OT>DJAV21fG z=XP=%m+0vV4LdIi#(~XpaUY$~fQ=xA#5?V%xGRr_|5WWV=uoG_Z&{fae)`2~u{6-p zG>E>8j({w7njU-5Lai|2HhDPntQ(X@yB z9l?NGoKB5N98fWrkdN3g8ox7Vic|gfTF~jIfXkm|9Yuu-p>v3d{5&hC+ZD%mh|_=* zD5v*u(SuLxzX~owH!mJQi%Z=ALvdjyt9U6baVY<88B>{HApAJ~>`buHVGQd%KUu(d z5#{NEKk6Vy08_8*E(?hqZe2L?P2$>!0~26N(rVzB9KbF&JQOIaU{SumX!TsYzR%wB z<5EgJXDJ=1L_SNCNZcBWBNeN+Y`)B%R(wEA?}Wi@mp(jcw9&^1EMSM58?68gwnXF` zzT0_7>)ep%6hid-*DZ42eU)tFcFz7@bo=<~CrLXpNDM}tv*-B(ZF`(9^RiM9W4xC%@ZHv=>w(&~$Wta%)Z;d!{J;e@z zX1Gkw^XrHOfYHR#hAU=G`v43E$Iq}*gwqm@-mPac0HOZ0 zVtfu7>CQYS_F@n6n#CGcC5R%4{+P4m7uVlg3axX}B(_kf((>W?EhIO&rQ{iUO$16X zv{Abj3ZApUrcar7Ck}B1%RvnR%uocMlKsRxV9Qqe^Y_5C$xQW@9QdCcF%W#!zj;!xWc+0#VQ*}u&rJ7)zc+{vpw+nV?{tdd&Xs`NV zKUp|dV98WbWl*_MoyzM0xv8tTNJChwifP!9WM^GD|Mkc75$F;j$K%Y8K@7?uJjq-w zz*|>EH5jH&oTKlIzueAN2926Uo1OryC|CmkyoQZABt#FtHz)QmQvSX35o`f z<^*5XXxexj+Q-a#2h4(?_*|!5Pjph@?Na8Z>K%AAjNr3T!7RN;7c)1SqAJfHY|xAV z1f;p%lSdE8I}E4~tRH(l*rK?OZ>mB4C{3e%E-bUng2ymerg8?M$rXC!D?3O}_mka? zm*Y~JMu+_F7O4T;#nFv)?Ru6 z92r|old*4ZB$*6M40B;V&2w->#>4DEu0;#vHSgXdEzm{+VS48 z7U1tVn#AnQ3z#gP26$!dmS5&JsXsrR>~rWA}%qd{92+j zu+wYAqrJYOA%WC9nZ>BKH&;9vMSW_59z5LtzS4Q@o5vcrWjg+28#&$*8SMYP z!l5=|p@x6YnmNq>23sQ(^du5K)TB&K8t{P`@T4J5cEFL@qwtsCmn~p>>*b=37y!kB zn6x{#KjM{S9O_otGQub*K)iIjtE2NfiV~zD2x{4r)IUD(Y8%r`n;#)ujIrl8Sa+L{ z>ixGoZJ1K@;wTUbRRFgnltN_U*^EOJS zRo4Y+S`cP}e-zNtdl^S5#%oN#HLjmq$W^(Y6=5tM#RBK-M14RO7X(8Gliy3+&9fO; zXn{60%0sWh1_g1Z2r0MuGwSGUE;l4TI*M!$5dm&v9pO7@KlW@j_QboeDd1k9!7S)jIwBza-V#1)(7ht|sjY}a19sO!T z2VEW7nB0!zP=Sx17-6S$r=A)MZikCjlQHE)%_Ka|OY4+jgGOw=I3CM`3ui^=o0p7u z?xujpg#dRVZCg|{%!^DvoR*~;QBH8ia6%4pOh<#t+e_u!8gjuk_Aic=|*H24Yq~Wup1dTRQs0nlZOy+30f16;f7EYh*^*i9hTZ`h`015%{i|4 z?$7qC3&kt#(jI#<76Biz=bl=k=&qyaH>foM#zA7}N`Ji~)-f-t&tR4^do)-5t?Hz_Q+X~S2bZx{t+MEjwy3kGfbv(ij^@;=?H_^FIIu*HP_7mpV)NS{MY-Rr7&rvWo@Wd~{Lt!8|66rq`GdGu% z@<(<7bYcZKCt%_RmTpAjx=TNvdh+ZiLkMN+hT;=tC?%vQQGc7WrCPIYZwYTW`;x|N zrlEz1yf95FiloUU^(onr3A3>+96;;6aL?($@!JwiQ2hO|^i)b4pCJ7-y&a~B#J`#FO!3uBp{5GLQfhOAOMUV7$0|d$=_y&jl>va$3u-H z_+H*|UXBPLe%N2Ukwu1*)kt!$Y>(IH3`YbEt; znb1uB*{UgwG{pQnh>h@vyCE!6B~!k}NxEai#iY{$!_w54s5!6jG9%pr=S~3Km^EEA z)sCnnau+ZY)(}IK#(3jGGADw8V7#v~<&y5cF=5_Ypkrs3&7{}%(4KM7) zuSHVqo~g#1kzNwXc39%hL8atpa1Wd#V^uL=W^&E)fvGivt)B!M)?)Y#Ze&zU6O_I?1wj)*M;b*dE zqlcwgX#eVuZj2GKgBu@QB(#LHMd`qk<08i$hG1@g1;zD*#(9PHjVWl*5!;ER{Q#A9 zyQ%fu<$U?dOW=&_#~{nrq{RRyD8upRi}c-m!n)DZw9P>WGs>o1vefI}ujt_`O@l#Z z%xnOt4&e}LlM1-0*dd?|EvrAO-$fX8i{aTP^2wsmSDd!Xc9DxJB=x1}6|yM~QQPbl z0xrJcQNtWHgt*MdGmtj%x6SWYd?uGnrx4{m{6A9bYx`m z$*UAs@9?3s;@Jl19%$!3TxPlCkawEk12FADYJClt0N@O@Pxxhj+Kk(1jK~laR0*KGAc7%C4nI^v2NShTc4#?!p{0@p0T#HSIRndH;#Ts0YECtlSR}~{Uck+keoJq6iH)(Zc~C!fBe2~4(Wd> zR<4I1zMeW$<0xww(@09!l?;oDiq zk8qjS9Lxv$<5m#j(?4VLDgLz;8b$B%XO|9i7^1M;V{aGC#JT)c+L=BgCfO5k>CTlI zOlf~DzcopV29Dajzt*OcYvaUH{UJPaD$;spv%>{y8goE+bDD$~HQbON>W*~JD`;`- zZEcCPSdlCvANe z=?|+e{6AW$f(H;BND>uy1MvQ`pri>SafK5bK!YAE>0URAW9RS8#LWUHBOc&BNQ9T+ zJpg~Eky!u!9WBk)!$Z?!^3M~o_VPERYnk1NmzVYaGH;1h+;st==-;jzF~2LTn+x*k zvywHZg7~=aiJe=OhS@U>1fYGvT1+jsAaiaM;) zay2xsMKhO+FIeK?|K{G4SJOEt*eX?!>K8jpsZWW8c!X|JR#v(1+Ey5NM^TB1n|_40 z@Db2gH}PNT+3YEyqXP8U@)`E|Xat<{K5K;eK7O0yV72m|b!o43!e-!P>iW>7-9HN7 zmmc7)JX0^lPzF#>$#D~nU^3f!~Q zQWly&oZEb1847&czU;dg?=dS>z3lJkADL1innNtE(f?~OxM`%A_PBp?Lj;zDDomdw zoC=eKBnzA5DamDVIk!-AoSMv~QchAOt&5fk#G=s!$FD}9rL0yDjwDkw<9>|UUuyVm z&o7y|6Ut5WI0!G$M?NiMUy%;s3ugPKJU_+B!Z$eMFm}A**6Z8jHg)_qVmzG-uG7bj zfb6twRQ2wVgd)WY00}ux=jqy@YH4ldI*;T^2iAk+@0u`r_Fu(hmc3}!u-Pb>BDIf{ zCNDDv_Ko`U@})TZvuE=#74~E4SUh)<>8kxZ=7`E?#|c zdDKEoHxbEq;VVpkk^b&~>-y`uO~mX=X0bmP!=F1G1YiluyeEg!D*8Fq-h=NyE-2S;^F6j=QMtUzN4oPedvc*q(BCpbg~*As!D@U z3(sz|;Pe1hn08P_cDQ(klZ6 z;P`q(5_V?*kJYBBrA1^yDgJD|)X1FV_*~sO>?8Sy~I9WdK5K8bc7aeNC zDb{Fe>y3N^{mrD1+GyH{F?@9}YQ2Om3t`nt zQ(}MS8M?6Vk>B=*j*yibz6QCdR=ALgTUcKx61){O@1WkPp-v$$4}e#KgK`HG~2@#A?`BF8em`ah6+8hH-DNA2>@02WWk9(fzhL_iz|~H~qEViQ(*{ zV;3tjb<%&r!whm6B`XtWmmrMWi=#ZO&`{h9`->HVxQ)^_oOS{W z!BzVRjdx5@pCXl#87ovlp<^QU;s<*d$)+|vI;Ai(!8Tjll^mi6!o~CpnlgZAK>6=V zm38^kT`D$_$v@UYeFyVhnsMZI1m`E&8<{V07>bBEI1=fg3cji*N?7pBzuamD`X|^^ zm!)2v?s|6T&H-_^y`KM&$!0!9tai9x&)5<(&sY6B`3D{$$KMAX3@&`SW;X0 zB-}obt^I;|#o_bR>eOv?P>=UC6CGTXIM+lSu?Uy+R9~O;q|c2+FafBP;E)B5M9HJgRIpF|GvRi*E+JTBI~T?T*X}r) zefUd*(+3n_YHZZS(g8)+7=pNV9QR^>Qs8t+iEpbJS!9;wio&9rn=19C0G#Ax zM-tWHp_YlJvXWsUqJUr^`OYFA4wkgL`cSOV;w4?tp>GT1jq}-qPoN zp&G}*;+#+Zh&vqDOp>gRL#^O7;s2yWqs+U4_+R4`{l9rEt-ud(kZ*JZm#0M{4K(OH zb<7kgkgbakPE=G&!#cNkvSgpU{KLkc6)dNU$}BQelv+t+gemD5;)F-0(%cjYUFcm{ zxaUt??ycI({X5Gkk@KIR$WCqy4!wkeO_j)?O7=lFL@zJDfz zrJJRDePaPzCAB)hPOL%05T5D*hq|L5-GG&s5sB97pCT23toUrTxRB{!lejfX_xg(y z;VQ+X91I;EUOB;=mTkswkW0~F$ zS%M}ATlKkIg??F?I|%gdYBhU(h$LqkhE!Xx$7kPS{2U4wLujF_4O+d8^ej{ zgSo(;vA)|(KT8R_n_aQ$YqDQaI9Stqi7u=+l~~*u^3-WsfA$=w=VX6H%gf!6X|O#X z*U6Wg#naq%yrf&|`*$O!?cS94GD zk}Gx%{UU!kx|HFb+{f(RA2h+t#A!32`fxL}QlXUM{QF3m&{=7+hz@aXMq*FirZk?W zoQ~ZCOx>S?o>3`+tC&N0x4R`%m)%O$b@BkW;6zE+aBzeYi47~78w$d~uypaV*p$kQ zJf34Q+pp~vg6)yeTT&qWbnR2|SifwK2gA7fzy#W(DyM^bdCjnee42Ws>5mM9W6_`j zC(|n5Fa&=MT$$@?p~)!IlLezYa}=Uw21^Fz-I#?_AOk(7Ttxm;#>RDD_9EloqhvrS z&7fpbd$q_e21Al+bcz|o{(^p}AG>jX0B}ZZRfzk$WLbNLC{y|lZ|&a(=bOE6Mxum{ zM=Nd+-I2A-N&2giWM2oAH`O&QecJn6%uYl0GWlpx&2*)BIfl3h&2E(>#ODt4oG}Dq z__73?sw2-TOWq@d&gmYKdh`a}-_6YQ5```}bEBEmWLj))O z?*eUM4tw0Cwrr+4Ml^9JkKW9e4|_^oal0*sS-u_Xovjo8RJ18x_m7v!j$eR@-{2(Y z?&K4ZR8^T{MGHL#C(+ZAs6&k}r07Xqo1WzaMLo9V;I<9a6jx2wH2qeU?kv25MJxoj zJKzX`Un|;_e&KY%R2jU~<5lm-`$EjIJLDP~11_5?&W#t3I{~+0Ze++pOh2B4c1Mde zSgj$ODQQm7gk&w{wwfE1_@V(g!C=2Hd%Gwj{{-_K4S|nZu+vk}@k(?&13iccsLkQo z_t8#Ah$HVB-MRyzpab*OHOp zl`$tEcUcF9_=3*qh8KTaW$znGztA7Obzb`QW5IQN+8XC=l%+$FVgZ|*XCU?G4w)}! zmEY+2!(!%R5;h`>W(ACqB|7`GTSp4{d)eEC8O)Mhsr$dQG}WVBk$aN1->sTSV7E)K zBqr;^#^bZJJX4E_{9gdPo8e?Ry>ZrE&qM)zF5z20DP0`)IIm_!vm&s2mzl z2;EPI{HgFH-Mp&fIL^6f74>19^>o^AOj`uyL0+Nb##Slvi9K4LQSs>f+$j?cn9Z__C zAkyZ9C;#uRi3cDYoTA>AT<|*pt{K70oZKG*S1F$r?KE=$4~W3!u53yUvh~(kMrClS zXC?Dmgv4iS`>~wBPJJFL_C8x2tEg*PCDX2=rHQ@z+Zs)Kkr;FYG`GnbUXqdipzvHE z1aZ>G6|e`}Q#)Kru0)(SZnUCN#dN2H zd1}r&xGsaAeEed9#?|0HzMGA7pl2=aehy_zsRV8RKV6+^I8woDd%4J8v9hs$x{ zl*V61wSumovRVWtetd1eJ%i^#z`_~~^B;aeuD`6LgHL66F0b^G5@om^&_3REtGmhz z%j^9{U`BH7-~P_>c_yu9sE+kk)|2`C)-ygYhR?g~gH`OK@JFAGg0O)ng-JzSZMjw< z2f&vA7@qAhrVyoz64A!JaTVa>jb5=I0cbRuTv;gMF@4bX3DVV#!VWZEo>PWHeMQtU!!7ptMzb{H ze`E4ZG!rr4A8>j2AK(A0Vh6mNY0|*1BbLhs4?>jmi6fRaQwed-Z?0d=eT@Hg zLS(%af5#q%h@txY2KaYmJBu>}ZESUv-G02~cJ-(ADz6u8rLVECbAR7+KV~a!DI83H zd!Z(Ekz%vjA-|%4-YpgfymMzxm_RjZg%ruo zT4^x)f*%Ufvg_n`&55cK;~QChP6~Fy_Z67HA`UtdW)@$Xk-2+|opk6A@y0~3Qb;V% z%+B@ArKl|Q^DJW&xuBZD#~SurH7XXf*uE0@|ccNd&MA%Ts*1 zg7TU!xY}~*AOY+tAnFR(Fu)e@^9V!Rm65$;G$-?6e%7w7p9WT098%-R?u#J+zLot@ z4H7R>G8;q~_^uxC_Z=-548YRA`r`CsPDL!^$v0Yy<^KSoKwiJaCt&dlW?p^7Y_<9c z3n#cMWFUe@W@4ffE`}pQduRZ)I5v`G8On2RI zL)V5k)PMBq(Zfb6Ruig;_SMwaM9t)2JfUafW-6F8V+PjKM#9iD1~v!uOfWiNL=R_j z$xKbCPfuiw`kKN1U{W6p#s!Vo+Suw#*7O24y`hNTmrEqDkQvZ}tMO{2`r|3XNXJwC zSUqB-GdK(D8yYTd*bs~vM{3@r5;JMtW-c8ywtvPG2Gepg-QU=s)?*2y@n~8f95m96 z+pO1p_FIP@Pbnlb&AnDXqBkb=RDa{H-fN9$Rv{OYoWwrU{J??m#C~^HFtMrjN~Spz zt1SsVlTk=x^7b3q-DxumB4DxAv}x1?YHb=BBbrOcvqOzjVK#ZlL$frhpxI1I&JL^4 zTz{rnIH(26vL$9Zf7%ffyC7agUX3bg9@D~^pcIOgp^SvS@0_fS0rHL9Zq*vjT4ZZ-;< zjl1>i0E~DMlLHLFe*&dK6lIzW57ySu#Tu=qwMh#+h*$yk2HIFb z>nT*!OJPT$OPLhmOCaK*%WUy42dzuvsd)CXDdLTLrH7iRS)E$Zzgab4TrcDG#Hg058>HuG9V=$qMph{<;l?`Ri zEyGDUBkrQzLi1NJtvoj(mN?yl$vw8i+u{fXdFV>oD0cQS`6mT>G!chOCzE!M}POG4yVkcsa=D@;o&t554oCp+<>_TZ~ZFu!frP4 zU=Fl`17;Hbhh*q72kj_XUp7O8XXeU24I1gAe!Z;8OmghWKbAdr6WwUEq^k(Y&_8z zj%SeljzOqyBkQ*T{RNL0@|%7B?116lab<@;U^MhM_=By8;asX*oe`l13GJ8z5* z5VjTi4+vl>1TM8OFqzvHGm)^9If&dr@6zaY`cEcbpgfH2v+vgE7J84UMd4{&7eL;p z(c9_$OzU1R7?w91eP-GY=k8o@VPB!Un6?GZ;t-tik9u# zvqoC)70K;GOln-bWzDpZYO;db3+qtNN9djk`Y?U8NTp<7p^qb*p}pudj%BUzM(7UH zy%qEc`XuT^%33b1Ck5~E(5L7=0rzR9`q$N${pil>S#W+o{57c$^%{6jXLl7mylgTC zJD;ToHF|(P$0P-VDu1113cl`fO??oskdG7^5dmB%MB4r5SOQ*GRGZ)={o>ds z>9kPUQ%r0Ab$o@MK{hL}EBvA<4GAv_oC7bVTzr|H)#yv~6@O3*T%M^d=yP+!DwVzl zmBv#szT%!L@ zp@s&_ia!GxNcwyFgCOxoHX+X@7dgvR{(Rc?n~*xScUt%qyo=g)w5da7a@kfkHC5f{IFx%*o4ng~rPm)5Yw; zw2^`5jQ4|6i@zwi9u9D=8;Zrap%z2I!`5JN3kOAh$h0K~vqK(kg#U3hW2TTZ@#_r_ zuYrSM;o@m|cf2&M;Y$Pr=7tL7cfFCjZdTPi91>|OQHV-$Uwc{<^Jl;4rh{n0WYMi;%o-qsd8G>t` zQ-2D8(zo(95gXe{3}cf6_?9yO@>*O2@DnMi0IM0|s|7 zttz7!JH98}Y&!xefmFwP>`Q>D`_oUYE!S7_mAp^my?hl~!ZN3Z&HjFI$bM0J_S;+@ z)c61&5|i&S#33B9Mvme=0gk(Yj(KKL8KhQ>V+m7_DV!+plI5r>jJ{+xCiSCc z`tY83(lA9*;dT!X@^x-D8ExhQ@OlJNOt(y3UP_9ldOS+k8hnRVig8sESest%o% z;j}Clsg_Ca5_>KG)G$OIMXfS(ocFQ<>%6$;u%x@EBc{_~MsPZjH3YcHB?RH<~ z;dk0a0@D>EH({DmGJ2n}HyvkMGJnIh%sA;g_+3K57^-Gv&8F^__Vz-f!0)!MQ5b`i zqoef_mEQ*sEWHiuFftjv-)N2Z8=|Bgx097+l$5w-TRn5KDo+Fae1PxP_%6mQq=HuS zP*%8{9H>3e?BNgbhlQLUK_uk{V@U3p*8>NdMN#@Fe@vi#yja%I#t$?$$AA0VQ(42x z0mDFwS%-M|lb{3O|He|F-NJ`0?$h{Q{SHul5z+L*m&!#!fJJqj;3jztr>O#Fy-E!z~0 zLOmUN3K~L8HkR|Nwiywi&40)E3vRgB<4otz96rleEBpjg`mCW*>Nn*WDNrlBS2nlV zdOxl4ll+uzZtGeG6`^DdE!@@cGyElu6#g>Yp&=1HtTN^eSMqQSqq&E_W@quQ!v*8$ z+|%d|%rshx=j?UN8s|+=?8>FG$a<4ngKuN*X)$w&m{snhX#>vXAAhv&&-}3>HGiL( z_9x8fVZXSs^sD>=(;RT!)SEFAxvXK^@SkiV<(^P-nfQ+mo2Io4{LcX;>*{6kT1 zf8-?bXHN4L2l2NaD^3zncNc1-nY1lw-EQ*FFcGJZs{9L$e=aJlCR8<`r&0!z{?fpt ztJbK!nz3wF0D;ur zV^Cy@9RmCxjK=X*#$+N#;gcRdLx}GuB`W$sS&0-$g7}56F@GLO#-t)SB+Mj^M7&p( z6cp|#ig#l@GT+ik-Xx2!!l_e8s;ehRK%E%3_0F#P1+Hc zYSW_5-U2TRC4ZkLEs)OhP@Dbhd?Cw$($5_;U|V4>EzzV(=>k+4Eezv|b9qyP_f% zJ<_EjASxvcKW!7qG9kWy8P-j=tyX_g&Hf!tUH*8gxIDQ$`d6;VtZYyv@r?#q71eqQ zuVwU8hJV-Mv?Dc1&FBmyML`_H0h2++J;ImVNPoF!}q{<%zspm zX8~m8`|*10*R2fZ&ze^H4}rQEqeM{`zr#4%AJ6!6_9qfm>cr6#TEf6N09|0P_S;v9 z5PmmirL$iSA{@-4#TOxVGx|!+=_0&Hxs(;xvNvL&VY_&!l9JH6|vKHhzEX6SO zrIYcL;g1S;8$`*n#4IE;{|-Iv?@OCWf7FZ_y^yVFseR%m<}9p51Z(??En=Zh=pMqj ze{7=8N(YOdYb_d`rseakM&DL5mx|f;i}F&b&b&8JY8k~4Uf_O$iai1BXmeU zNxJh9s*6M%Rncy_%IMBhysGXbnZ?!Xuz#8ntNV&8IjkHNE0L-p09L)>B;7blH;>WV zBO!T=Zixg>&~16TbA;YILdVDG1Cfw3=#xk2gAdWim_ja}>mfoTdz?@EoZ|Oqm>vV^ zkdmhp$NA$vr7ADPq{=ZG1+G9H8$Rw{GzH3e!l(4)>FGRuHRK#VbAKQ9 zzi#a}i2b>n^YpEC0Bo1` zLID4d1?(E8iZS|GWQ2ZxDhM<{hEz!HQ}gtz<1|mu62FVQ%?%c4hui|nZ9%=o=NzM# zB0hId)o(}WcX@g_Pk#}6PebTD{eS&9d5ePDY`pf24==BVoX&M>wd#YqUc2YDlRjs) zDqkZctyV2jL#jnqEg@?&^J)knJ~ada!)H#xPI@V`uZmNmGxAjcXcicGX7PKSPX<#g zkFwS|Mz@3W5w57p<$3lA_U3v1gte)?#MWM3nCC^2b?V(zDd>55ah{j%8-G6YoX--) zr#PxrA&nwmQ!ur){W+f;35p|ERz-!Lc=o;%TqhP9j#IY}4!Akwtcqei5^`BQtd?&Q zK4HJCl|M=ggxlfGk>~Yb22nFi#u#smczM$ZUwX>^d71e6Ah+!Ea@#1k^- zbokLQ!dK^6Kkj&9jH8iA{TMHcjBsp(`%m!UjxkOGJXn8%GqA)cAMF|8>&N(wkq$)O z7~cSr&bkqPb8v*;3iwFp34Vv5Pg}sSmv7DUZIN}#-NLbF`&`ww&VPmNynK6cPlHU# zFwOG09My_tnP3EDM)}S>zc-|M`Te8(!AQsrU*dc6{E0EX7fvLv!|SK2RWS6Kxy$qX zfaO~XUOx-Z5=Ya^J+_a96k$B|1fKvE=+#OBn$H<>55q^WVx(5L#`f>KZr zI>8T((-L7Jh(V!(nt%HQe?Ah@iqzabXIO}+6^X5^_qppP5js^$sPNM@PV)qRag3jg zgnbaxC)Y!tPv`krD+Nb7M37unh#gD59TthNj$>mx(wXOP+(oN{!k9D*k8fG|#6QN* zM+9ztkC(qA;*P&p#QXj!?&J_+?8o!?CrK~=^k#j%lS7J6d4G!b7FOpw-+ec2ALE}# ztl;`(JvjJPo_}k3(VrrnPtg*DIcU6szm@d#&7=IO+);m;_KZoDk%M7CROO}W4*3yU9C6flk4lU3(&7=xKPoN9$pNpl zDlau)w;~dDc%_TFz0zu|UxF0{E33L0Z=3ezrOQ4m^kyyZbkqTC%c@bSRj6zl^W1r= zsACw%D{Zxm^V7W4?v-{5E4xcnzA9MM);O9^>+wn*c7IOvO1mat#{t|k0PGYHUg?Te zBhsEzlQ^yi$5$3Po+8Or#dQlAm{o6SPc$)6{MSG`t;S{}Nwk|Bw4Y=$(D1~` zMMG$NZbZZLE;Ks#kVdGb^hxs2eKd>ir`hy1nnTagT-KhaQJDVV+HvfwRE0i9W8RS(D{ztwAe8~OMe_Gy1?;P@;lx^OC8^&8pq#gne3qD zvO+85Idq|1MJwe11>}0FmDkcLc|Fz1O;j&mMM3!xHONtFly9bsZp= z6aWB?DU;C^9FxIqIe*i8dz(GluG`YRvTlQ}ZQ8wBMi`H+11Xd;){T;FQf`ym_HIdT zxw%<4ULqnQiUNY#fhed{bPCKaEfg4_ZZJSmR31)Vg5U#DR8+vtbG{^9+GV)@e(AaA z`@Zu&-#O>ofAE2a0W1-#1$JC<#oFbUR(9&)Ek-<28LSLhbRSb2~R1VMjrsz%03% zbj)ad*oudfwr#|n`X(aNJEMjIl?b=$(fLs;tVcJPy=iF^TO^rj)iZvQKrx?*m$vcIFG^5a1P{u+&```@)4cGezkFUy zz(oF<;l(6O=C4@-?kc7$!yF9?`~n5!dh*|ts)a4%V@TF{bB$0iUtmJF;jGa)km+bm z&Jt!V^?%|x9Is&kssyGTX4&R&&aFzC(THIysMb)!;uT`os>h7+8l;aCvjFOtSv`50 zeGrcb1gefacqDB`6tP&0B`j?z8DD2@QPCivI#&9W7bmcQ8Y~x>mp6iAq)68VSs~6# zGeH?ij0XzQs=bD^bVyf2kC6uJu)YXwIG^r#mu^Or zwtsOB`9bfdlqt=ZFc%=i(l$_~$iq;0# zo#`-!DS0T2O;J6OAQ5AdRxXkX2DP1kIRVJqUWIC#Beg@3V)cqhED(^in`<%f%NlNF6p8k5w7f}}u^ z5$kofw-5#SIBTIi$!la_AGT@O3d;JTD6Oz~;#g9(aO3z|a49Zhd6#FSA-SxyZC$cg z@Cgl9avgB%k;u4kWQq{qs;lrRK6f?cz*t=rTto3N9fRCxQ4&oZqiu6$o%FaCpMNdJ zXK)=EbmYE*&r?!Re{D6kIbM7LrxfFQe36P{TrS**dAx8F`7vsBcN-*VM!q}LA~#9e z&A6qA9RFpqdNrpHrIkODEfszhU*$5=!DVNMfbXcB6x>FhA(39(&d0xouan2q2`PJF z$+#3?U)_N_Iq2V{;+>mMUVNLo!GC7lm96TTOi}P1s_KrlvaPAPIa?IJ%XR5)e2+Xz zGlJQ*eYMpWk6L=9DKmfwG~~HD$5KDPj~}pp_fR$`555d62BlN?n!g>VGn9BeK@e zWxskjn>ZPbvg?oJ34&}Ak7;-mKjI28x|^oS?Egf=9_*#$rK%KZp_$B!$Jv-YctXGv zj#>#?d6L`o9y~=!(qtv05r5or{9Szg{gkaeekuo)O+Te{%#%aekSTbEJd)76jP*8E znb}q23dMMD`~uHv_&I(#u7A;Huj5BH+Fx@{KPMpSRJ=gOk;w@w9wa4yldS-fa$S#Y z^`(cv-*UGwoJ>*o;$`;2OL&EJwi0!5nhjLEM$MLEZd+uSLuKcM&0B0 z+1`_`9Gr3_`Yi$1`nJ(NlCwvYf5e}P@CW>PY}b-}75s%1a;z4skALboP3MOd%H@$) zp}*p98s5RXWL}>ck63*P75^Yl(WvU^W}M3Cj9lBAdUU(ZxHxIV!|Ch&9{$Dj|0b_> zn(<7`RlF}S{V)|diid^KY3oBysUCU}s5nR!<%EU?8okLdZe)7gikqabyimd=2NL1t zQo8Xd1Ca1&_^+V(-hV?~-*&ic=bD-kev((HqKHpwbVrWZR)m*bpqtJaT)1g^YW9kW zVv;5%h{=@i*-O(L?@eZUcjnHCQfdRFdCm?^nmJ==&ITzlMU*qospO!lyhqYDP1i)3 z@QrCxq*zRM92Pl46Eo$sydbe4u8P^z3A*I2z=}Mnxbdj>W`8VWQqM2u5^qt-0+x@- zHM%2Yup$;vdCt6@(o5rK<@74?I$l(1;yAI8ngq=^G*u;g9j~aNB0{UR0@a6$NWyUZ z#x^6Ibodtf=~~6i1iu9nTvX`7iaHicj2)xZ=#!JISR{uBv6!aS!_wC#PH>XOr>8%D1|eI(Gogm5a)$j_o8sX^+C-p zv=ft!DSzlGMB1xEp-ps}PE2nd#LQp;kp(@2m>mih)~3+YK8RRQaW|@kjYR>;T`gDp zq16U_1u0zY^Q7SHK=Cjx3918VX8ej!P~Ate4!!MDM{s2*s14zh4>uOO8@=V;^5Q!& z$ETKimxO{7q|(Jc%|~CKZok?q1`fUA(}Jo`y?-B{6G(sDAkdGc{PiV)N5~~Xjr9Kt zJH)4Tl=ctdRx&f~ixj>wjBm9M9D0KED;&f?3OfTnWf=FeVuNJH0A6e_FDkqPdwt42 zJX$MHg@TG?r?7)l7-H|0pInr4lHx!P8Nr^=CZ>3lv>U>Y zhkvjyh5bP_g{OULP#Hig`>Dvs3wvrqSwobL(w~tb!}wJS&zHV9YE5=u?I=AU4SjWV zO9YjIMzy@iby29X=ytKFT-|Z-qHN^pH&Zg(nG=7i2(%pv7I0ike>aRbcj4_6{$Bde z6#mms5yO+xQcs}t1F}Z6j^Mwc!iVrqD1YShbcEcchuR9tglO|L7N$f&d0|J}kWf;h zm{KJrO8T*djc*+hWg#CeOdApvWc`SkN&7=$7P)ReIeIUue1&CVPEaj)2udhe+5W`X$bg@!MQ?OPnF&J6-okoFU`8T)QRCknthc6B1|0_*1TDCC-rX z7hEq%oFU_{xL%hyL&o29y(@8sj30EnCC-p=s)kKe88@Q>JiDAt)wLaNY+XbFz1BVS zL@dNLRAFy|io2*{eh7_dip6SpMK>mh7$&+JFv)c`CcD<5#I*sXt_xA-axlexD$3nw zVXAu#rn%Q+y88n7+?%8vx2)ps{{c`-2M9FbluW}5006p^;dxnq+e!m55QhI)wOUte zJ>7V>3ZA+y^#Dc18$lElK|$~`-JNcu*#pV8UWh)3Z{dXqUibh$lsH=z5gEwL{Q2fj zNZvnQ-vDf2PT=w3;k&^Ae^^@j$M1ODMq|d0-FZ_2|XiKHLhEB;^88I<+^6PSu7q?|oxD=%8&Ue1^o%27B&#!&!lh=u83+I?Fo;!DF z$CE8Xdghd2Wm~#iGQ%zHEg3sMe`e-%&$O*%-p(4BcZ{5&y9O3VbvKzAH8Q8%Lf&oZ z9@cZN(cUsPlFaL4NmFEG@6K-Cwq*#s&W_6d;X*El33pUaZpP5CMoh~v9Mc-X>}kVs zaTexxbZqU|k<1#WTb>FLGiif%!O0j8m^p)Kwe5^_jyQTYXLO!%^szC+f9dSETu;yC zg5+mfeo{ZJcjk0!r1QYgNh9M0sg9{GXOD~+4%3=cjr}RLxRWWAwa-{NThB7BtHrpx zybRXW#@S4+;F_nEUOkzN;kx^DOIN3K*4n&h!3_{scdu!g-Y%v`W4F-omO9m1Jg9r4 zJ+5oyhjQ57_Arw#*7k6if0oj6je^v`l>A?58l)zTR!~Ej!nCBG0<oPUP+Nxx!$(>=ko$io(N14La#|EhdE-=oTuIDNfJrbr3)T+^Xf4YmQS+N#8GuPQ? z=W@UlaOwsr##C?Q$Gq_r_Axb9PE?#ShXdo3(5Q{t!J5O29EKAbVr|D}-#bhl)G6n| zUQIJndK^br;)AqBqpjkw#iqO4bfARojE8AkNz3ifTF(Nu&9T(n0N5$F*+KWn{%)qF zvvmy8y-Y#V-6IzXf732%T}=1U{Y;NPs7xNsg2^$53UcY_##VP@G;14f)Uv&3#(fwb~OKgwcQ~c3ABsH``hMQBut0th^QhVpEHL-^bWxZ^lhtQ zj9%OJpr$^y4~h+Xy5kwnhRs1brqOZ1T-$7$SbAPkgC{Aa296(-lTI-0eQN~C@wy{d zoyJnM#xC4fe`i{W5@8OHR}x-dx&AP1tAUcYb|PRu_)t%B%eL(yf&{+ER1R_iIhUs1OZsGmziq=&(?k$+PtW<^X)#$tcrD2An z-|`GqF}@F`^X!L=v!y-r5IY^PKR`dI(f892Nx4RE;Ejgqhv|UC@Q+|hpkm>EYh!)$ zcb64`e~|amkBKhtLuFgoLksNufb4t*WyG^9x~_=TRQ1Q{L&E!EsT%Jrp!*5aMai(c z=_6u5^hq9U`q5HyewJw&u+uZ-+PQ*fNKFpYb0T3q{Ur0~!vbqFqgt(~JzOgQqQg3n zkiE0jYPHhnhHCQU_3`Mae%go*8HN@0^gKcve|hAL>5X=@T79-PY&!X!L1F`^r* zHxG{L2!z2xeq(gZv9Zw`k0Kh!<*ZV&NS2dDM|mB|3i$~-m@b0Xk<5fbkd-Y_-GOT5 zFonU?apmpNVaLuR$~~vxN|tj~Z`UCgi|($z%@HTp9c^`6txCK{Q+CNlrRnKBS?NQ& ze^qXQm}pPNgHPrygy^Txx6OF-P{H!dyn$}V7!$cc`k6TebXLNj(C7tv5rw?uUKHUP zq525ICa2ng=II(g8#*u1$Heg;57W=l&ueIxK7k-CSWlRU?K^7Lo|!x_s~5qJ&PU9# zQvY&AqpOk~f`;Wu9bt;hYDe~1g}mV?fAc|yNtzP=muJbVVhPeUU=~gOKHD+&m+#s2*K)+1CBJ974%so%*Jy3HzNWTt^5gPkZP{QifeO9B_f9SX6 zWOPw=`BSK}xa;qfV)qM3I29-K7KVo5d9q!qfY+= z?z-RuCP?3qcElbD(>Eoa{)zq>+4c|~l@iq<`qxT%Q$9L8>ey%WA%XY5LowKW{sP8e9jV>_n~qo~*gnHu*n%<7JA~&RICDgu;o;t?QVYd9(L!PI-dS%ggq9&d+y&sH zSryoqrsgK|(kwjrHtx~*e(uEv)0N)NaSCH7zhT~uOo^2}0g`{qiEt8ngb@e9DlbgK zl0S*ucdNf$Y}joKf9r*uR~a9ivmNL6^Ioyz0MpL@hoB(uL(QwSCV1(11-EY$7d2Gp zymzm7;{YGjct5`#nQXfEIHS8!bLQ3^As*D|O?nYJ5u$=Zd=#0?QBR}8c9_#r+t)MN zfrjebpqif$9|!8nEnRoiE4exv3-M#p-qvW2t0VexiDX{3@+VT%}0+Ra$dd!Ka?q z(z?xqH*%k(y;3l#N#nu6&8U;AKVZ+wa# z8n{M#(tN%9 zvvSp*zVO>1;x%OAdf4OmZigNp}k(KWD zCno8ge+|p&Q=#ra#4i>*liptUEHx%00bg@nk)E7@wdn)Rb&D>E*}syE_=|L|NZ*6~ z=dpj1p7w1IGzXH`pQnywb6{%&-8?r%?@4!K^N-@bizEK!n~L=QqY#g&4<0=qfJ45} zE^;oU_ZR6WE- z#SK`XnO4&_+-xn%v(PsDZkx8(Qg8%dulK=Tui?91+V3(td$HmJ-5yu|N`m}?xM_p$ zzO@P5X03QOo>;pDj-8^*7b)O->HH$-{suTNy;KG+nx(Rhx0j>i`D=7Fo!$pEi$(gR zf8g$h;O;y=evJW{&!qQ@WSBl#q~DmL&ne)1{sJwNOa1QAiJPCFpkwXHYxG6o{8Cyx zGf7{L1SaW^iu9Fke}jLHzdl0CD*k$X;^x9UjF!2gMx?;eQbq&IG~7wIoA%g+r& zsD^m$RTf&I=qidT+Cr_0#%Q~u_s}jyOZU)TMN@P@(L;1x(c^Ri)+N$uSkY0k6)n(v z6qR4$dp~_x(UM;@_ygF)>LTQhuT^Y_xuD7z2NUg6^w*cu`{U^=6cMB)PBeaflh243 ze@`_2n_~U%>6IHei{PI+WN*n<-$I0_6BhxXlDYUwdpxZ|c_2|_U+F|(yU4KQ2b;LA zBucsJ($Vrk?I)Tzgp;OtX^|T$I;`0*=0@gXpSY8|{oEZ;EUOR{;??e;xD^2TvUrr& z3EB}?@;@zc!FLvULlfV1qR8!6cvF$@e^$R;MegnnG{oTieMP=+yT86GRNtjV0__R~ zVMM4m#eGG7;37S~Qd=2n4nKXoE2MYfQ^&^&elTDE%ttA_Qfu}<{meyLm0T&4Mpx(x zr!cirEApX8u-(@j29QKTm(~@UxcS^bB-rhrAh%4ruhE<7CO$mLM{Xn{!AKx^e}x}z z;&;}6w@uRRP5&}0g@d1%2%RK{KxGFDW^?cAlt zLS>xcXOy0$xM&3W-wv!kMvFK_KF(mwDoZUQ-?sr!O9u!`Lm;-F4gdhY8;4O&V%U42cOzgT@++{5Rb_Y!~)Y_JT1+9)zb* zqnP-I58y)?&(IzX7bl6gWOQdQ<(RH>I^tfvvCW)~>#y zTcO`}J(;*+VECa;9FNE&852*oWNcV1vVZpD)Q|P`UFpTNqPHExmu^|J zwNdqq-%UM_193|l6&_OHxB*e*1`bCLDT>*Pb*8!6ELqrE-i8iy7Ij%u-2E|-0W*uxf<$W z`9N7d`evT{Ki4BcStVHJs&4Qp6v);2&~2rDlcKi@M}=#uL12{Myecx^iy{8c zVw`(}N3*!b4ak(=|HMS$2PVHlJ$X!Fx~nO4HM#P4Odcci4L6rhaQjTSgiAYJVW}(3 zcZ6dd;k|d|FB}wD<$jpIV3ES^cd=y*as#G1*to(L7Ee&T3=W)vrT%_}6Rcdu_!2Ox zdYK3HJOTg!9+QD19g|)V50gKZ2$Phk9FvcY6@RORP(={Ilb|T{zS&HZ zZ8w{+o7RKa2k|XD2_Ad^A4;5v9-M{w_q z=X}6rk(Ww~N);x^iv)>V)F>R%WhPu8Gn7lW${nB1g?2dLWg6t73{<@%IZZ~BaZFho z{msu;S`%=Y2!BRo(WJ^CT4hqAYqXBuA|4G-hEb5X+gsK4vi|+ax`Y)QE>yX5GbXw0?()rHg zp2v6Y?|;Ai6~Hta44Y4$EEhLYRc@>br(frOjAV;0o1acsC^@* zn3r)y+I>hF1TIxce;hk#yN!}<5g)5iP-2MryPTMe;_5#3Y?~{f39EjFts-NL=6`$fd!<&A)>c385EL}b_hc7TIt#4AVZQ2VNn8;C%V-97h_=;pxPGBN^ zxZEQv^u1TyF>`Dd|Y+WNVk^$vUz2S`^>>OG|rnzOP~h-%^w0;yXlW?LXSF zFAFN=d;B0nJdh6>c=m{s`j9&f&t2!$-EFF>xC?`>kKH9&>Z_j?I&y<d)Ov7vpfIa?C#9&uirm@0zd|~2z#gaHD7ORz-qEb_-YRO7fVmPlel~IFXuuP3)vCN9+M!jN)Dp22H6{lT-VJ zGgdUc&`&^+6vNb&LY?af1om1gjhU%`gWT>aQtk0gJTQUq-oH$Flkd1w_lBBf0;BCy z`7+HcE$8bM0^avZ&C0|*OB=uyFRJ?aTcyIPb&~+uB{0^Ysv=R7ZMP*l&{d2c6X;)4 zG{sye&>M>%3NQkre(=Ig+{%mG#`fOM=|O%cclvVw)s7Fw1@Oa-0qBDX0)tL}srdd3 zAKVr|u!4652w2`d0fsD36d(v8?%fw448z=eKw!vV=Ju7+g<@B0$2aAJ0j^IF7?!W< ztpbe1;%>zpHr&Lcv2JbrusgL?(as#!?0ARvZ(9Tyw9dPLBI6nnUO(iIo%Z>S_JI|# zma!w&AcT?E9qq-QVS__Pcf=Ea+vSIvKgxKI!0TcYM;pGp_iegD<(`iw?f*icdNCBX@kt!LzRTw1Yo($EO{91y)_~ zna_534W4x25$ukGuftOpJnG=jV8ac!8;kc6zdg|V2T)4~2x;QgE$@>LmS2BOn-Id% zPzQ28t;HPLr2p=wv3&Oj;JfT|seQL0nM~MJ-CF6-0jU9DeYR z@_64&(j;x_;hdb@dGFotF5i9czW2|+H~#{#7PlELoIc&#dNMd5B?h^g3~ml4Qo(RA zp=EQjBAK$LMzUIx)4a|VE*XEE7Bi9&No06p(8y7msI>(K*_+;xm6@}{P{;bNG3R2q_^ill$0qum2XdBSv~ zj!flrjWkV}8w?9NY@NI*E76{b`7I2yOInW8*^Z{HMa7sj>JplolG6-L9n;6tX6xj2 zn?nKGDyy>jD8s78N_*AgXzF9AX>98AVK(M^;YK|n@6nqZ^So$4y$?Rjnt@s@@WF!_ z;%ku)Ud$9Xi~Bio)1CH@sgE?7-s2Q zO70|>uI<+qhK9zbjuQPbQ&f114=b=z09Fwo&CMQ3=c?)OJGTfZGU7uMLc(z~Lu*;i zHb=5*a$S{_V&=AIc_1$mC;vnQ?IluiBSJ+^IKxRw46Caap*(-$LQE<*qx*Z?DW)h^ zd(nb5408-#VUeM}u~J*qZ5`H&Dr}$xlV!>~=nQ%A2*bQ|r4_N@!zMvf12!|v6f`-E zA159fr-nFf(3Q+@#Wuk_ZM}KMRF@3%tC$uEJdW)mlpT{2=#k8f2Ro-GAQpVs?IiHT zRBz6DyJPh!@>_pyHI|XqZrB*hXFcd(STxD>#HtTnj{R zI_co4MD?WI#m!+&AKWKrxt2HWBiimm8X2J@Gq@Vt#l(MB42sNXkJlShK|+a2t3nf~ z9K#Z_+$Sk=QZo6ZQ{saz&VK_8f$J9yVJq^&_z>ZYX>pD=c{zsT0)B$DOC{*dt0qOW z>sW&4oM!brL%2=LE6ISWnE}yg0)_4tD7E51O4qW1RV$2DEgqb%=t39~8?^CDDrIS&Wms6= zbK2Eh-Xx=3%DVAZsfQF>l4J92FV5i|>Z;Xl2{+y&vIS$bk4x|}%eIvd@Szv)LD%aOMWyPXmsD3iJHYjQVmo3Dol!SE z@M=&mE`Iu|7uUWm=}AD+4I&bA=>HbL+*kq^&HmjSY7T`%@iF*sp&=gc8pHfiEF8t+ zQ7pCa;CWn%gd*{&Kf;B_@vw!)P77iBTx)+}qra5~Tf#>yJZ7QIzl%ms7DjvgoiyqR zAE~hrv(V>%nuZ4pi--Ns(kM|Fr7Rq^khSof1=GT?g_BpXtn(I5#a*}Ij(62GJN`%C z<=Drl3ZC?LG0U$s-Dq50A)NbSTPi=_%})kwxho&E==wkE(LH}@{{)3qO|C%#YF=3$ zdiA?ni$9)wR*=E-zD>6#=i#B!N#gG&-1E6KkNw7xOU%m~-nh!XQ{HJ=8J4JS5MC7j80GfF1F!!W{h{y?1Y6gJv#Es?z-Mhy6*8qFYB=KY5fJ$eA5$JDWZC&|wm9Vh`;wc1 z=hdk(0FO+816Kit$%z66lMChx$ilBF2VOs5jG{_Fm|^llWu?h^^R#6V_b)Rr*r2Go zCJIq?W1a~s_?F7ag7Zb0%OoM9-t$dmLAMF|0NpViXalO=LkbX8`{$d;BCcg)V6a88 zp-~y6${p-l#0_8!3>GM=&ZvP@X-rJ1|U_6z{_d)L2hS-94p_r zNR&C&lwq=fmEz=Gi{xeDN1+4Vql040S4)s8GqAtmXGCMf(rRml$p-dPz{AsxWx*#7 z1I<|s^p_oqSz`7Kll2`vz-A#%!)0L5M^WYL$S|3)N@Q}Svnp66{FqRnt&S)votz;m zA;;+IfmI{UMr2?xK~eqK4W?QPtP=SQA4L?Exn2;JaX#W;mGFaPfWAVFN$n7b${>49 zkV+ZQVI((!sx|@ru8U%(NZ90nWgaq!b@vPmS||zvBY+B|C!b%YB@17*Bg(*_graC; zF33Ka$q#Y`z%B!>QGqN`0osXb-`Pr#N^_7ZX~ZBQ1A_vJd9x>9Ty7%^AMXK%usn+V z#4d>c>{h7C!iPA3cA@5E9CIF-wP*MN@ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 68e8816d7..a063f3fdd 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionSha256Sum=2db75c40782f5e8ba1fc278a5574bab070adccb2d21ca5a6e5ed840888448046 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a426..f5feea6d6 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 7101f8e46..9b42019c7 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## From a0f77c1392a33f76bd207fc861dbca7422b00c66 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Fri, 16 May 2025 21:20:34 +0200 Subject: [PATCH 117/175] don't suggest unsuported emojis and invert isSupported to isUnsupported to avoid confusion what happens when asking about non-emojis --- .../helium314/keyboard/keyboard/emoji/SupportedEmojis.kt | 2 +- .../keyboard/internal/keyboard_parser/EmojiParser.kt | 6 +++--- .../helium314/keyboard/latin/DictionaryFacilitatorImpl.java | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/SupportedEmojis.kt b/app/src/main/java/helium314/keyboard/keyboard/emoji/SupportedEmojis.kt index fcc304ebe..f3ffb5bfd 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/SupportedEmojis.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/SupportedEmojis.kt @@ -22,5 +22,5 @@ object SupportedEmojis { Log.i("test", "have ${unsupportedEmojis.size}, longest emoji: ${unsupportedEmojis.maxOfOrNull { it.length }}") } - fun isSupported(emoji: String) = emoji !in unsupportedEmojis + fun isUnsupported(emoji: String) = emoji in unsupportedEmojis } diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt index 414f7cc2b..81d34170e 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt @@ -78,13 +78,13 @@ class EmojiParser(private val params: KeyboardParams, private val context: Conte private fun parseEmojiKeyNew(line: String): KeyParams? { if (!line.contains(" ") || params.mId.mElementId == KeyboardId.ELEMENT_EMOJI_CATEGORY10) { // single emoji without popups, or emoticons (there is one that contains space...) - return if (!SupportedEmojis.isSupported(line)) null + return if (SupportedEmojis.isUnsupported(line)) null else KeyParams(line, line.getCode(), null, null, Key.LABEL_FLAGS_FONT_NORMAL, params) } val split = line.split(" ") val label = split.first() - if (!SupportedEmojis.isSupported(label)) return null - val popupKeysSpec = split.drop(1).filter { SupportedEmojis.isSupported(it) } + if (SupportedEmojis.isUnsupported(label)) return null + val popupKeysSpec = split.drop(1).filterNot { SupportedEmojis.isUnsupported(it) } .takeIf { it.isNotEmpty() }?.joinToString(",") return KeyParams( label, diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java index aa96e5b74..2bd17f62e 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java @@ -34,6 +34,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import helium314.keyboard.keyboard.Keyboard; +import helium314.keyboard.keyboard.emoji.SupportedEmojis; import helium314.keyboard.latin.NgramContext.WordInfo; import helium314.keyboard.latin.SuggestedWords.SuggestedWordInfo; import helium314.keyboard.latin.common.ComposedData; @@ -885,7 +886,7 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator { final boolean checkForGarbage = composedData.mIsBatchMode && (dictType.equals(Dictionary.TYPE_USER_HISTORY) || dictType.equals(Dictionary.TYPE_MAIN)); for (SuggestedWordInfo info : dictionarySuggestions) { final String word = info.getWord(); - if (!isBlacklisted(word)) { // don't add blacklisted words + if (!isBlacklisted(word) && !SupportedEmojis.INSTANCE.isUnsupported(word)) { // don't add blacklisted words and unsupported emojis if (checkForGarbage // only check history and "main main dictionary" // consider the user might use custom main dictionary containing shortcuts From 4d9170207322d64324009578b36f0dcc9cbd925e Mon Sep 17 00:00:00 2001 From: Helium314 Date: Fri, 16 May 2025 21:48:07 +0200 Subject: [PATCH 118/175] add setting for default emoji skin tone fixes GH-817 --- .../internal/keyboard_parser/EmojiParser.kt | 18 ++++++++++++++++++ .../keyboard/latin/settings/Defaults.kt | 1 + .../keyboard/latin/settings/Settings.java | 3 ++- .../settings/screens/AppearanceScreen.kt | 16 +++++++++++++--- app/src/main/res/values/strings.xml | 4 ++++ 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt index 81d34170e..35ab32dfe 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/EmojiParser.kt @@ -11,8 +11,12 @@ import helium314.keyboard.keyboard.internal.keyboard_parser.floris.KeyCode import helium314.keyboard.latin.R import helium314.keyboard.latin.common.Constants import helium314.keyboard.latin.common.StringUtils +import helium314.keyboard.latin.common.splitOnWhitespace +import helium314.keyboard.latin.settings.Defaults import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.utils.ResourceUtils +import helium314.keyboard.latin.utils.prefs +import java.util.Collections import kotlin.math.sqrt class EmojiParser(private val params: KeyboardParams, private val context: Context) { @@ -39,6 +43,20 @@ class EmojiParser(private val params: KeyboardParams, private val context: Conte } else { context.assets.open("emoji/$emojiFileName").reader().use { it.readLines() } } + val defaultSkinTone = context.prefs().getString(Settings.PREF_EMOJI_SKIN_TONE, Defaults.PREF_EMOJI_SKIN_TONE)!! + if (params.mId.mElementId == KeyboardId.ELEMENT_EMOJI_CATEGORY2 && defaultSkinTone != "") { + // adjust PEOPLE_AND_BODY if we have a non-yellow default skin tone + val modifiedLines = emojiLines.map { + val split = it.splitOnWhitespace().toMutableList() + // find the line containing the skin tone, and swap with first + val foundIndex = split.indexOfFirst { it.contains(defaultSkinTone) } + if (foundIndex > 0) { + Collections.swap(split, 0, foundIndex) + } + split.joinToString(" ") + } + return parseLines(modifiedLines) + } return parseLines(emojiLines) } diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt index 11d2de4ca..0dff54197 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt +++ b/app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt @@ -90,6 +90,7 @@ object Defaults { const val PREF_FONT_SCALE = SettingsValues.DEFAULT_SIZE_SCALE const val PREF_EMOJI_FONT_SCALE = SettingsValues.DEFAULT_SIZE_SCALE const val PREF_EMOJI_KEY_FIT = true + const val PREF_EMOJI_SKIN_TONE = "" const val PREF_SPACE_HORIZONTAL_SWIPE = "move_cursor" const val PREF_SPACE_VERTICAL_SWIPE = "none" const val PREF_DELETE_SWIPE = true diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java index 1e72e8e05..6b6c5ddf4 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -96,13 +96,14 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang public static final String PREF_FONT_SCALE = "font_scale"; public static final String PREF_EMOJI_FONT_SCALE = "emoji_font_scale"; public static final String PREF_EMOJI_KEY_FIT = "emoji_key_fit"; + public static final String PREF_EMOJI_SKIN_TONE = "emoji_skin_tone"; public static final String PREF_SPACE_HORIZONTAL_SWIPE = "horizontal_space_swipe"; public static final String PREF_SPACE_VERTICAL_SWIPE = "vertical_space_swipe"; public static final String PREF_DELETE_SWIPE = "delete_swipe"; public static final String PREF_AUTOSPACE_AFTER_PUNCTUATION = "autospace_after_punctuation"; public static final String PREF_AUTOSPACE_AFTER_SUGGESTION = "autospace_after_suggestion"; public static final String PREF_AUTOSPACE_AFTER_GESTURE_TYPING = "autospace_after_gesture_typing"; - public static final String PREF_AUTOSPACE_BEFORE_GESTURE_TYPING = "autospace_before_gesture_typing"; + public static final String PREF_AUTOSPACE_BEFORE_GESTURE_TYPING = "autospace_before_gesture_typing"; public static final String PREF_SHIFT_REMOVES_AUTOSPACE = "shift_removes_autospace"; public static final String PREF_ALWAYS_INCOGNITO_MODE = "always_incognito_mode"; public static final String PREF_BIGRAM_PREDICTIONS = "next_word_prediction"; diff --git a/app/src/main/java/helium314/keyboard/settings/screens/AppearanceScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/AppearanceScreen.kt index 3b16a48d7..016db3f0b 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/AppearanceScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/AppearanceScreen.kt @@ -4,7 +4,6 @@ package helium314.keyboard.settings.screens import android.content.Context import android.os.Build import androidx.compose.material3.Surface -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -21,7 +20,6 @@ import helium314.keyboard.latin.R import helium314.keyboard.latin.settings.Defaults import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.utils.Log -import helium314.keyboard.latin.utils.checkTimestampFormat import helium314.keyboard.latin.utils.getActivity import helium314.keyboard.latin.utils.getStringResourceOrName import helium314.keyboard.latin.utils.prefs @@ -36,7 +34,6 @@ import helium314.keyboard.settings.preferences.SwitchPreference import helium314.keyboard.settings.Theme import helium314.keyboard.settings.dialogs.ColorThemePickerDialog import helium314.keyboard.settings.dialogs.CustomizeIconsDialog -import helium314.keyboard.settings.dialogs.TextInputDialog import helium314.keyboard.settings.initPreview import helium314.keyboard.settings.preferences.BackgroundImagePref import helium314.keyboard.settings.preferences.CustomFontPreference @@ -85,6 +82,8 @@ fun AppearanceScreen( Settings.PREF_FONT_SCALE, Settings.PREF_EMOJI_FONT_SCALE, Settings.PREF_EMOJI_KEY_FIT, + if (prefs.getInt(Settings.PREF_EMOJI_MAX_SDK, Defaults.PREF_EMOJI_MAX_SDK) >= 24) + Settings.PREF_EMOJI_SKIN_TONE else null, ) SearchSettingsScreen( onClickBack = onClickBack, @@ -293,6 +292,17 @@ fun createAppearanceSettings(context: Context) = listOf( Setting(context, Settings.PREF_EMOJI_KEY_FIT, R.string.prefs_emoji_key_fit) { SwitchPreference(it, Defaults.PREF_EMOJI_KEY_FIT) { KeyboardSwitcher.getInstance().setThemeNeedsReload() } }, + Setting(context, Settings.PREF_EMOJI_SKIN_TONE, R.string.prefs_emoji_skin_tone) { setting -> + val items = listOf( + stringResource(R.string.prefs_emoji_skin_tone_neutral) to "", + "\uD83C\uDFFB" to "\uD83C\uDFFB", + "\uD83C\uDFFC" to "\uD83C\uDFFC", + "\uD83C\uDFFD" to "\uD83C\uDFFD", + "\uD83C\uDFFE" to "\uD83C\uDFFE", + "\uD83C\uDFFF" to "\uD83C\uDFFF" + ) + ListPreference(setting, items, Defaults.PREF_EMOJI_SKIN_TONE) { KeyboardSwitcher.getInstance().setThemeNeedsReload() } + }, ) @Preview diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 38c800ca7..31915e1d6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -356,6 +356,10 @@ Emoji view font scale Scale emoji key size with font size + + Default emoji skin tone + + Neutral Custom text on space bar From c33c2c58236163684c4b38aa4505c9fd127094ad Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 17 May 2025 09:54:27 +0200 Subject: [PATCH 119/175] remove test logging --- .../java/helium314/keyboard/keyboard/emoji/SupportedEmojis.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/SupportedEmojis.kt b/app/src/main/java/helium314/keyboard/keyboard/emoji/SupportedEmojis.kt index f3ffb5bfd..831017267 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/SupportedEmojis.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/SupportedEmojis.kt @@ -11,7 +11,6 @@ object SupportedEmojis { fun load(context: Context) { val maxSdk = context.prefs().getInt(Settings.PREF_EMOJI_MAX_SDK, Defaults.PREF_EMOJI_MAX_SDK) - Log.i("test", "max $maxSdk") unsupportedEmojis.clear() context.assets.open("emoji/minApi.txt").reader().readLines().forEach { val s = it.split(" ") @@ -19,7 +18,6 @@ object SupportedEmojis { if (minApi > maxSdk) unsupportedEmojis.addAll(s.drop(1)) } - Log.i("test", "have ${unsupportedEmojis.size}, longest emoji: ${unsupportedEmojis.maxOfOrNull { it.length }}") } fun isUnsupported(emoji: String) = emoji in unsupportedEmojis From 9c9fe392d1620a4c889f0d5ad23ff71483ae2f8a Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 17 May 2025 16:56:22 +0200 Subject: [PATCH 120/175] fix dealing with prases without non-whitespace letters in SpacedTokens --- .../main/java/helium314/keyboard/latin/utils/SpacedTokens.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SpacedTokens.kt b/app/src/main/java/helium314/keyboard/latin/utils/SpacedTokens.kt index b760e7bfd..01f4c718b 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SpacedTokens.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SpacedTokens.kt @@ -16,7 +16,7 @@ class SpacedTokens(phrase: String) : Iterable { private var startPos = mStartPos override fun hasNext(): Boolean { - return startPos < mLength + return startPos < mLength && startPos != -1 } override fun next(): String { From 66c3dd7a814d08477ff1fb7c35404029f8242cee Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 17 May 2025 20:33:31 +0200 Subject: [PATCH 121/175] use correct checksum --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a063f3fdd..eb1a55be0 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=2db75c40782f5e8ba1fc278a5574bab070adccb2d21ca5a6e5ed840888448046 +distributionSha256Sum=f397b287023acdba1e9f6fc5ea72d22dd63669d59ed4a289a29b1a76eee151c6 distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 validateDistributionUrl=true From 199f177c2d54e788cf4d1e10a10c5c34db8c8b97 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 18 May 2025 15:25:10 +0200 Subject: [PATCH 122/175] add left/right variants of alt, ctrl and meta for picky apps, fixes GH-1579 --- .../keyboard/keyboard/KeyboardActionListenerImpl.kt | 6 ++++++ .../keyboard/internal/keyboard_parser/floris/KeyCode.kt | 8 +++++++- .../helium314/keyboard/latin/inputlogic/InputLogic.java | 5 +++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt b/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt index b01d162aa..9df3a9682 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardActionListenerImpl.kt @@ -32,9 +32,15 @@ class KeyboardActionListenerImpl(private val latinIME: LatinIME, private val inp private fun adjustMetaState(code: Int, remove: Boolean) { val metaCode = when (code) { KeyCode.CTRL -> KeyEvent.META_CTRL_ON + KeyCode.CTRL_LEFT -> KeyEvent.META_CTRL_LEFT_ON + KeyCode.CTRL_RIGHT -> KeyEvent.META_CTRL_RIGHT_ON KeyCode.ALT -> KeyEvent.META_ALT_ON + KeyCode.ALT_LEFT -> KeyEvent.META_ALT_LEFT_ON + KeyCode.ALT_RIGHT -> KeyEvent.META_ALT_RIGHT_ON KeyCode.FN -> KeyEvent.META_FUNCTION_ON KeyCode.META -> KeyEvent.META_META_ON + KeyCode.META_LEFT -> KeyEvent.META_META_LEFT_ON + KeyCode.META_RIGHT -> KeyEvent.META_META_RIGHT_ON else -> return } metaState = if (remove) metaState and metaCode.inv() diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt index e47942501..73d69e3ac 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt @@ -168,6 +168,12 @@ object KeyCode { const val SELECT_LEFT = -10041 const val SELECT_RIGHT = -10042 const val TIMESTAMP = -10043 + const val CTRL_LEFT = -10044 + const val CTRL_RIGHT = -10045 + const val ALT_LEFT = -10046 + const val ALT_RIGHT = -10047 + const val META_LEFT = -10048 + const val META_RIGHT = -10049 /** to make sure a FlorisBoard code works when reading a JSON layout */ fun Int.checkAndConvertCode(): Int = if (this > 0) this else when (this) { @@ -184,7 +190,7 @@ object KeyCode { ACTION_NEXT, ACTION_PREVIOUS, NOT_SPECIFIED, CLIPBOARD_COPY_ALL, WORD_LEFT, WORD_RIGHT, PAGE_UP, PAGE_DOWN, META, TAB, ESCAPE, INSERT, SLEEP, MEDIA_PLAY, MEDIA_PAUSE, MEDIA_PLAY_PAUSE, MEDIA_NEXT, MEDIA_PREVIOUS, VOL_UP, VOL_DOWN, MUTE, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, BACK, - TIMESTAMP + TIMESTAMP, CTRL_LEFT, CTRL_RIGHT, ALT_LEFT, ALT_RIGHT, META_LEFT, META_RIGHT -> this // conversion diff --git a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java index 9deabf6d0..e2ef27e6a 100644 --- a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java @@ -815,8 +815,9 @@ public final class InputLogic { // We need to switch to the shortcut IME. This is handled by LatinIME since the // input logic has no business with IME switching. case KeyCode.CAPS_LOCK, KeyCode.SYMBOL_ALPHA, KeyCode.ALPHA, KeyCode.SYMBOL, KeyCode.NUMPAD, KeyCode.EMOJI, - KeyCode.TOGGLE_ONE_HANDED_MODE, KeyCode.SWITCH_ONE_HANDED_MODE, - KeyCode.CTRL, KeyCode.ALT, KeyCode.FN, KeyCode.META: + KeyCode.TOGGLE_ONE_HANDED_MODE, KeyCode.SWITCH_ONE_HANDED_MODE, KeyCode.FN, + KeyCode.CTRL, KeyCode.CTRL_LEFT, KeyCode.CTRL_RIGHT, KeyCode.ALT, KeyCode.ALT_LEFT, KeyCode.ALT_RIGHT, + KeyCode.META, KeyCode.META_LEFT, KeyCode.META_RIGHT: break; default: if (event.getMMetaState() != 0) { From 731c6cdd5eff44f8f757031f20633049edb4288b Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Sun, 18 May 2025 20:18:23 +0300 Subject: [PATCH 123/175] Allow for switching between emoji categories using swipe left/right (#1488) --- app/build.gradle.kts | 1 + .../keyboard/keyboard/KeyboardSwitcher.java | 7 +- .../keyboard/emoji/EmojiCategory.java | 22 +- .../keyboard/emoji/EmojiLayoutParams.kt | 4 +- .../keyboard/emoji/EmojiPalettesAdapter.java | 158 +----------- .../keyboard/emoji/EmojiPalettesView.java | 244 ++++++++++++------ .../helium314/keyboard/latin/LatinIME.java | 6 +- .../main/res/layout/emoji_category_view.xml | 20 ++ .../main/res/layout/emoji_palettes_view.xml | 7 +- 9 files changed, 217 insertions(+), 252 deletions(-) create mode 100644 app/src/main/res/layout/emoji_category_view.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index cbc5a221b..b8fdcc561 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -107,6 +107,7 @@ dependencies { implementation("androidx.core:core-ktx:1.16.0") implementation("androidx.recyclerview:recyclerview:1.4.0") implementation("androidx.autofill:autofill:1.1.0") + implementation("androidx.viewpager2:viewpager2:1.1.0") // kotlin implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1") diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java index aba763679..2b679dd26 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardSwitcher.java @@ -479,7 +479,6 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { if (mKeyboardViewWrapper.getOneHandedModeEnabled() == enabled) { return; } - mEmojiPalettesView.clearKeyboardCache(); final Settings settings = Settings.getInstance(); mKeyboardViewWrapper.setOneHandedModeEnabled(enabled); mKeyboardViewWrapper.setOneHandedGravity(settings.getCurrent().mOneHandedModeGravity); @@ -645,6 +644,12 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { } } + public void trimMemory() { + if (mEmojiPalettesView != null) { + mEmojiPalettesView.clearKeyboardCache(); + } + } + @SuppressLint("InflateParams") public View onCreateInputView(@NonNull Context displayContext, final boolean isHardwareAcceleratedDrawingEnabled) { if (mKeyboardView != null) { diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiCategory.java b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiCategory.java index 910fcb38a..d2a7213fd 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiCategory.java +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiCategory.java @@ -261,20 +261,6 @@ final class EmojiCategory { return 0; } - // Returns the view pager's page position for the categoryId - public int getPagerPageIdFromCategoryAndPageId(final int categoryId, final int categoryPageId) { - int sum = 0; - for (int i = 0; i < mShownCategories.size(); ++i) { - final CategoryProperties props = mShownCategories.get(i); - if (props.mCategoryId == categoryId) { - return sum + categoryPageId; - } - sum += props.getPageCount(); - } - Log.w(TAG, "categoryId not found: " + categoryId); - return 0; - } - public int getRecentTabId() { return getTabIdFromCategoryId(EmojiCategory.ID_RECENTS); } @@ -285,11 +271,11 @@ final class EmojiCategory { } // Returns a keyboard from the recycler view's adapter position. - public DynamicGridKeyboard getKeyboardFromAdapterPosition(final int position) { - if (position >= 0 && position < getCurrentCategoryPageCount()) { - return getKeyboard(mCurrentCategoryId, position); + public DynamicGridKeyboard getKeyboardFromAdapterPosition(int categoryId, final int position) { + if (position >= 0 && position < getCategoryPageCount(categoryId)) { + return getKeyboard(categoryId, position); } - Log.w(TAG, "invalid position for categoryId : " + mCurrentCategoryId); + Log.w(TAG, "invalid position for categoryId : " + categoryId); return null; } diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiLayoutParams.kt b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiLayoutParams.kt index 3444c8aad..b423ca44c 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiLayoutParams.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiLayoutParams.kt @@ -8,7 +8,7 @@ package helium314.keyboard.keyboard.emoji import android.content.res.Resources import android.view.View import android.widget.LinearLayout -import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager2.widget.ViewPager2 import helium314.keyboard.keyboard.internal.KeyboardParams import helium314.keyboard.latin.R import helium314.keyboard.latin.settings.Settings @@ -47,7 +47,7 @@ internal class EmojiLayoutParams(res: Resources) { emojiKeyboardHeight = emojiListHeight - emojiCategoryPageIdViewHeight - emojiListBottomMargin } - fun setEmojiListProperties(vp: RecyclerView) { + fun setEmojiListProperties(vp: ViewPager2) { val lp = vp.layoutParams as LinearLayout.LayoutParams lp.height = emojiKeyboardHeight lp.bottomMargin = emojiListBottomMargin diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesAdapter.java b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesAdapter.java index 7b3e02914..7f7b63614 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesAdapter.java +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesAdapter.java @@ -12,156 +12,32 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import helium314.keyboard.keyboard.Key; import helium314.keyboard.keyboard.Keyboard; -import helium314.keyboard.keyboard.KeyboardView; import helium314.keyboard.latin.R; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import helium314.keyboard.latin.settings.Settings; final class EmojiPalettesAdapter extends RecyclerView.Adapter{ private static final String TAG = EmojiPalettesAdapter.class.getSimpleName(); private static final boolean DEBUG_PAGER = false; + private final int mCategoryId; private final OnKeyEventListener mListener; - private final DynamicGridKeyboard mRecentsKeyboard; - private final SparseArray mActiveKeyboardViews = new SparseArray<>(); private final EmojiCategory mEmojiCategory; - private int mActivePosition = 0; - public EmojiPalettesAdapter(final EmojiCategory emojiCategory, - final OnKeyEventListener listener) { + public EmojiPalettesAdapter(final EmojiCategory emojiCategory, int categoryId, final OnKeyEventListener listener) { mEmojiCategory = emojiCategory; + mCategoryId = categoryId; mListener = listener; - mRecentsKeyboard = mEmojiCategory.getKeyboard(EmojiCategory.ID_RECENTS, 0); } - public void flushPendingRecentKeys() { - mRecentsKeyboard.flushPendingRecentKeys(); - final KeyboardView recentKeyboardView = - mActiveKeyboardViews.get(mEmojiCategory.getRecentTabId()); - if (recentKeyboardView != null) { - recentKeyboardView.invalidateAllKeys(); - } - } - - public void addRecentKey(final Key key) { - if (Settings.getValues().mIncognitoModeEnabled) { - // We do not want to log recent keys while being in incognito - return; - } - if (mEmojiCategory.isInRecentTab()) { - mRecentsKeyboard.addPendingKey(key); - return; - } - mRecentsKeyboard.addKeyFirst(key); - final KeyboardView recentKeyboardView = - mActiveKeyboardViews.get(mEmojiCategory.getRecentTabId()); - if (recentKeyboardView != null) { - recentKeyboardView.invalidateAllKeys(); - } - } - - public void onPageScrolled() { - releaseCurrentKey(false /* withKeyRegistering */); - } - - public void releaseCurrentKey(final boolean withKeyRegistering) { - // Make sure the delayed key-down event (highlight effect and haptic feedback) will be - // canceled. - final EmojiPageKeyboardView currentKeyboardView = - mActiveKeyboardViews.get(mActivePosition); - if (currentKeyboardView == null) { - return; - } - currentKeyboardView.releaseCurrentKey(withKeyRegistering); - } - -/* - @Override - public Object instantiateItem(final ViewGroup container, final int position) { - if (DEBUG_PAGER) { - Log.d(TAG, "instantiate item: " + position); - } - final EmojiPageKeyboardView oldKeyboardView = mActiveKeyboardViews.get(position); - if (oldKeyboardView != null) { - oldKeyboardView.deallocateMemory(); - // This may be redundant but wanted to be safer.. - mActiveKeyboardViews.remove(position); - } - final Keyboard keyboard = - mEmojiCategory.getKeyboardFromPagePosition(position); - final LayoutInflater inflater = LayoutInflater.from(container.getContext()); - final EmojiPageKeyboardView keyboardView = (EmojiPageKeyboardView) inflater.inflate( - R.layout.emoji_keyboard_page, container, false); - keyboardView.setKeyboard(keyboard); - keyboardView.setOnKeyEventListener(mListener); - container.addView(keyboardView); - mActiveKeyboardViews.put(position, keyboardView); - return keyboardView; - } - - @Override - public void setPrimaryItem(final ViewGroup container, final int position, - final Object object) { - if (mActivePosition == position) { - return; - } - final EmojiPageKeyboardView oldKeyboardView = mActiveKeyboardViews.get(mActivePosition); - if (oldKeyboardView != null) { - oldKeyboardView.releaseCurrentKey(false); - oldKeyboardView.deallocateMemory(); - } - mActivePosition = position; - } - - @Override - public boolean isViewFromObject(final View view, final Object object) { - return view == object; - } - - @Override - public void destroyItem(final ViewGroup container, final int position, - final Object object) { - if (DEBUG_PAGER) { - Log.d(TAG, "destroy item: " + position + ", " + object.getClass().getSimpleName()); - } - final EmojiPageKeyboardView keyboardView = mActiveKeyboardViews.get(position); - if (keyboardView != null) { - keyboardView.deallocateMemory(); - mActiveKeyboardViews.remove(position); - } - if (object instanceof View) { - container.removeView((View)object); - } else { - Log.w(TAG, "Warning!!! Emoji palette may be leaking. " + object); - } - } -*/ - @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - /*if (DEBUG_PAGER) { - Log.d(TAG, "instantiate item: " + viewType); - } - final EmojiPageKeyboardView oldKeyboardView = mActiveKeyboardViews.get(viewType); - if (oldKeyboardView != null) { - oldKeyboardView.deallocateMemory(); - // This may be redundant but wanted to be safer.. - mActiveKeyboardViews.remove(viewType); - } - final Keyboard keyboard = - mEmojiCategory.getKeyboardFromPagePosition(parent.getVerticalScrollbarPosition());*/ final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); final EmojiPageKeyboardView keyboardView = (EmojiPageKeyboardView)inflater.inflate( R.layout.emoji_keyboard_page, parent, false); - /*keyboardView.setKeyboard(keyboard); - keyboardView.setOnKeyEventListener(mListener); - parent.addView(keyboardView); - mActiveKeyboardViews.put(parent.getVerticalScrollbarPosition(), keyboardView);*/ return new ViewHolder(keyboardView); } @@ -170,33 +46,22 @@ final class EmojiPalettesAdapter extends RecyclerView.Adapter { + private boolean mInitialized; + + private PagerAdapter() { + setHasStableIds(true); + } + + @Override + public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) { + recyclerView.setItemViewCacheSize(mEmojiCategory.getShownCategories().size()); + } + + @NonNull + @Override + public PagerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + var view = LayoutInflater.from(parent.getContext()).inflate(R.layout.emoji_category_view, parent, false); + var viewHolder = new PagerViewHolder(view); + var emojiRecyclerView = getRecyclerView(view); + + emojiRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + // Ignore this message. Only want the actual page selected. + } + + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + updateState(recyclerView, viewHolder); + } + }); + + emojiRecyclerView.setPersistentDrawingCache(PERSISTENT_NO_CACHE); + return viewHolder; + } + + @Override + public void onBindViewHolder(PagerViewHolder holder, int position) { + holder.mCategoryId = getItemId(position); + var recyclerView = getRecyclerView(holder.itemView); + recyclerView.setAdapter(new EmojiPalettesAdapter(mEmojiCategory, (int) holder.mCategoryId, + EmojiPalettesView.this)); + + if (! mInitialized) { + recyclerView.scrollToPosition(mEmojiCategory.getCurrentCategoryPageId()); + mInitialized = true; + } + } + + @Override + public int getItemCount() { + return mEmojiCategory.getShownCategories().size(); + } + + @Override + public void onViewAttachedToWindow(PagerViewHolder holder) { + if (mPager.getScrollState() == ViewPager2.SCROLL_STATE_DRAGGING // swipe + || holder.getBindingAdapterPosition() == mPager.getCurrentItem() // tab + ) { + setCurrentCategoryId((int) getItemId(holder.getBindingAdapterPosition()), false); + updateState(getRecyclerView(holder.itemView), holder); + } + } + + @Override + public void onViewDetachedFromWindow(PagerViewHolder holder) { + if (holder.mCategoryId == EmojiCategory.ID_RECENTS) { + // Needs to save pending updates for recent keys when we get out of the recents + // category because we don't want to move the recent emojis around while the user + // is in the recents category. + getRecentsKeyboard().flushPendingRecentKeys(); + getRecyclerView(holder.itemView).getAdapter().notifyDataSetChanged(); + } + } + + @Override + public long getItemId(int position) { + return mEmojiCategory.getShownCategories().get(position).mCategoryId; + } + + private static RecyclerView getRecyclerView(View view) { + return view.findViewById(R.id.emoji_keyboard_list); + } + + private void updateState(@NonNull RecyclerView recyclerView, PagerViewHolder viewHolder) { + if (viewHolder.mCategoryId != mEmojiCategory.getCurrentCategoryId()) { + return; + } + + final int offset = recyclerView.computeVerticalScrollOffset(); + final int extent = recyclerView.computeVerticalScrollExtent(); + final int range = recyclerView.computeVerticalScrollRange(); + final float percentage = offset / (float) (range - extent); + + final int currentCategorySize = mEmojiCategory.getCurrentCategoryPageCount(); + final int a = (int) (percentage * currentCategorySize); + final float b = percentage * currentCategorySize - a; + mEmojiCategoryPageIndicatorView.setCategoryPageId(currentCategorySize, a, b); + + LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); + final int firstCompleteVisibleBoard = layoutManager.findFirstCompletelyVisibleItemPosition(); + final int firstVisibleBoard = layoutManager.findFirstVisibleItemPosition(); + mEmojiCategory.setCurrentCategoryPageId( + firstCompleteVisibleBoard > 0 ? firstCompleteVisibleBoard : firstVisibleBoard); + } + } + private boolean initialized = false; private final Colors mColors; - private EmojiPalettesAdapter mEmojiPalettesAdapter; private final EmojiLayoutParams mEmojiLayoutParams; - private final LinearLayoutManager mEmojiLayoutManager; private LinearLayout mTabStrip; - private RecyclerView mEmojiRecyclerView; private EmojiCategoryPageIndicatorView mEmojiCategoryPageIndicatorView; private KeyboardActionListener mKeyboardActionListener = KeyboardActionListener.EMPTY_LISTENER; private final EmojiCategory mEmojiCategory; - + private ViewPager2 mPager; public EmojiPalettesView(final Context context, final AttributeSet attrs) { this(context, attrs, R.attr.emojiPalettesViewStyle); @@ -91,7 +203,6 @@ public final class EmojiPalettesView extends LinearLayout R.styleable.EmojiPalettesView, defStyle, R.style.EmojiPalettesView); mEmojiCategory = new EmojiCategory(context, layoutSet, emojiPalettesViewAttr); emojiPalettesViewAttr.recycle(); - mEmojiLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false); setFitsSystemWindows(true); } @@ -129,47 +240,14 @@ public final class EmojiPalettesView extends LinearLayout for (final EmojiCategory.CategoryProperties properties : mEmojiCategory.getShownCategories()) { addTab(mTabStrip, properties.mCategoryId); } - mEmojiPalettesAdapter = new EmojiPalettesAdapter(mEmojiCategory, this); - - mEmojiRecyclerView = findViewById(R.id.emoji_keyboard_list); - mEmojiRecyclerView.setLayoutManager(mEmojiLayoutManager); - mEmojiRecyclerView.setAdapter(mEmojiPalettesAdapter); - mEmojiRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrollStateChanged(@NonNull @NotNull RecyclerView recyclerView, int newState) { - super.onScrollStateChanged(recyclerView, newState); - // Ignore this message. Only want the actual page selected. - } - - @Override - public void onScrolled(@NonNull @NotNull RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - mEmojiPalettesAdapter.onPageScrolled(); - - final int offset = recyclerView.computeVerticalScrollOffset(); - final int extent = recyclerView.computeVerticalScrollExtent(); - final int range = recyclerView.computeVerticalScrollRange(); - final float percentage = offset / (float) (range - extent); - - final int currentCategorySize = mEmojiCategory.getCurrentCategoryPageCount(); - final int a = (int) (percentage * currentCategorySize); - final float b = percentage * currentCategorySize - a; - mEmojiCategoryPageIndicatorView.setCategoryPageId(currentCategorySize, a, b); - - final int firstCompleteVisibleBoard = mEmojiLayoutManager.findFirstCompletelyVisibleItemPosition(); - final int firstVisibleBoard = mEmojiLayoutManager.findFirstVisibleItemPosition(); - mEmojiCategory.setCurrentCategoryPageId( - firstCompleteVisibleBoard > 0 ? firstCompleteVisibleBoard : firstVisibleBoard); - } - }); - - mEmojiRecyclerView.setPersistentDrawingCache(PERSISTENT_NO_CACHE); - mEmojiLayoutParams.setEmojiListProperties(mEmojiRecyclerView); + mPager = findViewById(R.id.emoji_pager); + mPager.setAdapter(new PagerAdapter()); + mEmojiLayoutParams.setEmojiListProperties(mPager); mEmojiCategoryPageIndicatorView = findViewById(R.id.emoji_category_page_id_view); mEmojiLayoutParams.setCategoryPageIdViewProperties(mEmojiCategoryPageIndicatorView); - setCurrentCategoryAndPageId(mEmojiCategory.getCurrentCategoryId(), mEmojiCategory.getCurrentCategoryPageId(), true); + setCurrentCategoryId(mEmojiCategory.getCurrentCategoryId(), true); mEmojiCategoryPageIndicatorView.setColors(mColors.get(ColorType.EMOJI_CATEGORY_SELECTED), mColors.get(ColorType.STRIP_BACKGROUND)); initialized = true; @@ -187,7 +265,7 @@ public final class EmojiPalettesView extends LinearLayout AudioAndHapticFeedbackManager.getInstance().performHapticAndAudioFeedback(KeyCode.NOT_SPECIFIED, this); final int categoryId = ((Long) tag).intValue(); if (categoryId != mEmojiCategory.getCurrentCategoryId()) { - setCurrentCategoryAndPageId(categoryId, 0, false); + setCurrentCategoryId(categoryId, false); updateEmojiCategoryPageIdView(); } } @@ -212,7 +290,7 @@ public final class EmojiPalettesView extends LinearLayout */ @Override public void onReleaseKey(final Key key) { - mEmojiPalettesAdapter.addRecentKey(key); + addRecentKey(key); final int code = key.getCode(); if (code == KeyCode.MULTIPLE_CODE_POINTS) { mKeyboardActionListener.onTextInput(key.getOutputText()); @@ -237,13 +315,22 @@ public final class EmojiPalettesView extends LinearLayout setupBottomRowKeyboard(editorInfo, keyboardActionListener); final KeyDrawParams params = new KeyDrawParams(); params.updateParams(mEmojiLayoutParams.getBottomRowKeyboardHeight(), keyVisualAttr); - if (mEmojiRecyclerView.getAdapter() == null) { - mEmojiRecyclerView.setAdapter(mEmojiPalettesAdapter); - setCurrentCategoryAndPageId(mEmojiCategory.getCurrentCategoryId(), mEmojiCategory.getCurrentCategoryPageId(), true); - } setupSidePadding(); } + private void addRecentKey(final Key key) { + if (Settings.getValues().mIncognitoModeEnabled) { + // We do not want to log recent keys while being in incognito + return; + } + if (mEmojiCategory.isInRecentTab()) { + getRecentsKeyboard().addPendingKey(key); + return; + } + getRecentsKeyboard().addKeyFirst(key); + mPager.getAdapter().notifyItemChanged(mEmojiCategory.getRecentTabId()); + } + private void setupBottomRowKeyboard(final EditorInfo editorInfo, final KeyboardActionListener keyboardActionListener) { MainKeyboardView keyboardView = findViewById(R.id.bottom_row_keyboard); keyboardView.setKeyboardActionListener(keyboardActionListener); @@ -263,11 +350,11 @@ public final class EmojiPalettesView extends LinearLayout final float rightPadding = keyboardAttr.getFraction(R.styleable.Keyboard_keyboardRightPadding, keyboardWidth, keyboardWidth, 0f) * sv.mSidePaddingScale; keyboardAttr.recycle(); - mEmojiRecyclerView.setPadding( + mPager.setPadding( (int) leftPadding, - mEmojiRecyclerView.getPaddingTop(), + mPager.getPaddingTop(), (int) rightPadding, - mEmojiRecyclerView.getPaddingBottom() + mPager.getPaddingBottom() ); mEmojiCategoryPageIndicatorView.setPadding( (int) leftPadding, @@ -280,9 +367,11 @@ public final class EmojiPalettesView extends LinearLayout public void stopEmojiPalettes() { if (!initialized) return; - mEmojiPalettesAdapter.releaseCurrentKey(true); - mEmojiPalettesAdapter.flushPendingRecentKeys(); - mEmojiRecyclerView.setAdapter(null); + getRecentsKeyboard().flushPendingRecentKeys(); + } + + private DynamicGridKeyboard getRecentsKeyboard() { + return mEmojiCategory.getKeyboard(EmojiCategory.ID_RECENTS, 0); } public void setKeyboardActionListener(final KeyboardActionListener listener) { @@ -298,34 +387,33 @@ public final class EmojiPalettesView extends LinearLayout mEmojiCategory.getCurrentCategoryPageId(), 0.0f); } - private void setCurrentCategoryAndPageId(final int categoryId, final int categoryPageId, final boolean force) { + private void setCurrentCategoryId(final int categoryId, final boolean initial) { final int oldCategoryId = mEmojiCategory.getCurrentCategoryId(); - final int oldCategoryPageId = mEmojiCategory.getCurrentCategoryPageId(); - - if (oldCategoryId == EmojiCategory.ID_RECENTS && categoryId != EmojiCategory.ID_RECENTS) { - // Needs to save pending updates for recent keys when we get out of the recents - // category because we don't want to move the recent emojis around while the user - // is in the recents category. - mEmojiPalettesAdapter.flushPendingRecentKeys(); - } - - if (force || oldCategoryId != categoryId || oldCategoryPageId != categoryPageId) { + if (initial || oldCategoryId != categoryId) { mEmojiCategory.setCurrentCategoryId(categoryId); - mEmojiCategory.setCurrentCategoryPageId(categoryPageId); - mEmojiPalettesAdapter.notifyDataSetChanged(); - mEmojiRecyclerView.scrollToPosition(categoryPageId); + + if (mPager.getScrollState() != ViewPager2.SCROLL_STATE_DRAGGING) { + // Not swiping + mPager.setCurrentItem(mEmojiCategory.getTabIdFromCategoryId( + mEmojiCategory.getCurrentCategoryId()), ! initial); + } + + final View old = mTabStrip.findViewWithTag((long) oldCategoryId); + final View current = mTabStrip.findViewWithTag((long) categoryId); + + if (old instanceof ImageView) + Settings.getValues().mColors.setColor((ImageView) old, ColorType.EMOJI_CATEGORY); + if (current instanceof ImageView) + Settings.getValues().mColors.setColor((ImageView) current, ColorType.EMOJI_CATEGORY_SELECTED); } - - final View old = mTabStrip.findViewWithTag((long) oldCategoryId); - final View current = mTabStrip.findViewWithTag((long) categoryId); - - if (old instanceof ImageView) - Settings.getValues().mColors.setColor((ImageView) old, ColorType.EMOJI_CATEGORY); - if (current instanceof ImageView) - Settings.getValues().mColors.setColor((ImageView) current, ColorType.EMOJI_CATEGORY_SELECTED); } public void clearKeyboardCache() { + if (!initialized) { + return; + } + mEmojiCategory.clearKeyboardCache(); + mPager.getAdapter().notifyDataSetChanged(); } } diff --git a/app/src/main/java/helium314/keyboard/latin/LatinIME.java b/app/src/main/java/helium314/keyboard/latin/LatinIME.java index 2969dd9a3..492d3e04e 100644 --- a/app/src/main/java/helium314/keyboard/latin/LatinIME.java +++ b/app/src/main/java/helium314/keyboard/latin/LatinIME.java @@ -2022,8 +2022,10 @@ public class LatinIME extends InputMethodService implements public void onTrimMemory(int level) { super.onTrimMemory(level); switch (level) { - case TRIM_MEMORY_RUNNING_LOW, TRIM_MEMORY_RUNNING_CRITICAL, TRIM_MEMORY_COMPLETE -> - KeyboardLayoutSet.onSystemLocaleChanged(); // clears caches, nothing else + case TRIM_MEMORY_RUNNING_LOW, TRIM_MEMORY_RUNNING_CRITICAL, TRIM_MEMORY_COMPLETE -> { + KeyboardLayoutSet.onSystemLocaleChanged(); // clears caches, nothing else + mKeyboardSwitcher.trimMemory(); + } // deallocateMemory always called on hiding, and should not be called when showing } } diff --git a/app/src/main/res/layout/emoji_category_view.xml b/app/src/main/res/layout/emoji_category_view.xml new file mode 100644 index 000000000..cbef189b9 --- /dev/null +++ b/app/src/main/res/layout/emoji_category_view.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/app/src/main/res/layout/emoji_palettes_view.xml b/app/src/main/res/layout/emoji_palettes_view.xml index ecf75b6ba..0625d09ac 100644 --- a/app/src/main/res/layout/emoji_palettes_view.xml +++ b/app/src/main/res/layout/emoji_palettes_view.xml @@ -15,11 +15,10 @@ android:background="@android:color/transparent" style="?attr/emojiPalettesViewStyle" > - + android:layout_height="wrap_content" /> Date: Sun, 18 May 2025 19:20:07 +0200 Subject: [PATCH 124/175] reload keyboard theme when changing number row setting otherwise emoji keyboards are not properly reloaded and may end up misaligned --- .../helium314/keyboard/settings/screens/PreferencesScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt index 70f29767c..272757201 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/PreferencesScreen.kt @@ -117,7 +117,7 @@ fun createPreferencesSettings(context: Context) = listOf( SwitchPreference(it, Defaults.PREF_ENABLE_CLIPBOARD_HISTORY) }, Setting(context, Settings.PREF_SHOW_NUMBER_ROW, R.string.number_row, R.string.number_row_summary) { - SwitchPreference(it, Defaults.PREF_SHOW_NUMBER_ROW) { KeyboardSwitcher.getInstance().reloadKeyboard() } + SwitchPreference(it, Defaults.PREF_SHOW_NUMBER_ROW) { KeyboardSwitcher.getInstance().setThemeNeedsReload() } }, Setting(context, Settings.PREF_LOCALIZED_NUMBER_ROW, R.string.localized_number_row, R.string.localized_number_row_summary) { SwitchPreference(it, Defaults.PREF_LOCALIZED_NUMBER_ROW) { From aa8068b5d2ef75fbb6dc4bde2524014338214705 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 18 May 2025 20:15:16 +0200 Subject: [PATCH 125/175] functional key background now also sets functional key text color for consistency, fixes GH-1576 --- .../internal/keyboard_parser/floris/TextKeyData.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt index 7aa161328..dcb50e802 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt @@ -390,7 +390,7 @@ sealed interface KeyData : AbstractKeyData { newCode = processCode() newLabel = processLabel(params) } - val newLabelFlags = labelFlags or additionalLabelFlags or getAdditionalLabelFlags(params) + var newLabelFlags = labelFlags or additionalLabelFlags or getAdditionalLabelFlags(params) val newPopupKeys = popup.merge(getAdditionalPopupKeys(params)) val background = when (type) { @@ -402,6 +402,9 @@ sealed interface KeyData : AbstractKeyData { KeyType.LOCK -> getShiftBackground(params) null -> getDefaultBackground(params) } + if (background == Key.BACKGROUND_TYPE_FUNCTIONAL + || background == Key.BACKGROUND_TYPE_STICKY_ON || background == Key.BACKGROUND_TYPE_STICKY_OFF) + newLabelFlags = newLabelFlags or Key.LABEL_FLAGS_FOLLOW_FUNCTIONAL_TEXT_COLOR return if (newCode == KeyCode.UNSPECIFIED || newCode == KeyCode.MULTIPLE_CODE_POINTS) { // code will be determined from label if possible (i.e. label is single code point) @@ -524,19 +527,18 @@ sealed interface KeyData : AbstractKeyData { // todo (later): add explanations / reasoning, often this is just taken from conversion from OpenBoard / AOSP layouts private fun getAdditionalLabelFlags(params: KeyboardParams): Int { return when (label) { - KeyLabel.ALPHA, KeyLabel.SYMBOL_ALPHA, KeyLabel.SYMBOL -> Key.LABEL_FLAGS_PRESERVE_CASE or Key.LABEL_FLAGS_FOLLOW_FUNCTIONAL_TEXT_COLOR + KeyLabel.ALPHA, KeyLabel.SYMBOL_ALPHA, KeyLabel.SYMBOL -> Key.LABEL_FLAGS_PRESERVE_CASE KeyLabel.COMMA -> Key.LABEL_FLAGS_HAS_POPUP_HINT // essentially the first term only changes the appearance of the armenian period key in holo theme KeyLabel.PERIOD -> (Key.LABEL_FLAGS_HAS_POPUP_HINT and if (params.mId.isAlphabetKeyboard) params.mLocaleKeyboardInfos.labelFlags else 0) or Key.LABEL_FLAGS_PRESERVE_CASE KeyLabel.ACTION -> { - Key.LABEL_FLAGS_PRESERVE_CASE or Key.LABEL_FLAGS_AUTO_X_SCALE or - Key.LABEL_FLAGS_FOLLOW_KEY_LABEL_RATIO or Key.LABEL_FLAGS_FOLLOW_FUNCTIONAL_TEXT_COLOR or + Key.LABEL_FLAGS_PRESERVE_CASE or Key.LABEL_FLAGS_AUTO_X_SCALE or Key.LABEL_FLAGS_FOLLOW_KEY_LABEL_RATIO or Key.LABEL_FLAGS_HAS_POPUP_HINT or KeyboardTheme.getThemeActionAndEmojiKeyLabelFlags(params.mThemeId) } KeyLabel.SPACE -> if (params.mId.isNumberLayout) Key.LABEL_FLAGS_ALIGN_ICON_TO_BOTTOM else 0 - KeyLabel.SHIFT -> Key.LABEL_FLAGS_PRESERVE_CASE or if (!params.mId.isAlphabetKeyboard) Key.LABEL_FLAGS_FOLLOW_FUNCTIONAL_TEXT_COLOR else 0 + KeyLabel.SHIFT -> Key.LABEL_FLAGS_PRESERVE_CASE toolbarKeyStrings[ToolbarKey.EMOJI] -> KeyboardTheme.getThemeActionAndEmojiKeyLabelFlags(params.mThemeId) KeyLabel.COM -> Key.LABEL_FLAGS_AUTO_X_SCALE or Key.LABEL_FLAGS_FONT_NORMAL or Key.LABEL_FLAGS_HAS_POPUP_HINT or Key.LABEL_FLAGS_PRESERVE_CASE KeyLabel.ZWNJ -> Key.LABEL_FLAGS_HAS_POPUP_HINT From 44558ceeaa8dc0dddbf455a5bd2379737e9423a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henr=C3=A9=20Botha?= <5593874+henrebotha@users.noreply.github.com> Date: Sun, 18 May 2025 20:44:23 +0200 Subject: [PATCH 126/175] Fix broken internal link (#1574) --- layouts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layouts.md b/layouts.md index 8612a2e97..295b24df2 100644 --- a/layouts.md +++ b/layouts.md @@ -34,7 +34,7 @@ If the layout has exactly 2 keys in the bottom row, these keys will replace comm * `text_key`: normal key, default * `auto_text_key`: used in FlorisBoard for a key that changes text case when shift is enabled, HeliBoard does that anyway unless disabled with a _labelFlag_ * `multi_text_key`: key with an array of code points, e.g. `{ "$": "multi_text_key", "codePoints": [2509, 2480], "label": "্র" }` - * there are also selector classes, which allow to change keys conditionally, see the [dvorak layout](https://github.com/Helium314/HeliBoard/blob/main/app/src/main/assets/layouts/dvorak.json) for an example: + * there are also selector classes, which allow to change keys conditionally, see the [dvorak layout](https://github.com/Helium314/HeliBoard/blob/main/app/src/main/assets/layouts/main/dvorak.json) for an example: * `case_selector`: keys for `lower` and `upper` (both mandatory), similar to `shift_state_selector` * `shift_state_selector`: keys for `unshifted`, `shifted`, `shiftedManual`, `shiftedAutomatic`, `capsLock`, `manualOrLocked`, `default` (all optional) * `variation_selector`: keys for input types `datetime`, `time`, `date`, `password`, `normal`, `uri`, `email`, `default` (all optional) From e154001d44b9cf113f604fe4cf2d69fe7248bda3 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 18 May 2025 20:48:28 +0200 Subject: [PATCH 127/175] fix broken links, remove outdated information --- layouts.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/layouts.md b/layouts.md index 295b24df2..75aad7247 100644 --- a/layouts.md +++ b/layouts.md @@ -1,8 +1,8 @@ # A compilation of information about the layout formats usable in this app. There are two distinct formats: -* the _simple_ format is a text file with one key label per line, and two consecutive line breaks indicating a switch to the next row, [example](app/src/main/assets/layouts/qwerty.txt) -* the _json_ format taken from [FlorisBoard](https://github.com/florisboard/florisboard/blob/master/CONTRIBUTING.md#adding-the-layout), but only "normal" keys are supported (i.e. no action keys and similar), [example](app/src/main/assets/layouts/azerty.json) +* the _simple_ format is a text file with one key label per line, and two consecutive line breaks indicating a switch to the next row, [example](app/src/main/assets/layouts/main/qwerty.txt) +* the _json_ format taken from [FlorisBoard](https://github.com/florisboard/florisboard/blob/master/CONTRIBUTING.md#adding-the-layout), but only "normal" keys are supported (i.e. no action keys and similar), [example](app/src/main/assets/layouts/main/azerty.json) You can add both directly in the app, see the related [FAQ](https://github.com/Helium314/HeliBoard/wiki/Customization#layouts). @@ -34,7 +34,7 @@ If the layout has exactly 2 keys in the bottom row, these keys will replace comm * `text_key`: normal key, default * `auto_text_key`: used in FlorisBoard for a key that changes text case when shift is enabled, HeliBoard does that anyway unless disabled with a _labelFlag_ * `multi_text_key`: key with an array of code points, e.g. `{ "$": "multi_text_key", "codePoints": [2509, 2480], "label": "্র" }` - * there are also selector classes, which allow to change keys conditionally, see the [dvorak layout](https://github.com/Helium314/HeliBoard/blob/main/app/src/main/assets/layouts/main/dvorak.json) for an example: + * there are also selector classes, which allow to change keys conditionally, see the [dvorak layout](app/src/main/assets/layouts/main/dvorak.json) for an example: * `case_selector`: keys for `lower` and `upper` (both mandatory), similar to `shift_state_selector` * `shift_state_selector`: keys for `unshifted`, `shifted`, `shiftedManual`, `shiftedAutomatic`, `capsLock`, `manualOrLocked`, `default` (all optional) * `variation_selector`: keys for input types `datetime`, `time`, `date`, `password`, `normal`, `uri`, `email`, `default` (all optional) @@ -122,7 +122,7 @@ You can also specify special key codes like `a|!code/key_action_previous` or `ab * Use `%` to mark all preceding keys as "_Language (important)_" instead. Keys after `%` will still be in the "_Language_" group. * The `punctuation` key is typically the period key. `popup_keys` set here override the default. * `[labels]` may contain non-default labels for the following keys `symbol`, `alphabet`, `shift_symbol`, `shift_symbol_tablet`, `comma`, `period`, `question` - * `[number_row]` may contain a custom number row (1-9 and 0 separated by space). You should also add the language to `numberRowLocales` in [`PreferencesSettingsFragment`](app/src/main/java/helium314/keyboard/latin/settings/PreferencesSettingsFragment.java) so the user can opt into having a localized number row. + * `[number_row]` may contain a custom number row (1-9 and 0 separated by space). * `[extra_keys]` are typically keys shown in the default layout of the language. This is currently only used for latin layouts to avoid duplicating layouts for just adding few keys on the right side. The layout name need to end with `+`, but the `+` is removed when looking up the actual layout. * If you add a new language for which Android does not have a display name, it will be displayed using the language tag * Avoiding this currently is more complicated than necessary: add the language to [LocaleUtils.doesNotHaveAndroidName](/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt#L210) to have an exception, and add a string named `subtype_` to [`strings.xml`](/app/src/main/res/values/strings.xml). In case you still have it not displayed properly, you may need to add a `subtype_in_root_locale_` to [donottranslate.xml](/app/src/main/res/values/donottranslate.xml), and add the language tag to `subtype_locale_exception_keys` and `subtype_locale_displayed_in_root_locale`. From e7ccf72fc54f31bfb12f2b2f432feca40c1aa172 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 18 May 2025 21:32:53 +0200 Subject: [PATCH 128/175] reduce unnecessary json parse attempts when editing layouts --- .../helium314/keyboard/latin/utils/LayoutUtilsCustom.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtilsCustom.kt b/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtilsCustom.kt index 19b44f739..4f8686442 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtilsCustom.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtilsCustom.kt @@ -36,11 +36,13 @@ object LayoutUtilsCustom { params.mPopupKeyTypes.add(POPUP_KEYS_LAYOUT) addLocaleKeyTextsToParams(context, params, POPUP_KEYS_NORMAL) try { - val keys = LayoutParser.parseJsonString(layoutContent).map { row -> row.mapNotNull { it.compute(params)?.toKeyParams(params) } } - return checkKeys(keys) + if (layoutContent.trimStart().startsWith("[") || layoutContent.trimStart().startsWith("//")) { + val keys = LayoutParser.parseJsonString(layoutContent).map { row -> row.mapNotNull { it.compute(params)?.toKeyParams(params) } } + return checkKeys(keys) + } } catch (e: SerializationException) { Log.w(TAG, "json parsing error", e) - if (layoutContent.trimStart().startsWith("[") && layoutContent.trimEnd().endsWith("]") && layoutContent.contains("},")) + if (layoutContent.trimEnd().endsWith("]") && layoutContent.contains("},")) return false // we're sure enough it's a json } catch (e: Exception) { Log.w(TAG, "json layout parsed, but considered invalid", e) From e45f0660a269be82ad3dc68f23691bd19e42b305 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 18 May 2025 21:52:25 +0200 Subject: [PATCH 129/175] process label for simple popup keys now toolbar keys and defined key labels work in simple layout popup keys --- .../keyboard_parser/floris/PopupSet.kt | 2 +- .../keyboard_parser/floris/TextKeyData.kt | 76 +++++++++---------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/PopupSet.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/PopupSet.kt index f0cb2cb40..8d696ddaf 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/PopupSet.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/PopupSet.kt @@ -49,6 +49,6 @@ open class PopupSet( } class SimplePopups(val popupKeys: Collection?) : PopupSet() { - override fun getPopupKeyLabels(params: KeyboardParams) = popupKeys + override fun getPopupKeyLabels(params: KeyboardParams) = popupKeys?.map { KeyData.processLabel(it, params) } override fun isEmpty(): Boolean = popupKeys.isNullOrEmpty() } diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt index dcb50e802..d3abc77d0 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt @@ -12,6 +12,7 @@ import kotlinx.serialization.Transient import helium314.keyboard.keyboard.Key import helium314.keyboard.keyboard.KeyboardId import helium314.keyboard.keyboard.KeyboardTheme +import helium314.keyboard.keyboard.internal.KeyboardCodesSet import helium314.keyboard.keyboard.internal.KeyboardIconsSet import helium314.keyboard.keyboard.internal.KeyboardParams import helium314.keyboard.keyboard.internal.keyboard_parser.floris.KeyCode.checkAndConvertCode @@ -285,6 +286,34 @@ sealed interface KeyData : AbstractKeyData { return getStringInLocale(id, params) } + fun processLabel(label: String, params: KeyboardParams): String = when (label) { + KeyLabel.SYMBOL_ALPHA -> if (params.mId.isAlphabetKeyboard) params.mLocaleKeyboardInfos.labelSymbol else params.mLocaleKeyboardInfos.labelAlphabet + KeyLabel.SYMBOL -> params.mLocaleKeyboardInfos.labelSymbol + KeyLabel.ALPHA -> params.mLocaleKeyboardInfos.labelAlphabet + KeyLabel.COMMA -> params.mLocaleKeyboardInfos.labelComma + KeyLabel.PERIOD -> getPeriodLabel(params) + KeyLabel.SPACE -> getSpaceLabel(params) + KeyLabel.ACTION -> "${getActionKeyLabel(params)}|${getActionKeyCode(params)}" + KeyLabel.DELETE -> "!icon/delete_key|!code/key_delete" + KeyLabel.SHIFT -> "${getShiftLabel(params)}|!code/key_shift" + KeyLabel.COM -> params.mLocaleKeyboardInfos.tlds.first() + KeyLabel.LANGUAGE_SWITCH -> "!icon/language_switch_key|!code/key_language_switch" + KeyLabel.ZWNJ -> "!icon/zwnj_key|\u200C" + KeyLabel.CURRENCY -> params.mLocaleKeyboardInfos.currencyKey.first + KeyLabel.CURRENCY1 -> params.mLocaleKeyboardInfos.currencyKey.second[0] + KeyLabel.CURRENCY2 -> params.mLocaleKeyboardInfos.currencyKey.second[1] + KeyLabel.CURRENCY3 -> params.mLocaleKeyboardInfos.currencyKey.second[2] + KeyLabel.CURRENCY4 -> params.mLocaleKeyboardInfos.currencyKey.second[3] + KeyLabel.CURRENCY5 -> params.mLocaleKeyboardInfos.currencyKey.second[4] + KeyLabel.CTRL, KeyLabel.ALT, KeyLabel.FN, KeyLabel.META , KeyLabel.ESCAPE -> label.uppercase(Locale.US) + KeyLabel.TAB -> "!icon/tab_key|!code/${KeyCode.TAB}" + else -> { + if (label in toolbarKeyStrings.values) { + "!icon/$label|!code/${getCodeForToolbarKey(ToolbarKey.valueOf(label.uppercase(Locale.US)))}" + } else label + } + } + // could make arrays right away, but they need to be copied anyway as popupKeys arrays are modified when creating KeyParams private const val POPUP_EYS_NAVIGATE_PREVIOUS = "!icon/previous_key|!code/key_action_previous,!icon/clipboard_action_key|!code/key_clipboard" private const val POPUP_EYS_NAVIGATE_NEXT = "!icon/clipboard_action_key|!code/key_clipboard,!icon/next_key|!code/key_action_next" @@ -301,12 +330,13 @@ sealed interface KeyData : AbstractKeyData { // so better only do it in case the popup stuff needs more improvements // idea: directly create PopupKeySpec, but need to deal with needsToUpcase and popupKeysColumnAndFlags fun getPopupLabel(params: KeyboardParams): String { - val newLabel = processLabel(params) + val newLabel = processLabel(label, params) if (code == KeyCode.UNSPECIFIED) { - if (newLabel == label) return label + if (newLabel == label || newLabel.contains(KeyboardCodesSet.PREFIX_CODE)) + return newLabel val newCode = processCode() - if (newLabel.endsWith("|")) return "${newLabel}!code/$newCode" // for toolbar keys - return if (newCode == code) newLabel else "${newLabel}|!code/$newCode" + if (newLabel.endsWith("|")) return "${newLabel}${KeyboardCodesSet.PREFIX_CODE}$newCode" // maybe not used any more + return if (newCode == code) newLabel else "${newLabel}|${KeyboardCodesSet.PREFIX_CODE}$newCode" } if (code >= 32) { if (newLabel.startsWith(KeyboardIconsSet.PREFIX_ICON)) { @@ -324,12 +354,12 @@ sealed interface KeyData : AbstractKeyData { val outputText = String(codePoints, 0, codePoints.size) return "${newLabel}|$outputText" } - return if (newLabel.endsWith("|")) "$newLabel!code/${processCode()}" // for toolbar keys - else "$newLabel|!code/${processCode()}" + return if (newLabel.endsWith("|")) "$newLabel${KeyboardCodesSet.PREFIX_CODE}${processCode()}" // for toolbar keys + else "$newLabel|${KeyboardCodesSet.PREFIX_CODE}${processCode()}" } fun getCurrencyLabel(params: KeyboardParams): String { - val newLabel = processLabel(params) + val newLabel = processLabel(label, params) return when (code) { // consider currency codes for label KeyCode.CURRENCY_SLOT_1 -> "$newLabel|${params.mLocaleKeyboardInfos.currencyKey.first}" @@ -388,7 +418,7 @@ sealed interface KeyData : AbstractKeyData { newLabel = getCurrencyLabel(params) } else { newCode = processCode() - newLabel = processLabel(params) + newLabel = processLabel(label, params) } var newLabelFlags = labelFlags or additionalLabelFlags or getAdditionalLabelFlags(params) val newPopupKeys = popup.merge(getAdditionalPopupKeys(params)) @@ -474,36 +504,6 @@ sealed interface KeyData : AbstractKeyData { else params.mDefaultKeyWidth } - // todo (later): encoding the code in the label should be avoided, because we know it already - private fun processLabel(params: KeyboardParams): String = when (label) { - KeyLabel.SYMBOL_ALPHA -> if (params.mId.isAlphabetKeyboard) params.mLocaleKeyboardInfos.labelSymbol else params.mLocaleKeyboardInfos.labelAlphabet - KeyLabel.SYMBOL -> params.mLocaleKeyboardInfos.labelSymbol - KeyLabel.ALPHA -> params.mLocaleKeyboardInfos.labelAlphabet - KeyLabel.COMMA -> params.mLocaleKeyboardInfos.labelComma - KeyLabel.PERIOD -> getPeriodLabel(params) - KeyLabel.SPACE -> getSpaceLabel(params) - KeyLabel.ACTION -> "${getActionKeyLabel(params)}|${getActionKeyCode(params)}" - KeyLabel.DELETE -> "!icon/delete_key|!code/key_delete" - KeyLabel.SHIFT -> "${getShiftLabel(params)}|!code/key_shift" -// KeyLabel.EMOJI -> "!icon/emoji_normal_key|!code/key_emoji" - KeyLabel.COM -> params.mLocaleKeyboardInfos.tlds.first() - KeyLabel.LANGUAGE_SWITCH -> "!icon/language_switch_key|!code/key_language_switch" - KeyLabel.ZWNJ -> "!icon/zwnj_key|\u200C" - KeyLabel.CURRENCY -> params.mLocaleKeyboardInfos.currencyKey.first - KeyLabel.CURRENCY1 -> params.mLocaleKeyboardInfos.currencyKey.second[0] - KeyLabel.CURRENCY2 -> params.mLocaleKeyboardInfos.currencyKey.second[1] - KeyLabel.CURRENCY3 -> params.mLocaleKeyboardInfos.currencyKey.second[2] - KeyLabel.CURRENCY4 -> params.mLocaleKeyboardInfos.currencyKey.second[3] - KeyLabel.CURRENCY5 -> params.mLocaleKeyboardInfos.currencyKey.second[4] - KeyLabel.CTRL, KeyLabel.ALT, KeyLabel.FN, KeyLabel.META , KeyLabel.ESCAPE -> label.uppercase(Locale.US) - KeyLabel.TAB -> "!icon/tab_key|" - else -> { - if (label in toolbarKeyStrings.values) { - "!icon/$label|" - } else label - } - } - private fun processCode(): Int { if (code != KeyCode.UNSPECIFIED) return code return when (label) { From 4ecf185431b999b44725dffee897e41a9d1b9d63 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 18 May 2025 22:03:04 +0200 Subject: [PATCH 130/175] add label for timestamp key --- .../keyboard/internal/keyboard_parser/floris/KeyLabel.kt | 1 + .../keyboard/internal/keyboard_parser/floris/TextKeyData.kt | 2 ++ 2 files changed, 3 insertions(+) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyLabel.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyLabel.kt index 221bb432a..01c73c2d7 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyLabel.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyLabel.kt @@ -31,6 +31,7 @@ object KeyLabel { const val META = "meta" const val TAB = "tab" const val ESCAPE = "esc" + const val TIMESTAMP = "timestamp" /** to make sure a FlorisBoard label works when reading a JSON layout */ // resulting special labels should be names of FunctionalKey enum, case insensitive diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt index d3abc77d0..38ced5992 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt @@ -307,6 +307,7 @@ sealed interface KeyData : AbstractKeyData { KeyLabel.CURRENCY5 -> params.mLocaleKeyboardInfos.currencyKey.second[4] KeyLabel.CTRL, KeyLabel.ALT, KeyLabel.FN, KeyLabel.META , KeyLabel.ESCAPE -> label.uppercase(Locale.US) KeyLabel.TAB -> "!icon/tab_key|!code/${KeyCode.TAB}" + KeyLabel.TIMESTAMP -> "⌚|!code/${KeyCode.TIMESTAMP}" else -> { if (label in toolbarKeyStrings.values) { "!icon/$label|!code/${getCodeForToolbarKey(ToolbarKey.valueOf(label.uppercase(Locale.US)))}" @@ -516,6 +517,7 @@ sealed interface KeyData : AbstractKeyData { KeyLabel.META -> KeyCode.META KeyLabel.TAB -> KeyCode.TAB KeyLabel.ESCAPE -> KeyCode.ESCAPE + KeyLabel.TIMESTAMP -> KeyCode.TIMESTAMP else -> { if (label in toolbarKeyStrings.values) { getCodeForToolbarKey(ToolbarKey.valueOf(label.uppercase(Locale.US))) From 960f058b7e27985c6fbe9e940e7712f7172c408c Mon Sep 17 00:00:00 2001 From: Helium314 Date: Tue, 20 May 2025 20:44:57 +0200 Subject: [PATCH 131/175] move DictionaryFacilitatoryImpl to Kotlin only very minor changes to behavior using coroutines instead of ExecutorUtils some code moved out of "main" facilitator --- .../latin/DictionaryFacilitatorImpl.java | 1106 ----------------- .../latin/DictionaryFacilitatorImpl.kt | 827 ++++++++++++ 2 files changed, 827 insertions(+), 1106 deletions(-) delete mode 100644 app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java create mode 100644 app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java deleted file mode 100644 index 2bd17f62e..000000000 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.java +++ /dev/null @@ -1,1106 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * modified - * SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only - */ - -package helium314.keyboard.latin; - -import android.Manifest; -import android.content.Context; -import android.provider.UserDictionary; -import android.text.TextUtils; -import android.util.LruCache; -import android.view.inputmethod.InputMethodSubtype; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Scanner; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -import helium314.keyboard.keyboard.Keyboard; -import helium314.keyboard.keyboard.emoji.SupportedEmojis; -import helium314.keyboard.latin.NgramContext.WordInfo; -import helium314.keyboard.latin.SuggestedWords.SuggestedWordInfo; -import helium314.keyboard.latin.common.ComposedData; -import helium314.keyboard.latin.common.Constants; -import helium314.keyboard.latin.common.StringUtils; -import helium314.keyboard.latin.common.StringUtilsKt; -import helium314.keyboard.latin.permissions.PermissionsUtil; -import helium314.keyboard.latin.personalization.UserHistoryDictionary; -import helium314.keyboard.latin.settings.Settings; -import helium314.keyboard.latin.settings.SettingsValues; -import helium314.keyboard.latin.settings.SettingsValuesForSuggestion; -import helium314.keyboard.latin.utils.ExecutorUtils; -import helium314.keyboard.latin.utils.KtxKt; -import helium314.keyboard.latin.utils.Log; -import helium314.keyboard.latin.utils.SubtypeSettings; -import helium314.keyboard.latin.utils.SubtypeUtilsKt; -import helium314.keyboard.latin.utils.SuggestionResults; - -/** - * Facilitates interaction with different kinds of dictionaries. Provides APIs - * to instantiate and select the correct dictionaries (based on language or account), - * update entries and fetch suggestions. - *

      - * Currently AndroidSpellCheckerService and LatinIME both use DictionaryFacilitator as - * a client for interacting with dictionaries. - */ -public class DictionaryFacilitatorImpl implements DictionaryFacilitator { - public static final String TAG = DictionaryFacilitatorImpl.class.getSimpleName(); - - // HACK: This threshold is being used when adding a capitalized entry in the User History - // dictionary. - private static final int CAPITALIZED_FORM_MAX_PROBABILITY_FOR_INSERT = 140; - - private ArrayList mDictionaryGroups = new ArrayList<>() {{ add(new DictionaryGroup()); }}; - private volatile CountDownLatch mLatchForWaitingLoadingMainDictionaries = new CountDownLatch(0); - // To synchronize assigning mDictionaryGroup to ensure closing dictionaries. - private final Object mLock = new Object(); - // library does not deal well with ngram history for auto-capitalized words, so we adjust the ngram - // context to store next word suggestions for such cases - private boolean mTryChangingWords = false; - private String mChangeFrom = ""; - private String mChangeTo = ""; - - // todo: write cache never set, and never read (only written) - // tried to use read cache for a while, but small performance improvements are not worth the work (https://github.com/Helium314/HeliBoard/issues/307) - private LruCache mValidSpellingWordReadCache; - private LruCache mValidSpellingWordWriteCache; - - @Override - public void setValidSpellingWordReadCache(final LruCache cache) { - mValidSpellingWordReadCache = cache; - } - - @Override - public void setValidSpellingWordWriteCache(final LruCache cache) { - mValidSpellingWordWriteCache = cache; - } - - // judging by usage, this should check primary locale only - @Override - public boolean isForLocale(final Locale locale) { - return locale != null && locale.equals(mDictionaryGroups.get(0).mLocale); - } - - private boolean hasLocale(final Locale locale) { - if (locale == null) return false; - for (DictionaryGroup dictionaryGroup : mDictionaryGroups) { - if (locale.equals(dictionaryGroup.mLocale)) return true; - } - return false; - } - - /** - * A group of dictionaries that work together for a single language. - */ - private static class DictionaryGroup { - private static final int MAX_CONFIDENCE = 2; - - /** - * The locale associated with the dictionary group. - */ - @NonNull public final Locale mLocale; - - /** - * The user account associated with the dictionary group. - */ - @Nullable public final String mAccount; - - @Nullable private Dictionary mMainDict; - // Confidence that the most probable language is actually the language the user is - // typing in. For now, this is simply the number of times a word from this language - // has been committed in a row, with an exception when typing a single word not contained - // in this language. - private int mConfidence = 1; - - // words cannot be removed from main dictionary, so we use a blacklist instead - public String blacklistFileName = null; - public Set blacklist = new HashSet<>(); - - // allow to go above max confidence, for better determination of currently preferred language - // when decreasing confidence or getting weight factor, limit to maximum - public void increaseConfidence() { - mConfidence += 1; - } - - // If confidence is above max, drop to max confidence. This does not change weights and - // allows conveniently typing single words from the other language without affecting suggestions - public void decreaseConfidence() { - if (mConfidence > MAX_CONFIDENCE) - mConfidence = MAX_CONFIDENCE; - else if (mConfidence > 0) { - mConfidence -= 1; - } - } - - public float getWeightForTypingInLocale(List groups) { - return getWeightForLocale(groups, 0.15f); - } - - public float getWeightForGesturingInLocale(List groups) { - return getWeightForLocale(groups, 0.05f); - } - - // might need some more tuning - private float getWeightForLocale(final List groups, final float step) { - if (groups.size() == 1) return 1f; - if (mConfidence < 2) return 1f - step * (MAX_CONFIDENCE - mConfidence); - for (DictionaryGroup group : groups) { - if (group != this && group.mConfidence >= mConfidence) return 1f - step / 2f; - } - return 1f; - } - public final ConcurrentHashMap mSubDictMap = - new ConcurrentHashMap<>(); - - public DictionaryGroup() { - this(new Locale(""), null, null, Collections.emptyMap()); - } - - public DictionaryGroup(@NonNull final Locale locale, - @Nullable final Dictionary mainDict, - @Nullable final String account, - @NonNull final Map subDicts) { - mLocale = locale; - mAccount = account; - // The main dictionary can be asynchronously loaded. - setMainDict(mainDict); - for (final Map.Entry entry : subDicts.entrySet()) { - setSubDict(entry.getKey(), entry.getValue()); - } - } - - private void setSubDict(@NonNull final String dictType, @NonNull final ExpandableBinaryDictionary dict) { - mSubDictMap.put(dictType, dict); - } - - public void setMainDict(@Nullable final Dictionary mainDict) { - // Close old dictionary if exists. Main dictionary can be assigned multiple times. - final Dictionary oldDict = mMainDict; - mMainDict = mainDict; - if (oldDict != null && mainDict != oldDict) { - oldDict.close(); - } - } - - public @Nullable Dictionary getDict(@NonNull final String dictType) { - if (Dictionary.TYPE_MAIN.equals(dictType)) { - return mMainDict; - } - return getSubDict(dictType); - } - - public @Nullable ExpandableBinaryDictionary getSubDict(@NonNull final String dictType) { - return mSubDictMap.get(dictType); - } - - public boolean hasDict(@NonNull final String dictType, @Nullable final String account) { - if (Dictionary.TYPE_MAIN.equals(dictType)) { - return mMainDict != null; - } - if (Dictionary.TYPE_USER_HISTORY.equals(dictType) && - !TextUtils.equals(account, mAccount)) { - // If the dictionary type is user history, & if the account doesn't match, - // return immediately. If the account matches, continue looking it up in the - // sub dictionary map. - return false; - } - return mSubDictMap.containsKey(dictType); - } - - public void closeDict(@NonNull final String dictType) { - final Dictionary dict; - if (Dictionary.TYPE_MAIN.equals(dictType)) { - dict = mMainDict; - } else { - dict = mSubDictMap.remove(dictType); - } - if (dict != null) { - dict.close(); - } - } - } - - public DictionaryFacilitatorImpl() { - } - - @Override - public void onStartInput() { - } - - @Override - public void onFinishInput(Context context) { - for (DictionaryGroup dictionaryGroup : mDictionaryGroups) { - for (final String dictType : ALL_DICTIONARY_TYPES) { - Dictionary dict = dictionaryGroup.getDict(dictType); - if (dict != null) dict.onFinishInput(); - } - } - } - - @Override - public boolean isActive() { - return !mDictionaryGroups.get(0).mLocale.getLanguage().isEmpty(); - } - - @Override - @NonNull - public Locale getMainLocale() { - return mDictionaryGroups.get(0).mLocale; - } - - @Override - public Locale getCurrentLocale() { - return getCurrentlyPreferredDictionaryGroup().mLocale; - } - - public boolean usesContacts() { - return mDictionaryGroups.get(0).getSubDict(Dictionary.TYPE_CONTACTS) != null; - } - - public boolean usesApps() { - return mDictionaryGroups.get(0).getSubDict(Dictionary.TYPE_APPS) != null; - } - - public boolean usesPersonalization() { - return mDictionaryGroups.get(0).getSubDict(Dictionary.TYPE_USER_HISTORY) != null; - } - - @Override - public String getAccount() { - return null; - } - - @Override - public boolean usesSameSettings(@NonNull final List locales, final boolean contacts, - final boolean apps, final boolean personalization, @Nullable final String account) { - final boolean first = usesContacts() == contacts && usesApps() == apps - && usesPersonalization() == personalization - && TextUtils.equals(mDictionaryGroups.get(0).mAccount, account) - && locales.size() == mDictionaryGroups.size(); - if (!first) return false; - for (int i = 0; i < locales.size(); i++) { - if (locales.get(i) != mDictionaryGroups.get(i).mLocale) return false; - } - return true; - } - - @Nullable - private static ExpandableBinaryDictionary getSubDict(final String dictType, - final Context context, final Locale locale, final File dictFile, - final String dictNamePrefix, @Nullable final String account) { - ExpandableBinaryDictionary dict = null; - try { - dict = switch (dictType) { - case Dictionary.TYPE_USER_HISTORY -> UserHistoryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account); - case Dictionary.TYPE_USER -> UserBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account); - case Dictionary.TYPE_CONTACTS -> ContactsBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account); - case Dictionary.TYPE_APPS -> AppsBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account); - default -> null; - }; - } catch (final SecurityException | IllegalArgumentException e) { - Log.e(TAG, "Cannot create dictionary: " + dictType, e); - } - if (dict == null) - Log.e(TAG, "Cannot create dictionary for " + dictType); - return dict; - } - - @Nullable - static DictionaryGroup findDictionaryGroupWithLocale(final List dictionaryGroups, - @NonNull final Locale locale) { - if (dictionaryGroups == null) return null; - for (DictionaryGroup dictionaryGroup : dictionaryGroups) { - if (locale.equals(dictionaryGroup.mLocale)) - return dictionaryGroup; - } - return null; - } - - // original - public void resetDictionaries( - final Context context, - @NonNull final Locale newLocale, - final boolean useContactsDict, - final boolean useAppsDict, - final boolean usePersonalizedDicts, - final boolean forceReloadMainDictionary, - @Nullable final String account, - final String dictNamePrefix, - @Nullable final DictionaryInitializationListener listener) { - final HashMap> existingDictionariesToCleanup = new HashMap<>(); - final HashSet subDictTypesToUse = new HashSet<>(); - subDictTypesToUse.add(Dictionary.TYPE_USER); - Log.i(TAG, "resetDictionaries, force reloading main dictionary: " + forceReloadMainDictionary); - final List allLocales = new ArrayList<>() {{ - add(newLocale); - - // adding secondary locales is a bit tricky since they depend on the subtype - // but usually this is called with the selected subtype locale - final InputMethodSubtype selected = SubtypeSettings.INSTANCE.getSelectedSubtype(KtxKt.prefs(context)); - if (SubtypeUtilsKt.locale(selected).equals(newLocale)) { - addAll(SubtypeUtilsKt.getSecondaryLocales(selected.getExtraValue())); - } else { - // probably we're called from the spell checker when using a different app as keyboard - final List enabled = SubtypeSettings.INSTANCE.getEnabledSubtypes(false); - for (InputMethodSubtype subtype : enabled) { - if (SubtypeUtilsKt.locale(subtype).equals(newLocale)) - addAll(SubtypeUtilsKt.getSecondaryLocales(subtype.getExtraValue())); - } - } - }}; - - // Do not use contacts dictionary if we do not have permissions to read contacts. - if (useContactsDict - && PermissionsUtil.checkAllPermissionsGranted(context, Manifest.permission.READ_CONTACTS)) { - subDictTypesToUse.add(Dictionary.TYPE_CONTACTS); - } - if (useAppsDict) { - subDictTypesToUse.add(Dictionary.TYPE_APPS); - } - if (usePersonalizedDicts) { - subDictTypesToUse.add(Dictionary.TYPE_USER_HISTORY); - } - - // Gather all dictionaries by locale. We may remove some from the list to clean up later. - for (DictionaryGroup dictionaryGroup : mDictionaryGroups) { - final ArrayList dictTypeForLocale = new ArrayList<>(); - existingDictionariesToCleanup.put(dictionaryGroup.mLocale, dictTypeForLocale); - - for (final String dictType : DYNAMIC_DICTIONARY_TYPES) { - if (dictionaryGroup.hasDict(dictType, account)) { - dictTypeForLocale.add(dictType); - } - } - if (dictionaryGroup.hasDict(Dictionary.TYPE_MAIN, account)) { - dictTypeForLocale.add(Dictionary.TYPE_MAIN); - } - } - - // create new dictionary groups and remove dictionaries to re-use from existingDictionariesToCleanup - final ArrayList newDictionaryGroups = new ArrayList<>(allLocales.size()); - for (Locale locale : allLocales) { - // get existing dictionary group for new locale - final DictionaryGroup oldDictionaryGroupForLocale = findDictionaryGroupWithLocale(mDictionaryGroups, locale); - final ArrayList dictTypesToCleanupForLocale = existingDictionariesToCleanup.get(locale); - final boolean noExistingDictsForThisLocale = (null == oldDictionaryGroupForLocale); - - // create new or re-use already loaded main dict - final Dictionary mainDict; - if (forceReloadMainDictionary || noExistingDictsForThisLocale - || !oldDictionaryGroupForLocale.hasDict(Dictionary.TYPE_MAIN, account)) { - mainDict = null; - } else { - mainDict = oldDictionaryGroupForLocale.getDict(Dictionary.TYPE_MAIN); - dictTypesToCleanupForLocale.remove(Dictionary.TYPE_MAIN); - } - - // create new or re-use already loaded sub-dicts - final Map subDicts = new HashMap<>(); - for (final String subDictType : subDictTypesToUse) { - final ExpandableBinaryDictionary subDict; - if (noExistingDictsForThisLocale || forceReloadMainDictionary - || !oldDictionaryGroupForLocale.hasDict(subDictType, account)) { - // Create a new dictionary. - subDict = getSubDict(subDictType, context, locale, null, dictNamePrefix, account); - if (subDict == null) continue; // https://github.com/Helium314/HeliBoard/issues/293 - } else { - // Reuse the existing dictionary, and don't close it at the end - subDict = oldDictionaryGroupForLocale.getSubDict(subDictType); - dictTypesToCleanupForLocale.remove(subDictType); - } - subDicts.put(subDictType, subDict); - } - DictionaryGroup newDictGroup = new DictionaryGroup(locale, mainDict, account, subDicts); - newDictionaryGroups.add(newDictGroup); - - // load blacklist - if (noExistingDictsForThisLocale) { - newDictGroup.blacklistFileName = context.getFilesDir().getAbsolutePath() + File.separator + "blacklists" + File.separator + locale.toLanguageTag() + ".txt"; - if (!new File(newDictGroup.blacklistFileName).exists()) - new File(context.getFilesDir().getAbsolutePath() + File.separator + "blacklists").mkdirs(); - newDictGroup.blacklist.addAll(readBlacklistFile(newDictGroup.blacklistFileName)); - } else { - // re-use if possible - newDictGroup.blacklistFileName = oldDictionaryGroupForLocale.blacklistFileName; - newDictGroup.blacklist.addAll(oldDictionaryGroupForLocale.blacklist); - } - } - - - // Replace Dictionaries. - final List oldDictionaryGroups; - synchronized (mLock) { - oldDictionaryGroups = mDictionaryGroups; - mDictionaryGroups = newDictionaryGroups; - if (hasAtLeastOneUninitializedMainDictionary()) { - asyncReloadUninitializedMainDictionaries(context, allLocales, listener); - } - } - - if (listener != null) { - listener.onUpdateMainDictionaryAvailability(hasAtLeastOneInitializedMainDictionary()); - } - - // Clean up old dictionaries. - for (final Locale localeToCleanUp : existingDictionariesToCleanup.keySet()) { - final ArrayList dictTypesToCleanUp = existingDictionariesToCleanup.get(localeToCleanUp); - final DictionaryGroup dictionarySetToCleanup = findDictionaryGroupWithLocale(oldDictionaryGroups, localeToCleanUp); - for (final String dictType : dictTypesToCleanUp) { - dictionarySetToCleanup.closeDict(dictType); - } - } - - if (mValidSpellingWordWriteCache != null) { - mValidSpellingWordWriteCache.evictAll(); - } - if (mValidSpellingWordReadCache != null) { - mValidSpellingWordReadCache.evictAll(); - } - } - - private void asyncReloadUninitializedMainDictionaries(final Context context, - final List locales, final DictionaryInitializationListener listener) { - final CountDownLatch latchForWaitingLoadingMainDictionary = new CountDownLatch(1); - mLatchForWaitingLoadingMainDictionaries = latchForWaitingLoadingMainDictionary; - ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD).execute(() -> - doReloadUninitializedMainDictionaries(context, locales, listener, latchForWaitingLoadingMainDictionary)); - } - - void doReloadUninitializedMainDictionaries(final Context context, final List locales, - final DictionaryInitializationListener listener, - final CountDownLatch latchForWaitingLoadingMainDictionary) { - final Dictionary[] mainDicts = new Dictionary[locales.size()]; - final ArrayList dictionaryGroups = new ArrayList<>(); - for (int i = 0; i < locales.size(); i++) { - Locale locale = locales.get(i); - DictionaryGroup dictionaryGroup = findDictionaryGroupWithLocale(mDictionaryGroups, locale); - if (null == dictionaryGroup) { - // This should never happen, but better safe than crashy - Log.w(TAG, "Expected a dictionary group for " + locale + " but none found"); - return; - } - dictionaryGroups.add(dictionaryGroup); - // do nothing if main dict already initialized - if (dictionaryGroup.mMainDict != null && dictionaryGroup.mMainDict.isInitialized()) { - mainDicts[i] = null; - continue; - } - mainDicts[i] = DictionaryFactoryKt.createMainDictionary(context, dictionaryGroup.mLocale); - } - - synchronized (mLock) { - for (int i = 0; i < locales.size(); i++) { - final Locale locale = locales.get(i); - if (mainDicts[i] == null) - continue; - if (locale.equals(dictionaryGroups.get(i).mLocale)) { - dictionaryGroups.get(i).setMainDict(mainDicts[i]); - } else { - // Dictionary facilitator has been reset for another locale. - mainDicts[i].close(); - } - } - } - if (listener != null) { - listener.onUpdateMainDictionaryAvailability(hasAtLeastOneInitializedMainDictionary()); - } - latchForWaitingLoadingMainDictionary.countDown(); - } - - public void closeDictionaries() { - final ArrayList dictionaryGroupsToClose; - synchronized (mLock) { - dictionaryGroupsToClose = new ArrayList<>(mDictionaryGroups); - mDictionaryGroups.clear(); - mDictionaryGroups.add(new DictionaryGroup()); - } - for (DictionaryGroup dictionaryGroup : dictionaryGroupsToClose) { - for (final String dictType : ALL_DICTIONARY_TYPES) { - dictionaryGroup.closeDict(dictType); - } - } - } - - // The main dictionaries are loaded asynchronously. Don't cache the return value - // of these methods. - public boolean hasAtLeastOneInitializedMainDictionary() { - for (DictionaryGroup dictionaryGroup : mDictionaryGroups) { - final Dictionary mainDict = dictionaryGroup.getDict(Dictionary.TYPE_MAIN); - if (mainDict != null && mainDict.isInitialized()) return true; - } - return false; - } - - public boolean hasAtLeastOneUninitializedMainDictionary() { - for (DictionaryGroup dictionaryGroup : mDictionaryGroups) { - final Dictionary mainDict = dictionaryGroup.getDict(Dictionary.TYPE_MAIN); - if (mainDict == null || !mainDict.isInitialized()) return true; - } - return false; - } - - public void waitForLoadingMainDictionaries(final long timeout, final TimeUnit unit) - throws InterruptedException { - mLatchForWaitingLoadingMainDictionaries.await(timeout, unit); - } - - public void addToUserHistory(final String suggestion, final boolean wasAutoCapitalized, - @NonNull final NgramContext ngramContext, final long timeStampInSeconds, - final boolean blockPotentiallyOffensive) { - // Update the spelling cache before learning. Words that are not yet added to user history - // and appear in no other language model are not considered valid. - putWordIntoValidSpellingWordCache("addToUserHistory", suggestion); - - final String[] words = suggestion.split(Constants.WORD_SEPARATOR); - - // increase / decrease confidence if we have more than one dictionary group - boolean[] validWordForDictionary; // store results to avoid unnecessary duplicate lookups - if (mDictionaryGroups.size() > 1 && words.length == 1) { // ignore if more than a single word, this only happens with (badly working) spaceAwareGesture - validWordForDictionary = adjustConfidencesInternal(suggestion, wasAutoCapitalized); - } else - validWordForDictionary = null; - - // add word to user dictionary if it is in no other dictionary except user history dictionary, - // reasoning: typing the same word again -> we probably want it in some dictionary permanently - final SettingsValues sv = Settings.getValues(); - if (sv.mAddToPersonalDictionary // require the setting - && sv.mAutoCorrectEnabled == sv.mAutoCorrectionEnabledPerUserSettings // don't add if user wants autocorrect but input field does not, see https://github.com/Helium314/HeliBoard/issues/427#issuecomment-1905438000 - && mDictionaryGroups.get(0).hasDict(Dictionary.TYPE_USER_HISTORY, mDictionaryGroups.get(0).mAccount) // require personalized suggestions - && !wasAutoCapitalized // we can't be 100% sure about what the user intended to type, so better don't add it - && words.length == 1) { // ignore if more than a single word, this only happens with (badly working) spaceAwareGesture - addToPersonalDictionaryIfInvalidButInHistory(suggestion, validWordForDictionary); - } - - NgramContext ngramContextForCurrentWord = ngramContext; - for (int i = 0; i < words.length; i++) { - final String currentWord = words[i]; - final boolean wasCurrentWordAutoCapitalized = (i == 0) && wasAutoCapitalized; - // add to history for preferred dictionary group, to avoid mixing languages in history - addWordToUserHistory(getCurrentlyPreferredDictionaryGroup(), ngramContextForCurrentWord, currentWord, - wasCurrentWordAutoCapitalized, (int) timeStampInSeconds, - blockPotentiallyOffensive); - ngramContextForCurrentWord = - ngramContextForCurrentWord.getNextNgramContext(new WordInfo(currentWord)); - - // remove manually entered blacklisted words from blacklist - for (DictionaryGroup dictionaryGroup : mDictionaryGroups) { - if (dictionaryGroup.blacklist.remove(currentWord)) - removeWordFromBlacklistFile(currentWord, dictionaryGroup.blacklistFileName); - } - } - } - - @Override public void adjustConfidences(final String word, final boolean wasAutoCapitalized) { - if (mDictionaryGroups.size() > 1 && !word.contains(Constants.WORD_SEPARATOR)) - adjustConfidencesInternal(word, wasAutoCapitalized); - } - - private boolean[] adjustConfidencesInternal(final String word, final boolean wasAutoCapitalized) { - final boolean[] validWordForDictionary = new boolean[mDictionaryGroups.size()]; - // if suggestion was auto-capitalized, check against both the suggestion and the de-capitalized suggestion - final String decapitalizedSuggestion; - if (wasAutoCapitalized) - decapitalizedSuggestion = StringUtilsKt.decapitalize(word, getCurrentLocale()); - else - decapitalizedSuggestion = word; - for (int i = 0; i < mDictionaryGroups.size(); i ++) { - final DictionaryGroup dictionaryGroup = mDictionaryGroups.get(i); - final boolean isValidWord = isValidWord(word, ALL_DICTIONARY_TYPES, dictionaryGroup); - if (isValidWord || (wasAutoCapitalized && isValidWord(decapitalizedSuggestion, ALL_DICTIONARY_TYPES, dictionaryGroup))) - dictionaryGroup.increaseConfidence(); - else dictionaryGroup.decreaseConfidence(); - validWordForDictionary[i] = isValidWord; - } - return validWordForDictionary; - } - - // main and secondary isValid provided to avoid duplicate lookups - private void addToPersonalDictionaryIfInvalidButInHistory(String word, boolean[] validWordForDictionary) { - final DictionaryGroup dictionaryGroup = getClearlyPreferredDictionaryGroupOrNull(); - if (dictionaryGroup == null) return; - if (validWordForDictionary == null - ? isValidWord(word, ALL_DICTIONARY_TYPES, dictionaryGroup) - : validWordForDictionary[mDictionaryGroups.indexOf(dictionaryGroup)] - ) - return; - - final ExpandableBinaryDictionary userDict = dictionaryGroup.getSubDict(Dictionary.TYPE_USER); - final Dictionary userHistoryDict = dictionaryGroup.getSubDict(Dictionary.TYPE_USER_HISTORY); - if (userDict == null || userHistoryDict == null) return; - - // user history always reports words as invalid, so here we need to check isInDictionary instead - // update: now getFrequency returns the correct value instead of -1, so better use that - // a little testing shows that after 2 times adding, the frequency is 111, and then rises slowly with usage - // 120 is after 3 uses of the word, so we simply require more than that. - // also maybe a problem: words added to dictionaries (user and history) are apparently found - // only after some delay. but this is not too bad, it just delays adding - if (userHistoryDict.getFrequency(word) > 120) { - if (userDict.isInDictionary(word)) // is this check necessary? - return; - ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD).execute(() -> - UserDictionary.Words.addWord(userDict.mContext, word, - 250 /*FREQUENCY_FOR_USER_DICTIONARY_ADDS*/, null, dictionaryGroup.mLocale)); - } - } - - private void putWordIntoValidSpellingWordCache( - @NonNull final String caller, - @NonNull final String originalWord) { - if (mValidSpellingWordWriteCache == null) { - return; - } - - final String lowerCaseWord = originalWord.toLowerCase(getCurrentLocale()); - final boolean lowerCaseValid = isValidSpellingWord(lowerCaseWord); - mValidSpellingWordWriteCache.put(lowerCaseWord, lowerCaseValid); - - final String capitalWord = - StringUtils.capitalizeFirstAndDowncaseRest(originalWord, getCurrentLocale()); - final boolean capitalValid; - if (lowerCaseValid) { - // The lower case form of the word is valid, so the upper case must be valid. - capitalValid = true; - } else { - capitalValid = isValidSpellingWord(capitalWord); - } - mValidSpellingWordWriteCache.put(capitalWord, capitalValid); - } - - private void addWordToUserHistory(final DictionaryGroup dictionaryGroup, - final NgramContext ngramContext, final String word, final boolean wasAutoCapitalized, - final int timeStampInSeconds, final boolean blockPotentiallyOffensive) { - final ExpandableBinaryDictionary userHistoryDictionary = - dictionaryGroup.getSubDict(Dictionary.TYPE_USER_HISTORY); - if (userHistoryDictionary == null || !hasLocale(userHistoryDictionary.mLocale)) { - return; - } - final int mainFreq = dictionaryGroup.hasDict(Dictionary.TYPE_MAIN, null) - ? dictionaryGroup.getDict(Dictionary.TYPE_MAIN).getFrequency(word) - : Dictionary.NOT_A_PROBABILITY; - if (mainFreq == 0 && blockPotentiallyOffensive) { - return; - } - if (mTryChangingWords) - mTryChangingWords = ngramContext.changeWordIfAfterBeginningOfSentence(mChangeFrom, mChangeTo); - final String secondWord; - // check for isBeginningOfSentenceContext too, because not all text fields auto-capitalize in this case - // and even if the user capitalizes manually, they most likely don't want the capitalized form suggested - if (wasAutoCapitalized || ngramContext.isBeginningOfSentenceContext()) { - // used word with lower-case first letter instead of all lower-case, as auto-capitalize - // does not affect the other letters - final String decapitalizedWord = StringUtilsKt.decapitalize(word, dictionaryGroup.mLocale); - if (isValidWord(word, ALL_DICTIONARY_TYPES, dictionaryGroup) && !isValidWord(decapitalizedWord, ALL_DICTIONARY_TYPES, dictionaryGroup)) { - // If the word was auto-capitalized and exists only as a capitalized word in the - // dictionary, then we must not downcase it before registering it. For example, - // the name of the contacts in start-of-sentence position would come here with the - // wasAutoCapitalized flag: if we downcase it, we'd register a lower-case version - // of that contact's name which would end up popping in suggestions. - secondWord = word; - } else { - // If however the word is not in the dictionary, or exists as a de-capitalized word - // only, then we consider that was a lower-case word that had been auto-capitalized. - secondWord = decapitalizedWord; - mTryChangingWords = true; - mChangeFrom = word; - mChangeTo = secondWord; - } - } else { - // HACK: We'd like to avoid adding the capitalized form of common words to the User - // History dictionary in order to avoid suggesting them until the dictionary - // consolidation is done. - // TODO: Remove this hack when ready. - final String lowerCasedWord = word.toLowerCase(dictionaryGroup.mLocale); - final int lowerCaseFreqInMainDict = dictionaryGroup.hasDict(Dictionary.TYPE_MAIN, null) - ? dictionaryGroup.getDict(Dictionary.TYPE_MAIN).getFrequency(lowerCasedWord) - : Dictionary.NOT_A_PROBABILITY; - if (mainFreq < lowerCaseFreqInMainDict - && lowerCaseFreqInMainDict >= CAPITALIZED_FORM_MAX_PROBABILITY_FOR_INSERT) { - // Use lower cased word as the word can be a distracter of the popular word. - secondWord = lowerCasedWord; - } else { - secondWord = word; - } - } - // We demote unrecognized words (frequency < 0, below) by specifying them as "invalid". - // We don't add words with 0-frequency (assuming they would be profanity etc.). - // comment: so this means words not in main dict are always invalid... weird (but still works) - final boolean isValid = mainFreq > 0; - UserHistoryDictionary.addToDictionary(userHistoryDictionary, ngramContext, secondWord, - isValid, timeStampInSeconds); - } - - /** returns the dictionaryGroup with most confidence, first group when tied */ - private DictionaryGroup getCurrentlyPreferredDictionaryGroup() { - DictionaryGroup dictGroup = null; - int highestConfidence = -1; - for (DictionaryGroup dictionaryGroup : mDictionaryGroups) { - if (dictionaryGroup.mConfidence > highestConfidence) { - dictGroup = dictionaryGroup; - highestConfidence = dictGroup.mConfidence; - } - } - return dictGroup; - } - - private DictionaryGroup getClearlyPreferredDictionaryGroupOrNull() { - // we want one clearly preferred group and return null otherwise - if (mDictionaryGroups.size() == 1) - return mDictionaryGroups.get(0); - // that preferred group should have at least MAX_CONFIDENCE, and all others should have 0 (we want to be really sure!) - int preferredGroup = -1; - for (int i = 0; i < mDictionaryGroups.size(); i ++) { - final DictionaryGroup dictionaryGroup = mDictionaryGroups.get(i); - if (dictionaryGroup.mConfidence == 0) continue; - if (dictionaryGroup.mConfidence >= DictionaryGroup.MAX_CONFIDENCE && preferredGroup == -1) { - preferredGroup = i; - continue; - } - // either we have 2 groups with high confidence, or a group with low but non-0 confidence - // in either case, we're not sure enough and return null - return null; - } - if (preferredGroup == -1) return null; - return mDictionaryGroups.get(preferredGroup); - } - - private void removeWord(final String dictName, final String word) { - final ExpandableBinaryDictionary dictionary = getCurrentlyPreferredDictionaryGroup().getSubDict(dictName); - if (dictionary != null) { - dictionary.removeUnigramEntryDynamically(word); - } - } - - @Override - public void unlearnFromUserHistory(final String word, - @NonNull final NgramContext ngramContext, final long timeStampInSeconds, - final int eventType) { - // TODO: Decide whether or not to remove the word on EVENT_BACKSPACE. - if (eventType != Constants.EVENT_BACKSPACE) { - removeWord(Dictionary.TYPE_USER_HISTORY, word); - } - - // Update the spelling cache after unlearning. Words that are removed from user history - // and appear in no other language model are not considered valid. - putWordIntoValidSpellingWordCache("unlearnFromUserHistory", word.toLowerCase()); - } - - // TODO: Revise the way to fusion suggestion results. - @Override - @SuppressWarnings("unchecked") - @NonNull public SuggestionResults getSuggestionResults(ComposedData composedData, - NgramContext ngramContext, @NonNull final Keyboard keyboard, - SettingsValuesForSuggestion settingsValuesForSuggestion, int sessionId, - int inputStyle) { - long proximityInfoHandle = keyboard.getProximityInfo().getNativeProximityInfo(); - final SuggestionResults suggestionResults = new SuggestionResults( - SuggestedWords.MAX_SUGGESTIONS, ngramContext.isBeginningOfSentenceContext(), - false /* firstSuggestionExceedsConfidenceThreshold */); - final float[] weightOfLangModelVsSpatialModel = - new float[] { Dictionary.NOT_A_WEIGHT_OF_LANG_MODEL_VS_SPATIAL_MODEL }; - - // start getting suggestions for non-main locales first, but in background - final ArrayList[] otherDictionarySuggestions = (ArrayList[]) new ArrayList[mDictionaryGroups.size() - 1]; - final CountDownLatch waitForOtherDictionaries; - if (mDictionaryGroups.size() > 1) { - waitForOtherDictionaries = new CountDownLatch(mDictionaryGroups.size() - 1); - for (int i = 1; i < mDictionaryGroups.size(); i ++) { - final DictionaryGroup dictionaryGroup = mDictionaryGroups.get(i); - final int index = i - 1; - ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD).execute(() -> { - otherDictionarySuggestions[index] = getSuggestions(composedData, - ngramContext, settingsValuesForSuggestion, sessionId, proximityInfoHandle, - weightOfLangModelVsSpatialModel, dictionaryGroup); - waitForOtherDictionaries.countDown(); - }); - } - } else - waitForOtherDictionaries = null; - - // get main locale suggestions - final ArrayList dictionarySuggestions = getSuggestions(composedData, - ngramContext, settingsValuesForSuggestion, sessionId, proximityInfoHandle, - weightOfLangModelVsSpatialModel, mDictionaryGroups.get(0)); - suggestionResults.addAll(dictionarySuggestions); - if (null != suggestionResults.mRawSuggestions) { - suggestionResults.mRawSuggestions.addAll(dictionarySuggestions); - } - - // wait for other locale suggestions - if (waitForOtherDictionaries != null) { - try { waitForOtherDictionaries.await(); } - catch (InterruptedException e) { - Log.w(TAG, "Interrupted while trying to get secondary locale suggestions", e); - } - for (int i = 1; i < mDictionaryGroups.size(); i ++) { - suggestionResults.addAll(otherDictionarySuggestions[i - 1]); - if (null != suggestionResults.mRawSuggestions) { - suggestionResults.mRawSuggestions.addAll(otherDictionarySuggestions[i - 1]); - } - } - } - - return suggestionResults; - } - - private ArrayList getSuggestions(ComposedData composedData, - NgramContext ngramContext, SettingsValuesForSuggestion settingsValuesForSuggestion, - int sessionId, long proximityInfoHandle, float[] weightOfLangModelVsSpatialModel, - DictionaryGroup dictGroup) { - final ArrayList suggestions = new ArrayList<>(); - float weightForLocale = composedData.mIsBatchMode - ? dictGroup.getWeightForGesturingInLocale(mDictionaryGroups) - : dictGroup.getWeightForTypingInLocale(mDictionaryGroups); - for (final String dictType : ALL_DICTIONARY_TYPES) { - final Dictionary dictionary = dictGroup.getDict(dictType); - if (null == dictionary) continue; - final ArrayList dictionarySuggestions = - dictionary.getSuggestions(composedData, ngramContext, - proximityInfoHandle, settingsValuesForSuggestion, sessionId, - weightForLocale, weightOfLangModelVsSpatialModel); - if (null == dictionarySuggestions) continue; - - // for some reason, garbage words are produced when glide typing - // for user history and main dictionary we can filter them out by checking whether the - // dictionary actually contains the word - // but personal dictionary and addon dictionaries may contain shortcuts, which do not - // pass an isInDictionary check (e.g. emojis) - // (if the main dict contains shortcuts to non-words, this will break) - final boolean checkForGarbage = composedData.mIsBatchMode && (dictType.equals(Dictionary.TYPE_USER_HISTORY) || dictType.equals(Dictionary.TYPE_MAIN)); - for (SuggestedWordInfo info : dictionarySuggestions) { - final String word = info.getWord(); - if (!isBlacklisted(word) && !SupportedEmojis.INSTANCE.isUnsupported(word)) { // don't add blacklisted words and unsupported emojis - if (checkForGarbage - // only check history and "main main dictionary" - // consider the user might use custom main dictionary containing shortcuts - // assume this is unlikely to happen, and take care about common shortcuts that are not actual words (emoji, symbols) - && word.length() > 2 // should exclude most symbol shortcuts - && info.mSourceDict.mDictType.equals(dictType) // dictType is always main, but info.mSourceDict.mDictType contains the actual dict (main dict is a dictionary group) - && !StringUtils.mightBeEmoji(word) // emojis often have more than 2 chars; simplified check for performance reasons - && !dictionary.isInDictionary(word)) - continue; - suggestions.add(info); - } - } - } - return suggestions; - } - - // Spell checker is using this, and has its own instance of DictionaryFacilitatorImpl, - // meaning that it always has default mConfidence. So we cannot choose to only check preferred - // locale, and instead simply return true if word is in any of the available dictionaries - public boolean isValidSpellingWord(final String word) { - if (mValidSpellingWordReadCache != null) { - final Boolean cachedValue = mValidSpellingWordReadCache.get(word); - if (cachedValue != null) { - return cachedValue; - } - } - boolean result = false; - for (DictionaryGroup dictionaryGroup : mDictionaryGroups) { - if (isValidWord(word, ALL_DICTIONARY_TYPES, dictionaryGroup)) { - result = true; - break; - } - } - if (mValidSpellingWordReadCache != null) - mValidSpellingWordReadCache.put(word, result); - return result; - } - - // this is unused, so leave it for now (redirecting to isValidWord seems to defeat the purpose...) - public boolean isValidSuggestionWord(final String word) { - return isValidWord(word, ALL_DICTIONARY_TYPES, mDictionaryGroups.get(0)); - } - - private boolean isValidWord(final String word, final String[] dictionariesToCheck, final DictionaryGroup dictionaryGroup) { - if (TextUtils.isEmpty(word)) { - return false; - } - if (isBlacklisted(word)) return false; - for (final String dictType : dictionariesToCheck) { - final Dictionary dictionary = dictionaryGroup.getDict(dictType); - // Ideally the passed map would come out of a {@link java.util.concurrent.Future} and - // would be immutable once it's finished initializing, but concretely a null test is - // probably good enough for the time being. - if (null == dictionary) continue; - if (dictionary.isValidWord(word)) { - return true; - } - } - return false; - } - - private boolean isBlacklisted(final String word) { - for (DictionaryGroup dictionaryGroup : mDictionaryGroups) { - if (dictionaryGroup.blacklist.contains(word)) - return true; - } - return false; - } - - @Override - public void removeWord(String word) { - for (DictionaryGroup dictionaryGroup : mDictionaryGroups) { - removeWordFromGroup(word, dictionaryGroup); - } - } - - private void removeWordFromGroup(String word, DictionaryGroup group) { - // remove from user history - final ExpandableBinaryDictionary historyDict = group.getSubDict(Dictionary.TYPE_USER_HISTORY); - if (historyDict != null) { - historyDict.removeUnigramEntryDynamically(word); - } - - // and from personal dictionary - final ExpandableBinaryDictionary userDict = group.getSubDict(Dictionary.TYPE_USER); - if (userDict != null) { - userDict.removeUnigramEntryDynamically(word); - } - - final ExpandableBinaryDictionary contactsDict = group.getSubDict(Dictionary.TYPE_CONTACTS); - if (contactsDict != null && contactsDict.isInDictionary(word)) { - contactsDict.removeUnigramEntryDynamically(word); // will be gone until next reload of dict - addToBlacklist(word, group); - return; - } - - final ExpandableBinaryDictionary appsDict = group.getSubDict(Dictionary.TYPE_APPS); - if (appsDict != null && appsDict.isInDictionary(word)) { - appsDict.removeUnigramEntryDynamically(word); // will be gone until next reload of dict - addToBlacklist(word, group); - return; - } - - if (!group.hasDict(Dictionary.TYPE_MAIN, null)) { - return; - } - - if (group.getDict(Dictionary.TYPE_MAIN).isValidWord(word)) { - addToBlacklist(word, group); - return; - } - - final String lowercase = word.toLowerCase(group.mLocale); - if (group.getDict(Dictionary.TYPE_MAIN).isValidWord(lowercase)) { - addToBlacklist(lowercase, group); - } - } - - private void addToBlacklist(final String word, final DictionaryGroup group) { - if (!group.blacklist.add(word)) - return; - ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD).execute(() -> { - try { - FileOutputStream fos = new FileOutputStream(group.blacklistFileName, true); - fos.write((word + "\n").getBytes(StandardCharsets.UTF_8)); - fos.close(); - } catch (IOException e) { - Log.e(TAG, "Exception while trying to write blacklist", e); - } - }); - } - - private ArrayList readBlacklistFile(final String filename) { - final ArrayList blacklist = new ArrayList<>(); - if (filename == null) return blacklist; - File blacklistFile = new File(filename); - if (!blacklistFile.exists()) return blacklist; - try { - final Scanner scanner = new Scanner(blacklistFile, StandardCharsets.UTF_8.name()).useDelimiter("\n"); - while (scanner.hasNext()) { - blacklist.add(scanner.next()); - } - } catch (IOException e) { - Log.e(TAG, "Exception while reading blacklist", e); - } - return blacklist; - } - - private void removeWordFromBlacklistFile(String word, String filename) { - ExecutorUtils.getBackgroundExecutor(ExecutorUtils.KEYBOARD).execute(() -> { - try { - ArrayList blacklist = readBlacklistFile(filename); - blacklist.remove(word); - FileOutputStream fos = new FileOutputStream(filename); - for (String entry : blacklist) { - fos.write((entry + "\n").getBytes(StandardCharsets.UTF_8)); - } - fos.close(); - } catch (IOException e) { - Log.e(TAG, "Exception while trying to write blacklist" + filename, e); - } - }); - - } - - @Override - public boolean clearUserHistoryDictionary(final Context context) { - for (DictionaryGroup dictionaryGroup : mDictionaryGroups) { - final ExpandableBinaryDictionary dictionary = dictionaryGroup.getSubDict(Dictionary.TYPE_USER_HISTORY); - if (dictionary == null) { - return false; // should only ever happen for primary dictionary, so this is safe - } - dictionary.clear(); - } - return true; - } - - @Override - public String localesAndConfidences() { - if (mDictionaryGroups.size() < 2) return null; - final StringBuilder sb = new StringBuilder(); - for (final DictionaryGroup dictGroup : mDictionaryGroups) { - if (sb.length() > 0) - sb.append(", "); - sb.append(dictGroup.mLocale).append(" ").append(dictGroup.mConfidence); - } - return sb.toString(); - } - - @Override - public void dumpDictionaryForDebug(final String dictName) { - final ExpandableBinaryDictionary dictToDump = mDictionaryGroups.get(0).getSubDict(dictName); - if (dictToDump == null) { - Log.e(TAG, "Cannot dump " + dictName + ". " - + "The dictionary is not being used for suggestion or cannot be dumped."); - return; - } - dictToDump.dumpAllWordsForDebug(); - } - - @Override - // this is unused, so leave it for now - @NonNull public List getDictionaryStats(final Context context) { - final ArrayList statsOfEnabledSubDicts = new ArrayList<>(); - for (final String dictType : DYNAMIC_DICTIONARY_TYPES) { - final ExpandableBinaryDictionary dictionary = mDictionaryGroups.get(0).getSubDict(dictType); - if (dictionary == null) continue; - statsOfEnabledSubDicts.add(dictionary.getDictionaryStats()); - } - return statsOfEnabledSubDicts; - } - - @Override - public String dump(final Context context) { - return ""; - } -} diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt new file mode 100644 index 000000000..c5212c0d5 --- /dev/null +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt @@ -0,0 +1,827 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * modified + * SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only + */ +package helium314.keyboard.latin + +import android.Manifest +import android.content.Context +import android.provider.UserDictionary +import android.util.LruCache +import helium314.keyboard.keyboard.Keyboard +import helium314.keyboard.keyboard.emoji.SupportedEmojis +import helium314.keyboard.latin.DictionaryFacilitator.DictionaryInitializationListener +import helium314.keyboard.latin.NgramContext.WordInfo +import helium314.keyboard.latin.SuggestedWords.SuggestedWordInfo +import helium314.keyboard.latin.common.ComposedData +import helium314.keyboard.latin.common.Constants +import helium314.keyboard.latin.common.StringUtils +import helium314.keyboard.latin.common.decapitalize +import helium314.keyboard.latin.common.splitOnWhitespace +import helium314.keyboard.latin.permissions.PermissionsUtil +import helium314.keyboard.latin.personalization.UserHistoryDictionary +import helium314.keyboard.latin.settings.Settings +import helium314.keyboard.latin.settings.SettingsValuesForSuggestion +import helium314.keyboard.latin.utils.Log +import helium314.keyboard.latin.utils.SubtypeSettings +import helium314.keyboard.latin.utils.SuggestionResults +import helium314.keyboard.latin.utils.getSecondaryLocales +import helium314.keyboard.latin.utils.locale +import helium314.keyboard.latin.utils.prefs +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import java.io.File +import java.io.IOException +import java.util.Locale +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import kotlin.concurrent.Volatile + +/** + * Facilitates interaction with different kinds of dictionaries. Provides APIs + * to instantiate and select the correct dictionaries (based on language or account), + * update entries and fetch suggestions. + * + * + * Currently AndroidSpellCheckerService and LatinIME both use DictionaryFacilitator as + * a client for interacting with dictionaries. + */ +class DictionaryFacilitatorImpl : DictionaryFacilitator { + private var dictionaryGroups = listOf(DictionaryGroup()) + + @Volatile + private var mLatchForWaitingLoadingMainDictionaries = CountDownLatch(0) + + // To synchronize assigning mDictionaryGroup to ensure closing dictionaries. + private val mLock = Any() + + // library does not deal well with ngram history for auto-capitalized words, so we adjust the ngram + // context to store next word suggestions for such cases + // todo: this looks awful, find a better solution / workaround + private var tryChangingWords = false + private var changeFrom = "" + private var changeTo = "" + + // todo: write cache never set, and never read (only written) + // tried to use read cache for a while, but small performance improvements are not worth the work, + // see https://github.com/Helium314/HeliBoard/issues/307 + private var mValidSpellingWordReadCache: LruCache? = null + private var mValidSpellingWordWriteCache: LruCache? = null + + private val scope = CoroutineScope(Dispatchers.Default) + + override fun setValidSpellingWordReadCache(cache: LruCache) { + mValidSpellingWordReadCache = cache + } + + override fun setValidSpellingWordWriteCache(cache: LruCache) { + mValidSpellingWordWriteCache = cache + } + + // judging by usage before adding multilingual typing, this should check primary group locale only + override fun isForLocale(locale: Locale?): Boolean { + return locale != null && locale == dictionaryGroups[0].locale + } + + override fun onStartInput() { + } + + override fun onFinishInput(context: Context) { + for (dictGroup in dictionaryGroups) { + DictionaryFacilitator.ALL_DICTIONARY_TYPES.forEach { dictGroup.getDict(it)?.onFinishInput() } + } + } + + override fun isActive(): Boolean { + return dictionaryGroups[0].locale.language.isNotEmpty() + } + + override fun getMainLocale(): Locale { + return dictionaryGroups[0].locale + } + + override fun getCurrentLocale(): Locale { + return currentlyPreferredDictionaryGroup.locale + } + + override fun getAccount(): String? { + return null + } + + override fun usesSameSettings( + locales: List, contacts: Boolean, apps: Boolean, personalization: Boolean, account: String? + ): Boolean { + val dictGroup = dictionaryGroups[0] // settings are the same for all groups + return contacts == dictGroup.hasDict(Dictionary.TYPE_CONTACTS, account) + && apps == dictGroup.hasDict(Dictionary.TYPE_APPS, account) + && personalization == dictGroup.hasDict(Dictionary.TYPE_USER_HISTORY, account) + && account == dictGroup.account + && locales.size == dictionaryGroups.size + && locales.none { findDictionaryGroupWithLocale(dictionaryGroups, it) == null } + } + + // -------------- managing (loading & closing) dictionaries ------------ + + override fun resetDictionaries( + context: Context, + newLocale: Locale, + useContactsDict: Boolean, + useAppsDict: Boolean, + usePersonalizedDicts: Boolean, + forceReloadMainDictionary: Boolean, + account: String?, + dictNamePrefix: String, + listener: DictionaryInitializationListener? + ) { + Log.i(TAG, "resetDictionaries, force reloading main dictionary: $forceReloadMainDictionary") + + val locales = getUsedLocales(newLocale, context) + + val subDictTypesToUse = listOfNotNull( + Dictionary.TYPE_USER, + if (useAppsDict) Dictionary.TYPE_APPS else null, + if (usePersonalizedDicts) Dictionary.TYPE_USER_HISTORY else null, + if (useContactsDict && PermissionsUtil.checkAllPermissionsGranted(context, Manifest.permission.READ_CONTACTS)) + Dictionary.TYPE_CONTACTS else null + ) + + val (newDictionaryGroups, existingDictsToCleanup) = + getNewDictGroupsAndDictsToCleanup(locales, subDictTypesToUse, forceReloadMainDictionary, dictNamePrefix, context) + + // Replace Dictionaries. + val oldDictionaryGroups: List + synchronized(mLock) { + oldDictionaryGroups = dictionaryGroups + dictionaryGroups = newDictionaryGroups + if (hasAtLeastOneUninitializedMainDictionary()) { + asyncReloadUninitializedMainDictionaries(context, locales, listener) + } + } + + listener?.onUpdateMainDictionaryAvailability(hasAtLeastOneInitializedMainDictionary()) + + // Clean up old dictionaries. + existingDictsToCleanup.forEach { (locale, dictTypes) -> + val dictGroupToCleanup = findDictionaryGroupWithLocale(oldDictionaryGroups, locale) ?: return@forEach + for (dictType in dictTypes) { + dictGroupToCleanup.closeDict(dictType) + } + } + + mValidSpellingWordWriteCache?.evictAll() + mValidSpellingWordReadCache?.evictAll() + } + + /** creates dictionaryGroups for [newLocales] with given [newSubDictTypes], trying to re-use existing dictionaries. + * returns the new dictionaryGroups and unused dictionary types by locale */ + private fun getNewDictGroupsAndDictsToCleanup( + newLocales: Collection, + newSubDictTypes: Collection, + forceReload: Boolean, + dictNamePrefix: String, + context: Context + ): Pair, Map>> { + // Gather all dictionaries by locale. We may remove some from the list later. + val existingDictsToCleanup = HashMap>() + for (dictGroup in dictionaryGroups) { + existingDictsToCleanup[dictGroup.locale] = DictionaryFacilitator.ALL_DICTIONARY_TYPES + .filterTo(mutableListOf()) { dictGroup.hasDict(it, account) } + } + + // create new dictionary groups and remove dictionaries to re-use from existingDictsToCleanup + val newDictionaryGroups = mutableListOf() + for (locale in newLocales) { + // get existing dictionary group for new locale + val oldDictGroupForLocale = findDictionaryGroupWithLocale(dictionaryGroups, locale) + val dictTypesToCleanupForLocale = existingDictsToCleanup[locale] + + // create new or re-use already loaded main dict + val mainDict: Dictionary? + if (forceReload || oldDictGroupForLocale == null + || !oldDictGroupForLocale.hasDict(Dictionary.TYPE_MAIN, account) + ) { + mainDict = null // null main dicts will be loaded later in asyncReloadUninitializedMainDictionaries + } else { + mainDict = oldDictGroupForLocale.getDict(Dictionary.TYPE_MAIN) + dictTypesToCleanupForLocale?.remove(Dictionary.TYPE_MAIN) + } + + // create new or re-use already loaded sub-dicts + val subDicts: MutableMap = HashMap() + for (subDictType in newSubDictTypes) { + val subDict: ExpandableBinaryDictionary + if (forceReload || oldDictGroupForLocale == null + || !oldDictGroupForLocale.hasDict(subDictType, account) + ) { + // Create a new dictionary. + subDict = getSubDict(subDictType, context, locale, null, dictNamePrefix, account) ?: continue + } else { + // Reuse the existing dictionary. + subDict = oldDictGroupForLocale.getSubDict(subDictType) ?: continue + dictTypesToCleanupForLocale?.remove(subDictType) + } + subDicts[subDictType] = subDict + } + val newDictGroup = DictionaryGroup(locale, mainDict, account, subDicts, context) + newDictionaryGroups.add(newDictGroup) + } + return newDictionaryGroups to existingDictsToCleanup + } + + private fun asyncReloadUninitializedMainDictionaries( + context: Context, locales: Collection, listener: DictionaryInitializationListener? + ) { + val latchForWaitingLoadingMainDictionary = CountDownLatch(1) + mLatchForWaitingLoadingMainDictionaries = latchForWaitingLoadingMainDictionary + scope.launch { + val dictGroupsWithNewMainDict = locales.mapNotNull { + val dictionaryGroup = findDictionaryGroupWithLocale(dictionaryGroups, it) + if (dictionaryGroup == null) { + Log.w(TAG, "Expected a dictionary group for $it but none found") + return@mapNotNull null // This should never happen + } + if (dictionaryGroup.getDict(Dictionary.TYPE_MAIN)?.isInitialized == true) null + else dictionaryGroup to createMainDictionary(context, it) + } + synchronized(mLock) { + dictGroupsWithNewMainDict.forEach { (dictGroup, mainDict) -> + dictGroup.setMainDict(mainDict) + } + } + + listener?.onUpdateMainDictionaryAvailability(hasAtLeastOneInitializedMainDictionary()) + latchForWaitingLoadingMainDictionary.countDown() + } + } + + override fun closeDictionaries() { + val dictionaryGroupsToClose: List + synchronized(mLock) { + dictionaryGroupsToClose = dictionaryGroups + dictionaryGroups = listOf(DictionaryGroup()) + } + for (dictionaryGroup in dictionaryGroupsToClose) { + for (dictType in DictionaryFacilitator.ALL_DICTIONARY_TYPES) { + dictionaryGroup.closeDict(dictType) + } + } + } + + // The main dictionaries are loaded asynchronously. Don't cache the return value of these methods. + override fun hasAtLeastOneInitializedMainDictionary(): Boolean = + dictionaryGroups.any { it.getDict(Dictionary.TYPE_MAIN)?.isInitialized == true } + + override fun hasAtLeastOneUninitializedMainDictionary(): Boolean = + dictionaryGroups.any { it.getDict(Dictionary.TYPE_MAIN)?.isInitialized != true } + + @Throws(InterruptedException::class) + override fun waitForLoadingMainDictionaries(timeout: Long, unit: TimeUnit) { + mLatchForWaitingLoadingMainDictionaries.await(timeout, unit) + } + + // -------------- actual dictionary stuff like getting suggestions ------------ + + override fun addToUserHistory( + suggestion: String, wasAutoCapitalized: Boolean, ngramContext: NgramContext, + timeStampInSeconds: Long, blockPotentiallyOffensive: Boolean + ) { + // Update the spelling cache before learning. Words that are not yet added to user history + // and appear in no other language model are not considered valid. + putWordIntoValidSpellingWordCache("addToUserHistory", suggestion) + + val words = suggestion.splitOnWhitespace().dropLastWhile { it.isEmpty() } + + // increase / decrease confidence + if (words.size == 1) // ignore if more than a single word, which only happens with (badly working) spaceAwareGesture + adjustConfidences(suggestion, wasAutoCapitalized) + + // Add word to user dictionary if it is in no other dictionary except user history dictionary (i.e. typed again). + val sv = Settings.getValues() + if (sv.mAddToPersonalDictionary // require the opt-in + && sv.mAutoCorrectEnabled == sv.mAutoCorrectionEnabledPerUserSettings // don't add if user wants autocorrect but input field does not, see https://github.com/Helium314/HeliBoard/issues/427#issuecomment-1905438000 + && dictionaryGroups[0].hasDict(Dictionary.TYPE_USER_HISTORY, dictionaryGroups[0].account) // require personalized suggestions + && !wasAutoCapitalized // we can't be 100% sure about what the user intended to type, so better don't add it + && words.size == 1 // only single words + ) { + addToPersonalDictionaryIfInvalidButInHistory(suggestion) + } + + var ngramContextForCurrentWord = ngramContext + val preferredGroup = currentlyPreferredDictionaryGroup + for (i in words.indices) { + val currentWord = words[i] + val wasCurrentWordAutoCapitalized = (i == 0) && wasAutoCapitalized + // add to history for preferred dictionary group, to avoid mixing languages in history + addWordToUserHistory( + preferredGroup, ngramContextForCurrentWord, currentWord, + wasCurrentWordAutoCapitalized, timeStampInSeconds.toInt(), blockPotentiallyOffensive + ) + ngramContextForCurrentWord = ngramContextForCurrentWord.getNextNgramContext(WordInfo(currentWord)) + + // remove manually entered blacklisted words from blacklist for likely matching languages + dictionaryGroups.filter { it.confidence == preferredGroup.confidence }.forEach { + it.removeFromBlacklist(currentWord) + } + } + } + + private fun addWordToUserHistory( + dictionaryGroup: DictionaryGroup, ngramContext: NgramContext, word: String, wasAutoCapitalized: Boolean, + timeStampInSeconds: Int, blockPotentiallyOffensive: Boolean + ) { + val userHistoryDictionary = dictionaryGroup.getSubDict(Dictionary.TYPE_USER_HISTORY) ?: return + + val mainFreq = dictionaryGroup.getDict(Dictionary.TYPE_MAIN)?.getFrequency(word) ?: Dictionary.NOT_A_PROBABILITY + if (mainFreq == 0 && blockPotentiallyOffensive) + return + if (tryChangingWords) // todo: ew... + tryChangingWords = ngramContext.changeWordIfAfterBeginningOfSentence(changeFrom, changeTo) + + val wordToUse: String + // Check for isBeginningOfSentenceContext too, because not all text fields auto-capitalize in this case. + // Even if the user capitalizes manually, they most likely don't want the capitalized form suggested. + if (wasAutoCapitalized || ngramContext.isBeginningOfSentenceContext) { + val decapitalizedWord = word.decapitalize(dictionaryGroup.locale) // try undoing auto-capitalization + if (isValidWord(word, DictionaryFacilitator.ALL_DICTIONARY_TYPES, dictionaryGroup) + && !isValidWord(decapitalizedWord, DictionaryFacilitator.ALL_DICTIONARY_TYPES, dictionaryGroup) + ) { + // If the word was auto-capitalized and exists only as a capitalized word in the + // dictionary, then we must not downcase it before registering it. For example, + // the name of the contacts in start-of-sentence position would come here with the + // wasAutoCapitalized flag: if we downcase it, we'd register a lower-case version + // of that contact's name which would end up popping in suggestions. + wordToUse = word + } else { + // If however the word is not in the dictionary, or exists as a de-capitalized word + // only, then we consider that was a lower-case word that had been auto-capitalized. + wordToUse = decapitalizedWord + tryChangingWords = true + changeFrom = word + changeTo = wordToUse + } + } else { + // HACK: We'd like to avoid adding the capitalized form of common words to the User + // History dictionary in order to avoid suggesting them until the dictionary + // consolidation is done. + // TODO: Remove this hack when ready. + val lowerCasedWord = word.lowercase(dictionaryGroup.locale) + val lowerCaseFreqInMainDict = dictionaryGroup.getDict(Dictionary.TYPE_MAIN)?.getFrequency(lowerCasedWord) + ?: Dictionary.NOT_A_PROBABILITY + wordToUse = if (mainFreq < lowerCaseFreqInMainDict + && lowerCaseFreqInMainDict >= CAPITALIZED_FORM_MAX_PROBABILITY_FOR_INSERT + ) { + // Use lower cased word as the word can be a distracter of the popular word. + lowerCasedWord + } else { + word + } + } + // We demote unrecognized words (frequency <= 0) by specifying them as "invalid". + // We don't add words with 0-frequency (assuming they would be profanity etc.). + val isValid = mainFreq > 0 + UserHistoryDictionary.addToDictionary(userHistoryDictionary, ngramContext, wordToUse, isValid, timeStampInSeconds) + } + + private fun addToPersonalDictionaryIfInvalidButInHistory(word: String) { + val dictionaryGroup = clearlyPreferredDictionaryGroup ?: return + val userDict = dictionaryGroup.getSubDict(Dictionary.TYPE_USER) ?: return + val userHistoryDict = dictionaryGroup.getSubDict(Dictionary.TYPE_USER_HISTORY) ?: return + if (isValidWord(word, DictionaryFacilitator.ALL_DICTIONARY_TYPES, dictionaryGroup)) + return // valid word, no reason to auto-add it to personal dict + if (userDict.isInDictionary(word)) + return // should never happen, but better be safe + + // User history always reports words as invalid, so we check the frequency instead. + // Testing shows that after 2 times adding, the frequency is 111, and then rises slowly with usage (values vary slightly). + // 120 is after 3 uses of the word, so we simply require more than that. todo: Could be made configurable. + // Words added to dictionaries (user and history) seem to be found only after some delay. + // This is not too bad, but it delays adding in case a user wants to fill a dictionary using this functionality + if (userHistoryDict.getFrequency(word) > 120) { + scope.launch { + UserDictionary.Words.addWord(userDict.mContext, word, 250, null, dictionaryGroup.locale) + } + } + } + + private fun putWordIntoValidSpellingWordCache(caller: String, originalWord: String) { + if (mValidSpellingWordWriteCache == null) + return + + val lowerCaseWord = originalWord.lowercase(currentLocale) + val lowerCaseValid = isValidSpellingWord(lowerCaseWord) + mValidSpellingWordWriteCache?.put(lowerCaseWord, lowerCaseValid) + + val capitalWord = StringUtils.capitalizeFirstAndDowncaseRest(originalWord, currentLocale) + val capitalValid = if (lowerCaseValid) { + true // The lower case form of the word is valid, so the upper case must be valid. + } else { + isValidSpellingWord(capitalWord) + } + mValidSpellingWordWriteCache?.put(capitalWord, capitalValid) + } + + override fun adjustConfidences(word: String, wasAutoCapitalized: Boolean) { + if (dictionaryGroups.size == 1 || word.contains(Constants.WORD_SEPARATOR)) + return + + // if suggestion was auto-capitalized, check against both the suggestion and the de-capitalized suggestion + val decapitalizedSuggestion = if (wasAutoCapitalized) word.decapitalize(currentLocale) else word + dictionaryGroups.forEach { + if (isValidWord(word, DictionaryFacilitator.ALL_DICTIONARY_TYPES, it)) { + it.increaseConfidence() + return@forEach + } + // also increase confidence if suggestion was auto-capitalized and the lowercase variant it valid + if (wasAutoCapitalized && isValidWord(decapitalizedSuggestion, DictionaryFacilitator.ALL_DICTIONARY_TYPES, it)) + it.increaseConfidence() + else it.decreaseConfidence() + } + } + + /** the dictionaryGroup with most confidence, first group when tied */ + private val currentlyPreferredDictionaryGroup: DictionaryGroup get() = dictionaryGroups.maxBy { it.confidence } + + /** the only dictionary group, or the dictionaryGroup confidence >= DictionaryGroup.MAX_CONFIDENCE if all others have 0 */ + private val clearlyPreferredDictionaryGroup: DictionaryGroup? get() { + if (dictionaryGroups.size == 1) return dictionaryGroups.first() // confidence not used if we only have a single group + + val preferred = currentlyPreferredDictionaryGroup + if (preferred.confidence < DictionaryGroup.MAX_CONFIDENCE) return null + if (dictionaryGroups.any { it.confidence > 0 && it !== preferred }) + return null + return preferred + } + + override fun unlearnFromUserHistory(word: String, ngramContext: NgramContext, timeStampInSeconds: Long, eventType: Int) { + // TODO: Decide whether or not to remove the word on EVENT_BACKSPACE. + if (eventType != Constants.EVENT_BACKSPACE) { + currentlyPreferredDictionaryGroup.getSubDict(Dictionary.TYPE_USER_HISTORY)?.removeUnigramEntryDynamically(word) + } + + // Update the spelling cache after unlearning. Words that are removed from user history + // and appear in no other language model are not considered valid. + putWordIntoValidSpellingWordCache("unlearnFromUserHistory", word.lowercase(Locale.getDefault())) + } + + // TODO: Revise the way to fusion suggestion results. + override fun getSuggestionResults( + composedData: ComposedData, ngramContext: NgramContext, keyboard: Keyboard, + settingsValuesForSuggestion: SettingsValuesForSuggestion, sessionId: Int, inputStyle: Int + ): SuggestionResults { + val proximityInfoHandle = keyboard.proximityInfo.nativeProximityInfo + val weightOfLangModelVsSpatialModel = floatArrayOf(Dictionary.NOT_A_WEIGHT_OF_LANG_MODEL_VS_SPATIAL_MODEL) + + val deferredSuggestions = dictionaryGroups.map { + scope.async { + // todo: if the order does not matter, we could add the suggestions right away without awaitAll first + getSuggestions(composedData, ngramContext, settingsValuesForSuggestion, sessionId, + proximityInfoHandle, weightOfLangModelVsSpatialModel, it) + } + } + val suggestionResults = SuggestionResults( + SuggestedWords.MAX_SUGGESTIONS, ngramContext.isBeginningOfSentenceContext, + false + ) + runBlocking { deferredSuggestions.awaitAll() }.forEach { + suggestionResults.addAll(it) + suggestionResults.mRawSuggestions?.addAll(it) + } + + return suggestionResults + } + + private fun getSuggestions( + composedData: ComposedData, ngramContext: NgramContext, + settingsValuesForSuggestion: SettingsValuesForSuggestion, sessionId: Int, + proximityInfoHandle: Long, weightOfLangModelVsSpatialModel: FloatArray, dictGroup: DictionaryGroup + ): List { + val suggestions = ArrayList() + val weightForLocale = dictGroup.getWeightForLocale(dictionaryGroups, composedData.mIsBatchMode) + for (dictType in DictionaryFacilitator.ALL_DICTIONARY_TYPES) { + val dictionary = dictGroup.getDict(dictType) ?: continue + val dictionarySuggestions = dictionary.getSuggestions(composedData, ngramContext, proximityInfoHandle, + settingsValuesForSuggestion, sessionId, weightForLocale, weightOfLangModelVsSpatialModel + ) ?: continue + + // For some reason "garbage" words are produced when glide typing. For user history + // and main dictionaries we can filter them out by checking whether the dictionary + // actually contains the word. But personal and addon dictionaries may contain shortcuts, + // which do not pass an isInDictionary check (e.g. emojis). + // (if the main dict contains shortcuts to non-words, this will break!) + val checkForGarbage = composedData.mIsBatchMode && (dictType == Dictionary.TYPE_USER_HISTORY || dictType == Dictionary.TYPE_MAIN) + + for (info in dictionarySuggestions) { + val word = info.word + if (isBlacklisted(word) || SupportedEmojis.isUnsupported(word)) // don't add blacklisted words and unsupported emojis + continue + if (checkForGarbage + // consider the user might use custom main dictionary containing shortcuts + // assume this is unlikely to happen, and take care about common shortcuts that are not actual words (emoji, symbols) + && word.length > 2 // should exclude most symbol shortcuts + && info.mSourceDict.mDictType == dictType // dictType is always main, but info.mSourceDict.mDictType contains the actual dict (main dict is a dictionary group) + && !StringUtils.mightBeEmoji(word) // simplified check for performance reasons + && !dictionary.isInDictionary(word) + ) + continue + suggestions.add(info) + } + } + return suggestions + } + + // Spell checker is using this, and has its own instance of DictionaryFacilitatorImpl, + // meaning that it always has default mConfidence. So we cannot choose to only check preferred + // locale, and instead simply return true if word is in any of the available dictionaries + override fun isValidSpellingWord(word: String): Boolean { + mValidSpellingWordReadCache?.get(word)?.let { return it } + val result = dictionaryGroups.any { isValidWord(word, DictionaryFacilitator.ALL_DICTIONARY_TYPES, it) } + mValidSpellingWordReadCache?.put(word, result) + return result + } + + // this is unused, so leave it for now (redirecting to isValidWord seems to defeat the purpose...) + override fun isValidSuggestionWord(word: String): Boolean { + return isValidWord(word, DictionaryFacilitator.ALL_DICTIONARY_TYPES, dictionaryGroups[0]) + } + + // todo: move into dictionaryGroup? + private fun isValidWord(word: String, dictionariesToCheck: Array, dictionaryGroup: DictionaryGroup): Boolean { + if (word.isEmpty() || dictionaryGroup.isBlacklisted(word)) return false + return dictionariesToCheck.any { dictionaryGroup.getDict(it)?.isValidWord(word) == true } + } + + private fun isBlacklisted(word: String): Boolean = dictionaryGroups.any { it.isBlacklisted(word) } + + override fun removeWord(word: String) { + for (dictionaryGroup in dictionaryGroups) { + dictionaryGroup.removeWord(word) + } + } + + // todo: remove return value, not used + override fun clearUserHistoryDictionary(context: Context): Boolean { + for (dictionaryGroup in dictionaryGroups) { + val dictionary = dictionaryGroup.getSubDict(Dictionary.TYPE_USER_HISTORY) + ?: return false + dictionary.clear() + } + return true + } + + override fun localesAndConfidences(): String? { + if (dictionaryGroups.size < 2) return null + return dictionaryGroups.joinToString(", ") { "${it.locale} ${it.confidence}" } + } + + override fun dumpDictionaryForDebug(dictName: String) { + val dictToDump = dictionaryGroups[0].getSubDict(dictName) + if (dictToDump == null) { + Log.e(TAG, ("Cannot dump $dictName. The dictionary is not being used for suggestion or cannot be dumped.")) + return + } + dictToDump.dumpAllWordsForDebug() + } + + override fun getDictionaryStats(context: Context): List = + DictionaryFacilitator.DYNAMIC_DICTIONARY_TYPES.mapNotNull { + dictionaryGroups[0].getSubDict(it)?.dictionaryStats + } + + // todo: remove from interface? + override fun dump(context: Context) = "" + + companion object { + private val TAG = DictionaryFacilitatorImpl::class.java.simpleName + + // HACK: This threshold is being used when adding a capitalized entry in the User History dictionary. + private const val CAPITALIZED_FORM_MAX_PROBABILITY_FOR_INSERT = 140 + + private fun getSubDict(dictType: String, context: Context, locale: Locale, dictFile: File?, + dictNamePrefix: String, account: String? + ): ExpandableBinaryDictionary? { + try { + return when (dictType) { + Dictionary.TYPE_USER_HISTORY -> UserHistoryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account) + Dictionary.TYPE_USER -> UserBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account) + Dictionary.TYPE_CONTACTS -> ContactsBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account) + Dictionary.TYPE_APPS -> AppsBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account) + else -> throw IllegalArgumentException("unknown dictionary type $dictType") + } + } catch (e: SecurityException) { + Log.e(TAG, "Cannot create dictionary: $dictType", e) + } catch (e: IllegalArgumentException) { + Log.e(TAG, "Cannot create dictionary: $dictType", e) + } + return null + } + + private fun findDictionaryGroupWithLocale(dictGroups: List?, locale: Locale): DictionaryGroup? { + return dictGroups?.firstOrNull { it.locale == locale } + } + + private fun getUsedLocales(mainLocale: Locale, context: Context): Collection { + val locales = hashSetOf(mainLocale) + // adding secondary locales is a bit tricky since they depend on the subtype + // but usually this is called with the selected subtype locale + val selectedSubtype = SubtypeSettings.getSelectedSubtype(context.prefs()) + if (selectedSubtype.locale() == mainLocale) { + locales.addAll(getSecondaryLocales(selectedSubtype.extraValue)) + } else { + // probably we're called from the spell checker when using a different app as keyboard + // so best bet is adding all secondary locales for matching main locale + SubtypeSettings.getEnabledSubtypes(false).forEach { + if (it.locale() == mainLocale) + locales.addAll(getSecondaryLocales(it.extraValue)) + } + } + return locales + } + } +} + +/** A group of dictionaries that work together for a single language. */ +private class DictionaryGroup( + val locale: Locale = Locale(""), + private var mainDict: Dictionary? = null, + val account: String? = null, // todo: not used, simply remove + subDicts: Map = emptyMap(), + context: Context? = null +) { + private val subDicts: ConcurrentHashMap = ConcurrentHashMap(subDicts) + + /** Removes a word from all dictionaries in this group. If the word is in a read-only dictionary, it is blacklisted. */ + fun removeWord(word: String) { + // remove from user history + getSubDict(Dictionary.TYPE_USER_HISTORY)?.removeUnigramEntryDynamically(word) + + // and from personal dictionary + getSubDict(Dictionary.TYPE_USER)?.removeUnigramEntryDynamically(word) + + val contactsDict = getSubDict(Dictionary.TYPE_CONTACTS) + if (contactsDict != null && contactsDict.isInDictionary(word)) { + contactsDict.removeUnigramEntryDynamically(word) // will be gone until next reload of dict + addToBlacklist(word) + return + } + + val appsDict = getSubDict(Dictionary.TYPE_APPS) + if (appsDict != null && appsDict.isInDictionary(word)) { + appsDict.removeUnigramEntryDynamically(word) // will be gone until next reload of dict + addToBlacklist(word) + return + } + + val mainDict = mainDict ?: return + if (mainDict.isValidWord(word)) { + addToBlacklist(word) + return + } + + val lowercase = word.lowercase(locale) + if (getDict(Dictionary.TYPE_MAIN)!!.isValidWord(lowercase)) { + addToBlacklist(lowercase) + } + } + + // --------------- Confidence for multilingual typing ------------------- + + // Confidence that the most probable language is actually the language the user is + // typing in. For now, this is simply the number of times a word from this language + // has been committed in a row, with an exception when typing a single word not contained + // in this language. + var confidence = 1 + + // allow to go above max confidence, for better determination of currently preferred language + // when decreasing confidence or getting weight factor, limit to maximum + fun increaseConfidence() { + confidence += 1 + } + + // If confidence is above max, drop to max confidence. This does not change weights and + // allows conveniently typing single words from the other language without affecting suggestions + fun decreaseConfidence() { + if (confidence > MAX_CONFIDENCE) confidence = MAX_CONFIDENCE + else if (confidence > 0) { + confidence -= 1 + } + } + + fun getWeightForLocale(groups: List, isGesturing: Boolean) = + getWeightForLocale(groups, if (isGesturing) 0.05f else 0.15f) + + // might need some more tuning + fun getWeightForLocale(groups: List, step: Float): Float { + if (groups.size == 1) return 1f + if (confidence < 2) return 1f - step * (MAX_CONFIDENCE - confidence) + for (group in groups) { + if (group !== this && group.confidence >= confidence) return 1f - step / 2f + } + return 1f + } + + // --------------- Blacklist ------------------- + + private val scope = CoroutineScope(Dispatchers.IO) + + // words cannot be (permanently) removed from some dictionaries, so we use a blacklist for "removing" words + private val blacklistFile = context?.let { + File(it.filesDir.absolutePath + File.separator + "blacklists" + File.separator + locale.toLanguageTag() + ".txt") + .also { it.mkdirs() } + } + + private val blacklist = hashSetOf().apply { + if (blacklistFile?.exists() != true) return@apply + scope.launch { + synchronized(this) { + try { + addAll(blacklistFile.readLines()) + } catch (e: IOException) { + Log.e(TAG, "Exception while trying to read blacklist from ${blacklistFile.name}", e) + } + } + } + } + + fun isBlacklisted(word: String) = blacklist.contains(word) + + fun addToBlacklist(word: String) { + if (!blacklist.add(word) || blacklistFile == null) return + scope.launch { + synchronized(this) { + try { + blacklistFile.appendText("$word\n") + } catch (e: IOException) { + Log.e(TAG, "Exception while trying to add word \"$word\" to blacklist ${blacklistFile.name}", e) + } + } + } + } + + fun removeFromBlacklist(word: String) { + if (!blacklist.remove(word) || blacklistFile == null) return + scope.launch { + synchronized(this) { + try { + val newLines = blacklistFile.readLines().filterNot { it == word } + blacklistFile.writeText(newLines.joinToString("\n")) + } catch (e: IOException) { + Log.e(TAG, "Exception while trying to remove word \"$word\" to blacklist ${blacklistFile.name}", e) + } + } + } + } + + // --------------- Dictionary handling ------------------- + + fun setMainDict(newMainDict: Dictionary?) { + // Close old dictionary if exists. Main dictionary can be assigned multiple times. + val oldDict = mainDict + mainDict = newMainDict + if (oldDict != null && newMainDict !== oldDict) + oldDict.close() + } + + fun getDict(dictType: String): Dictionary? { + if (dictType == Dictionary.TYPE_MAIN) { + return mainDict + } + return getSubDict(dictType) + } + + fun getSubDict(dictType: String): ExpandableBinaryDictionary? { + return subDicts[dictType] + } + + fun hasDict(dictType: String, forAccount: String?): Boolean { + if (dictType == Dictionary.TYPE_MAIN) { + return mainDict != null + } + if (dictType == Dictionary.TYPE_USER_HISTORY && forAccount != account) { + // If the dictionary type is user history, & if the account doesn't match, + // return immediately. If the account matches, continue looking it up in the + // sub dictionary map. + return false + } + return subDicts.containsKey(dictType) + } + + fun closeDict(dictType: String) { + val dict = if (Dictionary.TYPE_MAIN == dictType) { + mainDict + } else { + subDicts.remove(dictType) + } + dict?.close() + } + + companion object { + private val TAG = DictionaryGroup::class.java.simpleName + const val MAX_CONFIDENCE = 2 + } +} From 9709c0d0a24e071f94561d1ea15a8f827060773c Mon Sep 17 00:00:00 2001 From: Helium314 Date: Tue, 20 May 2025 21:17:08 +0200 Subject: [PATCH 132/175] more detailed comment on feature --- .../keyboard/latin/DictionaryFacilitatorImpl.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt index c5212c0d5..33c32a224 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt @@ -61,9 +61,12 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { // To synchronize assigning mDictionaryGroup to ensure closing dictionaries. private val mLock = Any() - // library does not deal well with ngram history for auto-capitalized words, so we adjust the ngram - // context to store next word suggestions for such cases - // todo: this looks awful, find a better solution / workaround + // The library does not deal well with ngram history for auto-capitalized words, so we adjust + // the ngram context to store next word suggestions for such cases. + // todo: this is awful, find a better solution / workaround + // or remove completely? not sure if it's actually an improvement + // should be fixed in the library, but that's not feasible with current user-provides-library approach + // added in 12cbd43bda7d0f0cd73925e9cf836de751c32ed0 / https://github.com/Helium314/HeliBoard/issues/135 private var tryChangingWords = false private var changeFrom = "" private var changeTo = "" @@ -340,7 +343,7 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { val mainFreq = dictionaryGroup.getDict(Dictionary.TYPE_MAIN)?.getFrequency(word) ?: Dictionary.NOT_A_PROBABILITY if (mainFreq == 0 && blockPotentiallyOffensive) return - if (tryChangingWords) // todo: ew... + if (tryChangingWords) tryChangingWords = ngramContext.changeWordIfAfterBeginningOfSentence(changeFrom, changeTo) val wordToUse: String From 900dfa1b9c77e9886f9c816efc6d382b1a54e7c0 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Tue, 20 May 2025 21:18:38 +0200 Subject: [PATCH 133/175] no need for special lock object --- .../keyboard/latin/DictionaryFacilitatorImpl.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt index 33c32a224..c742b6816 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt @@ -58,9 +58,6 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { @Volatile private var mLatchForWaitingLoadingMainDictionaries = CountDownLatch(0) - // To synchronize assigning mDictionaryGroup to ensure closing dictionaries. - private val mLock = Any() - // The library does not deal well with ngram history for auto-capitalized words, so we adjust // the ngram context to store next word suggestions for such cases. // todo: this is awful, find a better solution / workaround @@ -159,7 +156,7 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { // Replace Dictionaries. val oldDictionaryGroups: List - synchronized(mLock) { + synchronized(this) { oldDictionaryGroups = dictionaryGroups dictionaryGroups = newDictionaryGroups if (hasAtLeastOneUninitializedMainDictionary()) { @@ -252,7 +249,7 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { if (dictionaryGroup.getDict(Dictionary.TYPE_MAIN)?.isInitialized == true) null else dictionaryGroup to createMainDictionary(context, it) } - synchronized(mLock) { + synchronized(this) { dictGroupsWithNewMainDict.forEach { (dictGroup, mainDict) -> dictGroup.setMainDict(mainDict) } @@ -265,7 +262,7 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { override fun closeDictionaries() { val dictionaryGroupsToClose: List - synchronized(mLock) { + synchronized(this) { dictionaryGroupsToClose = dictionaryGroups dictionaryGroups = listOf(DictionaryGroup()) } From 27a23006314ce4db04bfb67d6af9d32f28da956b Mon Sep 17 00:00:00 2001 From: Helium314 Date: Tue, 20 May 2025 21:32:23 +0200 Subject: [PATCH 134/175] remove unused "account" --- .../keyboard/latin/AppsBinaryDictionary.java | 4 +- .../latin/ContactsBinaryDictionary.java | 3 +- .../keyboard/latin/DictionaryFacilitator.java | 8 +-- .../latin/DictionaryFacilitatorImpl.kt | 51 +++++++------------ .../latin/DictionaryFacilitatorLruCache.java | 6 +-- .../helium314/keyboard/latin/LatinIME.java | 14 ++--- .../keyboard/latin/UserBinaryDictionary.java | 3 +- .../PersonalizationHelper.java | 10 +--- .../UserHistoryDictionary.java | 12 ++--- .../latin/settings/SettingsValues.java | 5 -- 10 files changed, 37 insertions(+), 79 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/AppsBinaryDictionary.java b/app/src/main/java/helium314/keyboard/latin/AppsBinaryDictionary.java index 6d7ebe441..fce77fd3f 100644 --- a/app/src/main/java/helium314/keyboard/latin/AppsBinaryDictionary.java +++ b/app/src/main/java/helium314/keyboard/latin/AppsBinaryDictionary.java @@ -4,8 +4,6 @@ package helium314.keyboard.latin; import android.content.Context; -import androidx.annotation.Nullable; - import com.android.inputmethod.latin.BinaryDictionary; import java.io.File; @@ -35,7 +33,7 @@ public class AppsBinaryDictionary extends ExpandableBinaryDictionary { } public static AppsBinaryDictionary getDictionary(final Context context, final Locale locale, - final File dictFile, final String dictNamePrefix, @Nullable final String account) { + final File dictFile, final String dictNamePrefix) { return new AppsBinaryDictionary(context, locale, dictFile, dictNamePrefix + NAME); } diff --git a/app/src/main/java/helium314/keyboard/latin/ContactsBinaryDictionary.java b/app/src/main/java/helium314/keyboard/latin/ContactsBinaryDictionary.java index 2a82a0f0b..c8e953dab 100644 --- a/app/src/main/java/helium314/keyboard/latin/ContactsBinaryDictionary.java +++ b/app/src/main/java/helium314/keyboard/latin/ContactsBinaryDictionary.java @@ -14,7 +14,6 @@ import android.provider.ContactsContract.Contacts; import helium314.keyboard.latin.utils.Log; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import com.android.inputmethod.latin.BinaryDictionary; @@ -51,7 +50,7 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary } public static ContactsBinaryDictionary getDictionary(final Context context, @NonNull final Locale locale, - final File dictFile, final String dictNamePrefix, @Nullable final String account) { + final File dictFile, final String dictNamePrefix) { return new ContactsBinaryDictionary(context, locale, dictFile, dictNamePrefix + NAME); } diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitator.java b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitator.java index 783235a1f..69e9b6477 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitator.java +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitator.java @@ -23,7 +23,7 @@ import java.util.concurrent.TimeUnit; /** * Interface that facilitates interaction with different kinds of dictionaries. Provides APIs to - * instantiate and select the correct dictionaries (based on language or account), update entries + * instantiate and select the correct dictionaries (based on language and settings), update entries * and fetch suggestions. Currently AndroidSpellCheckerService and LatinIME both use * DictionaryFacilitator as a client for interacting with dictionaries. */ @@ -90,12 +90,9 @@ public interface DictionaryFacilitator { @NonNull final List locales, final boolean contacts, final boolean apps, - final boolean personalization, - @Nullable final String account + final boolean personalization ); - String getAccount(); - void resetDictionaries( final Context context, final Locale newLocale, @@ -103,7 +100,6 @@ public interface DictionaryFacilitator { final boolean useAppsDict, final boolean usePersonalizedDicts, final boolean forceReloadMainDictionary, - @Nullable final String account, final String dictNamePrefix, @Nullable final DictionaryInitializationListener listener); diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt index c742b6816..6a404d5b6 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt @@ -45,7 +45,7 @@ import kotlin.concurrent.Volatile /** * Facilitates interaction with different kinds of dictionaries. Provides APIs - * to instantiate and select the correct dictionaries (based on language or account), + * to instantiate and select the correct dictionaries (based on language and settings), * update entries and fetch suggestions. * * @@ -110,18 +110,11 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { return currentlyPreferredDictionaryGroup.locale } - override fun getAccount(): String? { - return null - } - - override fun usesSameSettings( - locales: List, contacts: Boolean, apps: Boolean, personalization: Boolean, account: String? - ): Boolean { + override fun usesSameSettings(locales: List, contacts: Boolean, apps: Boolean, personalization: Boolean): Boolean { val dictGroup = dictionaryGroups[0] // settings are the same for all groups - return contacts == dictGroup.hasDict(Dictionary.TYPE_CONTACTS, account) - && apps == dictGroup.hasDict(Dictionary.TYPE_APPS, account) - && personalization == dictGroup.hasDict(Dictionary.TYPE_USER_HISTORY, account) - && account == dictGroup.account + return contacts == dictGroup.hasDict(Dictionary.TYPE_CONTACTS) + && apps == dictGroup.hasDict(Dictionary.TYPE_APPS) + && personalization == dictGroup.hasDict(Dictionary.TYPE_USER_HISTORY) && locales.size == dictionaryGroups.size && locales.none { findDictionaryGroupWithLocale(dictionaryGroups, it) == null } } @@ -135,7 +128,6 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { useAppsDict: Boolean, usePersonalizedDicts: Boolean, forceReloadMainDictionary: Boolean, - account: String?, dictNamePrefix: String, listener: DictionaryInitializationListener? ) { @@ -191,7 +183,7 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { val existingDictsToCleanup = HashMap>() for (dictGroup in dictionaryGroups) { existingDictsToCleanup[dictGroup.locale] = DictionaryFacilitator.ALL_DICTIONARY_TYPES - .filterTo(mutableListOf()) { dictGroup.hasDict(it, account) } + .filterTo(mutableListOf()) { dictGroup.hasDict(it) } } // create new dictionary groups and remove dictionaries to re-use from existingDictsToCleanup @@ -204,7 +196,7 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { // create new or re-use already loaded main dict val mainDict: Dictionary? if (forceReload || oldDictGroupForLocale == null - || !oldDictGroupForLocale.hasDict(Dictionary.TYPE_MAIN, account) + || !oldDictGroupForLocale.hasDict(Dictionary.TYPE_MAIN) ) { mainDict = null // null main dicts will be loaded later in asyncReloadUninitializedMainDictionaries } else { @@ -217,10 +209,10 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { for (subDictType in newSubDictTypes) { val subDict: ExpandableBinaryDictionary if (forceReload || oldDictGroupForLocale == null - || !oldDictGroupForLocale.hasDict(subDictType, account) + || !oldDictGroupForLocale.hasDict(subDictType) ) { // Create a new dictionary. - subDict = getSubDict(subDictType, context, locale, null, dictNamePrefix, account) ?: continue + subDict = getSubDict(subDictType, context, locale, null, dictNamePrefix) ?: continue } else { // Reuse the existing dictionary. subDict = oldDictGroupForLocale.getSubDict(subDictType) ?: continue @@ -228,7 +220,7 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { } subDicts[subDictType] = subDict } - val newDictGroup = DictionaryGroup(locale, mainDict, account, subDicts, context) + val newDictGroup = DictionaryGroup(locale, mainDict, subDicts, context) newDictionaryGroups.add(newDictGroup) } return newDictionaryGroups to existingDictsToCleanup @@ -305,7 +297,7 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { val sv = Settings.getValues() if (sv.mAddToPersonalDictionary // require the opt-in && sv.mAutoCorrectEnabled == sv.mAutoCorrectionEnabledPerUserSettings // don't add if user wants autocorrect but input field does not, see https://github.com/Helium314/HeliBoard/issues/427#issuecomment-1905438000 - && dictionaryGroups[0].hasDict(Dictionary.TYPE_USER_HISTORY, dictionaryGroups[0].account) // require personalized suggestions + && dictionaryGroups[0].hasDict(Dictionary.TYPE_USER_HISTORY) // require personalized suggestions && !wasAutoCapitalized // we can't be 100% sure about what the user intended to type, so better don't add it && words.size == 1 // only single words ) { @@ -602,15 +594,15 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { // HACK: This threshold is being used when adding a capitalized entry in the User History dictionary. private const val CAPITALIZED_FORM_MAX_PROBABILITY_FOR_INSERT = 140 - private fun getSubDict(dictType: String, context: Context, locale: Locale, dictFile: File?, - dictNamePrefix: String, account: String? + private fun getSubDict( + dictType: String, context: Context, locale: Locale, dictFile: File?, dictNamePrefix: String ): ExpandableBinaryDictionary? { try { return when (dictType) { - Dictionary.TYPE_USER_HISTORY -> UserHistoryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account) - Dictionary.TYPE_USER -> UserBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account) - Dictionary.TYPE_CONTACTS -> ContactsBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account) - Dictionary.TYPE_APPS -> AppsBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix, account) + Dictionary.TYPE_USER_HISTORY -> UserHistoryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix) + Dictionary.TYPE_USER -> UserBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix) + Dictionary.TYPE_CONTACTS -> ContactsBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix) + Dictionary.TYPE_APPS -> AppsBinaryDictionary.getDictionary(context, locale, dictFile, dictNamePrefix) else -> throw IllegalArgumentException("unknown dictionary type $dictType") } } catch (e: SecurityException) { @@ -649,7 +641,6 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { private class DictionaryGroup( val locale: Locale = Locale(""), private var mainDict: Dictionary? = null, - val account: String? = null, // todo: not used, simply remove subDicts: Map = emptyMap(), context: Context? = null ) { @@ -798,16 +789,10 @@ private class DictionaryGroup( return subDicts[dictType] } - fun hasDict(dictType: String, forAccount: String?): Boolean { + fun hasDict(dictType: String): Boolean { if (dictType == Dictionary.TYPE_MAIN) { return mainDict != null } - if (dictType == Dictionary.TYPE_USER_HISTORY && forAccount != account) { - // If the dictionary type is user history, & if the account doesn't match, - // return immediately. If the account matches, continue looking it up in the - // sub dictionary map. - return false - } return subDicts.containsKey(dictType) } diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorLruCache.java b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorLruCache.java index 28cd88c56..2e98d0064 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorLruCache.java +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorLruCache.java @@ -59,10 +59,8 @@ public class DictionaryFacilitatorLruCache { // Nothing to do if the locale is null. This would be the case before any get() calls. if (mLocale != null) { // Note: Given that personalized dictionaries are not used here; we can pass null account. - mDictionaryFacilitator.resetDictionaries(mContext, mLocale, - mUseContactsDictionary, mUseAppsDictionary, false /* usePersonalizedDicts */, - false /* forceReloadMainDictionary */, null /* account */, - mDictionaryNamePrefix, null /* listener */); + mDictionaryFacilitator.resetDictionaries(mContext, mLocale, mUseContactsDictionary, + mUseAppsDictionary, false, false, mDictionaryNamePrefix, null); } } diff --git a/app/src/main/java/helium314/keyboard/latin/LatinIME.java b/app/src/main/java/helium314/keyboard/latin/LatinIME.java index 492d3e04e..83dbf9f58 100644 --- a/app/src/main/java/helium314/keyboard/latin/LatinIME.java +++ b/app/src/main/java/helium314/keyboard/latin/LatinIME.java @@ -738,8 +738,7 @@ public class LatinIME extends InputMethodService implements locales, mSettings.getCurrent().mUseContactsDictionary, mSettings.getCurrent().mUseAppsDictionary, - mSettings.getCurrent().mUsePersonalizedDicts, - mSettings.getCurrent().mAccount + mSettings.getCurrent().mUsePersonalizedDicts )) { return; } @@ -757,7 +756,7 @@ public class LatinIME extends InputMethodService implements final SettingsValues settingsValues = mSettings.getCurrent(); mDictionaryFacilitator.resetDictionaries(this, locale, settingsValues.mUseContactsDictionary, settingsValues.mUseAppsDictionary, - settingsValues.mUsePersonalizedDicts, false, settingsValues.mAccount, "", this); + settingsValues.mUsePersonalizedDicts, false, "", this); mInputLogic.mSuggest.setAutoCorrectionThreshold(settingsValues.mAutoCorrectionThreshold); } @@ -766,12 +765,9 @@ public class LatinIME extends InputMethodService implements */ /* package private */ void resetSuggestMainDict() { final SettingsValues settingsValues = mSettings.getCurrent(); - mDictionaryFacilitator.resetDictionaries(this /* context */, - mDictionaryFacilitator.getMainLocale(), settingsValues.mUseContactsDictionary, - settingsValues.mUseAppsDictionary, settingsValues.mUsePersonalizedDicts, - true /* forceReloadMainDictionary */, - settingsValues.mAccount, "" /* dictNamePrefix */, - this /* DictionaryInitializationListener */); + mDictionaryFacilitator.resetDictionaries(this, mDictionaryFacilitator.getMainLocale(), + settingsValues.mUseContactsDictionary, settingsValues.mUseAppsDictionary, + settingsValues.mUsePersonalizedDicts, true, "", this); } // used for debug diff --git a/app/src/main/java/helium314/keyboard/latin/UserBinaryDictionary.java b/app/src/main/java/helium314/keyboard/latin/UserBinaryDictionary.java index 0ff78fd6e..91d963cf8 100644 --- a/app/src/main/java/helium314/keyboard/latin/UserBinaryDictionary.java +++ b/app/src/main/java/helium314/keyboard/latin/UserBinaryDictionary.java @@ -82,8 +82,7 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary { } public static UserBinaryDictionary getDictionary( - final Context context, final Locale locale, final File dictFile, - final String dictNamePrefix, @Nullable final String account) { + final Context context, final Locale locale, final File dictFile, final String dictNamePrefix) { return new UserBinaryDictionary(context, locale, false, dictFile, dictNamePrefix + NAME); } diff --git a/app/src/main/java/helium314/keyboard/latin/personalization/PersonalizationHelper.java b/app/src/main/java/helium314/keyboard/latin/personalization/PersonalizationHelper.java index 93f7f76cb..dc8692c6a 100644 --- a/app/src/main/java/helium314/keyboard/latin/personalization/PersonalizationHelper.java +++ b/app/src/main/java/helium314/keyboard/latin/personalization/PersonalizationHelper.java @@ -10,7 +10,6 @@ import android.content.Context; import helium314.keyboard.latin.utils.Log; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import helium314.keyboard.latin.common.FileUtils; @@ -31,12 +30,8 @@ public class PersonalizationHelper { sLangUserHistoryDictCache = new ConcurrentHashMap<>(); @NonNull - public static UserHistoryDictionary getUserHistoryDictionary( - final Context context, final Locale locale, @Nullable final String accountName) { + public static UserHistoryDictionary getUserHistoryDictionary(final Context context, final Locale locale) { String lookupStr = locale.toString(); - if (accountName != null) { - lookupStr += "." + accountName; - } synchronized (sLangUserHistoryDictCache) { if (sLangUserHistoryDictCache.containsKey(lookupStr)) { final SoftReference ref = @@ -50,8 +45,7 @@ public class PersonalizationHelper { return dict; } } - final UserHistoryDictionary dict = new UserHistoryDictionary( - context, locale, accountName); + final UserHistoryDictionary dict = new UserHistoryDictionary(context, locale); sLangUserHistoryDictCache.put(lookupStr, new SoftReference<>(dict)); return dict; } diff --git a/app/src/main/java/helium314/keyboard/latin/personalization/UserHistoryDictionary.java b/app/src/main/java/helium314/keyboard/latin/personalization/UserHistoryDictionary.java index b860b1c96..98645080e 100644 --- a/app/src/main/java/helium314/keyboard/latin/personalization/UserHistoryDictionary.java +++ b/app/src/main/java/helium314/keyboard/latin/personalization/UserHistoryDictionary.java @@ -30,9 +30,8 @@ public class UserHistoryDictionary extends ExpandableBinaryDictionary { static final String NAME = UserHistoryDictionary.class.getSimpleName(); // TODO: Make this constructor private - UserHistoryDictionary(final Context context, final Locale locale, - @Nullable final String account) { - super(context, getUserHistoryDictName(NAME, locale, null /* dictFile */, account), locale, Dictionary.TYPE_USER_HISTORY, null); + UserHistoryDictionary(final Context context, final Locale locale) { + super(context, getUserHistoryDictName(NAME, locale, null), locale, Dictionary.TYPE_USER_HISTORY, null); if (mLocale != null && mLocale.toString().length() > 1) { reloadDictionaryIfRequired(); } @@ -41,14 +40,13 @@ public class UserHistoryDictionary extends ExpandableBinaryDictionary { /** * @returns the name of the {@link UserHistoryDictionary}. */ - static String getUserHistoryDictName(final String name, final Locale locale, - @Nullable final File dictFile, @Nullable final String account) { + static String getUserHistoryDictName(final String name, final Locale locale, @Nullable final File dictFile) { return getDictName(name, locale, dictFile); } public static UserHistoryDictionary getDictionary(final Context context, final Locale locale, - final File dictFile, final String dictNamePrefix, @Nullable final String account) { - return PersonalizationHelper.getUserHistoryDictionary(context, locale, account); + final File dictFile, final String dictNamePrefix) { + return PersonalizationHelper.getUserHistoryDictionary(context, locale); } /** diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java index b79e06e6e..9c0b66f23 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java @@ -16,7 +16,6 @@ import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodSubtype; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.core.util.TypedValueCompat; import helium314.keyboard.compat.ConfigurationCompatKt; @@ -150,9 +149,6 @@ public class SettingsValues { // User-defined colors public final Colors mColors; - @Nullable - public final String mAccount; // todo: always null, remove? - // creation of Colors and SpacingAndPunctuations are the slowest parts in here, but still ok public SettingsValues(final Context context, final SharedPreferences prefs, final Resources res, @NonNull final InputAttributes inputAttributes) { @@ -228,7 +224,6 @@ public class SettingsValues { mGestureFloatingPreviewDynamicEnabled = Settings.readGestureDynamicPreviewEnabled(prefs); mGestureFastTypingCooldown = prefs.getInt(Settings.PREF_GESTURE_FAST_TYPING_COOLDOWN, Defaults.PREF_GESTURE_FAST_TYPING_COOLDOWN); mGestureTrailFadeoutDuration = prefs.getInt(Settings.PREF_GESTURE_TRAIL_FADEOUT_DURATION, Defaults.PREF_GESTURE_TRAIL_FADEOUT_DURATION); - mAccount = null; // remove? or can it be useful somewhere? mOverrideShowingSuggestions = mInputAttributes.mMayOverrideShowingSuggestions && prefs.getBoolean(Settings.PREF_ALWAYS_SHOW_SUGGESTIONS, Defaults.PREF_ALWAYS_SHOW_SUGGESTIONS) && ((inputAttributes.mInputType & InputType.TYPE_MASK_VARIATION) != InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT From 4289e487e964ce9119b93e5b6f255def3534b949 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Tue, 20 May 2025 22:17:10 +0200 Subject: [PATCH 135/175] prepare for adding customizable weights for user-provided dictionaries --- .../keyboard/latin/DictionaryCollection.java | 41 +++++++------------ .../keyboard/latin/DictionaryFactory.kt | 5 ++- 2 files changed, 17 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryCollection.java b/app/src/main/java/helium314/keyboard/latin/DictionaryCollection.java index 7496f86f1..35d4bc034 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryCollection.java +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryCollection.java @@ -6,30 +6,35 @@ package helium314.keyboard.latin; -import helium314.keyboard.latin.utils.Log; - import helium314.keyboard.latin.SuggestedWords.SuggestedWordInfo; import helium314.keyboard.latin.common.ComposedData; import helium314.keyboard.latin.settings.SettingsValuesForSuggestion; +import helium314.keyboard.latin.utils.Log; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Locale; -import java.util.concurrent.CopyOnWriteArrayList; /** * Class for a collection of dictionaries that behave like one dictionary. */ public final class DictionaryCollection extends Dictionary { private final String TAG = DictionaryCollection.class.getSimpleName(); - private final CopyOnWriteArrayList mDictionaries; + private final ArrayList mDictionaries; + private final float[] mWeights; public DictionaryCollection(final String dictType, final Locale locale, - final Collection dictionaries) { + final Collection dictionaries, final float[] weights) { super(dictType, locale); - mDictionaries = new CopyOnWriteArrayList<>(dictionaries); + mDictionaries = new ArrayList<>(dictionaries); mDictionaries.removeAll(Collections.singleton(null)); + if (mDictionaries.size() > weights.length) { + mWeights = new float[mDictionaries.size()]; + Arrays.fill(mWeights, 1f); + Log.w(TAG, "got weights array of length " + weights.length + ", expected "+mDictionaries.size()); + } else mWeights = weights; } @Override @@ -38,19 +43,19 @@ public final class DictionaryCollection extends Dictionary { final SettingsValuesForSuggestion settingsValuesForSuggestion, final int sessionId, final float weightForLocale, final float[] inOutWeightOfLangModelVsSpatialModel) { - final CopyOnWriteArrayList dictionaries = mDictionaries; + final ArrayList dictionaries = mDictionaries; if (dictionaries.isEmpty()) return null; // To avoid creating unnecessary objects, we get the list out of the first // dictionary and add the rest to it if not null, hence the get(0) ArrayList suggestions = dictionaries.get(0).getSuggestions(composedData, ngramContext, proximityInfoHandle, settingsValuesForSuggestion, sessionId, - weightForLocale, inOutWeightOfLangModelVsSpatialModel); + weightForLocale * mWeights[0], inOutWeightOfLangModelVsSpatialModel); if (null == suggestions) suggestions = new ArrayList<>(); final int length = dictionaries.size(); for (int i = 1; i < length; ++ i) { final ArrayList sugg = dictionaries.get(i).getSuggestions( composedData, ngramContext, proximityInfoHandle, settingsValuesForSuggestion, - sessionId, weightForLocale, inOutWeightOfLangModelVsSpatialModel); + sessionId, weightForLocale * mWeights[i], inOutWeightOfLangModelVsSpatialModel); if (null != sugg) suggestions.addAll(sugg); } return suggestions; @@ -93,22 +98,4 @@ public final class DictionaryCollection extends Dictionary { for (final Dictionary dict : mDictionaries) dict.close(); } - - // Warning: this is not thread-safe. Take necessary precaution when calling. - public void addDictionary(final Dictionary newDict) { - if (null == newDict) return; - if (mDictionaries.contains(newDict)) { - Log.w(TAG, "This collection already contains this dictionary: " + newDict); - } - mDictionaries.add(newDict); - } - - // Warning: this is not thread-safe. Take necessary precaution when calling. - public void removeDictionary(final Dictionary dict) { - if (mDictionaries.contains(dict)) { - mDictionaries.remove(dict); - } else { - Log.w(TAG, "This collection does not contain this dictionary: " + dict); - } - } } diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt index 29b416a5d..4fc9c6859 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt @@ -25,6 +25,7 @@ import java.util.Locale * @param locale the locale for which to create the dictionary * @return an initialized instance of DictionaryCollection */ +// todo: this needs updating, and then we can expose the weight for custom dictionaries (useful for addons like emoji dict) fun createMainDictionary(context: Context, locale: Locale): DictionaryCollection { val cacheDir = DictionaryInfoUtils.getAndCreateCacheDirectoryForLocale(locale, context) val dictList = LinkedList() @@ -36,7 +37,7 @@ fun createMainDictionary(context: Context, locale: Locale): DictionaryCollection // add extracted dicts to list (after userDicts, to skip extracted dicts of same type) extractedDicts.forEach { checkAndAddDictionaryToListIfNotExisting(it, dictList, locale) } if (dictList.any { it.mDictType == Dictionary.TYPE_MAIN }) - return DictionaryCollection(Dictionary.TYPE_MAIN, locale, dictList) + return DictionaryCollection(Dictionary.TYPE_MAIN, locale, dictList, FloatArray(dictList.size) { 1f }) // no main dict found -> check assets val assetsDicts = DictionaryInfoUtils.getAssetsDictionaryList(context) @@ -57,7 +58,7 @@ fun createMainDictionary(context: Context, locale: Locale): DictionaryCollection // If the list is empty, that means we should not use any dictionary (for example, the user // explicitly disabled the main dictionary), so the following is okay. dictList is never // null, but if for some reason it is, DictionaryCollection handles it gracefully. - return DictionaryCollection(Dictionary.TYPE_MAIN, locale, dictList) + return DictionaryCollection(Dictionary.TYPE_MAIN, locale, dictList, FloatArray(dictList.size) { 1f }) } /** From 9d38471f72bece12bb21ed86d1c624c92190c0f1 Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Tue, 20 May 2025 23:57:02 +0300 Subject: [PATCH 136/175] Enlarge toolbar button and icon (#1556) --- .../keyboard/latin/suggestions/SuggestionStripView.java | 2 -- app/src/main/res/layout/suggestions_strip.xml | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java b/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java index 860759831..58dacf660 100644 --- a/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java +++ b/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java @@ -216,8 +216,6 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick colors.setColor(mToolbarExpandKey, ColorType.TOOL_BAR_EXPAND_KEY); mToolbarExpandKey.setBackground(new ShapeDrawable(new OvalShape())); // ShapeDrawable color is black, need src_atop filter mToolbarExpandKey.getBackground().setColorFilter(colors.get(ColorType.TOOL_BAR_EXPAND_KEY_BACKGROUND), PorterDuff.Mode.SRC_ATOP); - mToolbarExpandKey.getLayoutParams().height *= 0.82; // shrink the whole key a little (drawable not affected) - mToolbarExpandKey.getLayoutParams().width *= 0.82; for (final ToolbarKey pinnedKey : ToolbarUtilsKt.getPinnedToolbarKeys(prefs)) { final ImageButton button = createToolbarKey(context, iconsSet, pinnedKey); diff --git a/app/src/main/res/layout/suggestions_strip.xml b/app/src/main/res/layout/suggestions_strip.xml index ab2d27777..0995072aa 100644 --- a/app/src/main/res/layout/suggestions_strip.xml +++ b/app/src/main/res/layout/suggestions_strip.xml @@ -24,6 +24,8 @@ android:layout_gravity="center_vertical" android:layout_weight="0" android:layout_marginStart="4dp" + android:scaleType="centerCrop" + android:padding="2dp" style="?attr/suggestionWordStyle" android:contentDescription="@string/more_keys_strip_description" /> Date: Tue, 20 May 2025 23:05:01 +0200 Subject: [PATCH 137/175] add color for popup key icons fixes GH-1577 --- .../main/java/helium314/keyboard/keyboard/KeyboardView.java | 3 +-- app/src/main/java/helium314/keyboard/latin/common/Colors.kt | 5 +++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java index 77258b2d6..2df204403 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardView.java @@ -631,8 +631,7 @@ public class KeyboardView extends View { } else if (key.getBackgroundType() != Key.BACKGROUND_TYPE_NORMAL) { mColors.setColor(icon, ColorType.KEY_ICON); } else if (this instanceof PopupKeysKeyboardView) { - // set color filter for long press comma key, should not trigger anywhere else - mColors.setColor(icon, ColorType.KEY_ICON); + mColors.setColor(icon, ColorType.POPUP_KEY_ICON); } else if (key.getCode() == Constants.CODE_SPACE || key.getCode() == KeyCode.ZWNJ) { // set color of default number pad space bar icon for Holo style, or for zero-width non-joiner (zwnj) on some layouts like nepal mColors.setColor(icon, ColorType.KEY_ICON); diff --git a/app/src/main/java/helium314/keyboard/latin/common/Colors.kt b/app/src/main/java/helium314/keyboard/latin/common/Colors.kt index f8a57a476..708122828 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/Colors.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/Colors.kt @@ -278,7 +278,7 @@ class DynamicColors(context: Context, override val themeStyle: String, override TOOL_BAR_EXPAND_KEY_BACKGROUND -> if (!isNight) accent else doubleAdjustedBackground GESTURE_TRAIL -> gesture KEY_TEXT, SUGGESTION_AUTO_CORRECT, REMOVE_SUGGESTION_ICON, EMOJI_KEY_TEXT, KEY_PREVIEW_TEXT, POPUP_KEY_TEXT, - KEY_ICON, ONE_HANDED_MODE_BUTTON, EMOJI_CATEGORY, TOOL_BAR_KEY, FUNCTIONAL_KEY_TEXT -> keyText + KEY_ICON, POPUP_KEY_ICON, ONE_HANDED_MODE_BUTTON, EMOJI_CATEGORY, TOOL_BAR_KEY, FUNCTIONAL_KEY_TEXT -> keyText KEY_HINT_TEXT -> keyHintText SPACE_BAR_TEXT -> spaceBarText FUNCTIONAL_KEY_BACKGROUND -> functionalKey @@ -476,7 +476,7 @@ class DefaultColors ( TOOL_BAR_EXPAND_KEY_BACKGROUND, CLIPBOARD_SUGGESTION_BACKGROUND -> doubleAdjustedBackground GESTURE_TRAIL -> gesture KEY_TEXT, REMOVE_SUGGESTION_ICON, FUNCTIONAL_KEY_TEXT, KEY_ICON, EMOJI_KEY_TEXT, - POPUP_KEY_TEXT, KEY_PREVIEW_TEXT -> keyText + POPUP_KEY_TEXT, POPUP_KEY_ICON, KEY_PREVIEW_TEXT -> keyText KEY_HINT_TEXT -> keyHintText SPACE_BAR_TEXT -> spaceBarText FUNCTIONAL_KEY_BACKGROUND -> functionalKey @@ -637,6 +637,7 @@ enum class ColorType { MORE_SUGGESTIONS_WORD_BACKGROUND, POPUP_KEYS_BACKGROUND, POPUP_KEY_TEXT, + POPUP_KEY_ICON, NAVIGATION_BAR, SHIFT_KEY_ICON, SPACE_BAR_BACKGROUND, From d9a779a66e9dd79369d6aa5acb627cb97351ae2f Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 21 May 2025 17:35:24 +0200 Subject: [PATCH 138/175] update comments and documentation currently irrelevant changes to dump methods --- .../keyboard/latin/DictionaryFacilitator.java | 32 +++++++++++-------- .../latin/DictionaryFacilitatorImpl.kt | 19 ++++------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitator.java b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitator.java index 69e9b6477..eba0932f6 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitator.java +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitator.java @@ -42,14 +42,10 @@ public interface DictionaryFacilitator { Dictionary.TYPE_USER_HISTORY, Dictionary.TYPE_USER}; - /** - * The facilitator will put words into the cache whenever it decodes them. - */ + /** The facilitator will put words into the cache whenever it decodes them. */ void setValidSpellingWordReadCache(final LruCache cache); - /** - * The facilitator will get words from the cache whenever it needs to check their spelling. - */ + /** The facilitator will get words from the cache whenever it needs to check their spelling. */ void setValidSpellingWordWriteCache(final LruCache cache); /** @@ -79,12 +75,14 @@ public interface DictionaryFacilitator { */ void onFinishInput(Context context); + /** whether a dictionary is set */ boolean isActive(); + /** the locale provided in resetDictionaries */ @NonNull Locale getMainLocale(); - // useful for multilingual typing - Locale getCurrentLocale(); + /** the most "trusted" locale, differs from getMainLocale only if multilingual typing is used */ + @NonNull Locale getCurrentLocale(); boolean usesSameSettings( @NonNull final List locales, @@ -93,6 +91,7 @@ public interface DictionaryFacilitator { final boolean personalization ); + /** switches to newLocale, gets secondary locales from current settings, and sets secondary dictionaries */ void resetDictionaries( final Context context, final Locale newLocale, @@ -103,30 +102,37 @@ public interface DictionaryFacilitator { final String dictNamePrefix, @Nullable final DictionaryInitializationListener listener); + /** removes the word from all editable dictionaries, and adds it to a blacklist in case it's in a read-only dictionary */ void removeWord(String word); void closeDictionaries(); - // The main dictionaries are loaded asynchronously. Don't cache the return value - // of these methods. + /** main dictionaries are loaded asynchronously after resetDictionaries */ boolean hasAtLeastOneInitializedMainDictionary(); + /** main dictionaries are loaded asynchronously after resetDictionaries */ boolean hasAtLeastOneUninitializedMainDictionary(); + /** main dictionaries are loaded asynchronously after resetDictionaries */ void waitForLoadingMainDictionaries(final long timeout, final TimeUnit unit) throws InterruptedException; + /** adds the word to user history dictionary, calls adjustConfindences, and might add it to personal dictionary if the setting is enabled */ void addToUserHistory(final String suggestion, final boolean wasAutoCapitalized, @NonNull final NgramContext ngramContext, final long timeStampInSeconds, final boolean blockPotentiallyOffensive); + /** adjust confidences for multilingual typing */ void adjustConfidences(final String word, final boolean wasAutoCapitalized); + /** a string with all used locales and their current confidences, null if multilingual typing is not used */ + @Nullable String localesAndConfidences(); + + /** completely removes the word from user history (currently not if event is a backspace event) */ void unlearnFromUserHistory(final String word, @NonNull final NgramContext ngramContext, final long timeStampInSeconds, final int eventType); - // TODO: Revise the way to fusion suggestion results. @NonNull SuggestionResults getSuggestionResults(final ComposedData composedData, final NgramContext ngramContext, @NonNull final Keyboard keyboard, final SettingsValuesForSuggestion settingsValuesForSuggestion, final int sessionId, @@ -136,12 +142,10 @@ public interface DictionaryFacilitator { boolean isValidSuggestionWord(final String word); - boolean clearUserHistoryDictionary(final Context context); + void clearUserHistoryDictionary(final Context context); String dump(final Context context); - String localesAndConfidences(); - void dumpDictionaryForDebug(final String dictName); @NonNull List getDictionaryStats(final Context context); diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt index 6a404d5b6..0cdf506c8 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt @@ -212,7 +212,7 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { || !oldDictGroupForLocale.hasDict(subDictType) ) { // Create a new dictionary. - subDict = getSubDict(subDictType, context, locale, null, dictNamePrefix) ?: continue + subDict = createSubDict(subDictType, context, locale, null, dictNamePrefix) ?: continue } else { // Reuse the existing dictionary. subDict = oldDictGroupForLocale.getSubDict(subDictType) ?: continue @@ -556,14 +556,10 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { } } - // todo: remove return value, not used - override fun clearUserHistoryDictionary(context: Context): Boolean { + override fun clearUserHistoryDictionary(context: Context) { for (dictionaryGroup in dictionaryGroups) { - val dictionary = dictionaryGroup.getSubDict(Dictionary.TYPE_USER_HISTORY) - ?: return false - dictionary.clear() + dictionaryGroup.getSubDict(Dictionary.TYPE_USER_HISTORY)?.clear() } - return true } override fun localesAndConfidences(): String? { @@ -581,12 +577,11 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { } override fun getDictionaryStats(context: Context): List = - DictionaryFacilitator.DYNAMIC_DICTIONARY_TYPES.mapNotNull { - dictionaryGroups[0].getSubDict(it)?.dictionaryStats + DictionaryFacilitator.DYNAMIC_DICTIONARY_TYPES.flatMap { dictType -> + dictionaryGroups.mapNotNull { it.getSubDict(dictType)?.dictionaryStats } } - // todo: remove from interface? - override fun dump(context: Context) = "" + override fun dump(context: Context) = getDictionaryStats(context).joinToString("\n") companion object { private val TAG = DictionaryFacilitatorImpl::class.java.simpleName @@ -594,7 +589,7 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { // HACK: This threshold is being used when adding a capitalized entry in the User History dictionary. private const val CAPITALIZED_FORM_MAX_PROBABILITY_FOR_INSERT = 140 - private fun getSubDict( + private fun createSubDict( dictType: String, context: Context, locale: Locale, dictFile: File?, dictNamePrefix: String ): ExpandableBinaryDictionary? { try { From e32a0c8e98838c43fc37fa0db565f02bf9a04884 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 21 May 2025 18:13:58 +0200 Subject: [PATCH 139/175] move ComposedData to Kotlin and add method to create ComposedData for a given word --- .../keyboard/latin/common/ComposedData.java | 56 ------------------- .../keyboard/latin/common/ComposedData.kt | 55 ++++++++++++++++++ 2 files changed, 55 insertions(+), 56 deletions(-) delete mode 100644 app/src/main/java/helium314/keyboard/latin/common/ComposedData.java create mode 100644 app/src/main/java/helium314/keyboard/latin/common/ComposedData.kt diff --git a/app/src/main/java/helium314/keyboard/latin/common/ComposedData.java b/app/src/main/java/helium314/keyboard/latin/common/ComposedData.java deleted file mode 100644 index 7e42f380a..000000000 --- a/app/src/main/java/helium314/keyboard/latin/common/ComposedData.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * modified - * SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only - */ - -package helium314.keyboard.latin.common; - -import androidx.annotation.NonNull; - -/** - * An immutable class that encapsulates a snapshot of word composition data. - */ -public class ComposedData { - @NonNull - public final InputPointers mInputPointers; - public final boolean mIsBatchMode; - @NonNull - public final String mTypedWord; - - public ComposedData(@NonNull final InputPointers inputPointers, final boolean isBatchMode, - @NonNull final String typedWord) { - mInputPointers = inputPointers; - mIsBatchMode = isBatchMode; - mTypedWord = typedWord; - } - - /** - * Copy the code points in the typed word to a destination array of ints. - * - * If the array is too small to hold the code points in the typed word, nothing is copied and - * -1 is returned. - * - * @param destination the array of ints. - * @return the number of copied code points. - */ - public int copyCodePointsExceptTrailingSingleQuotesAndReturnCodePointCount( - @NonNull final int[] destination) { - // lastIndex is exclusive - final int lastIndex = mTypedWord.length() - - StringUtils.getTrailingSingleQuotesCount(mTypedWord); - if (lastIndex <= 0) { - // The string is empty or contains only single quotes. - return 0; - } - - // The following function counts the number of code points in the text range which begins - // at index 0 and extends to the character at lastIndex. - final int codePointSize = Character.codePointCount(mTypedWord, 0, lastIndex); - if (codePointSize > destination.length) { - return -1; - } - return StringUtils.copyCodePointsAndReturnCodePointCount(destination, mTypedWord, 0, - lastIndex, true /* downCase */); - } -} diff --git a/app/src/main/java/helium314/keyboard/latin/common/ComposedData.kt b/app/src/main/java/helium314/keyboard/latin/common/ComposedData.kt new file mode 100644 index 000000000..159d1b1c7 --- /dev/null +++ b/app/src/main/java/helium314/keyboard/latin/common/ComposedData.kt @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * modified + * SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only + */ +package helium314.keyboard.latin.common + +import helium314.keyboard.latin.WordComposer + +/** An immutable class that encapsulates a snapshot of word composition data. */ +class ComposedData( + @JvmField val mInputPointers: InputPointers, + @JvmField val mIsBatchMode: Boolean, + @JvmField val mTypedWord: String +) { + /** + * Copy the code points in the typed word to a destination array of ints. + * + * If the array is too small to hold the code points in the typed word, nothing is copied and + * -1 is returned. + * + * @param destination the array of ints. + * @return the number of copied code points. + */ + fun copyCodePointsExceptTrailingSingleQuotesAndReturnCodePointCount( + destination: IntArray + ): Int { + // lastIndex is exclusive + val lastIndex = (mTypedWord.length - StringUtils.getTrailingSingleQuotesCount(mTypedWord)) + if (lastIndex <= 0) { + return 0 // The string is empty or contains only single quotes. + } + + // The following function counts the number of code points in the text range which begins + // at index 0 and extends to the character at lastIndex. + val codePointSize = Character.codePointCount(mTypedWord, 0, lastIndex) + if (codePointSize > destination.size) { + return -1 + } + return StringUtils.copyCodePointsAndReturnCodePointCount( + destination, mTypedWord, 0, lastIndex, true + ) + } + + companion object { + fun createForWord(word: String): ComposedData { + val codePoints = StringUtils.toCodePointArray(word) + val coordinates = CoordinateUtils.newCoordinateArray(codePoints.size) + for (i in codePoints.indices) { + CoordinateUtils.setXYInArray(coordinates, i, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE) + } + return WordComposer().apply { setComposingWord(codePoints, coordinates) }.composedDataSnapshot + } + } +} From b1b357d6b89d93c535f71a2908672cf94eac8d39 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 21 May 2025 21:02:16 +0200 Subject: [PATCH 140/175] move DictionaryInfoUtils to Kotlin --- .../latin/utils/DictionaryInfoUtils.java | 223 ------------------ .../latin/utils/DictionaryInfoUtils.kt | 171 ++++++++++++++ .../keyboard/latin/utils/DictionaryUtils.kt | 4 +- .../settings/dialogs/NewDictionaryDialog.kt | 7 +- 4 files changed, 177 insertions(+), 228 deletions(-) delete mode 100644 app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.java create mode 100644 app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt diff --git a/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.java b/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.java deleted file mode 100644 index b27de7655..000000000 --- a/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * modified - * SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only - */ - -package helium314.keyboard.latin.utils; - -import android.content.Context; -import android.text.TextUtils; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.android.inputmethod.latin.utils.BinaryDictionaryUtils; - -import helium314.keyboard.latin.define.DecoderSpecificConstants; -import helium314.keyboard.latin.makedict.DictionaryHeader; -import helium314.keyboard.latin.makedict.UnsupportedFormatException; -import helium314.keyboard.latin.settings.SpacingAndPunctuations; - -import java.io.File; -import java.io.IOException; -import java.util.Locale; - -/** - * This class encapsulates the logic for the Latin-IME side of dictionary information management. - */ -public class DictionaryInfoUtils { - private static final String TAG = DictionaryInfoUtils.class.getSimpleName(); - public static final String DEFAULT_MAIN_DICT = "main"; - public static final String USER_DICTIONARY_SUFFIX = "user.dict"; - public static final String MAIN_DICT_PREFIX = DEFAULT_MAIN_DICT + "_"; - // 6 digits - unicode is limited to 21 bits - private static final int MAX_HEX_DIGITS_FOR_CODEPOINT = 6; - public static final String ASSETS_DICTIONARY_FOLDER = "dicts"; - public static final String ID_CATEGORY_SEPARATOR = ":"; - private static final String DICTIONARY_CATEGORY_SEPARATOR_EXPRESSION = "[" + ID_CATEGORY_SEPARATOR + "_]"; - - private DictionaryInfoUtils() { - // Private constructor to forbid instantation of this helper class. - } - - /** - * Returns whether we may want to use this character as part of a file name. - *

      - * This basically only accepts ascii letters and numbers, and rejects everything else. - */ - private static boolean isFileNameCharacter(int codePoint) { - if (codePoint >= 0x30 && codePoint <= 0x39) return true; // Digit - if (codePoint >= 0x41 && codePoint <= 0x5A) return true; // Uppercase - if (codePoint >= 0x61 && codePoint <= 0x7A) return true; // Lowercase - return codePoint == '_' || codePoint == '-'; - } - - /** - * Escapes a string for any characters that may be suspicious for a file or directory name. - *

      - * Concretely this does a sort of URL-encoding except it will encode everything that's not - * alphanumeric or underscore. (true URL-encoding leaves alone characters like '*', which - * we cannot allow here) - */ - // TODO: create a unit test for this method - public static String replaceFileNameDangerousCharacters(final String name) { - // This assumes '%' is fully available as a non-separator, normal - // character in a file name. This is probably true for all file systems. - final StringBuilder sb = new StringBuilder(); - final int nameLength = name.length(); - for (int i = 0; i < nameLength; i = name.offsetByCodePoints(i, 1)) { - final int codePoint = name.codePointAt(i); - if (DictionaryInfoUtils.isFileNameCharacter(codePoint)) { - sb.appendCodePoint(codePoint); - } else { - sb.append(String.format(Locale.US, "%%%1$0" + MAX_HEX_DIGITS_FOR_CODEPOINT + "x", codePoint)); - } - } - return sb.toString(); - } - - /** - * Helper method to get the top level cache directory. - */ - public static String getWordListCacheDirectory(final Context context) { - return context.getFilesDir() + File.separator + "dicts"; - } - - /** - * Reverse escaping done by {@link #replaceFileNameDangerousCharacters(String)}. - */ - @NonNull - public static String getWordListIdFromFileName(@NonNull final String fname) { - final StringBuilder sb = new StringBuilder(); - final int fnameLength = fname.length(); - for (int i = 0; i < fnameLength; i = fname.offsetByCodePoints(i, 1)) { - final int codePoint = fname.codePointAt(i); - if ('%' != codePoint) { - sb.appendCodePoint(codePoint); - } else { - // + 1 to pass the % sign - final int encodedCodePoint = - Integer.parseInt(fname.substring(i + 1, i + 1 + MAX_HEX_DIGITS_FOR_CODEPOINT), 16); - i += MAX_HEX_DIGITS_FOR_CODEPOINT; - sb.appendCodePoint(encodedCodePoint); - } - } - return sb.toString(); - } - - /** - * Helper method to the list of cache directories, one for each distinct locale. - */ - @Nullable public static File[] getCachedDirectoryList(final Context context) { - return new File(DictionaryInfoUtils.getWordListCacheDirectory(context)).listFiles(); - } - - /** - * Find out the cache directory associated with a specific locale. - */ - public static String getAndCreateCacheDirectoryForLocale(final Locale locale, final Context context) { - final String absoluteDirectoryName = getCacheDirectoryForLocale(locale, context); - final File directory = new File(absoluteDirectoryName); - if (!directory.exists()) { - if (!directory.mkdirs()) { - Log.e(TAG, "Could not create the directory for locale" + locale); - } - } - return absoluteDirectoryName; - } - - public static String getCacheDirectoryForLocale(final Locale locale, final Context context) { - final String relativeDirectoryName = replaceFileNameDangerousCharacters(locale.toLanguageTag()); - return getWordListCacheDirectory(context) + File.separator + relativeDirectoryName; - } - - public static File[] getCachedDictsForLocale(final Locale locale, final Context context) { - final File cachedDir = new File(getAndCreateCacheDirectoryForLocale(locale, context)); - if (!cachedDir.isDirectory()) - return new File[]{}; - return cachedDir.listFiles(); - } - - public static String getExtractedMainDictFilename() { - return DEFAULT_MAIN_DICT + ".dict"; - } - - @Nullable - public static DictionaryHeader getDictionaryFileHeaderOrNull(final File file, - final long offset, final long length) { - try { - return BinaryDictionaryUtils.getHeaderWithOffsetAndLength(file, offset, length); - } catch (UnsupportedFormatException | IOException e) { - return null; - } - } - - @Nullable - public static DictionaryHeader getDictionaryFileHeaderOrNull(final File file) { - try { - return BinaryDictionaryUtils.getHeader(file); - } catch (UnsupportedFormatException | IOException e) { - return null; - } - } - - /** - * Returns the locale for a dictionary file name stored in assets. - *

      - * Assumes file name main_[locale].dict - *

      - * Returns the locale, or null if file name does not match the pattern - */ - @Nullable public static String extractLocaleFromAssetsDictionaryFile(final String dictionaryFileName) { - if (dictionaryFileName.startsWith(DictionaryInfoUtils.MAIN_DICT_PREFIX) - && dictionaryFileName.endsWith(".dict")) { - return dictionaryFileName.substring( - DictionaryInfoUtils.MAIN_DICT_PREFIX.length(), - dictionaryFileName.lastIndexOf('.') - ); - } - return null; - } - - @Nullable public static String[] getAssetsDictionaryList(final Context context) { - final String[] dictionaryList; - try { - dictionaryList = context.getAssets().list(ASSETS_DICTIONARY_FOLDER); - } catch (IOException e) { - return null; - } - return dictionaryList; - } - - public static boolean looksValidForDictionaryInsertion(final CharSequence text, - final SpacingAndPunctuations spacingAndPunctuations) { - if (TextUtils.isEmpty(text)) { - return false; - } - final int length = text.length(); - if (length > DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH) { - return false; - } - int i = 0; - int digitCount = 0; - while (i < length) { - final int codePoint = Character.codePointAt(text, i); - final int charCount = Character.charCount(codePoint); - i += charCount; - if (Character.isDigit(codePoint)) { - // Count digits: see below - digitCount += charCount; - continue; - } - if (!spacingAndPunctuations.isWordCodePoint(codePoint)) { - return false; - } - } - // We reject strings entirely comprised of digits to avoid using PIN codes or credit - // card numbers. It would come in handy for word prediction though; a good example is - // when writing one's address where the street number is usually quite discriminative, - // as well as the postal code. - return digitCount < length; - } -} diff --git a/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt new file mode 100644 index 000000000..ec6322cbd --- /dev/null +++ b/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * modified + * SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only + */ +package helium314.keyboard.latin.utils + +import android.content.Context +import android.text.TextUtils +import com.android.inputmethod.latin.utils.BinaryDictionaryUtils +import helium314.keyboard.latin.common.loopOverCodePoints +import helium314.keyboard.latin.define.DecoderSpecificConstants +import helium314.keyboard.latin.makedict.DictionaryHeader +import helium314.keyboard.latin.makedict.UnsupportedFormatException +import helium314.keyboard.latin.settings.SpacingAndPunctuations +import java.io.File +import java.io.IOException +import java.util.Locale + +/** encapsulates the logic for the Latin-IME side of dictionary information management */ +object DictionaryInfoUtils { + private val TAG = DictionaryInfoUtils::class.java.simpleName + const val DEFAULT_MAIN_DICT = "main" + const val USER_DICTIONARY_SUFFIX = "user.dict" + const val MAIN_DICT_PREFIX = DEFAULT_MAIN_DICT + "_" + const val ASSETS_DICTIONARY_FOLDER = "dicts" + const val MAIN_DICT_FILE_NAME = DEFAULT_MAIN_DICT + ".dict" + private const val MAX_HEX_DIGITS_FOR_CODEPOINT = 6 // unicode is limited to 21 bits + + /** + * Returns whether we may want to use this character as part of a file name. + * This basically only accepts ascii letters and numbers, and rejects everything else. + */ + private fun isFileNameCharacter(codePoint: Int): Boolean { + if (codePoint in 0x30..0x39) return true // Digit + if (codePoint in 0x41..0x5A) return true // Uppercase + if (codePoint in 0x61..0x7A) return true // Lowercase + return codePoint == '_'.code || codePoint == '-'.code + } + + /** + * Escapes a string for any characters that may be suspicious for a file or directory name. + * + * Concretely this does a sort of URL-encoding except it will encode everything that's not + * alphanumeric or underscore. (true URL-encoding leaves alone characters like '*', which + * we cannot allow here) + */ + private fun replaceFileNameDangerousCharacters(name: String): String { + // This assumes '%' is fully available as a non-separator, normal + // character in a file name. This is probably true for all file systems. + val sb = StringBuilder() + loopOverCodePoints(name) { codePoint, _ -> + if (isFileNameCharacter(codePoint)) { + sb.appendCodePoint(codePoint) + } else { + sb.append(String.format(Locale.US, "%%%1$0" + MAX_HEX_DIGITS_FOR_CODEPOINT + "x", codePoint)) + } + false + } + return sb.toString() + } + + fun getWordListCacheDirectory(context: Context): String = context.filesDir.toString() + File.separator + "dicts" + + /** Reverse escaping done by replaceFileNameDangerousCharacters. */ + fun getWordListIdFromFileName(fname: String): String { + val sb = StringBuilder() + val fnameLength = fname.length + var i = 0 + while (i < fnameLength) { + val codePoint = fname.codePointAt(i) + if ('%'.code != codePoint) { + sb.appendCodePoint(codePoint) + } else { + // + 1 to pass the % sign + val encodedCodePoint = fname.substring(i + 1, i + 1 + MAX_HEX_DIGITS_FOR_CODEPOINT).toInt(16) + i += MAX_HEX_DIGITS_FOR_CODEPOINT + sb.appendCodePoint(encodedCodePoint) + } + i = fname.offsetByCodePoints(i, 1) + } + return sb.toString() + } + + /** Helper method to the list of cache directories, one for each distinct locale. */ + fun getCachedDirectoryList(context: Context) = File(getWordListCacheDirectory(context)).listFiles().orEmpty() + + /** Find out the cache directory associated with a specific locale. */ + fun getAndCreateCacheDirectoryForLocale(locale: Locale, context: Context): String { + val absoluteDirectoryName = getCacheDirectoryForLocale(locale, context) + val directory = File(absoluteDirectoryName) + if (!directory.exists() && !directory.mkdirs()) { + Log.e(TAG, "Could not create the directory for locale $locale") + } + return absoluteDirectoryName + } + + fun getCacheDirectoryForLocale(locale: Locale, context: Context): String { + val relativeDirectoryName = replaceFileNameDangerousCharacters(locale.toLanguageTag()) + return getWordListCacheDirectory(context) + File.separator + relativeDirectoryName + } + + fun getCachedDictsForLocale(locale: Locale, context: Context) = + File(getAndCreateCacheDirectoryForLocale(locale, context)).listFiles().orEmpty() + + fun getDictionaryFileHeaderOrNull(file: File, offset: Long, length: Long): DictionaryHeader? { + return try { + BinaryDictionaryUtils.getHeaderWithOffsetAndLength(file, offset, length) + } catch (e: UnsupportedFormatException) { + null + } catch (e: IOException) { + null + } + } + + fun getDictionaryFileHeaderOrNull(file: File): DictionaryHeader? { + return try { + BinaryDictionaryUtils.getHeader(file) + } catch (e: UnsupportedFormatException) { + null + } catch (e: IOException) { + null + } + } + + /** + * Returns the locale for a dictionary file name stored in assets. + * + * Assumes file name main_[locale].dict + * Returns the locale, or null if file name does not match the pattern + */ + fun extractLocaleFromAssetsDictionaryFile(dictionaryFileName: String): String? { + if (dictionaryFileName.startsWith(MAIN_DICT_PREFIX) && dictionaryFileName.endsWith(".dict")) { + return dictionaryFileName.substring(MAIN_DICT_PREFIX.length, dictionaryFileName.lastIndexOf('.')) + } + return null + } + + fun getAssetsDictionaryList(context: Context): Array? = try { + context.assets.list(ASSETS_DICTIONARY_FOLDER) + } catch (e: IOException) { + null + } + + @JvmStatic + fun looksValidForDictionaryInsertion(text: CharSequence, spacingAndPunctuations: SpacingAndPunctuations): Boolean { + if (TextUtils.isEmpty(text)) { + return false + } + if (text.length > DecoderSpecificConstants.DICTIONARY_MAX_WORD_LENGTH) { + return false + } + var digitCount = 0 + loopOverCodePoints(text) { codePoint, charCount -> + if (Character.isDigit(codePoint)) { + // Count digits: see below + digitCount += charCount + return@loopOverCodePoints false + } + if (!spacingAndPunctuations.isWordCodePoint(codePoint)) { + return false + } + false + } + // We reject strings entirely comprised of digits to avoid using PIN codes or credit + // card numbers. It would come in handy for word prediction though; a good example is + // when writing one's address where the street number is usually quite discriminative, + // as well as the postal code. + return digitCount < text.length + } +} diff --git a/app/src/main/java/helium314/keyboard/latin/utils/DictionaryUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/DictionaryUtils.kt index 3bbb310c4..1f329bd9f 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/DictionaryUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/DictionaryUtils.kt @@ -25,7 +25,7 @@ fun getDictionaryLocales(context: Context): MutableSet { val locales = HashSet() // get cached dictionaries: extracted or user-added dictionaries - DictionaryInfoUtils.getCachedDirectoryList(context)?.forEach { directory -> + DictionaryInfoUtils.getCachedDirectoryList(context).forEach { directory -> if (!directory.isDirectory) return@forEach if (!hasAnythingOtherThanExtractedMainDictionary(directory)) return@forEach val locale = DictionaryInfoUtils.getWordListIdFromFileName(directory.name).constructLocale() @@ -135,4 +135,4 @@ fun cleanUnusedMainDicts(context: Context) { } private fun hasAnythingOtherThanExtractedMainDictionary(dir: File) = - dir.listFiles()?.any { it.name != DictionaryInfoUtils.getExtractedMainDictFilename() } != false + dir.listFiles()?.any { it.name != DictionaryInfoUtils.MAIN_DICT_FILE_NAME } != false diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt index 2bf3da39c..9ebc0ee9f 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt @@ -32,6 +32,7 @@ import helium314.keyboard.settings.DropDownField import helium314.keyboard.settings.WithSmallTitle import java.io.File import java.util.Locale +import androidx.compose.ui.platform.LocalConfiguration @Composable fun NewDictionaryDialog( @@ -55,7 +56,7 @@ fun NewDictionaryDialog( val cacheDir = DictionaryInfoUtils.getAndCreateCacheDirectoryForLocale(locale, ctx) val dictFile = File(cacheDir, header.mIdString.substringBefore(":") + "_" + DictionaryInfoUtils.USER_DICTIONARY_SUFFIX) val type = header.mIdString.substringBefore(":") - val info = header.info(ctx.resources.configuration.locale()) + val info = header.info(LocalConfiguration.current.locale()) ThreeButtonAlertDialog( onDismissRequest = { onDismissRequest(); cachedFile.delete() }, onConfirmed = { @@ -64,7 +65,7 @@ fun NewDictionaryDialog( cachedFile.renameTo(dictFile) if (type == Dictionary.TYPE_MAIN) { // replaced main dict, remove the one created from internal data - val internalMainDictFile = File(cacheDir, DictionaryInfoUtils.getExtractedMainDictFilename()) + val internalMainDictFile = File(cacheDir, DictionaryInfoUtils.MAIN_DICT_FILE_NAME) internalMainDictFile.delete() } val newDictBroadcast = Intent(DictionaryPackConstants.NEW_DICTIONARY_INTENT_ACTION) @@ -92,7 +93,7 @@ fun NewDictionaryDialog( ) } if (dictFile.exists()) { - val oldInfo = DictionaryInfoUtils.getDictionaryFileHeaderOrNull(dictFile, 0, dictFile.length())?.info(ctx.resources.configuration.locale()) + val oldInfo = DictionaryInfoUtils.getDictionaryFileHeaderOrNull(dictFile, 0, dictFile.length())?.info(LocalConfiguration.current.locale()) HorizontalDivider() Text( stringResource(R.string.replace_dictionary_message, type, oldInfo ?: "(no info)", info), From 954a27b7c93342619a098a71b43e92025453bfde Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 21 May 2025 22:13:53 +0200 Subject: [PATCH 141/175] refactor creation of main dictionary --- .../main/java/helium314/keyboard/latin/App.kt | 3 +- .../latin/DictionaryFacilitatorImpl.kt | 2 +- .../keyboard/latin/DictionaryFactory.kt | 150 +++++++++--------- .../latin/utils/DictionaryInfoUtils.kt | 36 +++-- .../keyboard/latin/utils/DictionaryUtils.kt | 5 +- .../settings/dialogs/NewDictionaryDialog.kt | 2 +- .../settings/screens/DictionaryScreen.kt | 4 +- .../settings/screens/LanguageScreen.kt | 2 +- 8 files changed, 104 insertions(+), 100 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/App.kt b/app/src/main/java/helium314/keyboard/latin/App.kt index 2f0920399..631929dbf 100644 --- a/app/src/main/java/helium314/keyboard/latin/App.kt +++ b/app/src/main/java/helium314/keyboard/latin/App.kt @@ -85,8 +85,7 @@ fun checkVersionUpgrade(context: Context) { if (oldVersion == BuildConfig.VERSION_CODE) return // clear extracted dictionaries, in case updated version contains newer ones - DictionaryInfoUtils.getCachedDirectoryList(context)?.forEach { - if (!it.isDirectory) return@forEach + DictionaryInfoUtils.getCacheDirectories(context).forEach { val files = it.listFiles() ?: return@forEach for (file in files) { if (!file.name.endsWith(USER_DICTIONARY_SUFFIX)) diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt index 0cdf506c8..854bcb9d6 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt @@ -239,7 +239,7 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { return@mapNotNull null // This should never happen } if (dictionaryGroup.getDict(Dictionary.TYPE_MAIN)?.isInitialized == true) null - else dictionaryGroup to createMainDictionary(context, it) + else dictionaryGroup to DictionaryFactory.createMainDictionaryCollection(context, it) } synchronized(this) { dictGroupsWithNewMainDict.forEach { (dictGroup, mainDict) -> diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt index 4fc9c6859..17f1ca893 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt @@ -6,89 +6,87 @@ package helium314.keyboard.latin import android.content.Context -import helium314.keyboard.latin.common.FileUtils import helium314.keyboard.latin.common.LocaleUtils -import helium314.keyboard.latin.common.LocaleUtils.constructLocale import helium314.keyboard.latin.utils.DictionaryInfoUtils import helium314.keyboard.latin.utils.Log import java.io.File import java.util.LinkedList import java.util.Locale -/** - * Initializes a main dictionary collection from a dictionary pack, with explicit flags. - * - * - * This searches for a content provider providing a dictionary pack for the specified - * locale. If none is found, it falls back to the built-in dictionary - if any. - * @param context application context for reading resources - * @param locale the locale for which to create the dictionary - * @return an initialized instance of DictionaryCollection - */ -// todo: this needs updating, and then we can expose the weight for custom dictionaries (useful for addons like emoji dict) -fun createMainDictionary(context: Context, locale: Locale): DictionaryCollection { - val cacheDir = DictionaryInfoUtils.getAndCreateCacheDirectoryForLocale(locale, context) - val dictList = LinkedList() - // get cached dict files - val (userDicts, extractedDicts) = DictionaryInfoUtils.getCachedDictsForLocale(locale, context) - .partition { it.name.endsWith(DictionaryInfoUtils.USER_DICTIONARY_SUFFIX) } - // add user dicts to list - userDicts.forEach { checkAndAddDictionaryToListIfNotExisting(it, dictList, locale) } - // add extracted dicts to list (after userDicts, to skip extracted dicts of same type) - extractedDicts.forEach { checkAndAddDictionaryToListIfNotExisting(it, dictList, locale) } - if (dictList.any { it.mDictType == Dictionary.TYPE_MAIN }) - return DictionaryCollection(Dictionary.TYPE_MAIN, locale, dictList, FloatArray(dictList.size) { 1f }) - - // no main dict found -> check assets - val assetsDicts = DictionaryInfoUtils.getAssetsDictionaryList(context) - // file name is _.dict - val dictsByType = assetsDicts?.groupBy { it.substringBefore("_") } - // for each type find the best match - dictsByType?.forEach { (dictType, dicts) -> - val bestMatch = LocaleUtils.getBestMatch(locale, dicts) { it.substringAfter("_") - .substringBefore(".").constructLocale() } ?: return@forEach - // extract dict and add extracted file - val targetFile = File(cacheDir, "$dictType.dict") - FileUtils.copyStreamToNewFile( - context.assets.open(DictionaryInfoUtils.ASSETS_DICTIONARY_FOLDER + File.separator + bestMatch), - targetFile - ) - checkAndAddDictionaryToListIfNotExisting(targetFile, dictList, locale) - } - // If the list is empty, that means we should not use any dictionary (for example, the user - // explicitly disabled the main dictionary), so the following is okay. dictList is never - // null, but if for some reason it is, DictionaryCollection handles it gracefully. - return DictionaryCollection(Dictionary.TYPE_MAIN, locale, dictList, FloatArray(dictList.size) { 1f }) -} - -/** - * add dictionary created from [file] to [dicts] - * if [file] cannot be loaded it is deleted - * if the dictionary type already exists in [dicts], the [file] is skipped - */ -private fun checkAndAddDictionaryToListIfNotExisting(file: File, dicts: MutableList, locale: Locale) { - if (!file.isFile) return - val header = DictionaryInfoUtils.getDictionaryFileHeaderOrNull(file) ?: return killDictionary(file) - val dictType = header.mIdString.split(":").first() - if (dicts.any { it.mDictType == dictType }) return - val readOnlyBinaryDictionary = ReadOnlyBinaryDictionary( - file.absolutePath, 0, file.length(), false, locale, dictType - ) - - if (readOnlyBinaryDictionary.isValidDictionary) { - if (locale.language == "ko") { - // Use KoreanDictionary for Korean locale - dicts.add(KoreanDictionary(readOnlyBinaryDictionary)) - } else { - dicts.add(readOnlyBinaryDictionary) +object DictionaryFactory { + /** + * Initializes a main dictionary collection for a locale. + * Uses all dictionaries in cache folder for locale, and adds built-in + * dictionaries of matching locales if type is not already in cache folder. + * + * @return an initialized instance of DictionaryCollection + */ + // todo: + // expose the weight so users can adjust dictionary "importance" (useful for addons like emoji dict) + // allow users to block certain dictionaries (not sure how this should work exactly) + fun createMainDictionaryCollection(context: Context, locale: Locale): DictionaryCollection { + val dictList = LinkedList() + val (extracted, nonExtracted) = getAvailableDictsForLocale(locale, context) + extracted.sortedBy { !it.name.endsWith(DictionaryInfoUtils.USER_DICTIONARY_SUFFIX) }.forEach { + // we sort to have user dicts first, so they have priority over internal dicts of the same type + checkAndAddDictionaryToListNewType(it, dictList, locale) } - } else { - readOnlyBinaryDictionary.close() - killDictionary(file) + nonExtracted.forEach { filename -> + val type = filename.substringBefore(".") + if (dictList.any { it.mDictType == type }) return@forEach + val extractedFile = DictionaryInfoUtils.extractAssetsDictionary(filename, locale, context) + checkAndAddDictionaryToListNewType(extractedFile, dictList, locale) + } + return DictionaryCollection(Dictionary.TYPE_MAIN, locale, dictList, FloatArray(dictList.size) { 1f }) + } + + fun getAvailableDictsForLocale(locale: Locale, context: Context): Pair, List> { + val cachedDicts = DictionaryInfoUtils.getCachedDictsForLocale(locale, context) + + val nonExtractedDicts = mutableListOf() + DictionaryInfoUtils.getAssetsDictionaryList(context) + // file name is _.dict + ?.groupBy { it.substringBefore("_") } + ?.forEach { (dictType, dicts) -> + if (cachedDicts.any { it.name == "$dictType.dict" }) + return@forEach // dictionary is already extracted (can't be old because of cleanup on upgrade) + val bestMatch = LocaleUtils.getBestMatch(locale, dicts) { + DictionaryInfoUtils.extractLocaleFromAssetsDictionaryFile(it) + } ?: return@forEach + nonExtractedDicts.add(bestMatch) + } + return cachedDicts to nonExtractedDicts + } + + /** + * add dictionary created from [file] to [dicts] + * if [file] cannot be loaded it is deleted + * if the dictionary type already exists in [dicts], the [file] is skipped + */ + private fun checkAndAddDictionaryToListNewType(file: File, dicts: MutableList, locale: Locale) { + if (!file.isFile) return + val header = DictionaryInfoUtils.getDictionaryFileHeaderOrNull(file) ?: return killDictionary(file) + val dictType = header.mIdString.split(":").first() + if (dicts.any { it.mDictType == dictType }) return + val readOnlyBinaryDictionary = ReadOnlyBinaryDictionary( + file.absolutePath, 0, file.length(), false, locale, dictType + ) + + if (readOnlyBinaryDictionary.isValidDictionary) { + if (locale.language == "ko") { + // Use KoreanDictionary for Korean locale + dicts.add(KoreanDictionary(readOnlyBinaryDictionary)) + } else { + dicts.add(readOnlyBinaryDictionary) + } + } else { + readOnlyBinaryDictionary.close() + killDictionary(file) + } + } + + private fun killDictionary(file: File) { + Log.e("DictionaryFactory", "could not load dictionary ${file.parentFile?.name}/${file.name}, deleting") + file.delete() } } - -private fun killDictionary(file: File) { - Log.e("DictionaryFactory", "could not load dictionary ${file.parentFile?.name}/${file.name}, deleting") - file.delete() -} diff --git a/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt index ec6322cbd..eac4b7c02 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt @@ -8,6 +8,8 @@ package helium314.keyboard.latin.utils import android.content.Context import android.text.TextUtils import com.android.inputmethod.latin.utils.BinaryDictionaryUtils +import helium314.keyboard.latin.common.FileUtils +import helium314.keyboard.latin.common.LocaleUtils.constructLocale import helium314.keyboard.latin.common.loopOverCodePoints import helium314.keyboard.latin.define.DecoderSpecificConstants import helium314.keyboard.latin.makedict.DictionaryHeader @@ -60,6 +62,8 @@ object DictionaryInfoUtils { return sb.toString() } + // we cache the extracted dictionaries in filesDir, because actual cache might be cleared at + // any time, and we can't permanently check whether the dictionary still exists fun getWordListCacheDirectory(context: Context): String = context.filesDir.toString() + File.separator + "dicts" /** Reverse escaping done by replaceFileNameDangerousCharacters. */ @@ -83,11 +87,12 @@ object DictionaryInfoUtils { } /** Helper method to the list of cache directories, one for each distinct locale. */ - fun getCachedDirectoryList(context: Context) = File(getWordListCacheDirectory(context)).listFiles().orEmpty() + fun getCacheDirectories(context: Context) = File(getWordListCacheDirectory(context)).listFiles().orEmpty() /** Find out the cache directory associated with a specific locale. */ - fun getAndCreateCacheDirectoryForLocale(locale: Locale, context: Context): String { - val absoluteDirectoryName = getCacheDirectoryForLocale(locale, context) + fun getCacheDirectoryForLocale(locale: Locale, context: Context): String { + val relativeDirectoryName = replaceFileNameDangerousCharacters(locale.toLanguageTag()) + val absoluteDirectoryName = getWordListCacheDirectory(context) + File.separator + relativeDirectoryName val directory = File(absoluteDirectoryName) if (!directory.exists() && !directory.mkdirs()) { Log.e(TAG, "Could not create the directory for locale $locale") @@ -95,13 +100,8 @@ object DictionaryInfoUtils { return absoluteDirectoryName } - fun getCacheDirectoryForLocale(locale: Locale, context: Context): String { - val relativeDirectoryName = replaceFileNameDangerousCharacters(locale.toLanguageTag()) - return getWordListCacheDirectory(context) + File.separator + relativeDirectoryName - } - fun getCachedDictsForLocale(locale: Locale, context: Context) = - File(getAndCreateCacheDirectoryForLocale(locale, context)).listFiles().orEmpty() + File(getCacheDirectoryForLocale(locale, context)).listFiles().orEmpty() fun getDictionaryFileHeaderOrNull(file: File, offset: Long, length: Long): DictionaryHeader? { return try { @@ -129,11 +129,19 @@ object DictionaryInfoUtils { * Assumes file name main_[locale].dict * Returns the locale, or null if file name does not match the pattern */ - fun extractLocaleFromAssetsDictionaryFile(dictionaryFileName: String): String? { - if (dictionaryFileName.startsWith(MAIN_DICT_PREFIX) && dictionaryFileName.endsWith(".dict")) { - return dictionaryFileName.substring(MAIN_DICT_PREFIX.length, dictionaryFileName.lastIndexOf('.')) - } - return null + fun extractLocaleFromAssetsDictionaryFile(dictionaryFileName: String): Locale { + if (dictionaryFileName.contains('_') && !dictionaryFileName.contains('.')) + throw IllegalStateException("invalid asset dictionary name $dictionaryFileName") + return dictionaryFileName.substringAfter("_").substringBefore(".").constructLocale() + } + + fun extractAssetsDictionary(dictionaryFileName: String, locale: Locale, context: Context): File { + val targetFile = File(getCacheDirectoryForLocale(locale, context), "$dictionaryFileName.dict") + FileUtils.copyStreamToNewFile( + context.assets.open(ASSETS_DICTIONARY_FOLDER + File.separator + dictionaryFileName), + targetFile + ) + return targetFile } fun getAssetsDictionaryList(context: Context): Array? = try { diff --git a/app/src/main/java/helium314/keyboard/latin/utils/DictionaryUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/DictionaryUtils.kt index 1f329bd9f..e4f119d8b 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/DictionaryUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/DictionaryUtils.kt @@ -25,7 +25,7 @@ fun getDictionaryLocales(context: Context): MutableSet { val locales = HashSet() // get cached dictionaries: extracted or user-added dictionaries - DictionaryInfoUtils.getCachedDirectoryList(context).forEach { directory -> + DictionaryInfoUtils.getCacheDirectories(context).forEach { directory -> if (!directory.isDirectory) return@forEach if (!hasAnythingOtherThanExtractedMainDictionary(directory)) return@forEach val locale = DictionaryInfoUtils.getWordListIdFromFileName(directory.name).constructLocale() @@ -35,8 +35,7 @@ fun getDictionaryLocales(context: Context): MutableSet { val assetsDictionaryList = DictionaryInfoUtils.getAssetsDictionaryList(context) if (assetsDictionaryList != null) { for (dictionary in assetsDictionaryList) { - val locale = DictionaryInfoUtils.extractLocaleFromAssetsDictionaryFile(dictionary)?.constructLocale() ?: continue - locales.add(locale) + locales.add(DictionaryInfoUtils.extractLocaleFromAssetsDictionaryFile(dictionary)) } } return locales diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt index 9ebc0ee9f..4d02c0687 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt @@ -53,7 +53,7 @@ fun NewDictionaryDialog( val locales = SubtypeSettings.getAvailableSubtypeLocales() .filter { it.script() == dictLocale.script() || it.script() == mainLocale?.script() } .sortedWith(comparer) - val cacheDir = DictionaryInfoUtils.getAndCreateCacheDirectoryForLocale(locale, ctx) + val cacheDir = DictionaryInfoUtils.getCacheDirectoryForLocale(locale, ctx) val dictFile = File(cacheDir, header.mIdString.substringBefore(":") + "_" + DictionaryInfoUtils.USER_DICTIONARY_SUFFIX) val type = header.mIdString.substringBefore(":") val info = header.info(LocalConfiguration.current.locale()) diff --git a/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt index 77d1b9b42..3ad01cb06 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt @@ -55,7 +55,7 @@ fun DictionaryScreen( ) { val ctx = LocalContext.current val enabledLanguages = SubtypeSettings.getEnabledSubtypes(true).map { it.locale().language } - val cachedDictFolders = DictionaryInfoUtils.getCachedDirectoryList(ctx).orEmpty().map { it.name } + val cachedDictFolders = DictionaryInfoUtils.getCacheDirectories(ctx).orEmpty().map { it.name } val comparer = compareBy({ it.language !in enabledLanguages }, { it.toLanguageTag() !in cachedDictFolders}, { it.displayName }) val dictionaryLocales = getDictionaryLocales(ctx).sortedWith(comparer).toMutableList() dictionaryLocales.add(0, Locale(SubtypeLocaleUtils.NO_LANGUAGE)) @@ -155,7 +155,7 @@ fun getUserAndInternalDictionaries(context: Context, locale: Locale): Pair { val systemLocales = SubtypeSettings.getSystemLocales() val enabledSubtypes = SubtypeSettings.getEnabledSubtypes(true) - val localesWithDictionary = DictionaryInfoUtils.getCachedDirectoryList(context)?.mapNotNull { dir -> + val localesWithDictionary = DictionaryInfoUtils.getCacheDirectories(context)?.mapNotNull { dir -> if (!dir.isDirectory) return@mapNotNull null if (dir.list()?.any { it.endsWith(DictionaryInfoUtils.USER_DICTIONARY_SUFFIX) } == true) From e034065236d54d2b3108b4dc48d06816f6c948cb Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 21 May 2025 22:43:01 +0200 Subject: [PATCH 142/175] add simple DicitonaryFacilitator for a single dictionary (to be used later) --- .../latin/SingleDictionaryFacilitator.kt | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 app/src/main/java/helium314/keyboard/latin/SingleDictionaryFacilitator.kt diff --git a/app/src/main/java/helium314/keyboard/latin/SingleDictionaryFacilitator.kt b/app/src/main/java/helium314/keyboard/latin/SingleDictionaryFacilitator.kt new file mode 100644 index 000000000..e8941c459 --- /dev/null +++ b/app/src/main/java/helium314/keyboard/latin/SingleDictionaryFacilitator.kt @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: GPL-3.0-only +package helium314.keyboard.latin + +import android.content.Context +import android.util.LruCache +import helium314.keyboard.keyboard.Keyboard +import helium314.keyboard.keyboard.KeyboardSwitcher +import helium314.keyboard.latin.DictionaryFacilitator.DictionaryInitializationListener +import helium314.keyboard.latin.common.ComposedData +import helium314.keyboard.latin.settings.SettingsValuesForSuggestion +import helium314.keyboard.latin.utils.SuggestionResults +import java.util.Locale +import java.util.concurrent.TimeUnit + +/** Simple DictionaryFacilitator for a single Dictionary. Has some optional special purpose functionality. */ +class SingleDictionaryFacilitator(private val dict: Dictionary) : DictionaryFacilitator { + var suggestionLogger: SuggestionLogger? = null + + // this will not work from spell checker if used together with a different keyboard app + fun getSuggestions(word: String): SuggestionResults { + val suggestionResults = getSuggestionResults( + ComposedData.createForWord(word), + NgramContext.getEmptyPrevWordsContext(0), + KeyboardSwitcher.getInstance().keyboard, // looks like actual keyboard doesn't matter (composed data doesn't contain coordinates) + SettingsValuesForSuggestion(false, false), + Suggest.SESSION_ID_TYPING, SuggestedWords.INPUT_STYLE_TYPING + ) + return suggestionResults + } + + override fun getSuggestionResults( + composedData: ComposedData, ngramContext: NgramContext, keyboard: Keyboard, + settingsValuesForSuggestion: SettingsValuesForSuggestion, sessionId: Int, inputStyle: Int + ): SuggestionResults { + val suggestionResults = SuggestionResults( + SuggestedWords.MAX_SUGGESTIONS, ngramContext.isBeginningOfSentenceContext, + false + ) + suggestionResults.addAll( + dict.getSuggestions(composedData, ngramContext, keyboard.proximityInfo.nativeProximityInfo, + settingsValuesForSuggestion, sessionId, 1f, + floatArrayOf(Dictionary.NOT_A_WEIGHT_OF_LANG_MODEL_VS_SPATIAL_MODEL) + ) + ) + suggestionLogger?.onNewSuggestions(suggestionResults, composedData, ngramContext, keyboard, inputStyle) + + return suggestionResults + } + + // ------------ dummy functionality ---------------- + + override fun setValidSpellingWordReadCache(cache: LruCache) {} + + override fun setValidSpellingWordWriteCache(cache: LruCache) {} + + override fun isForLocale(locale: Locale?): Boolean = locale == dict.mLocale + + override fun onStartInput() {} + + override fun onFinishInput(context: Context) { + dict.onFinishInput() + } + + override fun closeDictionaries() { + dict.close() + } + + override fun isActive(): Boolean = true + + override fun getMainLocale(): Locale = dict.mLocale + + override fun getCurrentLocale(): Locale = mainLocale + + override fun usesSameSettings(locales: List, contacts: Boolean, apps: Boolean, personalization: Boolean): Boolean { + return locales.singleOrNull() == mainLocale + } + + override fun resetDictionaries(context: Context, newLocale: Locale, useContactsDict: Boolean, useAppsDict: Boolean, + usePersonalizedDicts: Boolean, forceReloadMainDictionary: Boolean, dictNamePrefix: String, listener: DictionaryInitializationListener? + ) { } + + override fun hasAtLeastOneInitializedMainDictionary(): Boolean = dict.isInitialized + + override fun hasAtLeastOneUninitializedMainDictionary(): Boolean = !dict.isInitialized + + override fun waitForLoadingMainDictionaries(timeout: Long, unit: TimeUnit) { + } + + override fun addToUserHistory( + suggestion: String, wasAutoCapitalized: Boolean, ngramContext: NgramContext, + timeStampInSeconds: Long, blockPotentiallyOffensive: Boolean + ) {} + + override fun adjustConfidences(word: String, wasAutoCapitalized: Boolean) {} + + override fun unlearnFromUserHistory(word: String, ngramContext: NgramContext, timeStampInSeconds: Long, eventType: Int) {} + + override fun isValidSpellingWord(word: String): Boolean = dict.isValidWord(word) + + override fun isValidSuggestionWord(word: String) = isValidSpellingWord(word) + + override fun removeWord(word: String) {} + + override fun clearUserHistoryDictionary(context: Context) {} + + override fun localesAndConfidences(): String? = null + + override fun dumpDictionaryForDebug(dictName: String) {} + + override fun getDictionaryStats(context: Context): List = emptyList() + + override fun dump(context: Context) = getDictionaryStats(context).joinToString("\n") + + companion object { + interface SuggestionLogger { + /** provides input data and suggestions returned by the library */ + fun onNewSuggestions(suggestions: SuggestionResults, composedData: ComposedData, + ngramContext: NgramContext, keyboard: Keyboard, inputStyle: Int) + } + } +} From e25300d8326363b9c080c41f52f5a158974bf16a Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Wed, 21 May 2025 23:48:33 +0300 Subject: [PATCH 143/175] Add comma to the repurposed comma key's popup in URL and email mode (#1594) --- .../internal/keyboard_parser/floris/TextKeyData.kt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt index 38ced5992..fbf1f7921 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt @@ -132,6 +132,9 @@ sealed interface KeyData : AbstractKeyData { keys.add("!icon/start_onehanded_mode_key|!code/key_toggle_onehanded") if (!params.mId.mDeviceLocked) keys.add("!icon/settings_key|!code/key_settings") + if (shouldShowTldPopups(params)) { + keys.add(",") + } return keys } @@ -315,6 +318,11 @@ sealed interface KeyData : AbstractKeyData { } } + private fun shouldShowTldPopups(params: KeyboardParams): Boolean = + (Settings.getInstance().current.mShowTldPopupKeys + && params.mId.mSubtype.layouts[LayoutType.FUNCTIONAL] != "functional_keys_tablet" + && params.mId.mMode in setOf(KeyboardId.MODE_URL, KeyboardId.MODE_EMAIL)) + // could make arrays right away, but they need to be copied anyway as popupKeys arrays are modified when creating KeyParams private const val POPUP_EYS_NAVIGATE_PREVIOUS = "!icon/previous_key|!code/key_action_previous,!icon/clipboard_action_key|!code/key_clipboard" private const val POPUP_EYS_NAVIGATE_NEXT = "!icon/clipboard_action_key|!code/key_clipboard,!icon/next_key|!code/key_action_next" @@ -583,11 +591,6 @@ sealed interface KeyData : AbstractKeyData { if (shouldShowTldPopups(params)) params.mLocaleKeyboardInfos.tlds else getPunctuationPopupKeys(params) ) - - private fun shouldShowTldPopups(params: KeyboardParams): Boolean = - (Settings.getInstance().current.mShowTldPopupKeys - && params.mId.mSubtype.layouts[LayoutType.FUNCTIONAL] != "functional_keys_tablet" - && params.mId.mMode in setOf(KeyboardId.MODE_URL, KeyboardId.MODE_EMAIL)) } /** From 7bc74810b1e2766379bb3af0dc1ec7adafc85471 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Fri, 23 May 2025 20:42:52 +0200 Subject: [PATCH 144/175] fix broken file handling in DictionaryGroup --- .../java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt index 854bcb9d6..13800aa7c 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt @@ -718,7 +718,7 @@ private class DictionaryGroup( // words cannot be (permanently) removed from some dictionaries, so we use a blacklist for "removing" words private val blacklistFile = context?.let { File(it.filesDir.absolutePath + File.separator + "blacklists" + File.separator + locale.toLanguageTag() + ".txt") - .also { it.mkdirs() } + .also { it.parentFile?.mkdirs() } } private val blacklist = hashSetOf().apply { @@ -741,6 +741,7 @@ private class DictionaryGroup( scope.launch { synchronized(this) { try { + if (blacklistFile.isDirectory) blacklistFile.delete() blacklistFile.appendText("$word\n") } catch (e: IOException) { Log.e(TAG, "Exception while trying to add word \"$word\" to blacklist ${blacklistFile.name}", e) From 3f51bd4da57a94f204ea8489e3bf0b913c0fa17e Mon Sep 17 00:00:00 2001 From: Helium314 Date: Fri, 23 May 2025 21:25:37 +0200 Subject: [PATCH 145/175] tune layout edit dialog --- .../keyboard/settings/dialogs/LayoutEditDialog.kt | 8 ++++++-- .../keyboard/settings/dialogs/ThreeButtonAlertDialog.kt | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutEditDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutEditDialog.kt index f50af816d..aae610370 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutEditDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/LayoutEditDialog.kt @@ -5,6 +5,7 @@ import android.widget.Toast import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.exclude import androidx.compose.foundation.layout.ime +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.material3.Text @@ -20,6 +21,8 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.DialogProperties import helium314.keyboard.keyboard.KeyboardSwitcher import helium314.keyboard.latin.R import helium314.keyboard.latin.utils.LayoutType @@ -111,8 +114,9 @@ fun LayoutEditDialog( } valid && nameValid // don't allow saving with invalid name, but inform user about issues with layout content }, - // why is exclude(WindowInsets.systemBars) necessary? - modifier = Modifier.windowInsetsPadding(WindowInsets.ime.exclude(WindowInsets.systemBars)), + properties = DialogProperties(usePlatformDefaultWidth = false, dismissOnClickOutside = false, dismissOnBackPress = false), + modifier = Modifier.windowInsetsPadding(WindowInsets.ime.exclude(WindowInsets.systemBars)) + .padding(horizontal = 16.dp), // dialog is rather wide, but shouldn't go all the way to the screen edges reducePadding = true, ) } diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/ThreeButtonAlertDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/ThreeButtonAlertDialog.kt index a299c90ba..cc20a4e63 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/ThreeButtonAlertDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/ThreeButtonAlertDialog.kt @@ -82,7 +82,7 @@ fun ThreeButtonAlertDialog( TextButton( onClick = onNeutral ) { Text(neutralButtonText) } - Spacer(modifier.weight(1f)) + Spacer(Modifier.weight(1f)) TextButton(onClick = onDismissRequest) { Text(cancelButtonText) } if (confirmButtonText != null) TextButton( From ead8fb36cb8b1eb3549a1fb4549deb3a18f6d31c Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 24 May 2025 07:01:05 +0200 Subject: [PATCH 146/175] update translations --- app/src/main/res/values-ar/strings.xml | 49 +++-------- app/src/main/res/values-b+sr+Latn/strings.xml | 2 +- app/src/main/res/values-bg/strings.xml | 23 +++-- app/src/main/res/values-bn/strings.xml | 5 ++ app/src/main/res/values-ca/strings.xml | 11 ++- app/src/main/res/values-cs/strings.xml | 11 ++- app/src/main/res/values-de/strings.xml | 31 ++++--- app/src/main/res/values-en-rGB/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-et/strings.xml | 11 ++- app/src/main/res/values-eu/strings.xml | 53 ++++++++++++ app/src/main/res/values-fi/strings.xml | 2 +- app/src/main/res/values-fr-rCA/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 19 ++-- app/src/main/res/values-hy/strings.xml | 2 +- app/src/main/res/values-in/strings.xml | 86 ++++++++++++------- app/src/main/res/values-iw/strings.xml | 10 ++- app/src/main/res/values-lt/strings.xml | 2 +- app/src/main/res/values-mk/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 11 ++- app/src/main/res/values-pl/strings.xml | 6 ++ app/src/main/res/values-pt-rBR/strings.xml | 13 ++- app/src/main/res/values-pt-rPT/strings.xml | 8 +- app/src/main/res/values-ru/strings.xml | 15 ++-- app/src/main/res/values-sk/strings.xml | 4 +- app/src/main/res/values-sl/strings.xml | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 11 ++- .../metadata/android/bg/full_description.txt | 30 +++++++ .../android/de-DE/changelogs/3004.txt | 11 +++ 29 files changed, 293 insertions(+), 143 deletions(-) create mode 100644 fastlane/metadata/android/bg/full_description.txt create mode 100644 fastlane/metadata/android/de-DE/changelogs/3004.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 77d6ecba7..85ed781ec 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -81,11 +81,11 @@ "الخطوة التالية" قيد الإعداد %s مكِّن %s - يرجى التحقق من \\%s\" في إعدادات الإدخال واللغات. سيؤدي ذلك إلى تمكين لوحة المفاتيح على جهازك.\" - <xliff:g id=\"APPLICATION_NAME\" مثال=\"لوحة مفاتيح أندرويد\">%s</xliff:g> ممكّن بالفعل في إعدادات اللغات &amp؛ إعدادات الإدخال، لذا فقد تم الانتهاء من هذه الخطوة. إلى الخطوة التالية!\" + يُرجى التحقق من \"%s\" في إعدادات الإدخال واللغات. سيؤدي ذلك إلى تمكين لوحة المفاتيح على جهازك. + <xliff:g id=\"APPLICATION_NAME\" مثال=\"لوحة مفاتيح أندرويد\">%s</xliff:g> ممكّن بالفعل في إعدادات اللغات &amp؛ إعدادات الإدخال، لذا فقد تم الانتهاء من هذه الخطوة. إلى الخطوة التالية! "تفعيل في الإعدادات" بدّل إلى %s - بعد ذلك، اختر \\<<xliff:g id=\"APPLICATION_NAME\" مثال=\"لوحة مفاتيح أندرويد\">%s</xliff:g>” كطريقة إدخال النص النشط.“ + بعد ذلك، اختر \"%s” كطريقة إدخال النص النشط. "تبديل أساليب الإدخال" تهانينا ، لقد انتهيت من الإعداد! الآن أصبح بإمكانك الكتابة في جميع تطبيقاتك المفضلة باستخدام %s. @@ -318,42 +318,7 @@ خطأ: البرنامج النصي غير متوافق مع لوحة المفاتيح هذه أظهِر المتغيرات المحددة بلغات لوحة المفاتيح مقياس الحشو السفلي - "► يؤدي الضغط لفترة طويلة على مفاتيح شريط الأدوات المثبتة إلى وظائف إضافية: <br> -\n • الحافظة &#65515; لصق <br> -\n • تحرك لليسار/ لليمين &#65515; كلمة يسار/يمين <br> -\n • التحرك لأعلى/لأسفل &#65515; الصفحة لأعلى/لأسفل <br> -\n • كلمة يسار/يمين &#65515; بداية/نهاية السطر <br> -\n • صفحة لأعلى/لأسفل &#65515; بداية/نهاية الصفحة <br> -\n • نسخة &#65515; قطع <br> -\n • اختر كلمة &#8596; حدد الكل <br> -\n • التراجع &#8596; إعادة <br> <br> -\n► يؤدي الضغط لفترة طويلة على المفاتيح في شريط أدوات شريط الاقتراحات إلى تثبيتها على شريط الاقتراحات. <br><br> -\n► اضغط لفترة طويلة على مفتاح الفاصلة للوصول إلى عرض الحافظة، أو عرض الرموز التعبيرية، أو الوضع بيد واحدة، أو الإعدادات، أو تبديل اللغة: <br> -\n • سيختفي عرض الرموز التعبيرية وتبديل اللغة إذا كان لديك المفتاح المقابل ممكّنًا. <ر> -\n • بالنسبة لبعض التخطيطات، فهو ليس مفتاح الفاصلة، ولكنه المفتاح الموجود في نفس الموضع (على سبيل المثال، إنه \\\'q\\\' لتخطيط Dvorak). <br><br> -\n► عند تمكين وضع التصفح المتخفي، لن يتم تعلم أي كلمات، ولن تتم إضافة أي رموز تعبيرية إلى الرسائل الأخيرة. <br><br> -\n► اضغط على أيقونة التصفح المتخفي للوصول إلى شريط الأدوات. <br><br> -\n► إدخال مفتاح منزلق: اسحب من مفتاح Shift إلى مفتاح آخر لكتابة مفتاح واحد كبير: <br> -\n • يعمل هذا أيضًا مع المفتاح \\\'?123\\\' لكتابة رمز واحد من لوحة مفاتيح الرموز، وللمفاتيح ذات الصلة. <br><br> -\n► اضغط مع الاستمرار على مفتاح Shift أو مفتاح الرمز، واضغط على مفتاح واحد أو أكثر، ثم حرر مفتاح Shift أو مفتاح الرمز للعودة إلى لوحة المفاتيح السابقة. <br><br> -\n► اضغط لفترة طويلة على أحد الاقتراحات في شريط الاقتراحات لإظهار المزيد من الاقتراحات، ثم اضغط على زر الحذف لإزالة هذا الاقتراح. <br><br> -\n► اسحب لأعلى من أحد الاقتراحات لفتح المزيد من الاقتراحات، ثم حرر الاقتراح لتحديده. <br><br> -\n► اضغط لفترة طويلة على أحد الإدخالات في سجل الحافظة لتثبيته (احتفظ به في الحافظة حتى تقوم بإلغاء تثبيته). <br><br> -\n► اسحب لليسار في عرض الحافظة لإزالة إدخال (باستثناء عندما يكون مثبتًا) <br> <br> -\n► حدد النص واضغط على مفتاح Shift للتبديل بين الكلمات الكبيرة والصغيرة والأحرف الكبيرة. <br><br> -\n► يمكنك إضافة قواميس عن طريق فتحها في مستكشف الملفات: <br> -\n • يعمل هذا فقط مع <i>content-uris</i> وليس مع <i>file-uris</i>، مما يعني أنه قد لا يعمل مع بعض مستكشفات الملفات. <br><br> -\n► بالنسبة للمستخدمين الذين يقومون بالنسخ الاحتياطي اليدوي مع الوصول إلى الجذر: <br> -\n • بدءًا من Android 7، لا يكون ملف التفضيلات المشتركة في الموقع الافتراضي، لأن التطبيق يستخدم %s. يعد ذلك ضروريًا حتى يمكن قراءة الإعدادات قبل إلغاء قفل الجهاز، على سبيل المثال. في التمهيد؛ <ر> -\n • الملف موجود في /data/user_de/0/package_id/shared_prefs/ على الرغم من أن هذا قد يعتمد على الجهاز وإصدار Android. <br><br> -\n<i><b>وضع التصحيح / تصحيح APK</b></i> <br> <br> -\n► اضغط لفترة طويلة على اقتراح لإظهار القاموس المصدر. <br><br> -\n► عند استخدام debug APK، يمكنك العثور على إعدادات Debug ضمن التفضيلات المتقدمة، على الرغم من أن الفائدة محدودة باستثناء تفريغ القواميس في السجل. <ر> -\n • بالنسبة لإصدار APK، تحتاج إلى النقر على الإصدار في <i>حول</i> عدة مرات، ثم يمكنك العثور على إعدادات تصحيح الأخطاء في <i>التفضيلات المتقدمة</i>. <ر> -\n • عند تمكين <i>إظهار معلومات الاقتراح</i>، ستحتوي الاقتراحات على بعض الأرقام الصغيرة في الأعلى لإظهار بعض النتائج الداخلية وقاموس المصدر. <br><br> -\n► في حالة تعطل التطبيق، سيُطلب منك ما إذا كنت تريد سجلات التعطل عند فتح الإعدادات. <br><br> -\n► عند استخدام الكتابة متعددة اللغات، سيُظهر شريط المسافة قيمة الثقة المستخدمة لتحديد اللغة المستخدمة حاليًا. <br><br> -\n► ستحتوي الاقتراحات على بعض الأرقام الصغيرة في الأعلى لإظهار بعض النتائج الداخلية وقاموس المصدر (يمكن تعطيله)." + "► يؤدي الضغط لفترة طويلة على مفاتيح شريط الأدوات المثبتة إلى وظائف إضافية: <br>\n\n • الحافظة &#65515; لصق <br>\n\n • تحرك لليسار/ لليمين &#65515; كلمة يسار/يمين <br>\n\n • التحرك لأعلى/لأسفل &#65515; الصفحة لأعلى/لأسفل <br>\n\n • كلمة يسار/يمين &#65515; بداية/نهاية السطر <br>\n\n • صفحة لأعلى/لأسفل &#65515; بداية/نهاية الصفحة <br>\n\n • نسخة &#65515; قطع <br>\n\n • اختر كلمة &#8596; حدد الكل <br>\n\n • التراجع &#8596; إعادة <br> <br>\n\n► يؤدي الضغط لفترة طويلة على المفاتيح في شريط أدوات شريط الاقتراحات إلى تثبيتها على شريط الاقتراحات. <br><br>\n\n► اضغط لفترة طويلة على مفتاح الفاصلة للوصول إلى عرض الحافظة، أو عرض الرموز التعبيرية، أو الوضع بيد واحدة، أو الإعدادات، أو تبديل اللغة: <br>\n\n • سيختفي عرض الرموز التعبيرية وتبديل اللغة إذا كان لديك المفتاح المقابل ممكّنًا. <ر>\n\n • بالنسبة لبعض التخطيطات، فهو ليس مفتاح الفاصلة، ولكنه المفتاح الموجود في نفس الموضع (على سبيل المثال، إنه \\\'q\\\' لتخطيط Dvorak). <br><br>\n\n► عند تمكين وضع التصفح المتخفي، لن يتم تعلم أي كلمات، ولن تتم إضافة أي رموز تعبيرية إلى الرسائل الأخيرة. <br><br>\n\n► اضغط على أيقونة التصفح المتخفي للوصول إلى شريط الأدوات. <br><br>\n\n► إدخال مفتاح منزلق: اسحب من مفتاح Shift إلى مفتاح آخر لكتابة مفتاح واحد كبير: <br>\n\n • يعمل هذا أيضًا مع المفتاح \\\'?123\\\' لكتابة رمز واحد من لوحة مفاتيح الرموز، وللمفاتيح ذات الصلة. <br><br>\n\n► اضغط مع الاستمرار على مفتاح Shift أو مفتاح الرمز، واضغط على مفتاح واحد أو أكثر، ثم حرر مفتاح Shift أو مفتاح الرمز للعودة إلى لوحة المفاتيح السابقة. <br><br>\n\n► اضغط لفترة طويلة على أحد الاقتراحات في شريط الاقتراحات لإظهار المزيد من الاقتراحات، ثم اضغط على زر الحذف لإزالة هذا الاقتراح. <br><br>\n\n► اسحب لأعلى من أحد الاقتراحات لفتح المزيد من الاقتراحات، ثم حرر الاقتراح لتحديده. <br><br>\n\n► اضغط لفترة طويلة على أحد الإدخالات في سجل الحافظة لتثبيته (احتفظ به في الحافظة حتى تقوم بإلغاء تثبيته). <br><br>\n\n► اسحب لليسار في عرض الحافظة لإزالة إدخال (باستثناء عندما يكون مثبتًا) <br> <br>\n\n► حدد النص واضغط على مفتاح Shift للتبديل بين الكلمات الكبيرة والصغيرة والأحرف الكبيرة. <br><br>\n\n► يمكنك إضافة قواميس عن طريق فتحها في مستكشف الملفات: <br>\n\n • يعمل هذا فقط مع <i>content-uris</i> وليس مع <i>file-uris</i>، مما يعني أنه قد لا يعمل مع بعض مستكشفات الملفات. <br><br>\n\n► بالنسبة للمستخدمين الذين يقومون بالنسخ الاحتياطي اليدوي مع الوصول إلى الجذر: <br>\n\n • بدءًا من Android 7، لا يكون ملف التفضيلات المشتركة في الموقع الافتراضي، لأن التطبيق يستخدم %s. يعد ذلك ضروريًا حتى يمكن قراءة الإعدادات قبل إلغاء قفل الجهاز، على سبيل المثال. في التمهيد؛ <ر>\n\n • الملف موجود في /data/user_de/0/package_id/shared_prefs/ على الرغم من أن هذا قد يعتمد على الجهاز وإصدار Android. <br><br>\n\n<i><b>وضع التصحيح / تصحيح APK</b></i> <br> <br>\n\n► اضغط لفترة طويلة على اقتراح لإظهار القاموس المصدر. <br><br>\n\n► عند استخدام debug APK، يمكنك العثور على إعدادات Debug ضمن التفضيلات المتقدمة، على الرغم من أن الفائدة محدودة باستثناء تفريغ القواميس في السجل. <ر>\n\n • بالنسبة لإصدار APK، تحتاج إلى النقر على الإصدار في <i>حول</i> عدة مرات، ثم يمكنك العثور على إعدادات تصحيح الأخطاء في <i>التفضيلات المتقدمة</i>. <br>\n\n • عند تمكين <i>إظهار معلومات الاقتراح</i>، ستحتوي الاقتراحات على بعض الأرقام الصغيرة في الأعلى لإظهار بعض النتائج الداخلية وقاموس المصدر. <br><br>\n\n► في حالة تعطل التطبيق، سيُطلب منك ما إذا كنت تريد سجلات التعطل عند فتح الإعدادات. <br><br>\n\n► عند استخدام الكتابة متعددة اللغات، سيُظهر شريط المسافة قيمة الثقة المستخدمة لتحديد اللغة المستخدمة حاليًا. <br><br>\n\n► ستحتوي الاقتراحات على بعض الأرقام الصغيرة في الأعلى لإظهار بعض النتائج الداخلية وقاموس المصدر (يمكن تعطيله)." رخصة جنو العامة v3.0 هذه الكلمة موجودة بالفعل في قاموس المستخدم %s. الرجاء كتابة واحدة أخرى. تفضيل المحلية على الأرقام اللاتينية @@ -490,4 +455,10 @@ تنسيق لمفتاح الطابع الزمني دغبانية السوتية + استُعيدت النسخة الاحتياطية + حجّم مفتاح الإيموجي مع حجم الخط + ابحث عن أسماء التطبيقات + استخدام أسماء التطبيقات المثبتة للاقتراحات والتصحيحات + لون بشرة الرموز التعبيرية الافتراضي + طبيعي diff --git a/app/src/main/res/values-b+sr+Latn/strings.xml b/app/src/main/res/values-b+sr+Latn/strings.xml index 66e0a0084..7e9c218be 100644 --- a/app/src/main/res/values-b+sr+Latn/strings.xml +++ b/app/src/main/res/values-b+sr+Latn/strings.xml @@ -123,4 +123,4 @@ "Traži" "Pauza" "Čekaj" - \ No newline at end of file + diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 35ded64ac..941423655 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -14,7 +14,7 @@ "Разширени" "Тема" "Активиране на разделената клавиатура" - "Други методи за въвеждане" + Превключване към други методи на въвеждане "Клавиш за превкл. на езика" "%s милисек" "Станд. за системата" @@ -81,15 +81,15 @@ "Следваща стъпка" "Настройване на %s" "Активирайте %s" - Моля, проверете \\%s\" на вашите езици & входни настройки. Това ще го разреши да работи на вашето устройство.\" + Моля, проверете \\%s\" на вашите Езици & входни настройки. Това ще го разреши да работи на вашето устройство. "Приложението %s вече е активирано от „Език и въвеждане“, така че тази стъпка е изпълнена. Преминете към следващата!" "Активиране в настройките" "Превключете към %s" - След това изберете \\%s\"като ваш активен метод за въвеждане на текст.\" + След това изберете \"%s\" като активен метод за въвеждане на текст. "Превключване на методите на въвеждане" "Поздравления! Вече сте готови!" Вече можете да пишете във всичките си любими приложения с %s. - "Край" + Завършено Показване на иконата на приложението "Показване на иконата на приложението в стартовия панел" "Добавени речници" @@ -148,7 +148,7 @@ Архивиране и възстановяване Осигурете собствена библиотека, за да активирате писането с жестове Разделено разстояние - Превключете и двете + Превключване и на двете Предупреждение: Деактивирането на тази настройка ще изчисти научените данни Игнорирайте искането на други приложения за деактивиране на предложенията (може да причини проблеми) Повече автоматична корекция @@ -179,7 +179,7 @@ Автоматично вмъкване на интервал след препинателни знаци, когато пишете нова дума Неизвестен библиотечен файл. Сигурни ли сте, че сте го получили от доверен източник и е за \'%s\'? Покажи повече букви с диакритични знаци в изскачащ прозорец - Показване на варианти, дефинирани в езиците на клавиатурата + Покажи вариантите, дефинирани в езиците на клавиатурата Добавяне на общи варианти Езици и оформления Ред с числа @@ -207,7 +207,7 @@ Напълно вляво Напълно вдясно Затваряне на хронологията на клипборда - Изберете клавиши от лентата с инструменти за клипборд + Избиране на клавиши от лентата с инструменти за клипборд Закачи клавиш от лентата с инструменти при дълго натискане Цифрова клавиатура Персонализиран текст в лентата за интервал @@ -224,7 +224,7 @@ Продължителното натискане на клавиш със символи за цифровата клавиатура Клипборда долен ред Емотикони долен ред - Задайте фоново изображение + Задаване на фоново изображение Изберете език Файлът не може да се прочете Не показвай отново @@ -453,7 +453,7 @@ Мащаб на страничната подложка (пейзаж) Показване на подсказки на реда с числа Разстояние на плъзгане за превключване на езика - Разстояние на разделяне (пейзаж) + Разделно разстояние (пейзаж) Разделена клавиатура Активиране на разделена клавиатура (пейзаж) Наистина ли изтривате %s? @@ -484,4 +484,9 @@ Сото Дагбани Мащабиране на размера на клавишите за емотикони с размера на шрифта + Резервното копие е възстановено + Търсене на имена на приложения + Използване на имената на инсталираните приложения за предложения и корекции + Тон на кожата на емотиконите по подразбиране + Неутрален diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 65c189f65..af1e21dd6 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -448,4 +448,9 @@ সেসুতু ডাগবানি ফন্টের আকারের সাথে ইমোজি বোতামের আকারের সমন্বয় + ব্যাকআপ পুনরুদ্ধার হয়েছে + অ্যাপের নামে সন্ধান + পরামর্শ ও সংশোধনের জন্য ইন্সটলকৃত অ্যাপের নাম ব্যবহার + ডিফল্ট ইমোজির ত্বকের রং + নিরপেক্ষ diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index d99c42029..1b903b794 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -81,11 +81,11 @@ "Pas següent" S\'està configurant %s Habilitar %s - Comproveu \\%s\" a la configuració d\'idiomes i entrada. Això li permetrà executar-se al vostre dispositiu.\" - %s ja està activada a la configuració d\'idiomes i entrada, així que ja s\'ha acabat aquest pas. Cap al següent!\" + Comproveu «%s» a la configuració d\'idiomes i entrada. Això li permetrà executar-se al vostre dispositiu. + %s ja està activada a la configuració d\'idiomes i entrada, així que ja s\'ha acabat aquest pas. Cap al següent! Habilita a la configuració Canviar a %s - A continuació, seleccioneu \\%s\" com a mètode d\'entrada de text actiu.\" + A continuació, seleccioneu «%s» com a mètode d\'entrada de text actiu. Canvia els mètodes d\'entrada "Enhorabona, ja has acabat!" Ara ja podeu escriure en totes les vostres aplicacions preferides amb %s. @@ -447,4 +447,9 @@ Dagbani Sesotho Escala la mida de la tecla emoji amb la de la font + Tema d\'emoji predeterminat + Còpia de seguretat restaurada + Cercar noms d\'aplicacions + Utilitzar els noms de les aplicacions instal·lades per a suggeriments i correccions + Neutre diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 3751f3b09..57d83131a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -82,11 +82,11 @@ "Další krok" "Nastavení aplikace %s" "Zapnutí aplikace %s" - Zaškrtněte aplikaci \\%s\" v nastavení Jazyky a zadávání. Tím povolíte její spuštění ve vašem zařízení.\" - Aplikace %s je již v nastavení Jazyky a zadávání zapnuta, tento krok je tedy již proveden. Pokračujte dalším!\" + Povolte aplikaci „%s“ v nastavení Jazyky a zadávání. Tím povolíte její spuštění ve vašem zařízení. + Aplikace %s je již v nastavení Jazyky a zadávání zapnuta, tento krok je tedy již proveden. Pokračujte dalším! "Aktivovat v nastavení" "Přepnutí na aplikaci %s" - Poté vyberte jako aktivní metodu zadávání textu možnost \\%s\".\" + Poté vyberte jako aktivní metodu zadávání textu možnost „%s“. "Přepnout metody zadávání" Gratulujeme, vše je připraveno! Nyní můžete ve všech svých oblíbených aplikacích psát pomocí aplikace %s. @@ -450,4 +450,9 @@ Sesothština Dagbani Škálovat velikost kláves emodži velikostí s velikostí písma + Záloha obnovena + Používat názvy nainstalovaných aplikací pro návrhy a opravy + Používat názvy aplikací + Neutrální + Výchozí barva pokožky emodži diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4673fe8b8..147ae6901 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -9,7 +9,7 @@ "Ton bei Tastendruck" Popup bei Tastendruck Optionen - "Gesteneingabe" + Gesten-Tippen "Textkorrektur" "Erweitert" "Design" @@ -38,7 +38,7 @@ "Sehr stark" "Vorschläge für nächstes Wort" "Anhand des vorherigen Wortes Vorschläge machen" - Gesteneingabe aktivieren + Gesten-Tippen aktivieren Gib ein Wort ein, indem du durch die Buchstaben gleitest Gestenspur anzeigen Schwebender Echtzeit-Vorschlag @@ -76,16 +76,16 @@ "Emoji-Palette auf physischen Tastaturen über Alt-Taste aufrufen" "Standard" Willkommen bei %s - "mit Gesteneingabe" + mit Gesten-Tippen "Jetzt starten" "Nächster Schritt" %s einrichten %s aktivieren - Bitte aktiviere %s\" unter der Systemeinstellung „Sprachen und Eingabe“, damit die App auf deinem Gerät verwendet werden darf.\" - %s ist bereits in deiner Systemeinstellung „Sprachen und Eingabe“ aktiviert. Weiter mit dem nächsten Schritt!\" + Bitte aktiviere %s\" unter der Systemeinstellung „Sprachen und Eingabe“. + %s ist bereits in Ihren Sprachen & Eingabeeinstellungen aktiviert, so dass dieser Schritt abgeschlossen ist. Weiter zum nächsten Schritt! "In den Einstellungen aktivieren" Zu %s wechseln - Wähle als nächstes %s\" als deine aktive Bildschirmtastatur.\" + Wähle als nächstes %s\" als deine aktive Bildschirmtastatur. "Eingabemethode wechseln" Hurra, die Einrichtung ist abgeschlossen! Jetzt kannst du in all deinen Lieblingsapps mit %s schreiben. @@ -201,9 +201,7 @@ Navigationsleiste einfärben Trotzdem benutzen Wald - Du benötigst die Bibliothek für „%s“. Inkompatible Bibliotheken können zu Abstürzen bei der Gesteneingabe führen. -\n -\nWarnung: Das Laden von externem Code kann ein Sicherheitsrisiko darstellen. Verwende nur Bibliotheken aus Quellen, denen du vertraust. + Du benötigst die Bibliothek für „%s“. Inkompatible Bibliotheken können zu Abstürzen beim Gesten-Tippen führen. \n \nWarnung: Das Laden von externem Code kann ein Sicherheitsrisiko darstellen. Verwende nur Bibliotheken aus Quellen, denen du vertraust. Wörterbuch zum Hinzufügen auswählen. Wörterbücher im .dict-Format können %s heruntergeladen werden. Bibliothek löschen Sprache @@ -232,12 +230,12 @@ Popup-Tastenreihenfolge wählen Version Hinweis-Quelle wählen - Native Bibliothek bereitstellen, um Gesteneingabe zu aktivieren + Native Bibliothek bereitstellen, um Gesten-Tippen zu aktivieren Mehr Symbole Versuche URLs und Ähnliches als einzelnes Wort zu erkennen Sprache auswählen Tastenbeschriftung - Gesteneingabe-Bibliothek laden + Gesten-Tippen-Bibliothek laden Leertastenhintergrund Dunkler Bild für den Tag- oder Nachtmodus festlegen? @@ -363,7 +361,7 @@ Seite runter Seitenanfang Zuletzt kopierte Inhalte der Zwischenablage als Vorschlag anzeigen - Schlage Zwischenablagen-Inhalt vor + Zwischenablagen-Inhalt vorschlagen Drücken der Eingabetaste oder der Leertaste nach anderen Tasten in der Symbolansicht Auswählen eines Eintrags des Zwischenablagenverlaufs Auswählen eines Emojis in der Emojiansicht @@ -441,13 +439,18 @@ Drücken der Eingabetaste oder der Leertaste nach anderen Tasten im Ziffernblock Leertaste Shift entfernt anstehende automatische Leerzeichen - Leerzeichen nach Wörtern bei Gesten-Eingabe + Leerzeichen nach Wörtern bei Gesten-Tippen Kein automatisches Leerzeichen beim drücken von Shift - Leerzeichen vor Wörtern bei Gesten-Eingabe + Leerzeichen vor Wörtern bei Gesten-Tippen Format der Timestamp-Taste Dagbani Sesotho Rücktaste macht Autokorrektur rückgängig Automatische Leerzeichen nach Auswählen eines Vorschlags Skaliere den Emoji-Knopf mit der Schriftgröße + Backup wiederhergestellt + App-Namen nachschlagen + Namen der installierten Apps für Vorschläge und Korrekturen verwenden + Standard-Emoji-Hautton + Neutral diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 3fb416e45..6f1d032ef 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -84,7 +84,7 @@ Setting up %s Enable %s Please tick \"%s\" in your Languages & input settings. This will authorise it to run on your device. - %s is already enabled in your Languages & input settings, so this step is done. On to the next one! + %s is already enabled in your Languages & input settings, so this step is done. On to the next one! "Enable in Settings" Switch to %s Next, select \"%s\" as your active text-input method. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index cb86504cf..b4a1c82d4 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -82,7 +82,7 @@ Configurando %s Activar %s Por favor, compruebe \"%s\" en sus ajustes de entrada de Idiomas. Esto lo autorizará a ejecutarse en su dispositivo.\" - %s ya está habilitado en sus idiomas & configuración de entrada, por lo que este paso está hecho. ¡En el siguiente! + %s ya está habilitado en sus idiomas & configuración de entrada, por lo que este paso está hecho. ¡En el siguiente! "Habilitar en Ajustes" Cambiar a %s A continuación, seleccione \\%s\" como su método de entrada de texto activo.\" diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 9eb091313..669cb4597 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -81,11 +81,11 @@ "Järgmine toiming" "Rakenduse %s seadistamine" Võta %s kasutusele - Palun märgi nutiseadme keele- ja sisendiseadetes „%s“ lubatuks. See võimaldab rakenduse kasutamist sinu nutiseadmes. - %s on sinu nutiseadme keele- ja sisendiseadetes juba lubatud, seega on see toiming tehtud. Asu järgmise toimingu juurde! + Palun märgi nutiseadme keele- ja sisendiseadetes „%s“ lubatuks. See võimaldab rakenduse kasutamist sinu nutiseadmes. + xliff:g id=\"APPLICATION_NAME\" example=\"Android Keyboard\">%s</xliff:g> on sinu nutiseadme keele- ja sisendiseadetes juba lubatud, seega on see toiming tehtud. Asu järgmise toimingu juurde! "Luba seadetes" Võta %s kõikjal kasutusele - Järgmisena vali aktiivseks tekstisisestusmeetodiks rakendus „%s“. + Järgmisena vali aktiivseks tekstisisestusmeetodiks rakendus „%s“. "Vaheta sisestusmeetodeid" "Õnnitleme. Kõik on valmis!" Nüüd saad rakendusega %s sisestada kõikides oma lemmikrakendustes. @@ -484,4 +484,9 @@ dagbani sotho Kohenda emoji klahvi suurust tavateksti klahvide suuruste järgi + Varukoopiast taastamine õnnestus + Otsi välja rakenduste nimed + Otsi soovituste ja paranduste jaoks välja paigaldatud rakenduste nimed + Emoji vaikimisi taustavärv + Neutraalne diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 10a1140bc..d0d43c0ad 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -405,4 +405,57 @@ Pertsonalizatu tresna-barrako tekla-kodeak Tekla-kodea Sakatze luzeko kodea + Ez erakutsi beti iradokizunik web edizioko eremuetarako + Banatze-tartea (horizontala) + Zuriunea + Erabili instalatutako aplikazioen izenak iradokizunak eta zuzenketak egiteko + Gaitu teklatu banatua (horizontala) + Egin dar-dar ez molestatzeko moduan + Web ediziorako eremuak (batez ere nabigatzaileetan aurkitzen direnak) oso ohiko arrazoia dira iradokizunen konfigurazioa beti erakusten duten arazoetarako + Zuzenketa automatikorako lasterbideak + Atzera-espazioak autozuzenketa desegiten du + Txertatu zuriunea iradokizun bat aukeratu ondoren + Denbora-zigilu gakoaren formatua + Mayus-ek kentzen du zuriune automatikoa + Gaituta dagoenean, lasterbideak autozuzenketaren bidez zabal daitezke + Bilatu aplikazioen izenak + Babeskopia berrezarri da + Txertatu zuriunea hitz bat idazteko keinuaren aurretik + Txertatu zuriunea hitz bat idazteko keinuaren ondoren + Ez txertatu zuriunerik Mayus sakatzean + Erakutsi zenbaki-errenkadako argibideak + Hiztegiak dituzten hizkuntzak + Erakutsi TLD popup teklak + Azpimota pertsonalizatua + URLak eta helbide elektronikoak idaztean, periodoen teklen popupak lehen mailako domeinuekin ordeztu + Zenbakien errenkada (oinarrizkoa) + %s (Baishakhi) + %s-n koloreak aurki eta parteka ditzakezu. + Override Emoji bertsioa + Emojien azalaren tonu lehenetsia + %s (Phonetic) + Sartu edo zuriunea sakatuta, numpad-eko beste teklen ondoren + Seguru %s ezabatu nahi duzula? + Ezarri letra-tipo pertsonalizatua fitxategitik + Dagbani + Sesotho + Eskalatu emojiak karaktereen tamainarekin + Bigarren mailako diseinuak + Abisua: hori da une honetan erabiltzen ari den diseinua + Tekla funtzionalak (pantaila handia) + Beheko betegarriaren eskala (horizontala) + Alboko betegarriaren eskala (horizontala) + Alboko betegarriaren eskala + Ezarri atzeko planoko irudia (horizontala) + Ezartzen ez bada, irudia bertikala erabiliko da + Seguru berrezarri nahi duzula ikono pertsonalizatu guztiak? + Banatu teklatua + Teklatuko karaktereen eskala + Emojien eskala + Neutroa + Dargwa (Urakhi) + Urakhi (%s) + % s-n diseinuak aurki eta parteka ditzakezu. + eztabaiden atala + Izen baliogabea diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index cc252abda..d69c5a059 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -315,4 +315,4 @@ Lisää hyvin yleiset muunnelmat (oletus) Poista ylimääräiset ponnahdusikkunat Näytä vihjeet numerorivillä - \ No newline at end of file + diff --git a/app/src/main/res/values-fr-rCA/strings.xml b/app/src/main/res/values-fr-rCA/strings.xml index 2cd616469..33575cebe 100644 --- a/app/src/main/res/values-fr-rCA/strings.xml +++ b/app/src/main/res/values-fr-rCA/strings.xml @@ -123,4 +123,4 @@ "Rech." "Pause" "Att." - \ No newline at end of file + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index da13165d8..a53d5d85d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -95,7 +95,7 @@ "Durée de vibration des touches" "Volume du son des touches" "Délai d\'un appui long sur les touches" - "Emojis pour clavier physique" + Émojis pour clavier physique "La touche Alt physique permet d\'afficher la palette d\'emoji" "Par défaut" Bienvenue sur %s @@ -105,7 +105,7 @@ Configurer %s Activer %s Veuillez vérifier que %s est activé dans vos paramètres de langue et de saisie. Cela autorisera son fonctionnement sur votre appareil. - L’application %s est déjà activée dans vos paramètres « Langues et saisie ». Passez à l’étape suivante ! + L’application %s est déjà activée dans vos paramètres « Langues et saisie ». Passez à l’étape suivante ! "Activer le clavier dans les paramètres" Basculer vers %s Sélectionnez ensuite « %s » comme méthode de saisie active. @@ -371,8 +371,8 @@ Nouveau dictionnaire: Basculer vers le pavé numérique Passer au clavier principal après avoir… Sélectionné une entrée dans l\'historique du presse-papiers - Appuyé sur Entrée ou sur Espace après la sélection d\'un symbole dans la vue des symboles - Sélectionné un emoji dans la vue des emojis + Appuyé sur Entrée ou sur la barre d\'espace après la sélection d\'un symbole dans la vue des symboles + Sélectionné un émoji dans la vue des émojis Ajouter les variantes les plus courantes (par défaut) Supprimer les touches pop-up déjà présentes dans la disposition de base Supprimer les pop-ups redondants @@ -384,7 +384,7 @@ Nouveau dictionnaire: Rangée de chiffres Texte personnalisé sur la barre d\'espace Rangée inférieure du presse-papier - Rangée inférieure des emojis + Rangée inférieure des émojis Tabulation Supprimer Majuscule @@ -407,7 +407,7 @@ Nouveau dictionnaire: Corbeille Vibrer en mode Ne pas déranger %s (Phonétique) - Remplacer la version des Emojis + Remplacer la version des émojis Dargwa (Urakhi) Urakhi (%s) Correction automatique des raccourcis @@ -439,7 +439,7 @@ Nouveau dictionnaire: Section de discussion Afficher les suggestions de domaines (TLD) Remplacer les suggestions de la touche point par des extensions de domaine (TLD) lors de la saisie d’URL ou d’adresses e-mail - Appuyer sur Entrée ou sur la barre d\'espace après d\'autres touches du pavé numérique + Appuyé sur Entrée ou sur la barre d\'espace après d\'autres touches du pavé numérique Les champs d\'édition Web (principalement présents dans les navigateurs) sont une cause très courante de problèmes avec le paramètre « Toujours afficher les suggestions » Rangée numérique (standard) Ne pas forcer l\'affichage des suggestions pour les champs de saisie web @@ -454,4 +454,9 @@ Nouveau dictionnaire: Dagbani Sesotho Ajuster la taille des touches emoji à la taille de la police + Sauvegarde restaurée + Rechercher les noms des applications + Utiliser les noms des applications installées pour les suggestions et les corrections + Neutre + Teint de peau par défaut des emojis diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml index 417434a3d..416cde7c4 100644 --- a/app/src/main/res/values-hy/strings.xml +++ b/app/src/main/res/values-hy/strings.xml @@ -124,4 +124,4 @@ "Որոնում" "Դադարեցնել" "Սպասել" - \ No newline at end of file + diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index bc5756263..0b419f0c9 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -5,7 +5,7 @@ SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only --> "Cari nama kontak" - "Getar jika tombol ditekan" + Bergetar saat tombol ditekan "Berbunyi jika tombol ditekan" "Muncul saat tombol ditekan" "Preferensi" @@ -16,8 +16,8 @@ "Aktifkan keyboard terpisah" "Beralih ke metode masukan lain" "Tombol pengalih bahasa" - "%s md" - "Default sistem" + %s md + Sistem bawaan "Menggunakan nama dari Kontak untuk saran dan koreksi" "Saran hasil personalisasi" "Titik spasi ganda" @@ -79,13 +79,13 @@ "dengan Ketikan Gestur" "Memulai" "Langkah berikutnya" - Menyiapkan<xliff:g id=\"NAMA_APLIKASI\" contoh=\"Papan Ketik Android\">%s<xliff:g> - Aktifkan<xliff:g id=\"NAMA_APLIKASI\" contoh=\"Papan Ketik Android\">%s<xliff:g> - Harap periksa \\<xliff:g id=\"NAMA_APLIKASI\" contoh=\"Papan Ketik Android\">%s<xliff:g>\" di setelan Bahasa &amp; masukan Anda. Ini akan mengizinkannya untuk berjalan di perangkat Anda.\" - <xliff:g id=\"NAMA_APLIKASI\" contoh=\"Papan Ketik Android\">%s<xliff:g> sudah diaktifkan di pengaturan Bahasa &amp; masukan Anda, jadi langkah ini sudah selesai. Lanjut ke langkah berikutnya!\" + Menyiapkan %s + Aktifkan %s + Harap periksa \"%s\" di setelan Bahasa masukan Anda. Ini akan mengizinkannya untuk berjalan di perangkat Anda. + %s sudah diaktifkan di pengaturan Bahasa masukan Anda, jadi langkah ini sudah selesai. Lanjut ke langkah berikutnya! "Aktifkan dalam Setelan" - Switch to%s - Next, select \\%s\" as your active text-input method.\" + Beralih ke %s + Selanjutnya, pilih \"%s\" sebagai metode input teks aktif Anda. "Alihkan metode masukan" "Selamat, Anda sudah siap!" Sekarang Anda bisa mengetik di semua aplikasi favorit Anda dengan %s. @@ -114,12 +114,12 @@ Gestur hapus Sentuh dan geser ke kiri pada tombol hapus untuk menghapus beberapa huruf/kata sekaligus Riwayat papan klip - Tidak terbatas + Tidak ada batas Aktifkan riwayat papan klip Waktu simpan riwayat Tampilkan petunjuk tombol Selalu tampilkan baris angka - %smnt + %s mnt Alfabet (Workman) Pemeriksa Ejaan HeliBoard Pengaturan Pemeriksa Ejaan HeliBoard @@ -131,7 +131,7 @@ Masukan Tombol tambahan Saran - Eksperimental + Percobaan Lainnya Koreksi Tombol lainnya @@ -169,7 +169,7 @@ Kesalahan saat menyimpan data cadangan: %s Gagal memuat data cadangan: %s Cadangkan - Kembalikan + Pulihkan Bawah Pengetikan multibahasa Muat pustaka pengetikan gestur @@ -214,11 +214,11 @@ Tekan untuk mengubah tata letak versi polos Peringatan: Menonaktifkan pengaturan ini akan menghapus data yang telah diperoleh Selalu tampilkan saran - Simpan data cadangan dan kembalikan + Pencadangan dan pemulihan Mode satu tangan %s (Sebeolsik 390) Tambahkan tata letak kustom - Pisahkan jarak + Jarak pisah Abaikan permintaan aplikasi lain untuk menonaktifkan saran (dapat menimbulkan masalah) Anda membutuhkan pustaka untuk \'%s\'. Pustaka yang tidak cocok mungkin bisa mengeluarkan Anda dari aplikasi secara tiba-tiba saat menggunakan pengetikan gestur. \n @@ -236,11 +236,11 @@ Simbol telepon Angka Papan nomor - Papan nomor (mode bentang) + Papan nomor (lanskap) Ubah gambar latar belakang Ubah gambar untuk mode cerah atau malam? Malam - Cerah + Siang Kamus Kamus utama internal Tambahkan kamus dari file @@ -324,7 +324,7 @@ Lisensi Publik Umum GPU v3.0 Kaitag Kaitag (%s) - Tutup riwayat clipboard + Tutup riwayat papan klip Emoji Potong %s (Probhat) @@ -347,10 +347,10 @@ Selalu gunakan saran pertengahan Saat menekan spasi atau tanda baca, saran tengah akan dimasukkan Emoji baris bawah - Baris bawah clipboard + Baris bawah papan klip Tetapkan simbol mata uang utama dan hingga 6 simbol mata uang sekunder, dipisahkan dengan spasi Arah bilah alat variabel - <xliff:g id=\"NAMA_BAHASA\" contoh=\"Bahasa Kannada\">%s<xliff:g> (Diperluas) + %s (Diperluas) Memuat Simpan ke file Tampilkan bilah alat jika input dimulai atau teks dipilih @@ -358,21 +358,21 @@ Bergetar dalam mode jangan ganggu Akhir halaman Kata tersisa - Pilih tombol bilah alat clipboard + Pilih tombol bilah alat papan klip Sematkan tombol bilah alat saat ditekan lama Ini akan menonaktifkan tindakan tekan lama lainnya untuk tombol bilah alat yang tidak disematkan - Tekan lama tombol simbol untuk numpad - <xliff:g id=\"NAMA_BAHASA\" contoh=\"Bahasa Hindi\">%s<xliff:g> (Fonetik) + Tekan lama tombol simbol untuk papan nomor + %s (Fonetik) Ganti versi Emoji Kode tekan lama - Dargwa(Urakhi) - Urakhi (<xliff:g id=\"LAYOUT_KEYBOARD\" contoh=\"QWERTY\">%s<xliff:g>) + Dargwa (Urakhi) + Urakhi (%s) Kode kunci Kunci huruf kapital - Space (tata letak angka) + Spasi (tata letak angka) Akhiri mode satu tangan Ubah ukuran mode satu tangan - Alihkan Numpad + Alihkan Papan nomor Pintasan koreksi otomatis Saat diaktifkan, pintasan mungkin diperluas dengan koreksi otomatis Halaman bawah @@ -381,7 +381,7 @@ Kata yang tepat Memuat akan menimpa tema saat ini Atur font khusus dari file - Salin ke clipboard + Salin ke papan klip Mengatur gambar latar belakang (lanskap) Jika tidak diatur, gambar potret akan digunakan Penggabung lebar nol @@ -393,7 +393,7 @@ Menekan enter atau spasi setelah tombol lain dalam tampilan simbol Beralih ke keyboard utama setelah… Memilih emoji dalam tampilan emoji - Memilih entri riwayat clipboard + Memilih entri riwayat papan klip Tambahkan varian yang sangat umum (default) Tekan tombol popup yang sudah ada pada tata letak dasar Bilah Alat @@ -401,7 +401,7 @@ Benarkah harus mereset semua ikon yang disesuaikan? Perilaku tombol alih bahasa Sarankan konten papan klip - Tampilkan konten clipboard yang baru saja disalin sebagai saran + Tampilkan konten papan klip yang baru saja disalin sebagai saran Benarkah semua kode kunci yang disesuaikan terhapus? ► Menekan lama tombol bilah alat yang disematkan menghasilkan fungsi tambahan: <br> \n• clipboard &#65515; tempel <br> \n• pindahkan ke kiri dan kanan &#65515; kata ke kiri dan kanan <br> \n• pindahkan ke atas dan bawah &#65515; halaman ke atas dan bawah <br> \n• kata ke kiri dan kanan &#65515; awal baris <br> \n• halaman ke atas dan bawah &#65515; awal halaman <br> \n• salin &#65515; potong <br> \n• pilih kata &#8596; pilih semua <br> \n• batalkan &#8596; ulangi <br> <br> \n► Menekan lama tombol pada bilah alat strip saran akan menyematkannya ke strip saran. <br> <br> \n► Tekan lama tombol Koma untuk mengakses Tampilan Clipboard, Tampilan Emoji, Mode Satu Tangan, Pengaturan, atau Ganti Bahasa: <br> \n• Tampilan Emoji dan Ganti Bahasa akan menghilang jika Anda mengaktifkan tombol terkait; <br> \n• Untuk beberapa tata letak, yang aktif bukanlah tombol Koma, tetapi tombol pada posisi yang sama (misalnya, \'q\' untuk tata letak Dvorak). <br> <br> \n► Saat mode penyamaran diaktifkan, tidak ada kata yang akan dipelajari, dan tidak ada emoji yang akan ditambahkan ke yang terbaru. <br> <br> \n► Tekan ikon Penyamaran untuk mengakses bilah alat. <br> <br> \n► Input tombol geser: Geser dari shift ke tombol lain untuk mengetik satu tombol huruf kapital: <br> \n• Ini juga berfungsi untuk tombol \'?123\' untuk mengetik satu simbol dari papan ketik simbol, dan untuk tombol terkait. <br> <br> \n► Tahan tombol shift atau simbol, tekan satu atau beberapa tombol, lalu lepaskan tombol shift atau simbol untuk kembali ke papan ketik sebelumnya. <br> <br> \n► Tekan lama saran di strip saran untuk menampilkan lebih banyak saran, dan tombol hapus untuk menghapus saran ini. <br> <br> \n► Geser ke atas dari saran untuk membuka lebih banyak saran, dan lepaskan pada saran untuk memilihnya. <br> <br> \n► Tekan lama entri dalam riwayat clipboard untuk menyematkannya (simpan di clipboard hingga Anda melepas sematannya). <br> <br> \n► Geser ke kiri dalam tampilan clipboard untuk menghapus entri (kecuali saat disematkan) <br> <br> \n► Pilih teks dan tekan shift untuk beralih antara kata-kata huruf besar, huruf kecil, dan huruf kapital. <br> <br> \n► Anda dapat menambahkan kamus dengan membukanya di file explorer: <br> \n• Ini hanya berfungsi dengan <i>content-uris<i> dan tidak dengan <i>file-uris<i>, yang berarti mungkin tidak berfungsi dengan beberapa file explorer. <br> <br> \n► Untuk pengguna yang melakukan pencadangan manual dengan akses root: <br> \n• Dimulai pada Android 7, file preferensi bersama tidak berada di lokasi default, karena aplikasi menggunakan %s. Ini diperlukan agar pengaturan dapat dibaca sebelum perangkat dibuka kuncinya, misalnya saat boot; <br> \n• File terletak di datauser_de0package_idshared_prefs meskipun ini mungkin bergantung pada perangkat dan versi Android. <br> <br> \n<i><b>Debug mode debug APK<b><i> <br> <br> \n► Tekan lama saran untuk menampilkan kamus sumber. <br> <br> \n► Saat menggunakan APK debug, Anda dapat menemukan Setelan Debug di Preferensi Lanjutan, meskipun kegunaannya terbatas kecuali untuk membuang kamus ke dalam log. <br> \n• Untuk APK rilis, Anda perlu mengetuk versi di <i>Tentang<i> beberapa kali, lalu Anda dapat menemukan setelan debug di <i>Preferensi Lanjutan<i>. <br> \n• Saat mengaktifkan <i>Tampilkan info saran<i>, saran akan memiliki beberapa angka kecil di atas yang menunjukkan beberapa skor internal dan kamus sumber. <br> <br> \n► Jika terjadi kerusakan aplikasi, Anda akan diminta apakah Anda menginginkan log kerusakan saat membuka Setelan. <br> <br> \n► Saat menggunakan pengetikan multibahasa, bilah spasi akan menunjukkan nilai keyakinan yang digunakan untuk menentukan bahasa yang saat ini digunakan. <br> <br> \n► Saran akan memiliki beberapa angka kecil di bagian atas yang menunjukkan beberapa skor internal dan kamus sumber (dapat dinonaktifkan). Pengaturan ini menampilkan semua warna yang digunakan secara internal. Daftar warna dapat berubah sewaktu-waktu. Warna default bersifat acak, dan nama-namanya tidak akan diterjemahkan. @@ -425,8 +425,8 @@ Kunci fungsional (layar besar) %s (Baishakhi) Anda dapat menemukan dan berbagi tata letak di %s. - Aktifkan keyboard split (lansekap) - Jarak split (lanskap) + Aktifkan keyboard terpisah (lanskap) + Jarak pisah (lanskap) Benaran mau dihapus %s? Nama invalid Skala padding bawah (lanskap) @@ -439,4 +439,26 @@ Bahasa dengan kamus Keyboard terpisah Anda dapat menemukan dan berbagi warna di %s. + Baris nomor (dasar) + Bidang edit web (kebanyakan ditemukan di browser) adalah penyebab yang sangat umum untuk masalah dengan pengaturan saran yang selalu ditampilkan + Jangan selalu menampilkan saran untuk bidang edit web + Spasi + Tidak ada spasi otomatis saat menekan shift + Shift menghapus spasi otomatis yang tertunda + Format kunci stempel waktu + Spasi otomatis sebelum mengetik kata dengan isyarat + Spasi otomatis setelah mengetik kata dengan isyarat + Menampilkan tombol popup TLD + Ganti popup tombol titik dengan domain tingkat atas saat mengetik URL dan alamat email + Menekan enter atau spasi setelah tombol lain di papan nomor + Dagbani + Sesotho + Menskala ukuran tombol emoji dengan ukuran font + Spasi otomatis setelah memilih saran + Cadangan dipulihkan + Cari nama aplikasi + Gunakan nama aplikasi yang terinstal untuk saran dan koreksi + Backspace mengembalikan koreksi otomatis + Warna kulit emoji bawaan + Netral diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index f1e7427bd..1f0853d28 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -85,7 +85,7 @@ "האפליקציה %s כבר פועלת בהגדרות השפה והקלט שלך, אז השלב הזה הסתיים. ממשיכים הלאה לשלב הבא!" "הפעל בהגדרות" "עבור אל %s" - בשלב הבא, יש לבחור ב-%s\' כשיטת ההזנה הפעילה להזנת מלל.\" + בשלב הבא, יש לבחור ב-\"%s\" כשיטת ההזנה הפעילה להזנת מלל. החלפת שיטת הזנה "ברכותינו, הכל מוכן!" "כעת תוכל להקליד בכל האפליקציות המועדפות עליך באמצעות %s." @@ -217,8 +217,7 @@ הקובץ אינו ניתן לקריאה הגדרת שם הפריסה באמת להסיר את המילון שנוסף ע\"י המשתמש \"%s\"? - "ללא מילון, תקבלו הצעות למלל שהקלדתם בעבר בלבד.<br> -\n באפשרותך להוריד מילונים %1$s, או לבדוק אם מילון עבור \"%2$s\" ניתן להורדה ישירות %3$s." + "ללא מילון, תקבלו הצעות למלל שהקלדתם בעבר בלבד.<br>\n באפשרותך להוריד מילונים %1$s, או לבדוק אם מילון עבור \"%2$s\" ניתן להורדה ישירות %3$s." לא להציג שוב בחירת המילון להוספה. מילונים בפורמט .dict ניתנים להורדה %s. כאן @@ -456,4 +455,9 @@ דאגבני ססוטו התאמת גודל מקש האמוג\'י לגודל הגופן + הגיבוי שוחזר + רשימת שמות יישומים לאיתור + גוון עור ברירת-מחדל לאמוג\'י + נייטרלי + שימוש בשמות יישומים מותקנים להצעות ולתיקונים diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 2ba198735..f89c6cbbd 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -125,4 +125,4 @@ "Paieška" "Pris." "Lauk." - \ No newline at end of file + diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index d2bd41b24..03f524bc3 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -123,4 +123,4 @@ "Барај" "Пауза" "Чекај" - \ No newline at end of file + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index c2c7c7250..3e92584f9 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -44,7 +44,7 @@ "Dynamisch zwevend voorbeeld" Woordgroepen gebaren Spaties invoeren door te vegen over de spatiebalk - "Engels (GB)" + Engels (VK) "Engels (VS)" "Spaans (VS)" "Hindi-Engels" @@ -81,11 +81,11 @@ "Volgende stap" %s instellen %s inschakelen - Vink %s aan in de instellingen bij \'Talen & invoer\'. De app kan dan worden uitgevoerd op dit apparaat. + Selecteer %s in de instellingen bij \'Talen & invoer\'. De app kan dan worden uitgevoerd op dit apparaat. %s is al ingeschakeld in de instellingen bij \'Talen & invoer\', dus deze stap is voltooid. Op naar de volgende! "Inschakelen in \'Instellingen\'" Overschakelen naar %s - Selecteer vervolgens %s als \"actieve tekstinvoermethode.\" + Selecteer vervolgens %s als actieve methode voor tekstinvoer. "Schakelen tussen invoermethoden" Gefeliciteerd, je kunt nu aan de slag! Je kunt nu in al je favoriete apps typen met %s. @@ -493,4 +493,9 @@ Dagbani Sesotho Emoji-toetsgrootte schalen met lettergrootte + Back-up hersteld + App-namen opzoeken + Gebruik de namen van geïnstalleerde apps voor suggesties en correcties + Neutraal + Standaard emoji-huidskleur diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index c22edcbf0..dd4af563c 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -492,4 +492,10 @@ Format klawisza znacznika czasu dagbani sesotho + Skaluj rozmiar emotikonów w zależności od rozmiaru czcionki + Kopia zapasowa przywrócona + Używaj nazw zainstalowanych aplikacji do sugestii i poprawek + Przeszukaj nazwy aplikacji + Domyślny odcień skóry emoji + Neutralny diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index d6d22f4d3..745a8b57d 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -16,7 +16,7 @@ Correções Outros Ativar teclado dividido - Experimental + Experimentos Usar nomes de contatos para sugestões e correções Sugestões personalizadas Duplo espaço para ponto @@ -116,7 +116,7 @@ Hinglês %s Nenhum idioma (Alfabeto) Alfabeto (QWERTY) - %s já está ativado nas configurações de \'Idiomas e Entrada\'. Esta etapa já está concluída. Vamos avançar para a próxima! + %s já está ativado nas configurações de \'Idiomas e Entrada\'. Esta etapa já está concluída. Vamos para a próxima! Alfabeto (QWERTZ) Alfabeto (AZERTY) Alfabeto (Dvorak) @@ -126,12 +126,12 @@ Bem-vindo ao %s Mostrar a paleta de emojis ao tocar na tecla Alt física Configurando %s - Por favor, ative o \\%s\" em \'Idiomas e Entrada\' nas configurações. Isso permitirá que ele seja usado no seu dispositivo. + Por favor, ative o \"%s\" em \'Idiomas e Entrada\' nas configurações. Isso permitirá que ele seja usado no seu dispositivo. Concluído Mostrar o ícone do app na launcher Dicionário disponível Alternar para %s - Em seguida, selecione \\%s\" como o seu método de entrada ativo. + Em seguida, selecione \"%s\" como o seu método de entrada ativo. Agora, você pode usar o %s para digitar nos seus apps favoritos. Adicionar ao dicionário Versão %1$s @@ -456,4 +456,9 @@ Dagani Sesoto Redimensionar tamanho da tecla de emoji com o tamanho da fonte + O backup foi restaurado + Procurar nomes de apps + Usar nomes de apps instalados para sugestões e correções + Cor de pele padrão para os emojis + Neutra diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 2d923cb84..4573e82d9 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -69,7 +69,7 @@ "Remover" "Guardar" "Idioma" - "Esquema" + Layout "Duração vibr. ao premir teclas" "Volume do som ao premir teclas" "Atraso ao manter tecla premida" @@ -232,7 +232,7 @@ Conteúdo copiado Mudar o lado do modo de uma mão Não foi possível ler o ficheiro - Copiar esquema existente + Copiar layout existente Texto personalizado na barra de espaço Mansi Personalizar moedas @@ -270,7 +270,7 @@ Tenta detetar URLs e similares como uma única palavra Selecionar fonte de dicas Escala do espaço inferior - Excluir realmente o layout customizado %s? + Excluir realmente o layout personalizado%s? Linha de números (básica) Definir imagem de fundo Não-conector de zero largura @@ -278,7 +278,7 @@ Ainda usar Claro Destaque - Adicionar esquema personalizado + Adicionar layout personalizado Selecionar língua "Substituir realmente o dicionário \"%1$s\" adicionado pelo utilizador?\n\nDicionário atual:\n%2$s \n\nDicionário novo:\n%3$s" Selecione um dicionário para adicionar. Dicionários no formato .dict podem ser descarregados%s. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c4cb820f7..6f6608dce 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -87,11 +87,11 @@ Далее Настроить %s Включить %s - Убедитесь, что \\%s\" включен в настройках языка и ввода. Это позволит ему работать на вашем устройстве.\" - Приложение %s уже включено в настройках языка и ввода. Перейдите к следующему шагу!\" + Убедитесь, что приложение \"%s\" включено в настройках языка и ввода. Это позволит ему работать на вашем устройстве. + Приложение %s уже включено в настройках языка и ввода, так что этот шаг выполнен. Переходим к следующему! Включить в настройках Переключитесь на %s - Теперь выберите \\%s\" в качестве активного метода ввода текста.\" + Теперь выберите \"%s\" в качестве активного метода ввода текста. Другой способ ввода Поздравляем, всё готово! Теперь вы можете использовать приложение %s для набора текста. @@ -232,7 +232,7 @@ хранилище, защищённое устройством Лес Вам понадобится библиотека для \'%s\'. Несовместимые библиотеки могут привести к сбою при использовании набора текста с помощью жестов. \n\nВнимание: загрузка внешнего кода может представлять угрозу безопасности. Используйте библиотеку только из источника, которому вы доверяете. - Удалить библиотеку + Удалить Язык Предпочитать локализованные латинские цифры Неизвестный файл библиотеки. Вы уверены, что получили его из надёжного источника и оно предназначено для \'%s\'? @@ -274,7 +274,7 @@ Ночь Больше не показывать Предупреждение: Отключение этого параметра приведёт к удалению изученных данных - Загрузить библиотеку + Загрузить Высота нижнего отступа Ввод жестами Показывать больше букв с диакритическими знаками в всплывающем окне @@ -448,4 +448,9 @@ Дагбани Сесото Масштабировать размер клавиш эмодзи вместе с размером шрифта + Резервная копия восстановлена + Использовать названия приложений + Использовать названия установленных приложений для предложений и исправлений + Тон кожи эмодзи по умолчанию + Нейтральный diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 2a59b8872..065ad2ee5 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -81,7 +81,7 @@ "Ďalší krok" "Nastavenie aplikácie %s" "Povoľte aplikáciu %s" - V nastaveniach Jazyky a vstup začiarknite políčko%s. Týmto aplikácii povolíte spustenie v zariadení.\" + V nastaveniach Jazyky a vstup začiarknite políčko%s. Týmto aplikácii povolíte spustenie v zariadení.\" "Aplikácia %s je už v nastaveniach Jazyky a vstup povolená. Prejdite na ďalší krok." "Povoliť v Nastaveniach" "Prepnite na aplikáciu %s." @@ -141,4 +141,4 @@ "Hľadať" "Pauza" "Čakať" - \ No newline at end of file + diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 3b33cbc78..7eced5e87 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -157,4 +157,4 @@ "Iskanje" "Zaus." "Čakaj" - \ No newline at end of file + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 3d83bdd72..c1ecf51d6 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -81,11 +81,11 @@ "下一步" 设置 %s 启用 %s - 请检查您的语言和输入设置中的 %s。这将授权它在您的设备上运行。 - 您已在语言和输入设置中启用 %s,因此这一步已完成。下一步! + 请在“语言和输入法”设置中选中“%s”,授权该应用在您的设备上运行。 + 您已在“语言和输入法”中启用了 %s,因此这一步骤已完成。继续下一步吧! "在设置中启用" 切换到 %s - 接下来,选择 %s 作为您要使用的文本输入法。 + 接下来,请选择“%s”作为您要使用的文本输入法。 "切换输入法" "恭喜,您已完成了设置!" 现在,您可以在您喜欢的所有应用中使用 %s 输入内容了。 @@ -450,4 +450,9 @@ 索托语 达巴尼语 根据字体大小缩放表情符号键大小 + 备份已还原 + 查找应用名称 + 使用已安装应用的名称进行建议和更正 + 中性 + 默认表情符号肤色 diff --git a/fastlane/metadata/android/bg/full_description.txt b/fastlane/metadata/android/bg/full_description.txt new file mode 100644 index 000000000..0670c31dd --- /dev/null +++ b/fastlane/metadata/android/bg/full_description.txt @@ -0,0 +1,30 @@ +HeliBoard е клавиатура с отворен код, базирана на AOSP / OpenBoard, която е съобразена с поверителността.. +Не използва разрешение за интернет и по този начин е 100% офлайн. + +Възможности: +

      diff --git a/fastlane/metadata/android/de-DE/changelogs/3004.txt b/fastlane/metadata/android/de-DE/changelogs/3004.txt new file mode 100644 index 000000000..6f8a7103e --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/3004.txt @@ -0,0 +1,11 @@ +* Layouts hinzugefügt: Arabisch Hija'i, Hebräisch 1452-2, Hindi Phonetic, Dargwa (Urakhi), Baishakhi, Kurdisch +* einige Layouts aktualisiert +* Unterstützung der Kombination von Akzenten +* geteilte Tastatursymbolleisten-Taste +* Hinzufügen von .com-Popups +* Einstellung einer benutzerdefinierten Schriftart ermöglicht +* Einstellung des Schriftgrades hinzugefügt +* Verbesserung der automatischen Sprachumschaltung +* Überarbeitung der Einstellungen +* Einstellungen für mehr Tuning von Tastaturauffüllung, Auto-Leerzeichen, Auto-Korrektur, Zahlenreihe hinzugefügt +* weitere Funktionen und Korrekturen From 917edee918d6750c976a245eab02d3b5517f1d23 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 24 May 2025 07:04:49 +0200 Subject: [PATCH 147/175] fix obviously broken links in description fixes GH-1568 --- fastlane/metadata/android/ar/full_description.txt | 2 +- fastlane/metadata/android/de-DE/full_description.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fastlane/metadata/android/ar/full_description.txt b/fastlane/metadata/android/ar/full_description.txt index dd46f57e0..27b361ad9 100644 --- a/fastlane/metadata/android/ar/full_description.txt +++ b/fastlane/metadata/android/ar/full_description.txt @@ -5,7 +5,7 @@ HeliBoard هو عبارة عن لوحة مفاتيح مفتوحة المصدر
      • أضف قواميس للاقتراحات والتدقيق الإملائي
        • -
        • قم ببناء قاموس خاص بك، أو احصل عليه هنا، أو في القسم التجريبي (قد تختلف الجودة)
        • +
        • قم ببناء قاموس خاص بك، أو احصل عليه هنا، أو في القسم التجريبي (قد تختلف الجودة)
        • يمكن استخدام قواميس إضافية للرموز التعبيرية أو الرموز العلمية لتقديم اقتراحات (على غرار "البحث عن الرموز التعبيرية")
        • لاحظ أنه بالنسبة للتخطيطات الكورية، تعمل الاقتراحات فقط باستخدام هذا القاموس، والأدوات الموجودة في مستودع القاموس غير قادرين على إنشاء قواميس صالحة للعمل
        diff --git a/fastlane/metadata/android/de-DE/full_description.txt b/fastlane/metadata/android/de-DE/full_description.txt index 670b10bee..afb8c27e7 100644 --- a/fastlane/metadata/android/de-DE/full_description.txt +++ b/fastlane/metadata/android/de-DE/full_description.txt @@ -5,7 +5,7 @@ Features:
        • Wörterbücher für Vorschläge und Rechtschreibprüfung hinzufügen
          • -
          • Erstelle deine eigenen oder hole sie dir hier oder im experimentellen Bereich (Qualität kann variieren)
          • +
          • Erstelle deine eigenen oder hole sie dir hier oder im experimentellen Bereich (Qualität kann variieren)
          • Zusätzliche Wörterbücher für Emojis oder wissenschaftliche Symbole können zur Bereitstellung von Vorschlägen genutzt werden (ähnlich wie bei der „Emoji-Suche“)
          • Beachte, dass die Vorschläge für koreanische Layouts nur mit diesem Wörterbuch funktionieren, die Werkzeuge im Wörterbuch-Repository können keine funktionierenden Wörterbücher erstellen
          From 82e6d8a5cbef051caa73f35096274b643291c34c Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 24 May 2025 08:25:18 +0200 Subject: [PATCH 149/175] move SubtypeLocaleUtils to Kotlin --- .../latin/utils/SubtypeLocaleUtils.java | 318 ------------------ .../latin/utils/SubtypeLocaleUtils.kt | 264 +++++++++++++++ 2 files changed, 264 insertions(+), 318 deletions(-) delete mode 100644 app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.java create mode 100644 app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.java b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.java deleted file mode 100644 index bb99355b6..000000000 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * modified - * SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only - */ - -package helium314.keyboard.latin.utils; - -import android.content.Context; -import android.content.res.Resources; -import android.view.inputmethod.InputMethodSubtype; - -import helium314.keyboard.compat.ConfigurationCompatKt; -import helium314.keyboard.latin.R; -import helium314.keyboard.latin.common.Constants; -import helium314.keyboard.latin.common.LocaleUtils; -import helium314.keyboard.latin.common.StringUtils; - -import java.util.HashMap; -import java.util.Locale; - -import static helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.COMBINING_RULES; -import static helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -/** - * A helper class to deal with subtype locales. - */ -// TODO: consolidate this into RichInputMethodSubtype -// todo (later): see whether this complicated mess can be simplified -public final class SubtypeLocaleUtils { - static final String TAG = SubtypeLocaleUtils.class.getSimpleName(); - - // This reference class {@link R} must be located in the same package as LatinIME.java. - // switched to context.getPackageName(), which works with changed debug package name - // any reason to prefer original version? -// private static final String RESOURCE_PACKAGE_NAME = R.class.getPackage().getName(); - - // Special language code to represent "no language". - public static final String NO_LANGUAGE = "zz"; - public static final String QWERTY = "qwerty"; - public static final String EMOJI = "emoji"; - public static final int UNKNOWN_KEYBOARD_LAYOUT = R.string.subtype_generic; - - private static volatile boolean sInitialized = false; - private static final Object sInitializeLock = new Object(); - private static Resources sResources; - // Keyboard layout to its display name map. - private static final HashMap sKeyboardLayoutToDisplayNameMap = new HashMap<>(); - // Keyboard layout to subtype name resource id map. - private static final HashMap sKeyboardLayoutToNameIdsMap = new HashMap<>(); - // Exceptional locale whose name should be displayed in Locale.ROOT. - private static final HashMap sExceptionalLocaleDisplayedInRootLocale = new HashMap<>(); - // Exceptional locale to subtype name resource id map. - private static final HashMap sExceptionalLocaleToNameIdsMap = new HashMap<>(); - // Exceptional locale to subtype name with layout resource id map. - private static final HashMap sExceptionalLocaleToWithLayoutNameIdsMap = new HashMap<>(); - private static final HashMap sResourceSubtypeDisplayNames = new HashMap<>(); - private static final String SUBTYPE_NAME_RESOURCE_PREFIX = "string/subtype_"; - private static final String SUBTYPE_NAME_RESOURCE_GENERIC_PREFIX = "string/subtype_generic_"; - private static final String SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX = "string/subtype_with_layout_"; - private static final String SUBTYPE_NAME_RESOURCE_NO_LANGUAGE_PREFIX = "string/subtype_no_language_"; - private static final String SUBTYPE_NAME_RESOURCE_IN_ROOT_LOCALE_PREFIX = "string/subtype_in_root_locale_"; - - private SubtypeLocaleUtils() { - // Intentional empty constructor for utility class. - } - - // Note that this initialization method can be called multiple times. - public static void init(final Context context) { - synchronized (sInitializeLock) { - if (!sInitialized) { - initLocked(context); - sInitialized = true; - } - } - } - - private static void initLocked(final Context context) { - final String RESOURCE_PACKAGE_NAME = context.getPackageName(); - final Resources res = context.getResources(); - sResources = res; - - final String[] predefinedLayoutSet = res.getStringArray(R.array.predefined_layouts); - final String[] layoutDisplayNames = res.getStringArray(R.array.predefined_layout_display_names); - for (int i = 0; i < predefinedLayoutSet.length; i++) { - final String layoutName = predefinedLayoutSet[i]; - sKeyboardLayoutToDisplayNameMap.put(layoutName, layoutDisplayNames[i]); - final String resourceName = SUBTYPE_NAME_RESOURCE_GENERIC_PREFIX + layoutName; - final int resId = res.getIdentifier(resourceName, null, RESOURCE_PACKAGE_NAME); - sKeyboardLayoutToNameIdsMap.put(layoutName, resId); - // Register subtype name resource id of "No language" with key "zz_" - final String noLanguageResName = SUBTYPE_NAME_RESOURCE_NO_LANGUAGE_PREFIX + layoutName; - final int noLanguageResId = res.getIdentifier(noLanguageResName, null, RESOURCE_PACKAGE_NAME); - final String key = getNoLanguageLayoutKey(layoutName); - sKeyboardLayoutToNameIdsMap.put(key, noLanguageResId); - } - - final String[] exceptionalLocaleInRootLocale = res.getStringArray(R.array.subtype_locale_displayed_in_root_locale); - for (final String languageTag : exceptionalLocaleInRootLocale) { - final String resourceName = SUBTYPE_NAME_RESOURCE_IN_ROOT_LOCALE_PREFIX + languageTag.replace('-', '_'); - final int resId = res.getIdentifier(resourceName, null, RESOURCE_PACKAGE_NAME); - sExceptionalLocaleDisplayedInRootLocale.put(languageTag, resId); - } - - final String[] exceptionalLocales = res.getStringArray(R.array.subtype_locale_exception_keys); - for (final String languageTag : exceptionalLocales) { - final String resourceName = SUBTYPE_NAME_RESOURCE_PREFIX + languageTag.replace('-', '_'); - final int resId = res.getIdentifier(resourceName, null, RESOURCE_PACKAGE_NAME); - sExceptionalLocaleToNameIdsMap.put(languageTag, resId); - final String resourceNameWithLayout = SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX + languageTag.replace('-', '_'); - final int resIdWithLayout = res.getIdentifier(resourceNameWithLayout, null, RESOURCE_PACKAGE_NAME); - sExceptionalLocaleToWithLayoutNameIdsMap.put(languageTag, resIdWithLayout); - } - } - - public static boolean isExceptionalLocale(final Locale locale) { - return sExceptionalLocaleToNameIdsMap.containsKey(locale.toLanguageTag()); - } - - private static String getNoLanguageLayoutKey(final String keyboardLayoutName) { - return NO_LANGUAGE + "_" + keyboardLayoutName; - } - - public static int getSubtypeNameResId(final Locale locale, final String keyboardLayoutName) { - final String languageTag = locale.toLanguageTag(); - if (isExceptionalLocale(locale)) { - return sExceptionalLocaleToWithLayoutNameIdsMap.get(languageTag); - } - final String key = NO_LANGUAGE.equals(languageTag) - ? getNoLanguageLayoutKey(keyboardLayoutName) - : keyboardLayoutName; - final Integer nameId = sKeyboardLayoutToNameIdsMap.get(key); - return nameId == null ? UNKNOWN_KEYBOARD_LAYOUT : nameId; - } - - @NonNull - public static Locale getDisplayLocaleOfSubtypeLocale(@NonNull final Locale locale) { - final String languageTag = locale.toLanguageTag(); - if (NO_LANGUAGE.equals(languageTag)) { - return ConfigurationCompatKt.locale(sResources.getConfiguration()); - } - if (sExceptionalLocaleDisplayedInRootLocale.containsKey(languageTag)) { - return Locale.ROOT; - } - return locale; - } - - public static String getSubtypeLocaleDisplayNameInSystemLocale(@NonNull final Locale locale) { - final Locale displayLocale = ConfigurationCompatKt.locale(sResources.getConfiguration()); - return getSubtypeLocaleDisplayNameInternal(locale, displayLocale); - } - - @NonNull - public static String getSubtypeLocaleDisplayName(@NonNull final Locale locale) { - final Locale displayLocale = getDisplayLocaleOfSubtypeLocale(locale); - return getSubtypeLocaleDisplayNameInternal(locale, displayLocale); - } - - @NonNull - public static String getSubtypeLanguageDisplayName(@NonNull final Locale locale) { - final Locale displayLocale = getDisplayLocaleOfSubtypeLocale(locale); - final Locale languageLocale; - if (sExceptionalLocaleDisplayedInRootLocale.containsKey(locale.toLanguageTag())) { - languageLocale = locale; - } else { - languageLocale = LocaleUtils.constructLocale(locale.getLanguage()); - } - return getSubtypeLocaleDisplayNameInternal(languageLocale, displayLocale); - } - - @NonNull - private static String getSubtypeLocaleDisplayNameInternal(@NonNull final Locale locale, - @NonNull final Locale displayLocale) { - final String languageTag = locale.toLanguageTag(); - if (NO_LANGUAGE.equals(locale.toLanguageTag())) { - // No language subtype should be displayed in system locale. - return sResources.getString(R.string.subtype_no_language); - } - final Integer exceptionalNameResId; - if (displayLocale.equals(Locale.ROOT) - && sExceptionalLocaleDisplayedInRootLocale.containsKey(languageTag)) { - exceptionalNameResId = sExceptionalLocaleDisplayedInRootLocale.get(languageTag); - } else if (sExceptionalLocaleToNameIdsMap.containsKey(languageTag)) { - exceptionalNameResId = sExceptionalLocaleToNameIdsMap.get(languageTag); - } else { - exceptionalNameResId = null; - } - - final String displayName; - if (exceptionalNameResId != null) { - displayName = RunInLocaleKt.runInLocale(sResources, displayLocale, res -> res.getString(exceptionalNameResId)); - } else { - displayName = LocaleUtils.getLocaleDisplayNameInLocale(locale, sResources, displayLocale); - } - return StringUtils.capitalizeFirstCodePoint(displayName, displayLocale); - } - - // InputMethodSubtype's display name in its locale. - // isAdditionalSubtype (T=true, F=false) - // locale layout | display name - // ------ ------- - ---------------------- - // en_US qwerty F English (US) exception - // en_GB qwerty F English (UK) exception - // es_US spanish F Español (EE.UU.) exception - // fr azerty F Français - // fr_CA qwerty F Français (Canada) - // fr_CH swiss F Français (Suisse) - // de qwertz F Deutsch - // de_CH swiss T Deutsch (Schweiz) - // zz qwerty F Alphabet (QWERTY) in system locale - // fr qwertz T Français (QWERTZ) - // de qwerty T Deutsch (QWERTY) - // en_US azerty T English (US) (AZERTY) exception - // zz azerty T Alphabet (AZERTY) in system locale - - @NonNull - private static String getReplacementString(@NonNull final InputMethodSubtype subtype, - @NonNull final Locale displayLocale) { - if (subtype.containsExtraValueKey(UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME)) { - return subtype.getExtraValueOf(UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME); - } - return getSubtypeLocaleDisplayNameInternal(SubtypeUtilsKt.locale(subtype), displayLocale); - } - - @NonNull - public static String getDisplayNameInSystemLocale(@NonNull final String mainLayoutName, @NonNull final Locale locale) { - final String displayName = getMainLayoutDisplayName(mainLayoutName); - if (displayName != null) // works for custom and latin layouts - return displayName; - // we have some locale-specific layout - for (InputMethodSubtype subtype : SubtypeSettings.INSTANCE.getResourceSubtypesForLocale(locale)) { - final String main = LayoutType.Companion.getMainLayoutFromExtraValue(subtype.getExtraValue()); - if (mainLayoutName.equals(main)) - return getSubtypeDisplayNameInSystemLocale(subtype); - } - return mainLayoutName; // should never happen... - } - - @NonNull - public static String getSubtypeDisplayNameInSystemLocale(@NonNull final InputMethodSubtype subtype) { - final String cached = sResourceSubtypeDisplayNames.get(subtype.hashCode()); - if (cached != null) return cached; - - final Locale displayLocale = ConfigurationCompatKt.locale(sResources.getConfiguration()); - final String displayName = getSubtypeDisplayNameInternal(subtype, displayLocale); - - if (!subtype.containsExtraValueKey(Constants.Subtype.ExtraValue.IS_ADDITIONAL_SUBTYPE)) { - sResourceSubtypeDisplayNames.put(subtype.hashCode(), displayName); - } - return displayName; - } - - public static void clearDisplayNameCache() { - sResourceSubtypeDisplayNames.clear(); - } - - @NonNull - public static String getSubtypeNameForLogging(@Nullable final InputMethodSubtype subtype) { - if (subtype == null) { - return ""; - } - return SubtypeUtilsKt.locale(subtype) + "/" + getMainLayoutName(subtype); - } - - @NonNull - private static String getSubtypeDisplayNameInternal(@NonNull final InputMethodSubtype subtype, - @NonNull final Locale displayLocale) { - final String replacementString = getReplacementString(subtype, displayLocale); - final int nameResId = subtype.getNameResId(); - return RunInLocaleKt.runInLocale(sResources, displayLocale, - res -> { - try { - return StringUtils.capitalizeFirstCodePoint(res.getString(nameResId, replacementString), displayLocale); - } catch (Resources.NotFoundException e) { - Log.w(TAG, "Unknown subtype: mode=" + subtype.getMode() - + " nameResId=" + subtype.getNameResId() - + " locale=" + subtype.getLocale() - + " extra=" + subtype.getExtraValue() - + "\n" + DebugLogUtils.getStackTrace()); - return ""; - } - }); - } - - @Nullable - public static String getMainLayoutDisplayName(@NonNull final InputMethodSubtype subtype) { - final String layoutName = getMainLayoutName(subtype); - return getMainLayoutDisplayName(layoutName); - } - - @Nullable - public static String getMainLayoutDisplayName(@NonNull final String layoutName) { - if (LayoutUtilsCustom.INSTANCE.isCustomLayout(layoutName)) - return LayoutUtilsCustom.INSTANCE.getDisplayName(layoutName); - return sKeyboardLayoutToDisplayNameMap.get(layoutName); - } - - @NonNull - public static String getMainLayoutName(final InputMethodSubtype subtype) { - String mainLayoutName = SubtypeUtilsKt.mainLayoutName(subtype); - if (mainLayoutName == null && subtype.isAsciiCapable()) { - mainLayoutName = QWERTY; - } - if (mainLayoutName == null) { // we could search for a subtype with the correct script, but this is a bug anyway... - Log.w(TAG, "KeyboardLayoutSet not found, use QWERTY: " + - "locale=" + subtype.getLocale() + " extraValue=" + subtype.getExtraValue()); - return QWERTY; - } - return mainLayoutName; - } - - public static String getCombiningRulesExtraValue(final InputMethodSubtype subtype) { - return subtype.getExtraValueOf(COMBINING_RULES); - } -} diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt new file mode 100644 index 000000000..8c19650d6 --- /dev/null +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt @@ -0,0 +1,264 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * modified + * SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only + */ +package helium314.keyboard.latin.utils + +import android.content.Context +import android.content.res.Resources +import android.view.inputmethod.InputMethodSubtype +import helium314.keyboard.compat.locale +import helium314.keyboard.latin.R +import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue +import helium314.keyboard.latin.common.LocaleUtils.constructLocale +import helium314.keyboard.latin.common.LocaleUtils.getLocaleDisplayNameInLocale +import helium314.keyboard.latin.common.StringUtils +import helium314.keyboard.latin.utils.LayoutType.Companion.getMainLayoutFromExtraValue +import helium314.keyboard.latin.utils.LayoutUtilsCustom.getDisplayName +import helium314.keyboard.latin.utils.LayoutUtilsCustom.isCustomLayout +import helium314.keyboard.latin.utils.SubtypeSettings.getResourceSubtypesForLocale +import java.util.Locale +import kotlin.concurrent.Volatile + +/** + * A helper class to deal with subtype locales. + */ +object SubtypeLocaleUtils { + @Volatile + private var initialized = false + private lateinit var resources: Resources + + // Keyboard layout to its display name map. + private val keyboardLayoutToDisplayName = HashMap() + + // Keyboard layout to subtype name resource id map. + private val keyboardLayoutToNameIds = HashMap() + + // Exceptional locale whose name should be displayed in Locale.ROOT. + private val exceptionalLocaleDisplayedInRootLocale = HashMap() + + // Exceptional locale to subtype name resource id map. + private val exceptionalLocaleToNameIds = HashMap() + + // Exceptional locale to subtype name with layout resource id map. + private val exceptionalLocaleToWithLayoutNameIds = HashMap() + private val resourceSubtypeDisplayNames = HashMap() + + // Note that this initialization method can be called multiple times. + @JvmStatic + fun init(context: Context) { + synchronized(this) { + if (!initialized) { + initLocked(context) + initialized = true + } + } + } + + private fun initLocked(context: Context) { + val packageName = context.packageName + resources = context.resources + + // todo: layout names are currently translatable in subtype_no_language_* but not the default names + // just remove the separate "alphabet ()" strings and have a single "alphabet (%s)"? + // or rather use the same style as for languages and only have "alphabet" + val predefinedLayouts = resources.getStringArray(R.array.predefined_layouts) + val layoutDisplayNames = resources.getStringArray(R.array.predefined_layout_display_names) + for (i in predefinedLayouts.indices) { + val layoutName = predefinedLayouts[i] + keyboardLayoutToDisplayName[layoutName] = layoutDisplayNames[i] + val resourceName = SUBTYPE_NAME_RESOURCE_GENERIC_PREFIX + layoutName + val resId = resources.getIdentifier(resourceName, null, packageName) + keyboardLayoutToNameIds[layoutName] = resId + // Register subtype name resource id of "No language" with key "zz_" + val noLanguageResName = SUBTYPE_NAME_RESOURCE_NO_LANGUAGE_PREFIX + layoutName + val noLanguageResId = resources.getIdentifier(noLanguageResName, null, packageName) + val key = getNoLanguageLayoutKey(layoutName) + keyboardLayoutToNameIds[key] = noLanguageResId + } + + // todo: do it using 2 arrays like predefined_layouts (and adjust information in layouts.md) + val exceptionalLocaleInRootLocale = resources.getStringArray(R.array.subtype_locale_displayed_in_root_locale) + for (languageTag in exceptionalLocaleInRootLocale) { + val resourceName = SUBTYPE_NAME_RESOURCE_IN_ROOT_LOCALE_PREFIX + languageTag.replace('-', '_') + val resId = resources.getIdentifier(resourceName, null, packageName) + exceptionalLocaleDisplayedInRootLocale[languageTag] = resId + } + + // todo: do it using 2 arrays like predefined_layouts (and adjust information in layouts.md) + // and the _with_layout variants can be removed? + val exceptionalLocales = resources.getStringArray(R.array.subtype_locale_exception_keys) + for (languageTag in exceptionalLocales) { + val resourceName = SUBTYPE_NAME_RESOURCE_PREFIX + languageTag.replace('-', '_') + val resId = resources.getIdentifier(resourceName, null, packageName) + exceptionalLocaleToNameIds[languageTag] = resId + val resourceNameWithLayout = SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX + languageTag.replace('-', '_') + val resIdWithLayout = resources.getIdentifier(resourceNameWithLayout, null, packageName) + exceptionalLocaleToWithLayoutNameIds[languageTag] = resIdWithLayout + } + } + + fun isExceptionalLocale(locale: Locale): Boolean { + return exceptionalLocaleToNameIds.containsKey(locale.toLanguageTag()) + } + + private fun getNoLanguageLayoutKey(keyboardLayoutName: String): String { + return NO_LANGUAGE + "_" + keyboardLayoutName + } + + fun getSubtypeNameResId(locale: Locale, keyboardLayoutName: String): Int { + val languageTag = locale.toLanguageTag() + if (isExceptionalLocale(locale)) { + return exceptionalLocaleToWithLayoutNameIds[languageTag]!! + } + val key = if (languageTag == NO_LANGUAGE) getNoLanguageLayoutKey(keyboardLayoutName) + else keyboardLayoutName + return keyboardLayoutToNameIds[key] ?: UNKNOWN_KEYBOARD_LAYOUT + } + + private fun getDisplayLocaleOfSubtypeLocale(locale: Locale): Locale { + val languageTag = locale.toLanguageTag() + if (languageTag == NO_LANGUAGE) + return resources.configuration.locale() + if (exceptionalLocaleDisplayedInRootLocale.containsKey(languageTag)) + return Locale.ROOT + return locale + } + + fun getSubtypeLocaleDisplayNameInSystemLocale(locale: Locale): String { + val displayLocale = resources.configuration.locale() + return getSubtypeLocaleDisplayNameInternal(locale, displayLocale) + } + + fun getSubtypeLocaleDisplayName(locale: Locale): String { + val displayLocale = getDisplayLocaleOfSubtypeLocale(locale) + return getSubtypeLocaleDisplayNameInternal(locale, displayLocale) + } + + fun getSubtypeLanguageDisplayName(locale: Locale): String { + val languageLocale = if (exceptionalLocaleDisplayedInRootLocale.containsKey(locale.toLanguageTag())) + locale + else + locale.language.constructLocale() + return getSubtypeLocaleDisplayNameInternal(languageLocale, getDisplayLocaleOfSubtypeLocale(locale)) + } + + private fun getSubtypeLocaleDisplayNameInternal(locale: Locale, displayLocale: Locale): String { + val languageTag = locale.toLanguageTag() + if (languageTag == NO_LANGUAGE) { + // "No language" subtype should be displayed in system locale. + return resources.getString(R.string.subtype_no_language) + } + val exceptionalNameResId = if (displayLocale == Locale.ROOT + && exceptionalLocaleDisplayedInRootLocale.containsKey(languageTag) + ) + exceptionalLocaleDisplayedInRootLocale[languageTag] + else + exceptionalLocaleToNameIds[languageTag] + val displayName = if (exceptionalNameResId != null) { + runInLocale(resources, displayLocale) { res: Resources -> res.getString(exceptionalNameResId) } + } else { + getLocaleDisplayNameInLocale(locale, resources, displayLocale) + } + return StringUtils.capitalizeFirstCodePoint(displayName, displayLocale) + } + + // InputMethodSubtype's display name in its locale. + // isAdditionalSubtype (T=true, F=false) + // locale layout | display name + // ------ ------- - ---------------------- + // en_US qwerty F English (US) exception + // en_GB qwerty F English (UK) exception + // es_US spanish F Español (EE.UU.) exception + // fr azerty F Français + // fr_CA qwerty F Français (Canada) + // fr_CH swiss F Français (Suisse) + // de qwertz F Deutsch + // de_CH swiss T Deutsch (Schweiz) + // zz qwerty F Alphabet (QWERTY) in system locale + // fr qwertz T Français (QWERTZ) + // de qwerty T Deutsch (QWERTY) + // en_US azerty T English (US) (AZERTY) exception + // zz azerty T Alphabet (AZERTY) in system locale + private fun getReplacementString(subtype: InputMethodSubtype, displayLocale: Locale): String = + subtype.getExtraValueOf(ExtraValue.UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME) + ?: getSubtypeLocaleDisplayNameInternal(subtype.locale(), displayLocale) + + fun getDisplayNameInSystemLocale(mainLayoutName: String, locale: Locale): String { + getMainLayoutDisplayName(mainLayoutName)?.let { return it } // works for custom and latin layouts + + // we have some locale-specific layout + for (subtype in getResourceSubtypesForLocale(locale)) { + if (mainLayoutName == getMainLayoutFromExtraValue(subtype.extraValue)) + return getSubtypeDisplayNameInSystemLocale(subtype) + } + return mainLayoutName // should never happen... + } + + fun getSubtypeDisplayNameInSystemLocale(subtype: InputMethodSubtype): String { + resourceSubtypeDisplayNames[subtype.hashCode()]?.let { return it } + + val displayName = getSubtypeDisplayNameInternal(subtype, resources.configuration.locale()) + if (!subtype.containsExtraValueKey(ExtraValue.IS_ADDITIONAL_SUBTYPE)) { + resourceSubtypeDisplayNames[subtype.hashCode()] = displayName + } + return displayName + } + + @JvmStatic + fun clearDisplayNameCache() { + resourceSubtypeDisplayNames.clear() + } + + @JvmStatic + fun getSubtypeNameForLogging(subtype: InputMethodSubtype?): String { + if (subtype == null) { + return "" + } + return subtype.locale().toString() + "/" + getMainLayoutName(subtype) + } + + private fun getSubtypeDisplayNameInternal(subtype: InputMethodSubtype, displayLocale: Locale): String { + val replacementString = getReplacementString(subtype, displayLocale) + return runInLocale(resources, displayLocale) { res: Resources -> + try { + StringUtils.capitalizeFirstCodePoint(res.getString(subtype.nameResId, replacementString), displayLocale) + } catch (e: Resources.NotFoundException) { + Log.w(TAG, ("Unknown subtype: mode=${subtype.mode} nameResId=${subtype.nameResId} locale=${subtype.locale()} extra=${subtype.extraValue}\n${DebugLogUtils.getStackTrace()}")) + "" + } + } + } + + fun getMainLayoutDisplayName(subtype: InputMethodSubtype): String? = + getMainLayoutDisplayName(getMainLayoutName(subtype)) + + fun getMainLayoutDisplayName(layoutName: String): String? = + if (isCustomLayout(layoutName)) getDisplayName(layoutName) + else keyboardLayoutToDisplayName[layoutName] + + @JvmStatic + fun getMainLayoutName(subtype: InputMethodSubtype): String { + subtype.mainLayoutName()?.let { return it } + if (!subtype.isAsciiCapable) + Log.w(TAG, "KeyboardLayoutSet not found, use QWERTY: locale=${subtype.locale()} extraValue=${subtype.extraValue}") + return QWERTY + } + + @JvmStatic + fun getCombiningRulesExtraValue(subtype: InputMethodSubtype): String = subtype.getExtraValueOf(ExtraValue.COMBINING_RULES) + + // Special language code to represent "no language". + const val NO_LANGUAGE = "zz" + const val QWERTY = "qwerty" + const val EMOJI = "emoji" + val UNKNOWN_KEYBOARD_LAYOUT = R.string.subtype_generic + + private val TAG = SubtypeLocaleUtils::class.java.simpleName + private const val SUBTYPE_NAME_RESOURCE_PREFIX = "string/subtype_" + private const val SUBTYPE_NAME_RESOURCE_GENERIC_PREFIX = "string/subtype_generic_" + private const val SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX = "string/subtype_with_layout_" + private const val SUBTYPE_NAME_RESOURCE_NO_LANGUAGE_PREFIX = "string/subtype_no_language_" + private const val SUBTYPE_NAME_RESOURCE_IN_ROOT_LOCALE_PREFIX = "string/subtype_in_root_locale_" +} From 9dbce40fd72d11aa2bbd8f904d9fdfa6ea7ffee7 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 24 May 2025 09:14:35 +0200 Subject: [PATCH 150/175] remove essentially duplicate functions --- .../main/java/helium314/keyboard/latin/App.kt | 7 ++++--- .../keyboard/latin/RichInputMethodManager.java | 5 ++--- .../keyboard/latin/RichInputMethodSubtype.kt | 5 +++-- .../latin/utils/LanguageOnSpacebarUtils.java | 6 +----- .../keyboard/latin/utils/LayoutUtils.kt | 2 +- .../keyboard/latin/utils/SubtypeLocaleUtils.kt | 18 +++--------------- .../keyboard/latin/utils/SubtypeSettings.kt | 2 +- .../keyboard/latin/utils/SubtypeUtils.kt | 4 +++- 8 files changed, 18 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/App.kt b/app/src/main/java/helium314/keyboard/latin/App.kt index 631929dbf..47ee42fea 100644 --- a/app/src/main/java/helium314/keyboard/latin/App.kt +++ b/app/src/main/java/helium314/keyboard/latin/App.kt @@ -34,6 +34,7 @@ import helium314.keyboard.latin.utils.defaultPinnedToolbarPref import helium314.keyboard.latin.utils.getResourceSubtypes import helium314.keyboard.latin.utils.locale import helium314.keyboard.latin.utils.mainLayoutName +import helium314.keyboard.latin.utils.mainLayoutNameOrQwerty import helium314.keyboard.latin.utils.prefs import helium314.keyboard.latin.utils.upgradeToolbarPrefs import helium314.keyboard.latin.utils.writeCustomKeyCodes @@ -445,19 +446,19 @@ fun checkVersionUpgrade(context: Context) { val mainLayoutName = oldSplit[1] // we now need more information than just locale and main layout name, get it from existing subtypes val filtered = additionalSubtypes.filter { - it.locale().toLanguageTag() == languageTag && (it.mainLayoutName() ?: "qwerty") == mainLayoutName + it.locale().toLanguageTag() == languageTag && (it.mainLayoutNameOrQwerty()) == mainLayoutName } if (filtered.isNotEmpty()) return@joinToString filtered.first().toSettingsSubtype().toPref() // find best matching resource subtype val goodMatch = resourceSubtypes.filter { - it.locale().toLanguageTag() == languageTag && (it.mainLayoutName() ?: "qwerty") == mainLayoutName + it.locale().toLanguageTag() == languageTag && (it.mainLayoutNameOrQwerty()) == mainLayoutName } if (goodMatch.isNotEmpty()) return@joinToString goodMatch.first().toSettingsSubtype().toPref() // not sure how we can get here, but better deal with it val okMatch = resourceSubtypes.filter { - it.locale().language == languageTag.constructLocale().language && (it.mainLayoutName() ?: "qwerty") == mainLayoutName + it.locale().language == languageTag.constructLocale().language && (it.mainLayoutNameOrQwerty()) == mainLayoutName } if (okMatch.isNotEmpty()) okMatch.first().toSettingsSubtype().toPref() diff --git a/app/src/main/java/helium314/keyboard/latin/RichInputMethodManager.java b/app/src/main/java/helium314/keyboard/latin/RichInputMethodManager.java index 92ac1c73f..55888a1e7 100644 --- a/app/src/main/java/helium314/keyboard/latin/RichInputMethodManager.java +++ b/app/src/main/java/helium314/keyboard/latin/RichInputMethodManager.java @@ -305,9 +305,8 @@ public class RichInputMethodManager { final int count = myImi.getSubtypeCount(); for (int i = 0; i < count; i++) { final InputMethodSubtype subtype = myImi.getSubtypeAt(i); - final String layoutName = SubtypeLocaleUtils.getMainLayoutName(subtype); - if (locale.equals(SubtypeUtilsKt.locale(subtype)) - && keyboardLayoutSetName.equals(layoutName)) { + final String layoutName = SubtypeUtilsKt.mainLayoutNameOrQwerty(subtype); + if (locale.equals(SubtypeUtilsKt.locale(subtype)) && keyboardLayoutSetName.equals(layoutName)) { return subtype; } } diff --git a/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt b/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt index ce68511b5..c26f79df8 100644 --- a/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt +++ b/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt @@ -17,6 +17,7 @@ import helium314.keyboard.latin.utils.ScriptUtils import helium314.keyboard.latin.utils.ScriptUtils.script import helium314.keyboard.latin.utils.SubtypeLocaleUtils import helium314.keyboard.latin.utils.locale +import helium314.keyboard.latin.utils.mainLayoutNameOrQwerty import java.util.Locale /** @@ -43,7 +44,7 @@ class RichInputMethodSubtype private constructor(val rawSubtype: InputMethodSubt val fullDisplayName: String get() { if (isNoLanguage) { - return SubtypeLocaleUtils.getMainLayoutDisplayName(rawSubtype)!! + return SubtypeLocaleUtils.getMainLayoutDisplayName(rawSubtype.mainLayoutNameOrQwerty())!! } return SubtypeLocaleUtils.getSubtypeLocaleDisplayName(locale) } @@ -52,7 +53,7 @@ class RichInputMethodSubtype private constructor(val rawSubtype: InputMethodSubt // Get the RichInputMethodSubtype's middle display name in its locale. get() { if (isNoLanguage) { - return SubtypeLocaleUtils.getMainLayoutDisplayName(rawSubtype)!! + return SubtypeLocaleUtils.getMainLayoutDisplayName(rawSubtype.mainLayoutNameOrQwerty())!! } return SubtypeLocaleUtils.getSubtypeLanguageDisplayName(locale) } diff --git a/app/src/main/java/helium314/keyboard/latin/utils/LanguageOnSpacebarUtils.java b/app/src/main/java/helium314/keyboard/latin/utils/LanguageOnSpacebarUtils.java index f942157ca..f7c400da2 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/LanguageOnSpacebarUtils.java +++ b/app/src/main/java/helium314/keyboard/latin/utils/LanguageOnSpacebarUtils.java @@ -43,16 +43,12 @@ public final class LanguageOnSpacebarUtils { return FORMAT_TYPE_NONE; } final Locale locale = subtype.getLocale(); - if (locale == null) { - return FORMAT_TYPE_NONE; - } final String keyboardLanguage = locale.getLanguage(); final String keyboardLayout = subtype.getMainLayoutName(); int sameLanguageAndLayoutCount = 0; for (final InputMethodSubtype ims : sEnabledSubtypes) { final String language = SubtypeUtilsKt.locale(ims).getLanguage(); - if (keyboardLanguage.equals(language) && keyboardLayout.equals( - SubtypeLocaleUtils.getMainLayoutName(ims))) { + if (keyboardLanguage.equals(language) && keyboardLayout.equals(SubtypeUtilsKt.mainLayoutNameOrQwerty(ims))) { sameLanguageAndLayoutCount++; } } diff --git a/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtils.kt index 68a99be99..13bcb24c0 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/LayoutUtils.kt @@ -17,7 +17,7 @@ object LayoutUtils { return context.assets.list(layoutType.folder)?.map { it.substringBefore(".") }.orEmpty() if (locale == null) return SubtypeSettings.getAllAvailableSubtypes() - .mapTo(HashSet()) { it.mainLayoutName()?.substringBefore("+") ?: "qwerty" } + .mapTo(HashSet()) { it.mainLayoutNameOrQwerty().substringBefore("+") } .apply { addAll(context.resources.getStringArray(R.array.predefined_layouts)) } val layouts = SubtypeSettings.getResourceSubtypesForLocale(locale).mapNotNullTo(mutableSetOf()) { it.mainLayoutName() } if (locale.script() == ScriptUtils.SCRIPT_LATIN) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt index 8c19650d6..f2da7d7c7 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt @@ -17,7 +17,6 @@ import helium314.keyboard.latin.common.StringUtils import helium314.keyboard.latin.utils.LayoutType.Companion.getMainLayoutFromExtraValue import helium314.keyboard.latin.utils.LayoutUtilsCustom.getDisplayName import helium314.keyboard.latin.utils.LayoutUtilsCustom.isCustomLayout -import helium314.keyboard.latin.utils.SubtypeSettings.getResourceSubtypesForLocale import java.util.Locale import kotlin.concurrent.Volatile @@ -189,7 +188,7 @@ object SubtypeLocaleUtils { getMainLayoutDisplayName(mainLayoutName)?.let { return it } // works for custom and latin layouts // we have some locale-specific layout - for (subtype in getResourceSubtypesForLocale(locale)) { + for (subtype in SubtypeSettings.getResourceSubtypesForLocale(locale)) { if (mainLayoutName == getMainLayoutFromExtraValue(subtype.extraValue)) return getSubtypeDisplayNameInSystemLocale(subtype) } @@ -216,7 +215,7 @@ object SubtypeLocaleUtils { if (subtype == null) { return "" } - return subtype.locale().toString() + "/" + getMainLayoutName(subtype) + return subtype.locale().toString() + "/" + subtype.mainLayoutNameOrQwerty() } private fun getSubtypeDisplayNameInternal(subtype: InputMethodSubtype, displayLocale: Locale): String { @@ -231,23 +230,12 @@ object SubtypeLocaleUtils { } } - fun getMainLayoutDisplayName(subtype: InputMethodSubtype): String? = - getMainLayoutDisplayName(getMainLayoutName(subtype)) - fun getMainLayoutDisplayName(layoutName: String): String? = if (isCustomLayout(layoutName)) getDisplayName(layoutName) else keyboardLayoutToDisplayName[layoutName] @JvmStatic - fun getMainLayoutName(subtype: InputMethodSubtype): String { - subtype.mainLayoutName()?.let { return it } - if (!subtype.isAsciiCapable) - Log.w(TAG, "KeyboardLayoutSet not found, use QWERTY: locale=${subtype.locale()} extraValue=${subtype.extraValue}") - return QWERTY - } - - @JvmStatic - fun getCombiningRulesExtraValue(subtype: InputMethodSubtype): String = subtype.getExtraValueOf(ExtraValue.COMBINING_RULES) + fun getCombiningRulesExtraValue(subtype: InputMethodSubtype): String? = subtype.getExtraValueOf(ExtraValue.COMBINING_RULES) // Special language code to represent "no language". const val NO_LANGUAGE = "zz" diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt index 86486adb9..69db1b4a4 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeSettings.kt @@ -241,7 +241,7 @@ object SubtypeSettings { continue } - val subtype = subtypesForLocale.firstOrNull { SubtypeLocaleUtils.getMainLayoutName(it) == (settingsSubtype.mainLayoutName() ?: SubtypeLocaleUtils.QWERTY) } + val subtype = subtypesForLocale.firstOrNull { it.mainLayoutNameOrQwerty() == (settingsSubtype.mainLayoutName() ?: SubtypeLocaleUtils.QWERTY) } if (subtype == null) { val message = "subtype $settingsSubtype could not be loaded" Log.w(TAG, message) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtils.kt index a210174ac..7351e5453 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtils.kt @@ -30,6 +30,8 @@ fun InputMethodSubtype.mainLayoutName(): String? { return map[LayoutType.MAIN] } +fun InputMethodSubtype.mainLayoutNameOrQwerty(): String = mainLayoutName() ?: SubtypeLocaleUtils.QWERTY + fun getResourceSubtypes(resources: Resources): List { val subtypes = mutableListOf() val xml = resources.getXml(R.xml.method) @@ -67,7 +69,7 @@ fun getResourceSubtypes(resources: Resources): List { /** Workaround for SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale ignoring custom layout names */ // todo (later): this should be done properly and in SubtypeLocaleUtils fun InputMethodSubtype.displayName(context: Context): String { - val layoutName = SubtypeLocaleUtils.getMainLayoutName(this) + val layoutName = mainLayoutNameOrQwerty() if (LayoutUtilsCustom.isCustomLayout(layoutName)) return "${locale().localizedDisplayName(context)} (${LayoutUtilsCustom.getDisplayName(layoutName)})" return SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(this) From d1120807d3dbcee6304120a6fc76948d99564b60 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 24 May 2025 09:29:11 +0200 Subject: [PATCH 151/175] move InputMethodSubtype.displayName to SubtypeLocaleUtils --- .../keyboard/keyboard/MainKeyboardView.java | 1 + .../keyboard/latin/utils/InputMethodPicker.kt | 1 + .../keyboard/latin/utils/SubtypeLocaleUtils.kt | 12 +++++++++--- .../helium314/keyboard/latin/utils/SubtypeUtils.kt | 11 ----------- .../keyboard/settings/screens/LanguageScreen.kt | 2 +- .../keyboard/settings/screens/MainSettingsScreen.kt | 2 +- .../keyboard/settings/screens/SubtypeScreen.kt | 2 +- 7 files changed, 14 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/MainKeyboardView.java b/app/src/main/java/helium314/keyboard/keyboard/MainKeyboardView.java index d84998e8b..3a3fa3e16 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/MainKeyboardView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/MainKeyboardView.java @@ -57,6 +57,7 @@ import helium314.keyboard.latin.settings.Settings; import helium314.keyboard.latin.utils.KtxKt; import helium314.keyboard.latin.utils.LanguageOnSpacebarUtils; import helium314.keyboard.latin.utils.Log; +import helium314.keyboard.latin.utils.SubtypeLocaleUtils; import helium314.keyboard.latin.utils.TypefaceUtils; import java.util.ArrayList; diff --git a/app/src/main/java/helium314/keyboard/latin/utils/InputMethodPicker.kt b/app/src/main/java/helium314/keyboard/latin/utils/InputMethodPicker.kt index 3f534842f..4793cc76a 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/InputMethodPicker.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/InputMethodPicker.kt @@ -14,6 +14,7 @@ import android.view.inputmethod.InputMethodSubtype import helium314.keyboard.latin.LatinIME import helium314.keyboard.latin.R import helium314.keyboard.latin.RichInputMethodManager +import helium314.keyboard.latin.utils.SubtypeLocaleUtils.displayName // similar to what showSubtypePicker does in https://github.com/rkkr/simple-keyboard/blob/master/app/src/main/java/rkr/simplekeyboard/inputmethod/latin/RichInputMethodManager.java fun createInputMethodPickerDialog(latinIme: LatinIME, richImm: RichInputMethodManager, windowToken: IBinder): AlertDialog { diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt index f2da7d7c7..3d579851b 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt @@ -13,10 +13,9 @@ import helium314.keyboard.latin.R import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue import helium314.keyboard.latin.common.LocaleUtils.constructLocale import helium314.keyboard.latin.common.LocaleUtils.getLocaleDisplayNameInLocale +import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName import helium314.keyboard.latin.common.StringUtils import helium314.keyboard.latin.utils.LayoutType.Companion.getMainLayoutFromExtraValue -import helium314.keyboard.latin.utils.LayoutUtilsCustom.getDisplayName -import helium314.keyboard.latin.utils.LayoutUtilsCustom.isCustomLayout import java.util.Locale import kotlin.concurrent.Volatile @@ -231,9 +230,16 @@ object SubtypeLocaleUtils { } fun getMainLayoutDisplayName(layoutName: String): String? = - if (isCustomLayout(layoutName)) getDisplayName(layoutName) + if (LayoutUtilsCustom.isCustomLayout(layoutName)) LayoutUtilsCustom.getDisplayName(layoutName) else keyboardLayoutToDisplayName[layoutName] + fun InputMethodSubtype.displayName(context: Context): String { + val layoutName = mainLayoutNameOrQwerty() + if (LayoutUtilsCustom.isCustomLayout(layoutName)) + return "${locale().localizedDisplayName(context)} (${LayoutUtilsCustom.getDisplayName(layoutName)})" + return getSubtypeDisplayNameInSystemLocale(this) + } + @JvmStatic fun getCombiningRulesExtraValue(subtype: InputMethodSubtype): String? = subtype.getExtraValueOf(ExtraValue.COMBINING_RULES) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtils.kt index 7351e5453..1b69075c3 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtils.kt @@ -1,6 +1,5 @@ package helium314.keyboard.latin.utils -import android.content.Context import android.content.SharedPreferences import android.content.res.Resources import android.os.Build @@ -10,7 +9,6 @@ import helium314.keyboard.latin.common.Constants.Separators import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue.KEYBOARD_LAYOUT_SET import helium314.keyboard.latin.common.LocaleUtils.constructLocale -import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName import helium314.keyboard.latin.settings.Defaults import helium314.keyboard.latin.settings.Settings import helium314.keyboard.latin.settings.SettingsSubtype.Companion.getExtraValueOf @@ -66,15 +64,6 @@ fun getResourceSubtypes(resources: Resources): List { return subtypes } -/** Workaround for SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale ignoring custom layout names */ -// todo (later): this should be done properly and in SubtypeLocaleUtils -fun InputMethodSubtype.displayName(context: Context): String { - val layoutName = mainLayoutNameOrQwerty() - if (LayoutUtilsCustom.isCustomLayout(layoutName)) - return "${locale().localizedDisplayName(context)} (${LayoutUtilsCustom.getDisplayName(layoutName)})" - return SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(this) -} - fun getHasLocalizedNumberRow(subtype: InputMethodSubtype, prefs: SharedPreferences): Boolean = subtype.getExtraValueOf(ExtraValue.LOCALIZED_NUMBER_ROW)?.toBoolean() ?: prefs.getBoolean(Settings.PREF_LOCALIZED_NUMBER_ROW, Defaults.PREF_LOCALIZED_NUMBER_ROW) diff --git a/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt index b68bbb26a..1d87ca856 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt @@ -37,8 +37,8 @@ import helium314.keyboard.latin.utils.DictionaryInfoUtils import helium314.keyboard.latin.utils.Log import helium314.keyboard.latin.utils.MissingDictionaryDialog import helium314.keyboard.latin.utils.SubtypeLocaleUtils +import helium314.keyboard.latin.utils.SubtypeLocaleUtils.displayName import helium314.keyboard.latin.utils.SubtypeSettings -import helium314.keyboard.latin.utils.displayName import helium314.keyboard.latin.utils.getActivity import helium314.keyboard.latin.utils.locale import helium314.keyboard.latin.utils.prefs diff --git a/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt index 67d3a977c..5ab1143ae 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt @@ -18,8 +18,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import helium314.keyboard.latin.R import helium314.keyboard.latin.utils.JniUtils +import helium314.keyboard.latin.utils.SubtypeLocaleUtils.displayName import helium314.keyboard.latin.utils.SubtypeSettings -import helium314.keyboard.latin.utils.displayName import helium314.keyboard.settings.NextScreenIcon import helium314.keyboard.settings.SearchSettingsScreen import helium314.keyboard.settings.Theme diff --git a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt index d1de9c8be..a1d01470a 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt @@ -63,10 +63,10 @@ import helium314.keyboard.latin.utils.Log import helium314.keyboard.latin.utils.ScriptUtils import helium314.keyboard.latin.utils.ScriptUtils.script import helium314.keyboard.latin.utils.SubtypeLocaleUtils +import helium314.keyboard.latin.utils.SubtypeLocaleUtils.displayName import helium314.keyboard.latin.utils.SubtypeSettings import helium314.keyboard.latin.utils.SubtypeUtilsAdditional import helium314.keyboard.latin.utils.appendLink -import helium314.keyboard.latin.utils.displayName import helium314.keyboard.latin.utils.getActivity import helium314.keyboard.latin.utils.getDictionaryLocales import helium314.keyboard.latin.utils.getSecondaryLocales From 69540b8d9f0a3db0b8a1abc058f61a7c1d010760 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 24 May 2025 11:35:58 +0200 Subject: [PATCH 152/175] improve localizedDisplayName don't use resoruces.getIdentifier use override names e.g. for English (UK) for consistent layout names merge with getLocaleDisplayNameInLocale --- .../latin/RichInputMethodManager.java | 3 -- .../keyboard/latin/common/LocaleUtils.kt | 46 ++++++++++--------- .../keyboard/latin/utils/InputMethodPicker.kt | 4 +- .../latin/utils/SubtypeLocaleUtils.kt | 7 ++- .../settings/dialogs/DictionaryDialog.kt | 5 +- .../settings/dialogs/NewDictionaryDialog.kt | 2 +- .../settings/screens/DictionaryScreen.kt | 6 +-- .../settings/screens/LanguageScreen.kt | 8 ++-- .../settings/screens/MainSettingsScreen.kt | 3 +- .../screens/PersonalDictionaryScreen.kt | 2 +- .../settings/screens/SubtypeScreen.kt | 6 +-- 11 files changed, 45 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/RichInputMethodManager.java b/app/src/main/java/helium314/keyboard/latin/RichInputMethodManager.java index 55888a1e7..d5e19d334 100644 --- a/app/src/main/java/helium314/keyboard/latin/RichInputMethodManager.java +++ b/app/src/main/java/helium314/keyboard/latin/RichInputMethodManager.java @@ -92,9 +92,6 @@ public class RichInputMethodManager { mContext = context; mInputMethodInfoCache = new InputMethodInfoCache(mImm, context.getPackageName()); - // Initialize subtype utils. - SubtypeLocaleUtils.init(context); - // Initialize the current input method subtype and the shortcut IME. refreshSubtypeCaches(); } diff --git a/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt b/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt index b007dd48c..7469e0cb8 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt @@ -8,10 +8,10 @@ package helium314.keyboard.latin.common import android.content.Context import android.content.res.Resources import helium314.keyboard.compat.locale -import helium314.keyboard.latin.BuildConfig import helium314.keyboard.latin.R import helium314.keyboard.latin.utils.ScriptUtils.script import helium314.keyboard.latin.utils.SubtypeLocaleUtils +import helium314.keyboard.latin.utils.runInLocale import java.util.Locale /** @@ -171,32 +171,34 @@ object LocaleUtils { } } - fun Locale.localizedDisplayName(context: Context) = - getLocaleDisplayNameInLocale(this, context.resources, context.resources.configuration.locale()) + fun Locale.localizedDisplayName(resources: Resources, displayLocale: Locale? = null): String { + val languageTag = toLanguageTag() + if (languageTag == SubtypeLocaleUtils.NO_LANGUAGE) + return resources.getString(R.string.subtype_no_language) // todo: remove the (Alphabet) - @JvmStatic - fun getLocaleDisplayNameInLocale(locale: Locale, resources: Resources, displayLocale: Locale): String { - val languageTag = locale.toLanguageTag() - if (languageTag == SubtypeLocaleUtils.NO_LANGUAGE) return resources.getString(R.string.subtype_no_language) - if (hasNonDefaultScript(locale) || doesNotHaveAndroidName(locale.language)) { - // supply our own name for the language instead of using name provided by the system - val resId = resources.getIdentifier( - "subtype_${languageTag.replace("-", "_")}", - "string", - BuildConfig.APPLICATION_ID // replaces context.packageName, see https://stackoverflow.com/a/24525379 - ) - if (resId != 0) return resources.getString(resId) + val overrideResId = when (languageTag) { + "en-US" -> R.string.subtype_en_US + "en-GB" -> R.string.subtype_en_GB + "es-US" -> R.string.subtype_es_US + "hi-Latn" -> R.string.subtype_hi_Latn + "sr-Latn" -> R.string.subtype_sr_Latn + "mns" -> R.string.subtype_mns + "xdq" -> R.string.subtype_xdq + "dru" -> R.string.subtype_xdq + "st" -> R.string.subtype_st + "dag" -> R.string.subtype_dag + else -> 0 } - val localeDisplayName = locale.getDisplayName(displayLocale) + if (overrideResId != 0) { + return if (displayLocale == null) resources.getString(overrideResId) + else runInLocale(resources, displayLocale) { it.getString(overrideResId) } + } + + val localeDisplayName = getDisplayName(displayLocale ?: resources.configuration.locale()) return if (localeDisplayName == languageTag) { - locale.getDisplayName(Locale.US) // try fallback to English name, relevant e.g. fpr pms, see https://github.com/Helium314/HeliBoard/pull/748 + getDisplayName(Locale.US) // try fallback to English name, relevant e.g. fpr pms, see https://github.com/Helium314/HeliBoard/pull/748 } else { localeDisplayName } } - - private fun hasNonDefaultScript(locale: Locale) = locale.script() != locale.language.constructLocale().script() - - private fun doesNotHaveAndroidName(language: String) = - language == "mns" || language == "xdq" || language=="dru" || language == "st" || language == "dag" } diff --git a/app/src/main/java/helium314/keyboard/latin/utils/InputMethodPicker.kt b/app/src/main/java/helium314/keyboard/latin/utils/InputMethodPicker.kt index 4793cc76a..9879af717 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/InputMethodPicker.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/InputMethodPicker.kt @@ -27,7 +27,7 @@ fun createInputMethodPickerDialog(latinIme: LatinIME, richImm: RichInputMethodMa var currentSubtypeIndex = 0 enabledImis.forEach { imi -> val subtypes = if (imi != thisImi) richImm.getEnabledInputMethodSubtypeList(imi, true) - else richImm.getEnabledInputMethodSubtypeList(imi, true).sortedBy { it.displayName(latinIme).toString() } + else richImm.getEnabledInputMethodSubtypeList(imi, true).sortedBy { it.displayName() } if (subtypes.isEmpty()) { enabledSubtypes.add(imi to null) } else { @@ -45,7 +45,7 @@ fun createInputMethodPickerDialog(latinIme: LatinIME, richImm: RichInputMethodMa for (imiAndSubtype in enabledSubtypes) { val (imi, subtype) = imiAndSubtype - val subtypeName = if (imi == thisImi) subtype?.displayName(latinIme) + val subtypeName = if (imi == thisImi) subtype?.displayName() else subtype?.getDisplayName(latinIme, imi.packageName, imi.serviceInfo.applicationInfo) val title = SpannableString(subtypeName?.ifBlank { imi.loadLabel(pm) } ?: imi.loadLabel(pm)) val subtitle = SpannableString(if (subtype == null) "" else "\n${imi.loadLabel(pm)}") diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt index 3d579851b..731da10a7 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt @@ -12,7 +12,6 @@ import helium314.keyboard.compat.locale import helium314.keyboard.latin.R import helium314.keyboard.latin.common.Constants.Subtype.ExtraValue import helium314.keyboard.latin.common.LocaleUtils.constructLocale -import helium314.keyboard.latin.common.LocaleUtils.getLocaleDisplayNameInLocale import helium314.keyboard.latin.common.LocaleUtils.localizedDisplayName import helium314.keyboard.latin.common.StringUtils import helium314.keyboard.latin.utils.LayoutType.Companion.getMainLayoutFromExtraValue @@ -157,7 +156,7 @@ object SubtypeLocaleUtils { val displayName = if (exceptionalNameResId != null) { runInLocale(resources, displayLocale) { res: Resources -> res.getString(exceptionalNameResId) } } else { - getLocaleDisplayNameInLocale(locale, resources, displayLocale) + locale.localizedDisplayName(resources, displayLocale) } return StringUtils.capitalizeFirstCodePoint(displayName, displayLocale) } @@ -233,10 +232,10 @@ object SubtypeLocaleUtils { if (LayoutUtilsCustom.isCustomLayout(layoutName)) LayoutUtilsCustom.getDisplayName(layoutName) else keyboardLayoutToDisplayName[layoutName] - fun InputMethodSubtype.displayName(context: Context): String { + fun InputMethodSubtype.displayName(): String { val layoutName = mainLayoutNameOrQwerty() if (LayoutUtilsCustom.isCustomLayout(layoutName)) - return "${locale().localizedDisplayName(context)} (${LayoutUtilsCustom.getDisplayName(layoutName)})" + return "${locale().localizedDisplayName(resources)} (${LayoutUtilsCustom.getDisplayName(layoutName)})" return getSubtypeDisplayNameInSystemLocale(this) } diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt index 7cbc5e942..1e8ecc204 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt @@ -50,6 +50,7 @@ import helium314.keyboard.settings.previewDark import helium314.keyboard.settings.screens.getUserAndInternalDictionaries import java.io.File import java.util.Locale +import androidx.compose.ui.platform.LocalConfiguration @Composable fun DictionaryDialog( @@ -66,7 +67,7 @@ fun DictionaryDialog( onConfirmed = {}, confirmButtonText = null, cancelButtonText = stringResource(R.string.dialog_close), - title = { Text(locale.localizedDisplayName(ctx)) }, + title = { Text(locale.localizedDisplayName(ctx.resources)) }, content = { val state = rememberScrollState() Column(Modifier.verticalScroll(state)) { @@ -117,7 +118,7 @@ private fun DictionaryDetails(dict: File) { } AnimatedVisibility(showDetails, enter = fadeIn(), exit = fadeOut()) { // default animation looks better, but makes the dialog flash Text( - header.info(LocalContext.current.resources.configuration.locale()), + header.info(LocalConfiguration.current.locale()), style = MaterialTheme.typography.bodyMedium, modifier = Modifier.padding(horizontal = 10.dp) ) diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt index 4d02c0687..1405c71ae 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/NewDictionaryDialog.kt @@ -81,7 +81,7 @@ fun NewDictionaryDialog( selectedItem = locale, onSelected = { locale = it }, items = locales - ) { Text(it.localizedDisplayName(ctx)) } + ) { Text(it.localizedDisplayName(ctx.resources)) } } if (locale.script() != dictLocale.script()) { // whatever, still allow it if the user wants diff --git a/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt index 3ad01cb06..d7359533d 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt @@ -55,7 +55,7 @@ fun DictionaryScreen( ) { val ctx = LocalContext.current val enabledLanguages = SubtypeSettings.getEnabledSubtypes(true).map { it.locale().language } - val cachedDictFolders = DictionaryInfoUtils.getCacheDirectories(ctx).orEmpty().map { it.name } + val cachedDictFolders = DictionaryInfoUtils.getCacheDirectories(ctx).map { it.name } val comparer = compareBy({ it.language !in enabledLanguages }, { it.toLanguageTag() !in cachedDictFolders}, { it.displayName }) val dictionaryLocales = getDictionaryLocales(ctx).sortedWith(comparer).toMutableList() dictionaryLocales.add(0, Locale(SubtypeLocaleUtils.NO_LANGUAGE)) @@ -69,7 +69,7 @@ fun DictionaryScreen( if (term.isBlank()) dictionaryLocales else dictionaryLocales.filter { loc -> loc.language != SubtypeLocaleUtils.NO_LANGUAGE - && loc.localizedDisplayName(ctx).replace("(", "") + && loc.localizedDisplayName(ctx.resources).replace("(", "") .splitOnWhitespace().any { it.startsWith(term, true) } } }, @@ -98,7 +98,7 @@ fun DictionaryScreen( val types = dicts.mapTo(mutableListOf()) { it.name.substringBefore("_${DictionaryInfoUtils.USER_DICTIONARY_SUFFIX}") } if (hasInternal && !types.contains(Dictionary.TYPE_MAIN)) types.add(0, stringResource(R.string.internal_dictionary_summary)) - Text(locale.localizedDisplayName(ctx)) + Text(locale.localizedDisplayName(ctx.resources)) Text( types.joinToString(", "), style = MaterialTheme.typography.bodyMedium, diff --git a/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt index 1d87ca856..979f9defb 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt @@ -75,7 +75,7 @@ fun LanguageScreen( }, filteredItems = { term -> sortedSubtypes.filter { - it.displayName(ctx).replace("(", "") + it.displayName().replace("(", "") .splitOnWhitespace().any { it.startsWith(term, true) } } }, @@ -91,10 +91,10 @@ fun LanguageScreen( ) { var showNoDictDialog by remember { mutableStateOf(false) } Column(modifier = Modifier.weight(1f)) { - Text(item.displayName(ctx), style = MaterialTheme.typography.bodyLarge) + Text(item.displayName(), style = MaterialTheme.typography.bodyLarge) val description = if (SubtypeSettings.isAdditionalSubtype(item)) { val secondaryLocales = item.getExtraValueOf(ExtraValue.SECONDARY_LOCALES)?.split(Separators.KV) - ?.joinToString(", ") { it.constructLocale().localizedDisplayName(ctx) } + ?.joinToString(", ") { it.constructLocale().localizedDisplayName(ctx.resources) } stringResource(R.string.custom_subtype) + (secondaryLocales?.let { "\n$it" } ?: "") } else null if (description != null) @@ -153,7 +153,7 @@ private fun getSortedSubtypes(context: Context): List { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) it.languageTag == SubtypeLocaleUtils.NO_LANGUAGE else it.locale == SubtypeLocaleUtils.NO_LANGUAGE }, - { it.displayName(context) } + { it.displayName() } ) return SubtypeSettings.getAllAvailableSubtypes().sortedWith(subtypeSortComparator) } diff --git a/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt index 5ab1143ae..3d8af0c5a 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/MainSettingsScreen.kt @@ -41,7 +41,6 @@ fun MainSettingsScreen( onClickDictionaries: () -> Unit, onClickBack: () -> Unit, ) { - val ctx = LocalContext.current SearchSettingsScreen( onClickBack = onClickBack, title = stringResource(R.string.ime_settings), @@ -54,7 +53,7 @@ fun MainSettingsScreen( ) { Preference( name = stringResource(R.string.language_and_layouts_title), - description = enabledSubtypes.joinToString(", ") { it.displayName(ctx) }, + description = enabledSubtypes.joinToString(", ") { it.displayName() }, onClick = onClickLanguage, icon = R.drawable.ic_settings_languages ) { NextScreenIcon() } diff --git a/app/src/main/java/helium314/keyboard/settings/screens/PersonalDictionaryScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/PersonalDictionaryScreen.kt index e9f38a228..7c0d88b3e 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/PersonalDictionaryScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/PersonalDictionaryScreen.kt @@ -243,7 +243,7 @@ private fun getSpecificallySortedLocales(firstLocale: Locale?): List { } fun Locale?.getLocaleDisplayNameForUserDictSettings(context: Context) = - this?.localizedDisplayName(context) ?: context.resources.getString(R.string.user_dict_settings_all_languages) + this?.localizedDisplayName(context.resources) ?: context.resources.getString(R.string.user_dict_settings_all_languages) // weight is frequency but different name towards user private data class Word(val word: String, val shortcut: String?, val weight: Int?) diff --git a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt index a1d01470a..903e11aab 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt @@ -141,7 +141,7 @@ fun SubtypeScreen( SubtypeSettings.removeEnabledSubtype(ctx, currentSubtype.toAdditionalSubtype()) onClickBack() } }, - title = { Text(currentSubtype.toAdditionalSubtype().displayName(ctx)) }, + title = { Text(currentSubtype.toAdditionalSubtype().displayName()) }, itemContent = { }, filteredItems = { emptyList() } ) { @@ -158,7 +158,7 @@ fun SubtypeScreen( WithSmallTitle(stringResource(R.string.secondary_locale)) { TextButton(onClick = { showSecondaryLocaleDialog = true }) { val text = getSecondaryLocales(currentSubtype.extraValues).joinToString(", ") { - it.localizedDisplayName(ctx) + it.localizedDisplayName(ctx.resources) }.ifEmpty { stringResource(R.string.action_none) } Text(text, Modifier.fillMaxWidth()) } @@ -282,7 +282,7 @@ fun SubtypeScreen( items = availableLocalesForScript, initialSelection = currentSubtype.getExtraValueOf(ExtraValue.SECONDARY_LOCALES) ?.split(Separators.KV)?.map { it.constructLocale() }.orEmpty(), - getItemName = { it.localizedDisplayName(ctx) } + getItemName = { it.localizedDisplayName(ctx.resources) } ) if (showKeyOrderDialog) { val setting = currentSubtype.getExtraValueOf(ExtraValue.POPUP_ORDER) From f72e8f41f417f995c38d9f19c83b835d176516fa Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 24 May 2025 12:45:36 +0200 Subject: [PATCH 153/175] make SubtypeLocaleUtils less convoluted still harder to understand than necessary... --- .../MainKeyboardAccessibilityDelegate.kt | 6 +- .../keyboard/keyboard/KeyboardLayoutSet.java | 2 +- .../keyboard/latin/RichInputMethodSubtype.kt | 17 +-- .../latin/utils/SubtypeLocaleUtils.kt | 114 +++++++----------- .../settings/screens/SubtypeScreen.kt | 2 +- 5 files changed, 52 insertions(+), 89 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/accessibility/MainKeyboardAccessibilityDelegate.kt b/app/src/main/java/helium314/keyboard/accessibility/MainKeyboardAccessibilityDelegate.kt index 0be99c7c0..6a4283494 100644 --- a/app/src/main/java/helium314/keyboard/accessibility/MainKeyboardAccessibilityDelegate.kt +++ b/app/src/main/java/helium314/keyboard/accessibility/MainKeyboardAccessibilityDelegate.kt @@ -14,7 +14,7 @@ import android.view.MotionEvent import helium314.keyboard.accessibility.AccessibilityLongPressTimer.LongPressTimerCallback import helium314.keyboard.keyboard.* import helium314.keyboard.latin.R -import helium314.keyboard.latin.utils.SubtypeLocaleUtils +import helium314.keyboard.latin.utils.SubtypeLocaleUtils.displayName /** * This class represents a delegate that can be registered in [MainKeyboardView] to enhance @@ -86,9 +86,7 @@ class MainKeyboardAccessibilityDelegate( * @param keyboard The new keyboard. */ private fun announceKeyboardLanguage(keyboard: Keyboard) { - val languageText = SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale( - keyboard.mId.mSubtype.rawSubtype) - sendWindowStateChanged(languageText) + sendWindowStateChanged(keyboard.mId.mSubtype.rawSubtype.displayName()) } /** diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardLayoutSet.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardLayoutSet.java index 3344aa6eb..2bdbbdc97 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardLayoutSet.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardLayoutSet.java @@ -96,7 +96,7 @@ public final class KeyboardLayoutSet { public static void onSystemLocaleChanged() { clearKeyboardCache(); LocaleKeyboardInfosKt.clearCache(); - SubtypeLocaleUtils.clearDisplayNameCache(); + SubtypeLocaleUtils.clearSubtypeDisplayNameCache(); } public static void onKeyboardThemeChanged() { diff --git a/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt b/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt index c26f79df8..01daa8190 100644 --- a/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt +++ b/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt @@ -17,7 +17,6 @@ import helium314.keyboard.latin.utils.ScriptUtils import helium314.keyboard.latin.utils.ScriptUtils.script import helium314.keyboard.latin.utils.SubtypeLocaleUtils import helium314.keyboard.latin.utils.locale -import helium314.keyboard.latin.utils.mainLayoutNameOrQwerty import java.util.Locale /** @@ -42,21 +41,9 @@ class RichInputMethodSubtype private constructor(val rawSubtype: InputMethodSubt val isCustom: Boolean get() = LayoutUtilsCustom.isCustomLayout(mainLayoutName) - val fullDisplayName: String get() { - if (isNoLanguage) { - return SubtypeLocaleUtils.getMainLayoutDisplayName(rawSubtype.mainLayoutNameOrQwerty())!! - } - return SubtypeLocaleUtils.getSubtypeLocaleDisplayName(locale) - } + val fullDisplayName: String get() = SubtypeLocaleUtils.getSubtypeLocaleDisplayName(locale) - val middleDisplayName: String - // Get the RichInputMethodSubtype's middle display name in its locale. - get() { - if (isNoLanguage) { - return SubtypeLocaleUtils.getMainLayoutDisplayName(rawSubtype.mainLayoutNameOrQwerty())!! - } - return SubtypeLocaleUtils.getSubtypeLanguageDisplayName(locale) - } + val middleDisplayName: String get() = SubtypeLocaleUtils.getSubtypeLanguageDisplayName(locale) override fun equals(other: Any?): Boolean { if (other !is RichInputMethodSubtype) return false diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt index 731da10a7..2c2b88e02 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt @@ -40,7 +40,7 @@ object SubtypeLocaleUtils { // Exceptional locale to subtype name with layout resource id map. private val exceptionalLocaleToWithLayoutNameIds = HashMap() - private val resourceSubtypeDisplayNames = HashMap() + private val resourceSubtypeDisplayNameCache = HashMap() // Note that this initialization method can be called multiple times. @JvmStatic @@ -114,6 +114,7 @@ object SubtypeLocaleUtils { return keyboardLayoutToNameIds[key] ?: UNKNOWN_KEYBOARD_LAYOUT } + /** Usually the [locale], but Locale.ROOT for exceptionalLocaleDisplayedInRootLocale, and system locale for NO_LANGUAGE */ private fun getDisplayLocaleOfSubtypeLocale(locale: Locale): Locale { val languageTag = locale.toLanguageTag() if (languageTag == NO_LANGUAGE) @@ -123,16 +124,13 @@ object SubtypeLocaleUtils { return locale } - fun getSubtypeLocaleDisplayNameInSystemLocale(locale: Locale): String { - val displayLocale = resources.configuration.locale() - return getSubtypeLocaleDisplayNameInternal(locale, displayLocale) - } - + /** Returns the full locale display name for use on space bar (considers exceptionalLocaleDisplayedInRootLocale) */ fun getSubtypeLocaleDisplayName(locale: Locale): String { val displayLocale = getDisplayLocaleOfSubtypeLocale(locale) return getSubtypeLocaleDisplayNameInternal(locale, displayLocale) } + /** Returns the language display name for use on space bar (considers exceptionalLocaleDisplayedInRootLocale) */ fun getSubtypeLanguageDisplayName(locale: Locale): String { val languageLocale = if (exceptionalLocaleDisplayedInRootLocale.containsKey(locale.toLanguageTag())) locale @@ -141,15 +139,17 @@ object SubtypeLocaleUtils { return getSubtypeLocaleDisplayNameInternal(languageLocale, getDisplayLocaleOfSubtypeLocale(locale)) } + /** + * Display name of subtype [locale] in [displayLocale]. + * Considers exceptionalLocaleDisplayedInRootLocale and exceptionalLocaleToNameIds, defaults to Locale.localizedDisplayName. + */ private fun getSubtypeLocaleDisplayNameInternal(locale: Locale, displayLocale: Locale): String { val languageTag = locale.toLanguageTag() if (languageTag == NO_LANGUAGE) { // "No language" subtype should be displayed in system locale. return resources.getString(R.string.subtype_no_language) } - val exceptionalNameResId = if (displayLocale == Locale.ROOT - && exceptionalLocaleDisplayedInRootLocale.containsKey(languageTag) - ) + val exceptionalNameResId = if (displayLocale == Locale.ROOT && exceptionalLocaleDisplayedInRootLocale.containsKey(languageTag)) exceptionalLocaleDisplayedInRootLocale[languageTag] else exceptionalLocaleToNameIds[languageTag] @@ -161,51 +161,9 @@ object SubtypeLocaleUtils { return StringUtils.capitalizeFirstCodePoint(displayName, displayLocale) } - // InputMethodSubtype's display name in its locale. - // isAdditionalSubtype (T=true, F=false) - // locale layout | display name - // ------ ------- - ---------------------- - // en_US qwerty F English (US) exception - // en_GB qwerty F English (UK) exception - // es_US spanish F Español (EE.UU.) exception - // fr azerty F Français - // fr_CA qwerty F Français (Canada) - // fr_CH swiss F Français (Suisse) - // de qwertz F Deutsch - // de_CH swiss T Deutsch (Schweiz) - // zz qwerty F Alphabet (QWERTY) in system locale - // fr qwertz T Français (QWERTZ) - // de qwerty T Deutsch (QWERTY) - // en_US azerty T English (US) (AZERTY) exception - // zz azerty T Alphabet (AZERTY) in system locale - private fun getReplacementString(subtype: InputMethodSubtype, displayLocale: Locale): String = - subtype.getExtraValueOf(ExtraValue.UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME) - ?: getSubtypeLocaleDisplayNameInternal(subtype.locale(), displayLocale) - - fun getDisplayNameInSystemLocale(mainLayoutName: String, locale: Locale): String { - getMainLayoutDisplayName(mainLayoutName)?.let { return it } // works for custom and latin layouts - - // we have some locale-specific layout - for (subtype in SubtypeSettings.getResourceSubtypesForLocale(locale)) { - if (mainLayoutName == getMainLayoutFromExtraValue(subtype.extraValue)) - return getSubtypeDisplayNameInSystemLocale(subtype) - } - return mainLayoutName // should never happen... - } - - fun getSubtypeDisplayNameInSystemLocale(subtype: InputMethodSubtype): String { - resourceSubtypeDisplayNames[subtype.hashCode()]?.let { return it } - - val displayName = getSubtypeDisplayNameInternal(subtype, resources.configuration.locale()) - if (!subtype.containsExtraValueKey(ExtraValue.IS_ADDITIONAL_SUBTYPE)) { - resourceSubtypeDisplayNames[subtype.hashCode()] = displayName - } - return displayName - } - @JvmStatic - fun clearDisplayNameCache() { - resourceSubtypeDisplayNames.clear() + fun clearSubtypeDisplayNameCache() { + resourceSubtypeDisplayNameCache.clear() } @JvmStatic @@ -216,27 +174,48 @@ object SubtypeLocaleUtils { return subtype.locale().toString() + "/" + subtype.mainLayoutNameOrQwerty() } - private fun getSubtypeDisplayNameInternal(subtype: InputMethodSubtype, displayLocale: Locale): String { - val replacementString = getReplacementString(subtype, displayLocale) - return runInLocale(resources, displayLocale) { res: Resources -> - try { - StringUtils.capitalizeFirstCodePoint(res.getString(subtype.nameResId, replacementString), displayLocale) - } catch (e: Resources.NotFoundException) { - Log.w(TAG, ("Unknown subtype: mode=${subtype.mode} nameResId=${subtype.nameResId} locale=${subtype.locale()} extra=${subtype.extraValue}\n${DebugLogUtils.getStackTrace()}")) - "" - } + /** Subtype display name is (), defaults to system locale */ + fun InputMethodSubtype.displayName(displayLocale: Locale? = null): String { + if (displayLocale == null) resourceSubtypeDisplayNameCache[hashCode()]?.let { return it } + + val layoutName = mainLayoutName() + if (layoutName != null && LayoutUtilsCustom.isCustomLayout(layoutName)) { + return resources.getString( + R.string.subtype_with_layout_generic, + locale().localizedDisplayName(resources, displayLocale), + LayoutUtilsCustom.getDisplayName(layoutName) + ) } + + val actualDisplayLocale = displayLocale ?: resources.configuration.locale() + // replacement for %s in nameResId + // this is usually the locale, but can also include a subtype name when subtype_generic is used + val replacementString = getExtraValueOf(ExtraValue.UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME) + ?: getSubtypeLocaleDisplayNameInternal(locale(), actualDisplayLocale) + + val name = runCatching { + if (displayLocale == null) resources.getString(nameResId, replacementString) + else runInLocale(resources, displayLocale) { resources.getString(nameResId, replacementString) } + }.getOrNull() ?: locale().localizedDisplayName(resources, displayLocale) + val displayName = StringUtils.capitalizeFirstCodePoint(name, actualDisplayLocale) + if (displayLocale == null && !containsExtraValueKey(ExtraValue.IS_ADDITIONAL_SUBTYPE)) + resourceSubtypeDisplayNameCache[hashCode()] = displayName + return displayName } fun getMainLayoutDisplayName(layoutName: String): String? = if (LayoutUtilsCustom.isCustomLayout(layoutName)) LayoutUtilsCustom.getDisplayName(layoutName) else keyboardLayoutToDisplayName[layoutName] - fun InputMethodSubtype.displayName(): String { - val layoutName = mainLayoutNameOrQwerty() - if (LayoutUtilsCustom.isCustomLayout(layoutName)) - return "${locale().localizedDisplayName(resources)} (${LayoutUtilsCustom.getDisplayName(layoutName)})" - return getSubtypeDisplayNameInSystemLocale(this) + fun getLayoutDisplayNameInSystemLocale(mainLayoutName: String, locale: Locale): String { + getMainLayoutDisplayName(mainLayoutName)?.let { return it } // works for custom and latin layouts + + // we have some locale-specific layout, use the subtype name + for (subtype in SubtypeSettings.getResourceSubtypesForLocale(locale)) { + if (mainLayoutName == getMainLayoutFromExtraValue(subtype.extraValue)) + return subtype.displayName() + } + return mainLayoutName // should never happen... } @JvmStatic @@ -248,7 +227,6 @@ object SubtypeLocaleUtils { const val EMOJI = "emoji" val UNKNOWN_KEYBOARD_LAYOUT = R.string.subtype_generic - private val TAG = SubtypeLocaleUtils::class.java.simpleName private const val SUBTYPE_NAME_RESOURCE_PREFIX = "string/subtype_" private const val SUBTYPE_NAME_RESOURCE_GENERIC_PREFIX = "string/subtype_generic_" private const val SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX = "string/subtype_with_layout_" diff --git a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt index 903e11aab..336a192eb 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt @@ -407,7 +407,7 @@ private fun MainLayoutRow( horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.widthIn(min = 200.dp).fillMaxWidth() ) { - Text(SubtypeLocaleUtils.getDisplayNameInSystemLocale(it, currentSubtype.locale)) + Text(SubtypeLocaleUtils.getLayoutDisplayNameInSystemLocale(it, currentSubtype.locale)) Row (verticalAlignment = Alignment.CenterVertically) { IconButton({ showLayoutEditDialog = it to null }) { Icon(painterResource(R.drawable.ic_edit), stringResource(R.string.edit_layout)) } if (it in customLayouts) From c4e7c84608324a32011cae741174db6bf727708a Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 24 May 2025 14:56:58 +0200 Subject: [PATCH 154/175] remove complicated and obsolete generic ubtype_with_layout_ and subtype_no_language_ strings and simplify the place where they were used --- .../keyboard/latin/RichInputMethodSubtype.kt | 2 +- .../keyboard/latin/common/LocaleUtils.kt | 2 +- .../latin/utils/SubtypeLocaleUtils.kt | 86 +++--------- .../latin/utils/SubtypeUtilsAdditional.kt | 8 +- app/src/main/res/values-af/strings.xml | 12 -- app/src/main/res/values-am/strings.xml | 10 -- app/src/main/res/values-ar/strings.xml | 12 -- app/src/main/res/values-az/strings.xml | 10 -- app/src/main/res/values-b+sr+Latn/strings.xml | 10 -- app/src/main/res/values-be/strings.xml | 12 -- app/src/main/res/values-bg/strings.xml | 10 -- app/src/main/res/values-bn/strings.xml | 12 -- app/src/main/res/values-bs/strings.xml | 10 -- app/src/main/res/values-ca/strings.xml | 12 -- app/src/main/res/values-cs/strings.xml | 12 -- app/src/main/res/values-da/strings.xml | 12 -- app/src/main/res/values-de/strings.xml | 13 -- app/src/main/res/values-el/strings.xml | 12 -- app/src/main/res/values-en-rAU/strings.xml | 11 -- app/src/main/res/values-en-rCA/strings.xml | 11 -- app/src/main/res/values-en-rGB/strings.xml | 13 -- app/src/main/res/values-en-rIN/strings.xml | 11 -- app/src/main/res/values-en-rXC/strings.xml | 10 -- app/src/main/res/values-es-rUS/strings.xml | 12 -- app/src/main/res/values-es/strings.xml | 12 -- app/src/main/res/values-et/strings.xml | 10 -- app/src/main/res/values-eu/strings.xml | 12 -- app/src/main/res/values-fa/strings.xml | 12 -- app/src/main/res/values-fi/strings.xml | 10 -- app/src/main/res/values-fr-rCA/strings.xml | 10 -- app/src/main/res/values-fr/strings.xml | 13 -- app/src/main/res/values-gl/strings.xml | 11 -- app/src/main/res/values-gu/strings.xml | 10 -- app/src/main/res/values-hi/strings.xml | 10 -- app/src/main/res/values-hr/strings.xml | 12 -- app/src/main/res/values-hu/strings.xml | 12 -- app/src/main/res/values-hy/strings.xml | 10 -- app/src/main/res/values-in/strings.xml | 12 -- app/src/main/res/values-is/strings.xml | 10 -- app/src/main/res/values-it/strings.xml | 13 -- app/src/main/res/values-iw/strings.xml | 12 -- app/src/main/res/values-ja/strings.xml | 10 -- app/src/main/res/values-ka/strings.xml | 12 -- app/src/main/res/values-kk/strings.xml | 10 -- app/src/main/res/values-km/strings.xml | 10 -- app/src/main/res/values-kn/strings.xml | 10 -- app/src/main/res/values-ko/strings.xml | 12 -- app/src/main/res/values-ky/strings.xml | 10 -- app/src/main/res/values-lo/strings.xml | 10 -- app/src/main/res/values-lt/strings.xml | 10 -- app/src/main/res/values-lv/strings.xml | 10 -- app/src/main/res/values-mk/strings.xml | 10 -- app/src/main/res/values-ml/strings.xml | 12 -- app/src/main/res/values-mn/strings.xml | 10 -- app/src/main/res/values-mr/strings.xml | 10 -- app/src/main/res/values-ms/strings.xml | 10 -- app/src/main/res/values-my/strings.xml | 10 -- app/src/main/res/values-nb/strings.xml | 12 -- app/src/main/res/values-ne/strings.xml | 10 -- app/src/main/res/values-nl/strings.xml | 12 -- app/src/main/res/values-pa/strings.xml | 10 -- app/src/main/res/values-pl/strings.xml | 13 -- app/src/main/res/values-pt-rBR/strings.xml | 12 -- app/src/main/res/values-pt-rPT/strings.xml | 12 -- app/src/main/res/values-pt/strings.xml | 12 -- app/src/main/res/values-ro/strings.xml | 10 -- app/src/main/res/values-ru/strings.xml | 16 --- app/src/main/res/values-si/strings.xml | 10 -- app/src/main/res/values-sk/strings.xml | 10 -- app/src/main/res/values-sl/strings.xml | 10 -- app/src/main/res/values-sq/strings.xml | 10 -- app/src/main/res/values-sr/strings.xml | 12 -- app/src/main/res/values-sv/strings.xml | 12 -- app/src/main/res/values-sw/strings.xml | 10 -- app/src/main/res/values-ta/strings.xml | 10 -- app/src/main/res/values-te/strings.xml | 10 -- app/src/main/res/values-th/strings.xml | 10 -- app/src/main/res/values-tl/strings.xml | 10 -- app/src/main/res/values-tr/strings.xml | 12 -- app/src/main/res/values-uk/strings.xml | 12 -- app/src/main/res/values-ur/strings.xml | 10 -- app/src/main/res/values-uz/strings.xml | 12 -- app/src/main/res/values-vi/strings.xml | 10 -- app/src/main/res/values-zh-rCN/strings.xml | 12 -- app/src/main/res/values-zh-rHK/strings.xml | 10 -- app/src/main/res/values-zh-rTW/strings.xml | 10 -- app/src/main/res/values-zu/strings.xml | 10 -- app/src/main/res/values/donottranslate.xml | 43 ++---- app/src/main/res/values/strings.xml | 132 +----------------- layouts.md | 2 +- 90 files changed, 42 insertions(+), 1148 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt b/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt index 01daa8190..d79fc4133 100644 --- a/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt +++ b/app/src/main/java/helium314/keyboard/latin/RichInputMethodSubtype.kt @@ -70,7 +70,7 @@ class RichInputMethodSubtype private constructor(val rawSubtype: InputMethodSubt + "," + Constants.Subtype.ExtraValue.EMOJI_CAPABLE) private val DUMMY_NO_LANGUAGE_SUBTYPE = RichInputMethodSubtype( InputMethodSubtypeBuilder() - .setSubtypeNameResId(R.string.subtype_no_language_qwerty) + .setSubtypeNameResId(R.string.subtype_no_language) .setSubtypeIconResId(R.drawable.ic_ime_switcher) .setSubtypeLocale(SubtypeLocaleUtils.NO_LANGUAGE) .setSubtypeMode(Constants.Subtype.KEYBOARD_MODE) diff --git a/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt b/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt index 7469e0cb8..f06ca7332 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt @@ -174,7 +174,7 @@ object LocaleUtils { fun Locale.localizedDisplayName(resources: Resources, displayLocale: Locale? = null): String { val languageTag = toLanguageTag() if (languageTag == SubtypeLocaleUtils.NO_LANGUAGE) - return resources.getString(R.string.subtype_no_language) // todo: remove the (Alphabet) + return resources.getString(R.string.subtype_no_language) val overrideResId = when (languageTag) { "en-US" -> R.string.subtype_en_US diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt index 2c2b88e02..9ef0f1b03 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt @@ -29,17 +29,9 @@ object SubtypeLocaleUtils { // Keyboard layout to its display name map. private val keyboardLayoutToDisplayName = HashMap() - // Keyboard layout to subtype name resource id map. - private val keyboardLayoutToNameIds = HashMap() - // Exceptional locale whose name should be displayed in Locale.ROOT. - private val exceptionalLocaleDisplayedInRootLocale = HashMap() + private val exceptionalLocaleDisplayedInRootLocale = HashMap() - // Exceptional locale to subtype name resource id map. - private val exceptionalLocaleToNameIds = HashMap() - - // Exceptional locale to subtype name with layout resource id map. - private val exceptionalLocaleToWithLayoutNameIds = HashMap() private val resourceSubtypeDisplayNameCache = HashMap() // Note that this initialization method can be called multiple times. @@ -54,7 +46,6 @@ object SubtypeLocaleUtils { } private fun initLocked(context: Context) { - val packageName = context.packageName resources = context.resources // todo: layout names are currently translatable in subtype_no_language_* but not the default names @@ -65,54 +56,17 @@ object SubtypeLocaleUtils { for (i in predefinedLayouts.indices) { val layoutName = predefinedLayouts[i] keyboardLayoutToDisplayName[layoutName] = layoutDisplayNames[i] - val resourceName = SUBTYPE_NAME_RESOURCE_GENERIC_PREFIX + layoutName - val resId = resources.getIdentifier(resourceName, null, packageName) - keyboardLayoutToNameIds[layoutName] = resId - // Register subtype name resource id of "No language" with key "zz_" - val noLanguageResName = SUBTYPE_NAME_RESOURCE_NO_LANGUAGE_PREFIX + layoutName - val noLanguageResId = resources.getIdentifier(noLanguageResName, null, packageName) - val key = getNoLanguageLayoutKey(layoutName) - keyboardLayoutToNameIds[key] = noLanguageResId } - // todo: do it using 2 arrays like predefined_layouts (and adjust information in layouts.md) val exceptionalLocaleInRootLocale = resources.getStringArray(R.array.subtype_locale_displayed_in_root_locale) - for (languageTag in exceptionalLocaleInRootLocale) { - val resourceName = SUBTYPE_NAME_RESOURCE_IN_ROOT_LOCALE_PREFIX + languageTag.replace('-', '_') - val resId = resources.getIdentifier(resourceName, null, packageName) - exceptionalLocaleDisplayedInRootLocale[languageTag] = resId - } - - // todo: do it using 2 arrays like predefined_layouts (and adjust information in layouts.md) - // and the _with_layout variants can be removed? - val exceptionalLocales = resources.getStringArray(R.array.subtype_locale_exception_keys) - for (languageTag in exceptionalLocales) { - val resourceName = SUBTYPE_NAME_RESOURCE_PREFIX + languageTag.replace('-', '_') - val resId = resources.getIdentifier(resourceName, null, packageName) - exceptionalLocaleToNameIds[languageTag] = resId - val resourceNameWithLayout = SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX + languageTag.replace('-', '_') - val resIdWithLayout = resources.getIdentifier(resourceNameWithLayout, null, packageName) - exceptionalLocaleToWithLayoutNameIds[languageTag] = resIdWithLayout + val exceptionalLocaleInRootLocaleDisplayNames = resources.getStringArray(R.array.subtype_locale_displayed_in_root_locale_display_names) + for (i in exceptionalLocaleInRootLocale.indices) { + exceptionalLocaleDisplayedInRootLocale[exceptionalLocaleInRootLocale[i]] = exceptionalLocaleInRootLocaleDisplayNames[i] } } - fun isExceptionalLocale(locale: Locale): Boolean { - return exceptionalLocaleToNameIds.containsKey(locale.toLanguageTag()) - } - - private fun getNoLanguageLayoutKey(keyboardLayoutName: String): String { - return NO_LANGUAGE + "_" + keyboardLayoutName - } - - fun getSubtypeNameResId(locale: Locale, keyboardLayoutName: String): Int { - val languageTag = locale.toLanguageTag() - if (isExceptionalLocale(locale)) { - return exceptionalLocaleToWithLayoutNameIds[languageTag]!! - } - val key = if (languageTag == NO_LANGUAGE) getNoLanguageLayoutKey(keyboardLayoutName) - else keyboardLayoutName - return keyboardLayoutToNameIds[key] ?: UNKNOWN_KEYBOARD_LAYOUT - } + // see SubtypeUtilsAdditional.getAdditionalExtraValues, currently not needed + //fun isExceptionalLocale(locale: Locale) = exceptionalLocaleDisplayedInRootLocale.containsKey(locale.toLanguageTag()) /** Usually the [locale], but Locale.ROOT for exceptionalLocaleDisplayedInRootLocale, and system locale for NO_LANGUAGE */ private fun getDisplayLocaleOfSubtypeLocale(locale: Locale): Locale { @@ -149,12 +103,8 @@ object SubtypeLocaleUtils { // "No language" subtype should be displayed in system locale. return resources.getString(R.string.subtype_no_language) } - val exceptionalNameResId = if (displayLocale == Locale.ROOT && exceptionalLocaleDisplayedInRootLocale.containsKey(languageTag)) - exceptionalLocaleDisplayedInRootLocale[languageTag] - else - exceptionalLocaleToNameIds[languageTag] - val displayName = if (exceptionalNameResId != null) { - runInLocale(resources, displayLocale) { res: Resources -> res.getString(exceptionalNameResId) } + val displayName = if (displayLocale == Locale.ROOT && exceptionalLocaleDisplayedInRootLocale.containsKey(languageTag)) { + exceptionalLocaleDisplayedInRootLocale[languageTag]!! } else { locale.localizedDisplayName(resources, displayLocale) } @@ -186,12 +136,18 @@ object SubtypeLocaleUtils { LayoutUtilsCustom.getDisplayName(layoutName) ) } + if (keyboardLayoutToDisplayName.containsKey(layoutName)) { + return resources.getString( + R.string.subtype_with_layout_generic, + locale().localizedDisplayName(resources, displayLocale), + keyboardLayoutToDisplayName[layoutName] + ) + } val actualDisplayLocale = displayLocale ?: resources.configuration.locale() - // replacement for %s in nameResId - // this is usually the locale, but can also include a subtype name when subtype_generic is used - val replacementString = getExtraValueOf(ExtraValue.UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME) - ?: getSubtypeLocaleDisplayNameInternal(locale(), actualDisplayLocale) + // replacement for %s in nameResId, which now always is the locale + // not read from ExtraValue.UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME any more + val replacementString = getSubtypeLocaleDisplayNameInternal(locale(), actualDisplayLocale) val name = runCatching { if (displayLocale == null) resources.getString(nameResId, replacementString) @@ -226,10 +182,4 @@ object SubtypeLocaleUtils { const val QWERTY = "qwerty" const val EMOJI = "emoji" val UNKNOWN_KEYBOARD_LAYOUT = R.string.subtype_generic - - private const val SUBTYPE_NAME_RESOURCE_PREFIX = "string/subtype_" - private const val SUBTYPE_NAME_RESOURCE_GENERIC_PREFIX = "string/subtype_generic_" - private const val SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX = "string/subtype_with_layout_" - private const val SUBTYPE_NAME_RESOURCE_NO_LANGUAGE_PREFIX = "string/subtype_no_language_" - private const val SUBTYPE_NAME_RESOURCE_IN_ROOT_LOCALE_PREFIX = "string/subtype_in_root_locale_" } diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt index 8c9527f1e..a2d839266 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeUtilsAdditional.kt @@ -113,8 +113,6 @@ object SubtypeUtilsAdditional { } private fun getNameResId(locale: Locale, mainLayoutName: String): Int { - val nameId = SubtypeLocaleUtils.getSubtypeNameResId(locale, mainLayoutName) - if (nameId != SubtypeLocaleUtils.UNKNOWN_KEYBOARD_LAYOUT) return nameId SubtypeSettings.getResourceSubtypesForLocale(locale).forEach { if (it.mainLayoutName() == mainLayoutName) return it.nameResId } @@ -163,15 +161,17 @@ object SubtypeUtilsAdditional { val extraValueItems = mutableListOf() if (isAsciiCapable) extraValueItems.add(ExtraValue.ASCII_CAPABLE) - if (SubtypeLocaleUtils.isExceptionalLocale(locale)) { +/* if (SubtypeLocaleUtils.isExceptionalLocale(locale)) { // this seems to be for shorter names (e.g. English (US) instead English (United States)) // but is now also used for languages that are not known by Android (at least older versions) // todo: actually this should never contain a custom layout name, because it may contain any // characters including , and = which may break extra values + // todo: disabled for now, not necessary with the more generic subtype name + // might become necessary again when exposing subtypes to the system extraValueItems.add( ExtraValue.UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME + "=" + SubtypeLocaleUtils.getMainLayoutDisplayName(mainLayoutName) ) - } + }*/ if (isEmojiCapable) extraValueItems.add(ExtraValue.EMOJI_CAPABLE) extraValueItems.add(ExtraValue.IS_ADDITIONAL_SUBTYPE) diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml index 94a881b37..207dfc7f9 100644 --- a/app/src/main/res/values-af/strings.xml +++ b/app/src/main/res/values-af/strings.xml @@ -49,20 +49,10 @@ "Spaans (VS)" "Hinglish" "Serwies (Latyns)" - Engels (VK) (%s) - Engels (VS) (%s) - Spaans (VS) (%s) - Hinglish (%s) - Serwies (%s) %s (Tradisioneel) %s (Kompak) "Geen taal nie (alfabet)" "Alfabet (QWERTY)" - "Alfabet (QWERTZ)" - "Alfabet (AZERTY)" - "Alfabet (Dvorak)" - "Alfabet (Colemak)" - "Alfabet (PC)" "Emosiekone" "Voeg by" "Verwyder" @@ -138,8 +128,6 @@ Lang-druk van spasiebalk sal toevoer metode seleksie skerm wys Outo-spasie na leestekens Plaas \'n spasie na \'n leesteken sodra \'n nuwe woord getik word - Alphabet (Workman) - Alphabet (Colemak Mod-DH) HeliBoard Instellings Invoer Bykomende Sleutels diff --git a/app/src/main/res/values-am/strings.xml b/app/src/main/res/values-am/strings.xml index e9a384c81..0400edb90 100644 --- a/app/src/main/res/values-am/strings.xml +++ b/app/src/main/res/values-am/strings.xml @@ -49,20 +49,10 @@ "ስፓኒሽኛ (ዩኤስ)" "ሂንግሊሽ" "ሰርብያኛ (ላቲን)" - "እንግሊዝኛ (ዩኬ) (%s)" - "እንግሊዝኛ (አሜሪካ) (%s)" - "ስፓኒሽ (አሜሪካ) (%s)" - "ሂንግሊሽ (%s)" - "ሰርቢያኛ (%s)" "%s (ተለምዷዊ)" "%s (እስግ)" "ምንም ቋንቋ (ፊደላት)" "ፊደላት (QWERTY)" - "ፊደላት (QWERTZ)" - "ፊደላት (AZERTY)" - "ፊደላት (Dvorak)" - "ፊደላት (Colemak)" - "ፊደላት (ፒሲ)" "ኢሞጂ" "አክል" "አስወግድ" diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 85ed781ec..af82279c4 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -49,20 +49,10 @@ "الإسبانية (الأميركية)" "هنجليزية" "الصربية (اللاتينية)" - الإنجليزية (المملكة المتحدة) (%s) - الإنجليزية (الولايات المتحدة) (%s) - الإسبانية (الولايات المتحدة) (%s) - الهنجليزية (%s) - الصربية (%s) %s (التقليدية) %s (مضغوط) "بدون لغة (أبجدية)" "‏الأبجدية (QWERTY)" - "‏الأبجدية (QWERTZ)" - "‏الأبجدية (AZERTY)" - "‏الأبجدية (Dvorak)" - "‏الأبجدية (Colemak)" - "‏الأبجدية (PC)" "الرموز التعبيرية" أضف "إزالة" @@ -146,8 +136,6 @@ أدرج مسافةً تلقائيًا بعد علامة الترقيم عند كتابة كلمة جديدة افرض وضع التخفي %s min - الأبجدية (Colemak Mod-DH) - الأبجدية (Workman) ثقة التصحيح التلقائي "تراجع" "إعادة" diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 526e0ba86..0a12b55a5 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -49,20 +49,10 @@ "İspan (ABŞ)" "Hingilis" "Serb (Latın)" - "İngilis (Britaniya) (%s)" - "İngilis (Amerika) (%s)" - "İspan (Amerika) (%s)" - "Hingilis (%s)" - "Serb (%s)" "%s (Ənənəvi)" "%s (Kompakt)" "Dil yoxdur (Əlifba)" "Əlifba (QWERTY)" - "Əlifba (QWERTZ)" - "Əlifba (AZERTY)" - "Əlifba (Dvorak)" - "Əlifba (Colemak)" - "Əlifba (PC)" "Emoji" "Əlavə et" "Ləğv et" diff --git a/app/src/main/res/values-b+sr+Latn/strings.xml b/app/src/main/res/values-b+sr+Latn/strings.xml index 7e9c218be..3da01fdfa 100644 --- a/app/src/main/res/values-b+sr+Latn/strings.xml +++ b/app/src/main/res/values-b+sr+Latn/strings.xml @@ -49,20 +49,10 @@ "španski (SAD)" "hengleski" "srpski (latinica)" - "engleski (UK) (%s)" - "engleski (SAD) (%s)" - "španski (SAD) (%s)" - "hengleski (%s)" - "srpski (%s)" "%s (tradicionalni)" "%s (kompaktna)" "Nema jezika (abeceda)" "abeceda (QWERTY)" - "abeceda (QWERTZ)" - "abeceda (AZERTY)" - "abeceda (Dvorak)" - "abeceda (Colemak)" - "abeceda (PC)" "Emotikoni" "Dodaj" "Ukloni" diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index df4da739d..77e9c3e26 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -50,20 +50,10 @@ "Іспанская (ЗША)" хінгліш сербская (Лацініца) - Англійская (Вялікабрытанія) (%s) - Англійская (ЗША) (%s) - Іспанская (ЗША) (%s) - Хінгліш (%s) - Сербская (%s) %s (Традыцыйная) %s (Кампактная) стандартная (лацініца) "Лацініца (QWERTY)" - "Лацініца (QWERTZ)" - "Лацініца (AZERTY)" - "Лацініца (Дворак)" - "Лацініца (Colemak)" - "Лацініца (ПК)" "Эмодзі" "Дадаць" "Выдаліць" @@ -180,7 +170,6 @@ Паказваць падказкі пры доўгім націску Змяніць метад ўводу з дапамогай клавішы прабел Доўгі націск клавішы прабел адкрые меню выбару метаду ўводу - Алфавіт (Colemak Mod-DH) Выкарыстоўваць тэму сістэмы Стыль тэмы Закруглены @@ -190,7 +179,6 @@ Правядзіце пальцам ад клавішы выдалення, каб выбраць і выдаліць адразу большыя часткі тэксту Аўтаматычна ўстаўляць прабел пасля знакаў прыпынку пры ўводзе новага слова Аўтапрабел пасля знакаў прыпынку - Алфавіт (Workman) Знешні выгляд будзе адпавядаць наладам сістэмы Канфідэнцыяльнасць аўтавыпраўлення "Адрабіць" diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 941423655..db4c652e3 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -49,20 +49,10 @@ "испански (САЩ)" "Хинглиш" "Сръбска (латиница)" - "английски (Великобр.) (%s)" - "английски (САЩ) (%s)" - "испански (САЩ) (%s)" - "Хинглиш (%s)" - "Сръбска (%s)" "%s (традиционна клавиатура)" "%s (компактна)" "Без език (латиница)" "латиница (QWERTY)" - "латиница (QWERTZ)" - "латиница (AZERTY)" - "латиница (Дворак)" - "латиница (Коулмак)" - "латиница (PC)" "Емотикони" "Добавяне" "Премахване" diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index af1e21dd6..051b41f59 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -98,11 +98,6 @@ ডিভাইস সুরক্ষিত স্টোরেজ ► পিন করে রাখা টুলবার বোতামে দীর্ঘ চাপ দিলে তা অতিরিক্ত কাজ করবে: <br> \n\t• ক্লিপবোর্ড &#65515; পেস্ট <br> \n\t• বামে/ডানে স্থানান্তর &#65515; সম্পূর্ণ বামে/ডানে স্থানান্তর <br> \n\t• উপরে/নিচে স্থানান্তর &#65515; পৃষ্ঠার উপরে/নিচে <br> \n\t• শব্দের ডানে/বামে &#65515; লাইনের শুরু/শেষ <br> \n\t• পাতার উপরে/নিচে &#65515; পাতার শুরু/শেষ <br> \n\t• অনুলিপি &#65515; কর্তন <br> \n\t• শব্দ নির্বাচন &#8596; সমস্ত নির্বাচন <br> \n\t• পূর্বাবস্থা &#8596; পুনরাবৃত্তি <br> <br> \n► পরামর্শ ফলকের টুলবারের কোনো বোতামে দীর্ঘ চাপ দিলে তা পরামর্শ ফলকে আবদ্ধ হবে। <br> <br> \n► কমা বোতামে দীর্ঘ চাপ দিলে ক্লিপবোর্ড দর্শন, ইমোজি দর্শন, একক হাত মোড, সেটিংস অথবা ভাষা পরিবর্তন বোতাম উপলব্ধ হবে:<br> \n\t• সংশ্লিষ্ট বোতাম সক্ষম থাকলে ইমোজি দর্শন বা ভাষা পরিবর্তন বোতাম দৃশ্যমান থাকবে না; <br> \n\t• কিছু লেআউটের জন্য কমা বোতাম নয়, কিন্তু একই জায়গার বোতামটি, যেমন: Dvorak লেআউটে \'q\' বোতাম। <br> <br> \n► ছদ্মবেশী মোড সক্রিয় থাকলে শব্দ শিখন বন্ধ থাকবে, এবং সাম্প্রতিকে কোনো ইমোজি যুক্ত হবে না। <br> <br> \n► ছদ্মবেশী বোতামে চাপ দিলে টুলবার উপলব্ধ হবে। <br> <br> \n► স্লাইডিং কি ইনপুট: বড়ো হাতের অক্ষর লেখার জন্য শিফট বোতাম থেকে অন্য বোতামে অভিস্পর্শ করুন: <br> \n\t• সিম্বল কিবোর্ড থেকে সিম্বল এবং সম্পর্কিত অক্ষর লেখার জন্য \'?123\' বোতামেও এটি কাজ করে।<br> <br> \n► শিফট অথবা প্রতীক বোতাম চেপে ধরে এক বা একাধিক বোতাম চাপার পর শিফট অথবা প্রতীক বোতাম ছেড়ে দিলে তা পূর্ববর্তী কিবোর্ডে নিয়ে যাবে। <br> <br> \n► পরামর্শ ফলকে কোনো পরামর্শে দীর্ঘ চাপ দিলে আরও পরামর্শ, বিলোপ করার জন্য অপসারণ বোতাম প্রদর্শিত হবে। <br> <br> \n► আরও পরামর্শ খুলতে কোনো পরামর্শ থেকে উপরে অভিস্পর্শ করুন এবং নির্দিষ্ট পরামর্শ নির্বাচনের জন্য ছেড়ে দিন। <br> <br> \n► ক্লিপবোর্ড ইতিহাসে কোনো অন্তর্ভুক্তিতে দীর্ঘ চাপ দিয়ে তা পিন করা যাবে (আনপিন না করা পর্যন্ত তা ক্লিপবোর্ডে থাকবে) \n► ক্লিপবোর্ড দর্শনে বাম পাশে অভিস্পর্শ করলে অন্তর্ভুক্তি অপসারণ হবে (যদি না সেটি পিন করা থাকে)। <br> <br> \n► লেখা সিলেক্ট করে শিফট চাপলে তা বড়ো হাতের অক্ষর, ছোটো হাতের অক্ষর এবং সব অক্ষর বড়ো হাতের হবে। <br> <br> \n► আপনি ফাইল এক্সপ্লোরারে খোলার মাধ্যমে অভিধান সংযুক্ত করতে পারেন: <br> \n\t• এটি কেবল <i>content-uris</i> এর সাথে কাজ করে, <i>file-uris</i> এর সাথে নয়। অর্থাৎ কিছু ফাইল এক্সপ্লোরারের সাথে নাও কাজ করতে পারে। <br> <br> \n► রুট উপলব্ধতাসহ ম্যানুয়াল ব্যাকআপ করা ব্যবহারকারীদের জন্য: <br> \nঅ্যান্ড্রয়েড ৭ থেকে শেয়ারড্ প্রেফারেন্স ফাইল ডিফল্ট জায়গা নয়। কারণ অ্যাপ %s ব্যবহার করছে। ডিভাইস আনলকের আগে সেটিংস খোলার জন্য এটি প্রয়োজনীয়, যেমন: বুট করার সময়। <br> \nফাইলটি /data/user_de/0/package_id/shared_prefs/ থাকে। যদিও এটা ডিভাইস এবং অ্যান্ড্রয়েড সংস্করণের উপরে নির্ভর করে। <br> <br> \n<i><b>কেবল ডিবাগ এপিকে</b></i> <br> <br> \n► পরামর্শে দীর্ঘ চাপ দিলে তার উৎস-অভিধান দেখাবে। <br> <br> \n► ডিবাগ সেটিংস উচ্চতর সেটিংসে উপলব্ধ। যদিও লগ ফাইলে অভিধান অবমুক্ত করা ছাড়া এর ব্যবহারযোগ্যতা সীমিত। <br> \n\t• রিলিজ এপিকে এর জন্য <i>সম্পর্কে</i> এর সংস্করণে কয়েকবার চাপ দিতে হবে। তাহলে <i>উচ্চতর</i>-এ ডিবাগ সেটিংস উপলব্ধ হবে। <br> \n\t• <i>পরামর্শ তথ্য প্রদর্শন</i> চালু করলে পরামর্শের উপরে কিছু ছোটো নম্বর থাকবে যা অভ্যন্তরীণ হিসাব ও উৎস অভিধান নির্দেশ করে। <br> <br> \n► অ্যাপ্লিকেশন ক্র্যাশের পরে সেটিংস খুললে আপনি ক্র্যাশ লগ চান কি না তা জিজ্ঞেস করা হবে৷ <br> <br> \n► বহুভাষী টাইপিং ব্যবহারের সময় স্পেসবার বর্তমান ভাষা নির্ধারণের জন্য একটি দৃঢ়তা মান দেখাবে। <br> <br> \n► পরামর্শের উপরে কিছু ছোটো নম্বর থাকবে যা অভ্যন্তরীণ হিসাব ও উৎস অভিধান নির্দেশ করে (নিষ্ক্রিয় করা যেতে পারে)। সার্বিয়ান (ল্যাটিন) - ইংরেজি (ইউকে) (%s) - ইংরেজি (ইউএস) (%s) - স্প্যানিশ (ইউএস) (%s) - হিংলিশ (%s) - সার্বিয়ান (%s) %s (প্রথাগত) %s (অক্ষর) %s (প্রভাত) @@ -112,13 +107,6 @@ %s (সেবালসিক চূড়ান্ত) ভাষাহীন (বর্ণমালা) বর্ণমালা (কোয়ার্টি) - বর্ণমালা (QWERTZ) - বর্ণমালা (AZERTY) - বর্ণমালা (ডভোরাক) - বর্ণমালা (কোলেমাক) - বর্ণমালা (কোলেমাক Mod-DH) - আলফাবেট (ওয়ার্কম্যান) - বর্ণমালা (PC) ইমোজি সংযুক্ত করুন অপসারণ করুন diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 17f43c24c..e3bbeb258 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -51,20 +51,10 @@ "španski (SAD)" "Hindu engleski" "Srpski (latinica)" - "Engleski (UK) (%s)" - "Engleski (SAD) (%s)" - "Španski (SAD) (%s)" - "Hindu engleski (%s)" - "Srpski (%s)" "%s (tradicionalan)" "%s (kompaktan)" "Nema jezika (abeceda)" "Abeceda (QWERTY)" - "Abeceda (QWERTZ)" - "Abeceda (AZERTY)" - "Abeceda (Dvorak)" - "Abeceda (Colemak)" - "Abeceda (PC)" "Emoji" "Dodaj" "Ukloni" diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 1b903b794..6dffe8234 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -49,20 +49,10 @@ "Espanyol (EUA)" Hinglish "Serbi (llatí)" - Anglès (Regne Unit) (%s) - Anglès (EUA) (%s) - Espanyol (EUA) (%s) - Hinglish (%s) - Serbi (%s) %s (Tradicional) %s (Compacte) Cap idioma (alfabet) "Alfabet (QWERTY)" - "Alfabet (QWERTZ)" - "Alfabet (AZERTY)" - "Alfabet (Dvorak)" - "Alfabet (Colemak)" - "Alfabet (PC)" Emojis "Afegeix" "Elimina" @@ -143,9 +133,7 @@ Mostra consells quan es mantingui premuda una tecla %s (Akkhor) Escala de l\'alçada del teclat - Alfabet (Workman) L\'aspecte seguirà la configuració del sistema - Alfabet (Colemak Mod-DH) Confidència d\'autocorrecció "Utilitza els idiomes del sistema" Selecciona un mètode d\'entrada diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 57d83131a..ccbbc4d37 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -50,20 +50,10 @@ "Španělština (USA)" Hinglish srbština (Latinka) - "Angličtina (Velká Británie) (%s)" - "Angličtina (USA) (%s)" - "Španělština (USA) (%s)" - hinglish (%s) - "Srbština (%s)" "%s (Tradiční)" "%s (Kompaktní)" standardní (Latinka) "Latinka (QWERTY)" - "Latinka (QWERTZ)" - "Latinka (AZERTY)" - "Latinka (Dvorak)" - "Latinka (Colemak)" - "Latinka (PC)" "Emodži" "Přidat" "Odebrat" @@ -140,9 +130,7 @@ Nastavení HeliBoard Návrhy Klávesa pro emodži - Abeceda (Workman) Pokud vypnuto, tlačítko schránky vloží obsah schránky, pokud nějaký existuje - Abeceda (Colemak Mod-DH) Automatická mezera po znaménkách Více kláves Posuňte prstem z tlačítka Delete a mažte větší části textu společně diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index e66f23bcd..1dd9ae8b7 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -49,20 +49,10 @@ "Spansk (USA)" "Hinglish" Serbisk (latin) - Engelsk (Storbritannien) (%s) - Engelsk (USA) (%s) - Spansk (USA) (%s) - Hinglish (%s) - Serbisk (%s) %s (traditionel) %s (kompakt) "Intet sprog (Alfabet)" "Alfabet (QWERTY)" - "Alfabet (QWERTZ)" - "Alfabet (AZERTY)" - "Alfabet (Dvorak)" - "Alfabet (Colemak)" - "Alfabet (PC)" "Emoji" "Tilføj" "Fjern" @@ -118,7 +108,6 @@ Aktivér udklipsholderhistorik Hvis deaktiveret, indsætter udklipsholdertasten eventuelt indhold af udklipsholderen Opbevaringstid for historik - Alfabet (Colemak Mod-DH) Tastekanter Automatisk dag-/nattilstand Udseende følger systemindstillinger @@ -135,7 +124,6 @@ Indsæt automatisk mellemrum efter skilletegn, når du skriver et nyt ord Auto-mellemrum efter skilletegn %s (Akkhor) - Alfabet (Workman) HeliBoard-indstillinger Input Yderligere taster diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 147ae6901..3abe242bf 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -49,20 +49,10 @@ "Spanisch (USA)" Hinglisch "Serbisch (Lateinisch)" - Englisch (GB) (%s) - Englisch (USA) (%s) - Spanisch (USA) (%s) - Hinglisch (%s) - Serbisch (%s) %s (Traditionell) %s (Kompakt) "Keine Sprache (lat. Alphabet)" "Lat. Alphabet (QWERTY)" - "Lat. Alphabet (QWERTZ)" - "Lat. Alphabet (AZERTY)" - "Lat. Alphabet (Dvorak)" - "Lat. Alphabet (Colemak)" - "Lat. Alphabet (PC)" "Emoji" "Hinzufügen" "Entfernen" @@ -146,8 +136,6 @@ Tastenränder Automatischer Tag-/Nachtmodus %s (Bengali) - Lat. Alphabet (Workman) - Lat. Alphabet (Colemak Mod-DH) Vertrauen in die Autokorrektur Rückgängig "Wiederholen" @@ -225,7 +213,6 @@ Akzent Auf GitHub ansehen Zahlenzeile - Alphabet (Bépo) Wiederherstellen Popup-Tastenreihenfolge wählen Version diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index c2134e233..700bc60ee 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -50,20 +50,10 @@ "Ισπανικά (ΗΠΑ)" "Hinglish" "Σερβικά (Λατινικά)" - "Αγγλικά (Ηνωμένο Βασίλειο) (%s)" - "Αγγλικά (ΗΠΑ) (%s)" - "Ισπανικά (ΗΠΑ) (%s)" - "Hinglish (%s)" - "Σερβικά (%s)" "%s (Παραδοσιακά)" "%s (Συμπαγές)" "Καμία γλώσσα (Αλφάβητο)" "Αλφάβητο (QWERTY)" - "Αλφάβητο (QWERTZ)" - "Αλφάβητο (AZERTY)" - "Αλφάβητο (Dvorak)" - "Αλφάβητο (Colemak)" - "Αλφάβητο (PC)" "Emoticon" "Προσθήκη" "Κατάργηση" @@ -137,8 +127,6 @@ Να εμφανίζεται πάντα η αριθμητική σειρά Αλλάξτε τη μέθοδο εισαγωγής με το πλήκτρο διαστήματος %s (Akkhor) - Αλφάβητο (Colemak Mod-DH) - Αλφάβητο (Workman) Η εμφάνιση θα ακολουθεί τις ρυθμίσεις του συστήματος Αυτόματο κενό μετά τη στίξη Ρυθμίσεις HeliBoard diff --git a/app/src/main/res/values-en-rAU/strings.xml b/app/src/main/res/values-en-rAU/strings.xml index 335d7f915..b3525961f 100644 --- a/app/src/main/res/values-en-rAU/strings.xml +++ b/app/src/main/res/values-en-rAU/strings.xml @@ -51,21 +51,10 @@ "Hinglish" "Kaitag" "Serbian (Latin)" - "English (UK) (%s)" - "English (US) (%s)" - "Spanish (US) (%s)" - "Hinglish (%s)" - "Kaitag (%s)" - "Serbian (%s)" "%s (Traditional)" "%s (Compact)" "No language (Alphabet)" "Alphabet (QWERTY)" - "Alphabet (QWERTZ)" - "Alphabet (AZERTY)" - "Alphabet (Dvorak)" - "Alphabet (Colemak)" - "Alphabet (PC)" "Emoji" "Add" "Remove" diff --git a/app/src/main/res/values-en-rCA/strings.xml b/app/src/main/res/values-en-rCA/strings.xml index 335d7f915..b3525961f 100644 --- a/app/src/main/res/values-en-rCA/strings.xml +++ b/app/src/main/res/values-en-rCA/strings.xml @@ -51,21 +51,10 @@ "Hinglish" "Kaitag" "Serbian (Latin)" - "English (UK) (%s)" - "English (US) (%s)" - "Spanish (US) (%s)" - "Hinglish (%s)" - "Kaitag (%s)" - "Serbian (%s)" "%s (Traditional)" "%s (Compact)" "No language (Alphabet)" "Alphabet (QWERTY)" - "Alphabet (QWERTZ)" - "Alphabet (AZERTY)" - "Alphabet (Dvorak)" - "Alphabet (Colemak)" - "Alphabet (PC)" "Emoji" "Add" "Remove" diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 6f1d032ef..70c9464b7 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -50,21 +50,10 @@ "Hinglish" "Kaitag" "Serbian (Latin)" - English (UK) (%s) - English (US) (%s) - Spanish (US) (%s) - Hinglish (%s) - Kaitag (%s) - Serbian (%s) %s (Traditional) %s (Compact) "No language (Alphabet)" "Alphabet (QWERTY)" - "Alphabet (QWERTZ)" - "Alphabet (AZERTY)" - "Alphabet (Dvorak)" - "Alphabet (Colemak)" - "Alphabet (PC)" "Emoji" "Add" "Remove" @@ -134,8 +123,6 @@ Auto day/night mode Key borders Additional keys - Alphabet (Colemak Mod-DH) - Alphabet (Workman) Appearance will follow system settings Change input method with space key Long pressing space key will prompt input method selection menu diff --git a/app/src/main/res/values-en-rIN/strings.xml b/app/src/main/res/values-en-rIN/strings.xml index 455fd6493..87cd3fc0d 100644 --- a/app/src/main/res/values-en-rIN/strings.xml +++ b/app/src/main/res/values-en-rIN/strings.xml @@ -51,21 +51,10 @@ "Hinglish" "Kaitag" "Serbian (Latin)" - "English (UK) (%s)" - "English (US) (%s)" - "Spanish (US) (%s)" - "Hinglish (%s)" - "Kaitag (%s)" - "Serbian (%s)" "%s (Traditional)" "%s (Compact)" "No language (Alphabet)" "Alphabet (QWERTY)" - "Alphabet (QWERTZ)" - "Alphabet (AZERTY)" - "Alphabet (Dvorak)" - "Alphabet (Colemak)" - "Alphabet (PC)" "Emoji" "Add" "Remove" diff --git a/app/src/main/res/values-en-rXC/strings.xml b/app/src/main/res/values-en-rXC/strings.xml index 38445f734..906e80956 100644 --- a/app/src/main/res/values-en-rXC/strings.xml +++ b/app/src/main/res/values-en-rXC/strings.xml @@ -50,20 +50,10 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‎‏‎‏‎‎‎‎‎‎‏‎‎‏‏‎‏‎‏‏‎‏‎‎‎‎Spanish (US)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‏‎‎‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‏‎‎‏‏‎‎‎‏‎‎‎‏‏‏‏‏‎Hinglish‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‏‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‎‎‏‏‏‎Serbian (Latin)‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‏‏‎‎‎‏‎‏‏‎‏‏‏‎‎‎‎‏‎‏‎‏‏‎‎‎‎‎‎‏‏‎‏‏‎‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‎English (UK) (‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎)‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‎‏‎‎‎‎‏‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‎English (US) (‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎)‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‏‏‎‎‏‏‎‎‎‎‏‎‎‎‏‏‏‎‎‏‏‏‎‏‏‎‏‏‎‏‏‏‎‏‎‏‎‎‎‎‎‎‎‏‎‏‏‎‏‎‎Spanish (US) (‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎)‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‎‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‎‏‎‎‎Hinglish (‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎)‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‎‎‏‎‏‏‏‏‎‏‏‏‎Serbian (‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‏‎‏‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ (Traditional)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ (Compact)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‏‏‎‏‎‎‏‎‎‏‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‏‏‎No language (Alphabet)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‏‎‎‎Alphabet (QWERTY)‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‏‎‏‎‏‏‏‎‏‏‏‏‎‏‏‏‎‏‎‎‎‏‎‏‎‎‏‎‎‎‎Alphabet (QWERTZ)‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‎‎‎‏‎‎‏‏‏‎‏‎‏‎‏‏‏‎‏‎‎‎‏‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‎Alphabet (AZERTY)‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‎‏‏‎‎‎‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‎‎‏‏‎‎‎‎‏‎‏‎‎‎‏‎‏‎‎‎‎‏‏‏‎‎Alphabet (Dvorak)‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‎‏‎‏‎‏‏‎‏‎‎‎‏‏‎‏‏‎‏‎‏‏‎‎‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‏‏‏‏‎Alphabet (Colemak)‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‎‏‎‏‏‏‎‎‏‏‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‎‏‎‎‏‎‎Alphabet (PC)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‎‎‏‎‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎Emoji‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‎‎‏‏‎‏‏‎‎‎‎‎‎‏‎‎‎‎‎‏‎‎‏‏‎‏‏‏‏‏‎Add‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‎‏‎‏‎‏‏‏‎‏‎‏‏‎‏‎‏‎‎‏‎‏‏‎‎‎‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎Remove‎‏‎‎‏‎" diff --git a/app/src/main/res/values-es-rUS/strings.xml b/app/src/main/res/values-es-rUS/strings.xml index 0a03b783f..aea7b6756 100644 --- a/app/src/main/res/values-es-rUS/strings.xml +++ b/app/src/main/res/values-es-rUS/strings.xml @@ -49,20 +49,10 @@ "Español (EE.UU.)" "Hinglish" "Serbio (latino)" - "Inglés, Reino Unido (%s)" - "Inglés, EE. UU. (%s)" - "Español, EE. UU. (%s)" - "Hinglish (%s)" - "Serbio (%s)" "%s (tradicional)" "%s (compacto)" "Ningún idioma (alfabeto)" "Alfabeto (QWERTY)" - "Alfabeto (QWERTZ)" - "Alfabeto (AZERTY)" - "Alfabeto (Dvorak)" - "Alfabeto (Colemak)" - "Alfabeto (PC)" "Emoji" "Agregar" "Eliminar" @@ -136,10 +126,8 @@ %s (Akkhor) Más teclas Mostrar símbolos sugeridos - Alfabeto (Colemak Mod-DH) Bordes de teclas Seguir la configuración del sistema - Alfabeto (Workman) Modo claro/oscuro automático Ajustes de HeliBoard Entrada diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index b4a1c82d4..d1f380471 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -49,20 +49,10 @@ "Español (EE.UU.)" inglés indio "Serbio (latino)" - Inglés (Reino Unido) (%s) - Inglés (EE.UU.) (%s) - Español (EE.UU.)) (%s) - inglés indio (%s) - Serbio (%s) %s (Tradicional) %s (Compacto) "Ningún idioma (alfabeto)" "Alfabeto (QWERTY)" - "Alfabeto (QWERTZ)" - "Alfabeto (AZERTY)" - "Alfabeto (Dvorak)" - "Alfabeto (Colemak)" - "Alfabeto (PC)" "Emoji" "Añadir" "Quitar" @@ -110,9 +100,7 @@ "Todos los idiomas" "Más idiomas…" " ABCDEFGHIJKLMNÑOPQRSTUVWXYZ" - Alfabeto (Colemak Mod-DH) La apariencia seguirá los ajustes del sistema - Alfabeto (Workman) Mostrar siempre fila de números Teclas adicionales Cambiar método de entrada con la barra espaciadora diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 669cb4597..bd329f178 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -49,20 +49,10 @@ Hispaania (USA) "Hindi-inglise" "Serbia (ladina)" - "Inglise (Ühendk.) (%s)" - "Inglise (USA) (%s)" - "Hispaania (USA) (%s)" - "Hindi-inglise (%s)" - "Serbia (%s)" "%s (traditsiooniline)" "%s (kompaktne)" "Keel puudub (tähestik)" "Tähestik (QWERTY)" - "Tähestik (QWERTZ)" - "Tähestik (AZERTY)" - "Tähestik (Dvorak)" - "Tähestik (Colemak)" - "Tähestik (PC)" "Emotikon" "Lisa" "Eemalda" diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index d0d43c0ad..1263768f7 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -49,20 +49,10 @@ "Gaztelania (AEB)" "Hinglisha" "Serbiarra (latindarra)" - Ingelesa (Erresuma Batua) (%s) - Ingelesa (Estatu Batuak) (%s) - Gaztelania (AEB) (%s) - Hinglisha (%s) - Serbiarra (%s) %s (Tradizionala) %s (Trinkoa) "Ez dago hizkuntzarik (alfabetoa)" Alfabetoa (QWERTY) - Alfabetoa (QWERTZ) - Alfabetoa (AZERTY) - Alfabetoa (Dvorak) - Alfabetoa (Colemak) - Alfabetoa (PC) "Emojiak" "Gehitu" "Kendu" @@ -144,8 +134,6 @@ Sartu automatikoki zuriunea puntuazioen ondoren hitz berri bat idaztean Aldatu idazketa-metodoa zuriune teklarekin Teklatuaren altuera eskala - Alfabetoa (Colemak Mod-DH) - Alfabetoa (Workman) "Erabili sistemaren hizkuntzak" "Aukeratu idazketa-metodoa" "Desegin" diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index dd4c26268..0bea7d73e 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -49,20 +49,10 @@ "اسپانیایی (امریکا)" "هندی انگلیسی" "صربی (لاتین)" - انگلیسی (بریتانیا) (%s) - انگلیسی (امریکا) (%s) - اسپانیایی (امریکا) (%s) - هندی انگلیسی (%s) - صربی (%s) %s (سنتی) %s (فشرده) "بدون زبان (حروف الفبا)" "‏حروف الفبا (QWERTY)" - "‏حروف الفبا (QWERTZ)" - "‏حروف الفبا (AZERTY)" - "‏حروف الفبا (Dvorak)" - "‏حروف الفبا (Colemak)" - "‏حروف الفبا (PC)" "اموجی" "افزودن" "حذف" @@ -128,8 +118,6 @@ مدت زمان نگهداری تاریخچه کلید‌های بیشتر با فشار طولانی کلید فاصله، منوی انتخاب روش ورودی را باز می کند - حروف الفبا (Colemak Mod-DH) - حروف الفبا (Workman) ظاهر از تنظیمات سیستم پیروی می‌کند اگر غیرفعال باشد، کلید کلیپ بورد، محتوای خود را در صورت وجود جایگذاری می‌کند %sدقیقه. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index d69c5a059..a2c99618f 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -49,20 +49,10 @@ "espanja (Yhdysvallat)" "Hindienglanti" "serbialainen (latinal.)" - "englanti (UK) (%s)" - "englanti (US) (%s)" - "espanja (US) (%s)" - "Hindienglanti (%s)" - "serbialainen (%s)" "%s (perinteinen)" "%s (tiivis)" "Ei kieltä (aakkoset)" "aakkoset (QWERTY)" - "Aakkoset (QWERTZ)" - "Aakkoset (AZERTY)" - "Aakkoset (Dvorak)" - "Aakkoset (Colemak)" - "Aakkoset (PC)" "Emoji" "Lisää" "Poista" diff --git a/app/src/main/res/values-fr-rCA/strings.xml b/app/src/main/res/values-fr-rCA/strings.xml index 33575cebe..700f98635 100644 --- a/app/src/main/res/values-fr-rCA/strings.xml +++ b/app/src/main/res/values-fr-rCA/strings.xml @@ -49,20 +49,10 @@ "Espagnol (États-Unis)" "Hinglish" "Serbe (latin)" - "anglais (Royaume-Uni) (%s)" - "anglais (États-Unis) (%s)" - "espagnol (États-Unis) (%s)" - "Hinglish (%s)" - "Serbe (%s)" "%s (traditionnel)" "%s (compact)" "Aucune langue (alphabet)" "Alphabet latin (QWERTY)" - "Alphabet latin (QWERTZ)" - "Alphabet latin (AZERTY)" - "Alphabet latin (Dvorak)" - "Alphabet latin (Colemak)" - "Alphabet latin (PC)" "Emoji" "Ajouter" "Supprimer" diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index a53d5d85d..eff7b9a6f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -59,20 +59,10 @@ "Espagnol (États-Unis)" "Hindi/Anglais" "Serbe (latin)" - Anglais (Royaume-Uni) (%s) - Anglais (États-Unis) (%s) - Espagnol (États-Unis) (%s) - Hindi/Anglais (%s) - Serbe (%s) %s (Traditionnel) %s (Compact) "Aucune langue (latin)" "Alphabet latin (QWERTY)" - "Alphabet latin (QWERTZ)" - "Alphabet latin (AZERTY)" - "Alphabet latin (Dvorak)" - "Alphabet latin (Colemak)" - "Alphabet latin (PC)" Émoji "Ajouter" "Supprimer" @@ -265,8 +255,6 @@ Nouveau dictionnaire: Bordures des touches Mode jour/nuit automatique Réduire l\'espace entre les touches - Alphabet (Workman) - Alphabet (Colemak Mod-DH) Touche d\'accès aux émojis Touches supplémentaires Historique du presse-papier @@ -303,7 +291,6 @@ Nouveau dictionnaire: Rechercher "Pause" "Attente" - Alphabet (Bépo) %s (expérimental) Version Impossible de lire le fichier diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 3bddef35a..357063777 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -49,20 +49,10 @@ "Español (EUA)" "Hinglish" "Serbio (alfabeto latino)" - "Inglés (Reino Unido) (%s)" - "Inglés (EUA) (%s)" - "Español (EUA) (%s)" - "Hinglish (%s)" - "Serbio (%s)" "%s (tradicional)" "%s (compacto)" "Ningún idioma (alfabeto)" "alfabeto (QWERTY)" - "Alfabeto (QWERTZ)" - "Alfabeto (AZERTY)" - "Alfabeto (Dvorak)" - "Alfabeto (Colemak)" - "Alfabeto (PC)" "Emoji" "Engadir" "Eliminar" @@ -256,7 +246,6 @@ Escala do espazo inferior do teclado %s (Sebeolsik Final) Alfabeto (Colemak Mod-DH) - Alfabeto (Bépo) Engadir disposición persoal Elixe un ficheiro cun formato compatible. Tes información sobre os formatos en %s. Cargar ficheiro diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml index df251d843..36a152adf 100644 --- a/app/src/main/res/values-gu/strings.xml +++ b/app/src/main/res/values-gu/strings.xml @@ -49,20 +49,10 @@ "સ્પેનિશ (US)" "હિંગ્લિશ" "સર્બિયન (લેટિન)" - "અંગ્રેજી (યુકે) (%s)" - "અંગ્રેજી (યુએસ) (%s)" - "સ્પેનિશ (યુએસ) (%s)" - "હિંગ્લિશ (%s)" - "સર્બિયન (%s)" "%s (પરંપરાગત)" "%s (કોમ્પેક્ટ)" "ભાષા નથી (આલ્ફાબેટ)" "આલ્ફાબેટ (QWERTY)" - "આલ્ફાબેટ (QWERTZ)" - "આલ્ફાબેટ (AZERTY)" - "આલ્ફાબેટ (Dvorak)" - "આલ્ફાબેટ (Colemak)" - "આલ્ફાબેટ (PC)" "ઇમોજી" "ઉમેરો" "દૂર કરો" diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 18cfa548b..73214a8d4 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -49,20 +49,10 @@ "स्पेनिश (यूएस)" "हिंग्लिश" "सर्बियाई (लैटिन)" - "अंग्रेज़ी (यूके) (%s)" - "अंग्रेज़ी (यूएस) (%s)" - "स्‍पेनिश (यूएस) (%s)" - "हिंग्लिश (%s)" - "सर्बियाई (%s)" "%s (पारंपरिक)" "%s (संक्षिप्त)" "भाषा उपलब्ध नहीं है (लैटिन वर्णाक्षर)" "वर्णाक्षर (QWERTY)" - "वर्णाक्षर (QWERTZ)" - "वर्णाक्षर (AZERTY)" - "वर्णाक्षर (Dvorak)" - "वर्णाक्षर (Colemak)" - "वर्णाक्षर (PC)" "Emoji" "जोड़ें" "निकालें" diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index a65b72f7a..68156c76d 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -49,20 +49,10 @@ Španjolski (SAD) "Hinglish" "Srpski (latinica)" - Engleski (UK) (%s) - Engleski (US) (%s) - Španjolski (US) (%s) - Hinglish (%s) - Srpski (%s) %s (traditionalno) %s (kompaktno) Neodređen jezik (abeceda) Abeceda (QWERTY) - Abeceda (QWERTZ) - Abeceda (AZERTY) - Abeceda (Dvorak) - Abeceda (Colemak) - Abeceda (PC) "Emoji" "Dodaj" "Ukloni" @@ -113,9 +103,7 @@ HeliBoard provjera pravopisa Postavke HeliBoard provjere pravopisa %s (Akkhor) - Abeceda (Colemak Mod-DH) Prijedlozi - Abeceda (Workman) Povijest međuspremnika Razno Ispravci diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index e2aa6ff7a..2847f5f35 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -49,20 +49,10 @@ Spanyol (amerikai) "Hinglish (hindi-angol)" "Szerb (latin)" - Angol (brit) (%s) - Angol (amerikai) (%s) - Spanyol (amerikai) (%s) - "Hinglish (hindi-angol, %s)" - Szerb (%s) %s (Hagyományos) %s (Kompakt) "Nincs nyelv (ábécé)" "Ábécé (QWERTY)" - "Ábécé (QWERTZ)" - "Ábécé (AZERTY)" - "Ábécé (Dvorak)" - "Ábécé (Colemak)" - "Ábécé (PC)" "Hangulatjel" "Hozzáadás" "Eltávolítás" @@ -127,11 +117,9 @@ Billentyűzet magassági skála Mindig mutassa a számsort Kulcsfontosságú tippek megjelenítése - Ábécé (Colemak Mod-DH) Hosszan-lenyomott tippek megjelenítése A szóköz billentyű hosszan történő megnyomásával a beviteli módszer kiválasztási menüje jelenik meg Beviteli mód megváltoztatása a szóközzel - Ábécé (Munkás) Automatikus nappali/éjszakai üzemmód HeliBoard helyesírás-ellenőrző Csúsztató törlése diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml index 416cde7c4..e14c6ed7d 100644 --- a/app/src/main/res/values-hy/strings.xml +++ b/app/src/main/res/values-hy/strings.xml @@ -49,20 +49,10 @@ "Իսպաներեն (ԱՄՆ)" "Հինգլիշ" "Սերբերեն (Լատինական)" - "Անգլերեն (ՄԹ) (%s)" - "Անգլերեն (ԱՄՆ) (%s)" - "Իսպաներեն (ԱՄՆ) (%s)" - "Հինգլիշ (%s)" - "Սերբերեն (%s)" "%s (ավանդական)" "%s (սեղմ)" "Ոչ մի լեզվով (Այբուբեն)" "Այբուբեն (QWERTY)" - "Այբուբեն (QWERTZ)" - "Այբուբեն (AZERTY)" - "Այբուբեն (Dvorak)" - "Այբուբեն (Colemak)" - "Այբուբեն (PC)" "Զմայլիկներ" "Ավելացնել" "Հեռացնել" diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 0b419f0c9..f9dcd2f81 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -49,20 +49,10 @@ "Spanyol (AS)" "Hinglish" "Serbia (Latin)" - Inggris (UK) (%s) - Inggris (US) (%s) - Spanyol (US) (%s) - Hinglish (%s) - Serbia (%s) %s (Tradisional) %s (Ringkas) "Tidak ada bahasa (Abjad)" "Abjad (QWERTY)" - "Abjad (QWERTZ)" - "Abjad (AZERTY)" - "Abjad (Dvorak)" - "Abjad (Colemak)" - "Abjad (PC)" "Emoji" "Tambahkan" "Hapus" @@ -120,7 +110,6 @@ Tampilkan petunjuk tombol Selalu tampilkan baris angka %s mnt - Alfabet (Workman) Pemeriksa Ejaan HeliBoard Pengaturan Pemeriksa Ejaan HeliBoard Baris angka @@ -138,7 +127,6 @@ Nonaktifkan pembelajaran kata baru Menekan lama pada tombol spasi akan menampilkan menu pemilihan metode masukan Tampilkan petunjuk tekan-lama - Alfabet (Colemak Mod-DH) Batas tombol Mode siang/malam otomatis Tampilan mengikuti pengaturan sistem diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 6ab84a443..8aa90e1dc 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -49,20 +49,10 @@ "Spænskt (US)" "Hinglish" "Serbneskt (latneskt)" - "Enskt (Bretland) (%s)" - "Enskt (Bandaríkin) (%s)" - "Spænskt (Bandaríkin) (%s)" - "Hinglish (%s)" - "Serbneskt (%s)" "%s (hefðbundið)" "%s (lítið)" "Ekkert tungumál (stafróf)" "Stafróf (QWERTY)" - "Stafróf (QWERTZ)" - "Stafróf (AZERTY)" - "Stafróf (Dvorak)" - "Stafróf (Colemak)" - "Stafróf (tölva)" Tjáningartákn "Bæta við" "Fjarlægja" diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 1595c4c9d..d63f7fe18 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -49,20 +49,10 @@ Spagnolo (Stati Uniti) "Hinglish" Serbo (Latino) - Inglese (Regno Unito) (%s) - Inglese (Stati Uniti) (%s) - Spagnolo (Stati Uniti) (%s) - Hinglish (%s) - Serbo (%s) %s (tradizionale) %s (compatto) "Nessuna lingua (alfabeto)" "Alfabeto (QWERTY)" - "Alfabeto (QWERTZ)" - "Alfabeto (AZERTY)" - "Alfabeto (Dvorak)" - "Alfabeto (Colemak)" - "Alfabeto (PC)" "Emoji" "Aggiungi" "Rimuovi" @@ -111,11 +101,9 @@ "Altre lingue…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" Altezza tastiera - Alfabeto (Colemak Mod-DH) Spazio automatico dopo la punteggiatura Altri tasti Aggiunge automaticamente uno spazio dopo ogni parola seguita da punteggiatura - Alfabeto (Workman) Cronologia appunti %s min Nessun limite @@ -229,7 +217,6 @@ %s (Tipo tastiera Sebeolsik Final) Chiaro Imposta un\'immagine di sfondo - Alfabeto (Bépo) Altri simboli Vuoi impostare l\'immagine per il tema chiaro o scuro? Dizionari diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 1f0853d28..14a88373a 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -49,20 +49,10 @@ "ספרדית (ארצות הברית)" "אנגלית הודית" "סרבית (באותיות לטיניות)" - אנגלית (בריטניה)‏ %s) - אנגלית (ארה\"ב) ‏%s) - ספרדית (ארה\"ב) ‏%s) - אנגלית הודית %s) - סרבית ) %s) "%s (מסורתית)" "%s (קומפקטית)" "ללא שפה (אלף-בית)" "‏אלף-בית (QWERTY)" - "‏אלף-בית (QWERTZ)" - "‏אלף-בית (AZERTY)" - "‏אלף-בית (Dvorak)" - "‏אלף-בית (Colemak)" - "‏אלף-בית (PC)" "אמוג\'י" "הוסף" "הסר" @@ -130,10 +120,8 @@ בודק האיות של HeliBoard היסטוריית הלוח רווח אוטומטי לאחר סימני פיסוק - אלפבית (Colemak Mod-DH) המראה יעקוב אחר הגדרות המערכת הוסף רווח אוטומטי לאחר סימני פיסוק בעת הקלדת מילה חדשה - אלפבית (עובד) הגדרות HeliBoard קֶלֶט נסיוני diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index bcaa4b17a..9cdc3555f 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -49,20 +49,10 @@ "スペイン語 (米国)" "ヒングリッシュ" "セルビア語(ラテン文字)" - "英語(英国)(%s)" - "英語(米国)(%s)" - "スペイン語(米国)(%s)" - "ヒングリッシュ(%s)" - "セルビア語(%s)" "%s(伝統言語)" "%s(コンパクト)" "言語なし(アルファベット)" "アルファベット(QWERTY)" - "アルファベット(QWERTZ)" - "アルファベット(AZERTY)" - "アルファベット(Dvorak)" - "アルファベット(Colemak)" - "アルファベット(PC)" "絵文字" "追加" "削除" diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 04b1e76f8..2dcc37652 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -49,20 +49,10 @@ "ესპანური (აშშ)" "ჰინგლისური" "სერბული (ლათინური)" - ინგლისური (UK) %s - ინგლისური (აშშ) (%s) - ესპანური (აშშ) (%s) - ჰინგლისური (%s) - სერბული (%s) %s (ტრადიციული) %s (კომპაქტური) "ენის გარეშე (ლათინური ანბანი)" "ლათ. ანბანი (QWERTY)" - "ანბანი (QWERTZ)" - "ანბანი (AZERTY)" - "ანბანი (Dvorak)" - "ანბანი (Colemak)" - "ანბანი (PC)" "სიცილაკები" "დამატება" "ამოშლა" @@ -142,13 +132,11 @@ მინიშნებები ექსპერიმენტალური რიცხვებიანი მწკრივის ყოველთვის ჩვენება - ანბანი (Workman) %sწთ. ისტორიის შენახვის დრო მეტი ღილაკი კლავიატურის სიმაღლის მასშტაბი ღილაკის კონტურები - ანბანი (Colemak Mod-DH) დღის/ღამის ავტ. არჩევანი "დაბრუნება" "გამეორება" diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index 7ac658539..c3b97069b 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -49,20 +49,10 @@ "Испан (АҚШ)" "Хинглиш" "Серб (латын жазуы)" - "Ағылшын (Құрама Корольдік) (%s)" - "Ағылшын (АҚШ) (%s)" - "Испан (АҚШ) (%s)" - "Хинглиш (%s)" - "Серб (%s)" "%s (дәстүрлі)" "%s (шағын)" "Тіл жоқ (әліпби)" "Әліпби (QWERTY)" - "Әліпби (QWERTZ)" - "Әліпби (AZERTY)" - "Әліпби (Dvorak)" - "Әліпби (Colemak)" - "Әліпби (ДК)" "Эмодзи" "Қосу" "Өшіру" diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml index 813846419..fa2d79c35 100644 --- a/app/src/main/res/values-km/strings.xml +++ b/app/src/main/res/values-km/strings.xml @@ -50,20 +50,10 @@ "អេស្ប៉ាញ (សហរដ្ឋ​អាមេរិក​)" "Hinglish" "សើប (ឡាតាំង​)" - "អង់គ្លេស (ចក្រភព​អង់គ្លេស) (%s)" - "អង់គ្លេស (អាមេរិក) (%s)" - "អេស្ប៉ាញ (អាមេរិក) (%s)" - "Hinglish (%s)" - "សើប (%s)" "%s (អក្សរ​ពេញ)" "%s (បង្រួម)" "គ្មាន​ភាសា (អក្សរ​ក្រម)" "តាម​លំដាប់​អក្សរក្រម (QWERTY)" - "តាម​លំដាប់​អក្សរក្រម (QWERTZ)" - "តាម​លំដាប់​អក្សរក្រម (AZERTY)" - "តាម​លំដាប់​អក្សរក្រម (Dvorak)" - "តាម​លំដាប់​អក្សរក្រម (Colemak)" - "តាម​លំដាប់​អក្សរក្រម (កុំព្យូទ័រ)" "សញ្ញា​អារម្មណ៍" "បន្ថែម" "លុប​ចេញ" diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml index 10e8f28ed..e6ee70c29 100644 --- a/app/src/main/res/values-kn/strings.xml +++ b/app/src/main/res/values-kn/strings.xml @@ -49,21 +49,11 @@ "ಸ್ಪ್ಯಾನಿಷ್ (US)" "ಹಿಂಗ್ಲಿಷ್" "ಸರ್ಬಿಯನ್ (ಲ್ಯಾಟಿನ್)" - "ಇಂಗ್ಲಿಷ್ (ಯುಕೆ) (%s)" - "ಇಂಗ್ಲಿಷ್ (US) (%s)" - "ಸ್ಪ್ಯಾನಿಷ್ (US) (%s)" - "ಹಿಂಗ್ಲಿಷ್ (%s)" "%s (ವಿಸ್ತರಿಸಲಾಗಿದೆ)" - "ಸರ್ಬಿಯನ್ (%s)" "%s (ಸಾಂಪ್ರದಾಯಿಕ)" "%s (ಕಾಂಪ್ಯಾಕ್ಟ್‌‌)" "ಯಾವುದೇ ಭಾಷೆಯಿಲ್ಲ (ವರ್ಣಮಾಲೆ)" "ವರ್ಣಮಾಲೆ (QWERTY)" - "ವರ್ಣಮಾಲೆ (QWERTZ)" - "ವರ್ಣಮಾಲೆ (AZERTY)" - "ವರ್ಣಮಾಲೆ (ಡ್ವೊರಕ್)" - "ವರ್ಣಮಾಲೆ (ಕೋಲ್‌ಮ್ಯಾಕ್)" - "ವರ್ಣಮಾಲೆ (PC)" "ಎಮೋಜಿ" "ಸೇರಿಸು" "ತೆಗೆದುಹಾಕಿ" diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 0863c8235..68ea38926 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -49,20 +49,10 @@ "스페인어(미국)" "인도 영어" "세르비아어(라틴 문자)" - 영어(영국)(%s) - 영어(미국)(%s) - 스페인어 (미국) (%s) - 인도 영어(%s) - 세르비아어(%s) %s (번체) %s (소형) "언어 없음(알파벳)" "알파벳(QWERTY)" - "알파벳(QWERTZ)" - "알파벳(AZERTY)" - "알파벳(드보락)" - "알파벳(콜맥)" - "알파벳(PC)" "이모티콘" "추가" "삭제" @@ -146,9 +136,7 @@ 시스템 설정에 따른 모양 한번에 많은 글자들을 선택하고 제거하기 위해서는 삭제 키를 스와이프하기 키의 경계 - 알파벳 (Workman) %s (벵골어) - 알파벳 (Colemak Mod-DH) "실행취소" "다시 실행" "사용자의 대화 내용과 입력한 데이터를 통해 단어 추천의 정확도를 개선합니다." diff --git a/app/src/main/res/values-ky/strings.xml b/app/src/main/res/values-ky/strings.xml index c038863d0..495759c91 100644 --- a/app/src/main/res/values-ky/strings.xml +++ b/app/src/main/res/values-ky/strings.xml @@ -49,20 +49,10 @@ "Испанча (US)" "Хинглиш" "Сербче (Латын)" - "Англисче (UK) (%s)" - "Англисче (US) (%s)" - "Испанча (US) (%s)" - "Хинглиш (%s)" - "Сербче (%s)" "%s (Салттык)" "%s (Чакан)" "Тил жок (Алфавит)" "Алфавит (QWERTY)" - "Алфавит (QWERTZ)" - "Алфавит (AZERTY)" - "Алфавит (Dvorak)" - "Алфавит (Colemak)" - "Алфавит (PC)" "Эмодзи" "Кошуу" "Алып салуу" diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index ad9fdad0f..ea113a300 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -50,20 +50,10 @@ "ສະເປນ (ອາເມລິກາ)" "ຮິງ​ລິສ" "ເຊີ​ບຽນ (​ລາ​ຕິນ)" - "ອັງ​ກິດ (ສະ​ຫະ​ລາດ​ຊະ​ອາ​ນາ​ຈັກ) (%s)" - "ອັງ​ກິດ (ສະ​ຫະ​ລັດຯ) (%s)" - "ສະ​ແປນ​ນິດ (ສະ​ຫະ​ລັດຯ) (%s)" - "ຮິງ​ລິສ (%s)" - "ເຊີ​ບຽນ (%s)" "%s (ດັ້ງ​ເດີມ)" "%s (ກະ​ທັດ​ຮັດ)" "ບໍ່ມີພາສາ (ໂຕອັກສອນ)" "ໂຕອັກສອນ (QWERTY)" - "ໂຕອັກສອນ (QWERTZ)" - "ໂຕອັກສອນ (AZERTY)" - "ໂຕອັກສອນ (Dvorak)" - "ໂຕອັກສອນ (Colemak)" - "ໂຕອັກສອນ (PC)" "ອີໂມຈິ" "ເພີ່ມ" "ລຶບອອກ" diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index f89c6cbbd..6b63b86f8 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -49,20 +49,10 @@ "Ispanų k. (JAV)" "Hindi ir anglų k. derinys" "Serbų k. (lot. rašmenys)" - "Anglų (JK) (%s)" - "Anglų (JAV) (%s)" - "Ispanų (JAV) (%s)" - "Hindi ir anglų derinys (%s)" - "Serbų k. (%s)" "%s (tradicinė)" "%s (kompaktiška)" "Kalbos nėra (abėcėlė)" "Abėcėlė (QWERTY)" - "Abėcėlė (QWERTZ)" - "Abėcėlė (AZERTY)" - "Abėcėlė (Dvorako)" - "Abėcėlė („Colemak“)" - "Abėcėlė (PC)" "Jaustukai" "Pridėti" "Pašalinti" diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 6d20ab598..23324d3ff 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -49,20 +49,10 @@ "Spāņu (ASV)" "Hindi–angļu valoda" "Serbu (latīņu)" - "Angļu (Lielbritānija) (%s)" - "Angļu (ASV) (%s)" - "Spāņu (ASV) (%s)" - "Hindi–angļu valoda (%s)" - "Serbu (%s)" "%s (tradicionālā)" "%s (kompaktā)" "Nav valodas (alfabēts)" "Alfabēts (QWERTY)" - "Alfabēts (QWERTZ)" - "Alfabēts (AZERTY)" - "Alfabēts (Dvorak)" - "Alfabēts (Colemak)" - "Alfabēts (PC)" "Japāņu emocijzīmes" "Pievienot" "Noņemt" diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 03f524bc3..6aa873244 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -49,20 +49,10 @@ "шпански (САД)" "Хинглиш" "Српски (латиница)" - "англиски (ОК) (%s)" - "англиски (САД) (%s)" - "шпански (САД) (%s)" - "Хинглиш (%s)" - "Српски (%s)" "%s (традиционален)" "%s (Компактна)" "Нема јазик (азбука)" "Азбука (QWERTY)" - "Азбука (QWERTZ)" - "Азбука (AZERTY)" - "Азбука (Dvorak)" - "Азбука (Colemak)" - "Азбука (PC)" "Емотикони" "Додај" "Отстрани" diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 72c161fc6..23b2fd551 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -49,20 +49,10 @@ "സ്‌പാനിഷ് (യുഎസ്)" "ഹിംഗ്ലീഷ്" "സെർബിയൻ (ലാറ്റിൻ)" - ഇംഗ്ലീഷ് (യുകെ) (%s) - ഇംഗ്ലീഷ് (യുഎസ്) (%s) - സ്‌പാനിഷ് (യുഎസ്) (%s) - ഹിംഗ്ലീഷ് (%s) - സെർബിയൻ (%s) %s (പരമ്പരാഗതം) %s (കോം‌പാക്‌ട്) "ഭാഷയില്ല (അക്ഷരമാല)" "അക്ഷരമാല (QWERTY)" - "അക്ഷരമാല (QWERTZ)" - "അക്ഷരമാല (AZERTY)" - "അക്ഷരമാല (Dvorak)" - "അക്ഷരമാല (Colemak)" - "അക്ഷരമാല (PC)" "ഇമോജി" "ചേര്‍ക്കുക" "നീക്കംചെയ്യുക" @@ -138,8 +128,6 @@ വിരാമചിഹ്നത്തിന് ശേഷം ഒരു പുതിയ വാക്ക് ടൈപ്പുചെയ്യുമ്പോൾ സ്വയം സ്പേസ് ചേർക്കുക സ്പേസ് കീ ദീർഘനേരം അമർത്തുന്നത് ഇൻപുട്ട് രീതി തിരഞ്ഞെടുക്കൽ മെനു പ്രദർശിപ്പിക്കും കീബോർഡ് ഉയരം സ്കെയിൽ - അക്ഷരമാല (Colemak Mod-DH) - അക്ഷരമാല (ജോലിക്കാരൻ) വിരാമചിഹ്നത്തിനു ശേഷമുള്ള ഓട്ടോസ്പേസ് %s (അഖോർ ) പരീക്ഷണാത്മകം diff --git a/app/src/main/res/values-mn/strings.xml b/app/src/main/res/values-mn/strings.xml index 6ab815798..c7a2dc27b 100644 --- a/app/src/main/res/values-mn/strings.xml +++ b/app/src/main/res/values-mn/strings.xml @@ -49,20 +49,10 @@ "Испани (АНУ)" "Хинглиш" "Серьби хэл (латин)" - "Англи (ИБ) ( %s )" - "Англи (АНУ) ( %s )" - "Испани (АНУ-ын) (%s)" - "Хинглиш (%s)" - "Серьби хэл (%s)" "%s (уламжлалт)" "%s (Компакт)" "Хэл байхгүй (Цагаан толгой)" "Цагаан толгой (QWERTY)" - "Цагаан толгой (QWERTZ)" - "Цагаан толгой (AZERTY)" - "Цагаан толгой (Dvorak)" - "Цагаан толгой (Colemak)" - "Цагаан толгой (PC)" "Инээмсэглэл" "Нэмэх" "Устгах" diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml index 154a9169d..26e10c89e 100644 --- a/app/src/main/res/values-mr/strings.xml +++ b/app/src/main/res/values-mr/strings.xml @@ -49,20 +49,10 @@ "स्पॅनिश (यूएस)" "हिंग्लिश" "सर्बियन (लॅटिन)" - "इंग्रजी (यूके) (%s)" - "इंग्रजी (यूएस) (%s)" - "स्पॅनिश (यूएस) (%s)" - "हिंग्लिश (%s)" - "सर्बियन (%s)" "%s (पारंपारिक)" "%s (संक्षिप्त)" "भाषा नाही (वर्णमाला)" "वर्णमाला (QWERTY)" - "वर्णमाला (QWERTZ)" - "वर्णमाला (AZERTY)" - "वर्णमाला (ड्व्होरॅक)" - "वर्णमाला (कोलमॅक)" - "वर्णमाला (PC)" "इमोजी" "जोडा" "काढा" diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 11126791c..817f5d9ad 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -50,20 +50,10 @@ "Bahasa Sepanyol (AS)" "Hinglish" "Bahasa Serbia (Latin)" - "Bahasa Inggeris (UK) (%s)" - "Bahasa Inggeris (AS) (%s)" - "Bahasa Sepanyol (AS) (%s)" - "Hinglish (%s)" - "Bahasa Serbia (%s)" "%s (Tradisional)" "%s (Sarat)" "Tiada bahasa (Abjad)" "Abjad (QWERTY)" - "Abjad (QWERTZ)" - "Abjad (AZERTY)" - "Abjad (Dvorak)" - "Abjad (Colemak)" - "Abjad (PC)" "Emoji" "Tambah" "Alih Keluar" diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index c9c82653a..669d9d6fd 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -49,20 +49,10 @@ "စပိန် (ယူအက်စ်)" "ဟင်ဂလိပ်" "ဆားဘီယား (လက်တင်)" - "အင်္ဂလိပ် (ယူကေ) (%s)" - "အင်္ဂလိပ် (ယူအက်စ်) (%s)" - "စပိန် (ယူအက်စ်) (%s)" - "ဟင်ဂလိပ် (%s)" - "ဆားဘီယား (%s)" "%s (ရိုးရာ)" "%s (ကျစ်လစ်သော)" "ဘာသာစကားမရှိ (ဗျည်းအက္ခရာ)" "ဗျည်းအက္ခရာ (ကွာတီ)" - "ဗျည်းအက္ခရာ (ကွာတီ)" - "ဗျည်း (အဇာတည်)" - "ဗျည်းအက္ခရာ (ဒီဘိုရခ်)" - "ဗျည်းအက္ခရာ (ကိုလ်မာ့ခ်)" - "ဗျည်း (PC)" "အီမိုဂျီ" "ထည့်ရန်" "ဖယ်ရှားပါ" diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index b881f5837..1b15eb57c 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -49,20 +49,10 @@ "spansk (USA)" "Hinglish" "Serbisk (latin)" - "Engelsk (Storbritannia) (%s)" - "Engelsk (USA) (%s)" - Spansk (USA) (%s) - "Hinglish (%s)" - "Serbisk (%s)" "%s (tradisjonelt)" "%s (kompakt)" "Ingen språk (alfabet)" Alfabet (QWERTY) - "Alfabet (QWERTZ)" - "Alfabet (AZERTY)" - "Alfabet (Dvorak)" - "Alfabet (Colemak)" - "Alfabet (PC)" "Emoji" "Legg til" "Fjern" @@ -115,10 +105,8 @@ Automatisk dag/nattmodus Langtrykke på mellomromstasten for inndatametode-valgmeny HeliBoard-innstillinger - Alfabet (Colemak Mod-DH) HeliBoard-stavekontroll Innstillinger for HeliBoard-stavekontroll - Alfabet (Workman) Slettingsdragning Emoji-tast Utfør en dragning fra Delete-tasten for å velge og fjerne større deler av tekst samtidig diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index fec0e8952..c89d66c3f 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -49,20 +49,10 @@ "स्पेनिस (युएस्)" "हिङ्लिस" "सर्बियाई (ल्याटिन)" - "अंग्रेजी (बेलायत) ( %s )" - "अंग्रेजी (अमेरिका) (%s)" - "स्पेनेली (अमेरिका) (%s)" - "हिङ्लिस (%s)" - "सर्बियाई (%s)" "%s (परम्परागत)" "%s (संकुचित)" "कुनै भाषा होइन (वर्णमाला)" "वर्णमाला (QWERTY)" - "वर्णमाला (QWERTZ)" - "वर्णमाला (AZERTY)" - "वर्णमाला (Dvorak)" - "वर्णमाला (Colemak)" - "वर्णमाला (PC)" "इमोजी" "थप्नुहोस्" "हटाउनुहोस्" diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 3e92584f9..7aa36b0e1 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -49,20 +49,10 @@ "Spaans (VS)" "Hindi-Engels" "Servisch (Latijns)" - Engels (VK) (%s) - Engels (VS) (%s) - Spaans (VS) (%s) - Hindi-Engels (%s) - Servisch (%s) %s (Traditional) %s (Compact) "Geen taal (alfabet)" "Alfabet (QWERTY)" - "Alfabet (QWERTZ)" - "Alfabet (AZERTY)" - "Alfabet (Dvorak)" - "Alfabet (Colemak)" - Alfabet (PC) "Emoji" "Toevoegen" "Verwijderen" @@ -142,8 +132,6 @@ Toetsenbordhoogte schaal %s (Akkhor) Invoermethode schakelen met spatietoets - Alfabet (Colemak Mod-DH) - Alfabet (Workman) Toetsranden Automatisch spatie invoegen na interpunctie en het typen van een nieuw woord HeliBoard-instellingen diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 6cfaeee81..f446c66aa 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -49,20 +49,10 @@ "ਸਪੇਨੀ (ਅਮਰੀਕਾ)" "ਹਿੰਗਲਿੰਸ਼" "ਸਰਬੀਅਨ (ਲਾਤੀਨੀ)" - "ਅੰਗਰੇਜ਼ੀ (ਯੂ.ਕੇ.) (%s)" - "ਅੰਗਰੇਜ਼ੀ (ਅਮਰੀਕਾ) (%s)" - "ਸਪੇਨੀ (ਅਮਰੀਕਾ) (%s)" - "ਹਿੰਗਲਿਸ਼(%s)" - "ਸਰਬੀਅਨ (%s)" "%s (ਪਰੰਪਰਿਕ)" "%s (ਸੰਖਿਪਤ)" "ਕੋਈ ਭਾਸ਼ਾ ਨਹੀਂ (ਵਰਨਮਾਲਾ)" "ਵਰਨਮਾਲਾ (QWERTY)" - "ਵਰਨਮਾਲਾ (QWERTZ)" - "ਵਰਨਮਾਲਾ (AZERTY)" - "ਵਰਨਮਾਲਾ (ਵੋਰਕ)" - "ਵਰਨਮਾਲਾ (ਕੋਲਮੈਕ)" - "ਵਰਨਮਾਲਾ (PC)" "ਇਮੋਜੀ" "ਸ਼ਾਮਲ ਕਰੋ" "ਹਟਾਓ" diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index dd4af563c..4350ad2be 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -50,20 +50,10 @@ "Hiszpański (USA)" hinglish serbski (alfabet łaciński) - Angielski (Wielka Brytania) (%s) - Angielski (USA) (%s) - Hiszpański (USA) (%s) - hinglish (%s) - serbski (%s) %s (tradycyjny) %s (kompaktowy) standardowy (Alfabet) "Alfabet (QWERTY)" - "Alfabet (QWERTZ)" - "Alfabet (AZERTY)" - "Alfabet (Dvorak)" - "Alfabet (Colemak)" - "Alfabet (PC)" "Emotikony" "Dodaj" "Usuń" @@ -128,14 +118,12 @@ Zawsze pokazuj rząd numeryczny Zmień metodę wprowadzania za pomocą spacji Pokazuj wskazówki dotyczące długiego naciśnięcia przycisku - Alfabet (Colemak Mod-DH) Przesuń palcem od klawisza usuwania, aby zaznaczyć i usunąć większe fragmenty tekstu za jednym razem Po wyłączeniu, klawisz schowka będzie wklejał zawartość schowka, jeśli taka istnieje Gest usunięcia Długie naciśnięcie klawisza spacji spowoduje wyświetlenie menu wyboru metody wprowadzania tekstu Pokazuj wskazówki klawiszy Skala wysokości klawiatury - Alfabet (Workman) %s (Akkhor) Ustawienia HeliBoard Dodatkowe klawisze @@ -263,7 +251,6 @@ Akcent Zobacz na GitHubie Rząd numeryczny - Alfabet (Bépo) Przywracanie Wybierz kolejność klawiszy w wyskakującym okienku Wersja diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 745a8b57d..f4f4460ca 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -52,11 +52,8 @@ Espanhol (Estados Unidos) Hinglês Sérvio (Latino) - Espanhol (Estados Unidos) (%s) - Sérvio %s Nepali (Nepal) %s (Tradicional) Bengali (Bangladesh) %s (Akkhor) - Alfabeto (PC) Emojis Adicionar Remover @@ -111,18 +108,9 @@ Alterar método de entrada com a tecla de espaço Tempo de retenção do histórico Linha de números - Inglês (Reino Unido) %s - Inglês (Estados Unidos) %s - Hinglês %s Nenhum idioma (Alfabeto) Alfabeto (QWERTY) %s já está ativado nas configurações de \'Idiomas e Entrada\'. Esta etapa já está concluída. Vamos para a próxima! - Alfabeto (QWERTZ) - Alfabeto (AZERTY) - Alfabeto (Dvorak) - Alfabeto (Colemak) - Alfabeto (Colemak Mod-DH) - Alfabeto (Workman) Bem-vindo ao %s Mostrar a paleta de emojis ao tocar na tecla Alt física Configurando %s diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 4573e82d9..03e0b9414 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -50,20 +50,10 @@ "Espanhol (EUA)" Hindi-Inglês Sérvio (Latino) - Inglês (Reino Unido) %s - Inglês (EUA) %s - Espanhol (EUA) (%s) - Hindi-inglês %s - Sérvio %s %s (Tradicional) %s (Compacto) Nenhum idioma (alfabeto) "Alfabeto (QWERTY)" - "Alfabeto (QWERTZ)" - "Alfabeto (AZERTY)" - "Alfabeto (Dvorak)" - "Alfabeto (Colemak)" - "Alfabeto (PC)" Emojis "Adicionar" "Remover" @@ -134,8 +124,6 @@ Alterar método de introdução com a tecla Espaço Toque longo na tecla Espaço abre menu de seleção do método de introdução Altura do teclado - Alfabeto (Colemak Mod-DH) - Alfabeto (Workman) Limite das teclas Definições do corretor ortográfico de HeliBoard Confiança da correção automática diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 31a03b0f2..c86114287 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -49,20 +49,10 @@ Espanhol (EUA) Hindi-Inglês "Sérvio (Latino)" - Inglês (Reino Unido) %s - Inglês (EUA) %s - Espanhol (EUA) (%s) - Hindi-inglês %s - Sérvio %s %s (Tradicional) %s (Compacto) "Nenhum idioma (alfabeto)" "Alfabeto (QWERTY)" - "Alfabeto (QWERTZ)" - "Alfabeto (AZERTY)" - "Alfabeto (Dvorak)" - "Alfabeto (Colemak)" - "Alfabeto (PC)" "Emojis" "Adicionar" "Remover" @@ -114,7 +104,6 @@ Definições de verificação ortográfica HeliBoard Número de linha Mostrar sempre n.º de linha - Alfabeto (Colemak Mod-DH) Desativar aprendizagem de palavras Impor modo incógnito Tecla de emoji @@ -133,7 +122,6 @@ Mostrar dicas com toque longo Limite das teclas Teclas adicionais - Alfabeto (Workman) Aparência usa as definições do sistema Modo diurno/noturno automático Alterar método de introdução com a tecla Espaço diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index e6c17c2e5..9db923dc4 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -49,20 +49,10 @@ "spaniolă (S.U.A.)" "Hinglish" "Sârbă (caractere latine)" - "Engleză (Regatul Unit) (%s)" - "Engleză (S.U.A.) (%s)" - "Spaniolă (S.U.A.) (%s)" - "Hinglish (%s)" - "Sârbă (%s)" "%s (tradițională)" "%s (Compact)" "Nicio limbă (alfabet)" "Alfabet (QWERTY)" - "Alfabet (QWERTZ)" - "Alfabet (AZERTY)" - "Alfabet (Dvorak)" - "Alfabet (Colemak)" - "Alfabet (PC)" "Emoji" Adaugă Elimină diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 6f6608dce..221eb54ec 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -52,23 +52,10 @@ Мансийский Кайтагский Сербский (латиница) - Английский (Великобритания) (%s) - Английский (США) (%s) - Испанский (США) (%s) - Хинглиш (%s) - Мансийский (%s) - Урахинский (%s) - Кайтагский (%s) - Сербский (%s) %s (Традиционная) %s (Компактная) Стандартная (латиница) Латиница (QWERTY) - Латиница (QWERTZ) - Латиница (AZERTY) - Латиница (Dvorak) - Латиница (Colemak) - Латиница (ПК) Эмодзи Добавить Удалить @@ -149,7 +136,6 @@ Время хранения журнала буфера обмена %s (Акхор) Даргинский (Урахи) - Латиница (Workman) Контуры клавиш Использовать тему системы Стиль темы @@ -161,7 +147,6 @@ Если отключено, клавиша буфера обмена вставит содержимое буфера обмена, если оно есть Автоматически добавлять пробел после знаков препинания Изменять метод ввода с помощью пробела - Латиница (Colemak Mod-DH) Экспериментальные Другие настройки (разное) Исправления @@ -245,7 +230,6 @@ Буфер обмена Индиго Ряд с цифрами - Алфавит (Бепо) Выберите порядок всплывающих клавиш Выберите источник подсказки Выберите язык diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index d0c6e07ba..d25f85496 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -49,20 +49,10 @@ "ස්පාඤ්ඤ (US)" "හින්ග්ලිෂ්" "සර්බියානු (ලතින්)" - "ඉංග්‍රීසි (එ.රා) (%s)" - "ඉංග්‍රීසි (එ.ජ) (%s)" - "ස්පාඤ්ඤ (එ.ජ) (%s)" - "හින්ග්ලිෂ් (%s)" - "සර්බියානු (%s)" "%s (සාම්ප්‍රදායික)" "%s (සංයුක්ත)" "භාෂාවක් නැත (අකාරාදිය)" "අකාරාදිය (QWERTY)" - "අකාරාදිය (QWERTZ)" - "අකාරාදිය (AZERTY)" - "අකාරාදිය (Dvorak)" - "අකාරාදිය (Colemak)" - "අකාරාදිය (PC)" "ඉමොජි" "එක් කරන්න" "ඉවත් කරන්න" diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 065ad2ee5..22c7af031 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -49,20 +49,10 @@ "španielčina (USA)" Indická angličtina "srbčina (latinka)" - "angličtina (VB) (%s)" - "angličtina (USA) (%s)" - "španielčina (USA) (%s)" - "Hinglish (%s)" - "srbčina (%s)" "%s (tradičná)" "%s (kompaktná)" "Žiadny jazyk (latinka)" "latinka (QWERTY)" - "Latinka (QWERTZ)" - "Latinka (AZERTY)" - "Latinka (Dvorak)" - "Latinka (Colemak)" - "Latinka (PC)" "Emoji" "Pridať" "Odstrániť" diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 7eced5e87..8c9b545d7 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -49,20 +49,10 @@ "španščina (ZDA)" "Hindujska angleščina" "Srbščina (latinica)" - "angleščina (VB) (%s)" - "angleščina (ZDA) (%s)" - "španščina (ZDA) (%s)" - "Hindujska angleščina (%s)" - "Srbščina (%s)" "%s (tradicionalna)" "%s (kompaktna)" "Brez jezika (latinice)" "Latinica (QWERTY)" - "Latinica (QWERTZ)" - "Latinica (AZERTY)" - "Latinica (Dvorak)" - "Latinica (Colemak)" - "Latinica (PC)" "Emodžiji" "Dodaj" "Odstrani" diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 74050b52e..e9987b4f6 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -50,20 +50,10 @@ "spanjisht (SHBA)" "hinglisht" "serbisht (latin)" - "anglisht (MB) (%s)" - "anglisht (SHBA) (%s)" - "spanjisht (SHBA) (%s)" - "hinglisht (%s)" - "serbisht (%s)" "%s (tradicionale)" "%s (kompakte)" "nuk ka gjuhë (alfabeti)" "alfabeti (QWERTY)" - "alfabeti (QWERTZ)" - "alfabeti (AZERTY)" - "alfabeti (dvorak)" - "alfabeti (Colemak)" - "alfabeti (PC)" "\"Emoji\"" "Shto" "Hiq" diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index fcee9f37c..bb0a812ff 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -49,20 +49,10 @@ "шпански (САД)" "хенглески" "српски (латиница)" - енглески (UK) (%s) - енглески (US) (%s) - шпански (US) (%s) - хенглески (%s) - српски (%s) %s (традиционални) %s (компактна) "Нема језика (абецеда)" "абецеда (QWERTY)" - "абецеда (QWERTZ)" - "абецеда (AZERTY)" - "абецеда (Dvorak)" - "абецеда (Colemak)" - "абецеда (PC)" "Емотикони" "Додај" "Уклони" @@ -133,8 +123,6 @@ Аутоматски режим дан/ноћ Изглед ће пратити подешавања система %s (Акхор) - Абецеда (Colemak Mod-DH) - Абецеда (Workman) Без лимита Омогући историју међуспремника Време задржавања историје diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 0d706689b..afed73253 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -49,20 +49,10 @@ Spanska (USA) Hingelska "Serbiska (latinsk)" - Engelska (UK) (%s) - Engelska (USA) (%s) - Spanska (USA) (%s) - Hingelska (%s) - Serbiska (%s) %s (traditionell) %s (kompakt) "Inget språk (alfabet)" "Alfabet (QWERTY)" - "Alfabet (QWERTZ)" - "Alfabet (AZERTY)" - "Alfabet (Dvorak)" - "Alfabet (Colemak)" - Alfabet (pc) Emoji "Lägg till" "Ta bort" @@ -141,8 +131,6 @@ Fler tangenter Skala för tangentbordets höjd %s (akkhor) - Alfabet (Colemak Mod-DH) - Alfabet (Workman) Kantlinjer runt tangenter Automatiskt dag-/nattläge Utseendet kommer att följa systeminställningarna diff --git a/app/src/main/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml index 7b249231e..6d084a1bb 100644 --- a/app/src/main/res/values-sw/strings.xml +++ b/app/src/main/res/values-sw/strings.xml @@ -50,20 +50,10 @@ "Kihispania (Marekani)" "Hinglish" "Kiserbia (Kilatino)" - "Kiingereza (UK) (%s)" - "Kiingereza (US) (%s)" - "Kihispania (US) (%s)" - "Hinglish (%s)" - "Kiserbia (%s)" "%s (cha Jadi)" "%s (Thabiti)" "Hakuna lugha (Alfabeti)" "Alfabeti (QWERTY)" - "Alfabeti (QWERTZ)" - "Alfabeti (AZERTY)" - "Alfabeti (Dvorak)" - "Alfabeti (Colemak)" - "Alfabeti (PC)" "Emoji" "Ongeza" "Ondoa" diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index ceb060b1a..17a8b5a16 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -49,20 +49,10 @@ "ஸ்பானிஷ் (யூஎஸ்)" "ஹிங்கிலிஷ்" "செர்பியன் (லத்தீன்)" - "ஆங்கிலம் (யூகே) (%s)" - "ஆங்கிலம் (யூஎஸ்) (%s)" - "ஸ்பானிஷ் (யூஎஸ்) (%s)" - "ஹிங்கிலிஷ் (%s)" - "செர்பியன் (%s)" "%s (பாரம்பரியமானது)" "%s (வசதியான)" "மொழியில்லை (அகரவரிசை)" "அகரவரிசை (க்வெர்டி)" - "அகரவரிசை (க்வெர்ட்ச்)" - "அகரவரிசை (எசெர்டி)" - "அகரவரிசை (ட்வொராக்)" - "அகரவரிசை (கொல்மக்)" - "அகரவரிசை (பிசி)" "எமோஜி" "சேர்" "அகற்று" diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index c5bb08c13..a0e69a1b8 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -49,20 +49,10 @@ "స్పానిష్ (యుఎస్)" "హింగ్లీష్" "సెర్బియన్ (లాటిన్)" - "ఆంగ్లం (యుకె) (%s)" - "ఆంగ్లం (యుఎస్) (%s)" - "స్పానిష్ (యుఎస్) (%s)" - "హింగ్లీష్ (%s)" - "సెర్బియన్ (%s)" "%s (సాంప్రదాయకం)" "%s (కాంపాక్ట్)" "భాష లేదు (ఆల్ఫాబెట్)" "ఆల్ఫాబెట్ (QWERTY)" - "ఆల్ఫాబెట్ (QWERTZ)" - "ఆల్ఫాబెట్ (AZERTY)" - "ఆల్ఫాబెట్ (డ్వోరక్)" - "ఆల్ఫాబెట్ (కోల్‌మాక్)" - "ఆల్ఫాబెట్ (PC)" "ఎమోజి" "జోడించండి" "తీసివేయి" diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index bf1ff89b4..6a36a4408 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -50,20 +50,10 @@ "สเปน (สหรัฐอเมริกา)" "ภาษาอังกฤษผสมกับฮินดู" "เซอร์เบีย (ละติน)" - "อังกฤษ (สหราชอาณาจักร) (%s)" - "อังกฤษ (สหรัฐอเมริกา) (%s)" - "สเปน (สหรัฐอเมริกา) (%s)" - "ภาษาอังกฤษผสมกับฮินดู (%s)" - "เซอร์เบีย (%s)" "%s (ดั้งเดิม)" "%s (แบบกะทัดรัด)" "ไม่มีภาษา (ตัวอักษรละติน)" "ตัวอักษร (QWERTY)" - "ตัวอักษร (QWERTZ)" - "ตัวอักษร (AZERTY)" - "ตัวอักษร (Dvorak)" - "ตัวอักษร (Colemak)" - "ตัวอักษร (PC)" "อีโมจิ" "เพิ่ม" "ลบ" diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml index 8060d0790..a48faacbe 100644 --- a/app/src/main/res/values-tl/strings.xml +++ b/app/src/main/res/values-tl/strings.xml @@ -50,20 +50,10 @@ "Spanish (US)" "Hinglish" "Serbian (Latin)" - "English (UK) (%s)" - "English (US) (%s)" - "Spanish (US) (%s)" - "Hinglish (%s)" - "Serbian (%s)" "%s (Traditional)" "%s (Compact)" "Walang wika (Alpabeto)" "Alpabeto (QWERTY)" - "Alpabeto (QWERTZ)" - "Alpabeto (AZERTY)" - "Alpabeto (Dvorak)" - "Alpabeto (Colemak)" - "Alpabeto (PC)" "Emoji" "Idagdag" "Alisin" diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 59a3f92b3..58386c47f 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -49,20 +49,10 @@ "İspanyolca (ABD)" "Hingilizce" "Sırpça (Latin alfabesi)" - İngilizce (İngiltere) (%s) - İngilizce (ABD) (%s) - İspanyolca (ABD) (%s) - Hingilizce (%s) - Sırpça (%s) %s (Geleneksel) %s (Kompakt) "Dil yok (Alfabe)" "Alfabe (QWERTY)" - "Alfabe (QWERTZ)" - "Alfabe (AZERTY)" - "Alfabe (Dvorak)" - "Alfabe (Colemak)" - "Alfabe (PC)" "Emoji" "Ekle" "Kaldır" @@ -122,7 +112,6 @@ HeliBoard yazım denetleyicisi ayarları Klavye yükseklik ölçeği Kadırarak silme - Alfabe (Workman) Tuş kenarlıkları Otomatik gündüz/gece modu HeliBoard yazım denetleyicisi @@ -139,7 +128,6 @@ Boşluk tuşuyla giriş yöntemini değiştir %s (Akkhor) Bir kerede metnin daha büyük bölümlerini seçmek ve silmek için silme tuşundan hızlıca kaydırın - Alfabe (Colemak Mod-DH) Görünüm sistem ayarlarını takip edecektir HeliBoard ayarları Giriş diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 61365d311..0a4883c14 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -50,20 +50,10 @@ "Іспанська (США)" Гінґліш Сербська (латиниця) - Англійська (Велика Британія) (%s) - Англійська (США) (%s) - Іспанська (США) (%s) - Гінґліш (%s) - Сербська (%s) %s (Традиційна) %s (Компактна) Стандартна (латиниця) "Латиниця (QWERTY)" - "Латиниця (QWERTZ)" - "Латиниця (AZERTY)" - "Латиниця (Dvorak)" - "Латиниця (Colemak)" - "Латиниця (ПК)" Емоджі Додати Видалити @@ -169,7 +159,6 @@ Показувати підказки клавіш Змінювати метод введення клавішею пробіл Довге натискання клавіші пробіл виводить меню вибору способу введення - Алфавіт (Workman) Перевірка правопису HeliBoard Збільшені клавіші Видаляти ковзанням @@ -191,7 +180,6 @@ Завжди показувати рядок цифр Контури клавіш Додаткові клавіші - Алфавіт (Colemak Mod-DH) Конфіденційність автовиправлення Скасовувати "Повторити" diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index d74673cf3..d23a7caef 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -49,20 +49,10 @@ "ہسپانوی (امریکہ)" "ہنگلش" "سربیائی (لاطینی)" - "انگریزی (برطانیہ) (%s)" - "انگریزی (امریکہ) (%s)" - "ہسپانوی (امریکہ) (%s)" - "ہنگلش (%s)" - "سربیائی (%s)" "%s (روایتی)" "%s (کمپیکٹ)" "کوئی زبان نہیں (الفابیٹ)" "‏حروف تہجی (QWERTY)" - "‏حروف تہجی (QWERTZ)" - "‏حروف تہجی (AZERTY)" - "‏حروف تہجی (Dvorak)" - "‏حروف تہجی (Colemak)" - "‏حروف تہجی (PC)" "Emoji" "شامل کریں" "ہٹائیں" diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index 4c05577a1..f375de143 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -49,20 +49,10 @@ "Ispan (AQSH)" "Hinglish" "Serb (Lotin)" - Ingliz (Buyuk Britaniya) (%s) - Ingliz (AQSH) (%s) - Ispan (AQSH) (%s) - Hinglish (%s) - Serb (%s) %s (An’anaviy) %s(Ixcham) "Til aniqlanmadi (lotin)" "Lotin (QWERTY)" - "Lotin (QWERTZ)" - "Lotin (AZERTY)" - "Lotin (Dvorak)" - "Lotin (Colemak)" - "Lotin (shaxsiy kompyuter)" "Kulgichlar" "Qo‘shish" "Olib tashlash" @@ -139,8 +129,6 @@ Majburiy inkognito rejimi Tinish belgilaridan keyin avtomatik bo\'shliq qo‘yish %s (Akkhor) - Alfavit (Colemak Mod-DH) - Alfavit (Workman) Kiritish Qo\'shimcha kalitlar HeliBoard Sozlamalari diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 3b4bc737c..e7b7793ee 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -50,20 +50,10 @@ "Tiếng Tây Ban Nha (Mỹ)" "Tiếng Anh-Hindi" "Tiếng Serbia (La tinh)" - "Tiếng Anh (Anh) (%s)" - "Tiếng Anh (Mỹ) (%s)" - "Tiếng Tây Ban Nha (Mỹ) (%s)" - "Tiếng Anh-Hindi (%s)" - "Tiếng Serbia (%s)" "%s (Truyền thống)" "%s (Viết tắt)" "Không ngôn ngữ nào (Bảng chữ cái)" "Bảng chữ cái (QWERTY)" - "Bảng chữ cái (QWERTZ)" - "Bảng chữ cái (AZERTY)" - "Bảng chữ cái (Dvorak)" - "Bảng chữ cái (Colemak)" - "Bảng chữ cái (PC)" "Biểu tượng cảm xúc" "Thêm" "Xóa" diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c1ecf51d6..643f455fb 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -49,20 +49,10 @@ "西班牙语(美国)" "印地英语" "塞尔维亚语(拉丁语布局)" - 英语(英国)(%s) - 英语(美国)(%s) - 西班牙语(美国)(%s) - 印地英语 (%s) - 塞尔维亚语 (%s) %s(传统) %s (紧凑型) 无语言(字母表) 字母表(QWERTY) - 字母表(QWERTZ) - 字母表(AZERTY) - 字母表(Dvorak) - 字母表(Colemak) - 字母表(PC) "表情符号" "添加" 移除 @@ -132,7 +122,6 @@ 拼写检查 拼写检查设置 %s (Akkhor) - 字母表(Workman) 禁用新单词学习 更多键 数字行 @@ -145,7 +134,6 @@ 长按空格键将提示输入法选择菜单 使用空格键更改输入法 键盘高度比例 - 字母表(Colemak Mod-DH) 自动更正置信度 "使用系统语言" "选择输入法" diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index eeeef8578..1133e16b4 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -50,20 +50,10 @@ "西班牙文 (美國)" "印度英文" "塞爾維亞文 (拉丁文)" - "英文 (英國) (%s)" - "英文 (美國) (%s)" - "西班牙文 (美國) (%s)" - "印度英文 (%s)" - "塞爾維亞文 (%s)" "%s (傳統)" "%s (精簡版)" "無語言 (字母)" "字母 (QWERTY)" - "字母 (QWERTZ)" - "字母 (AZERTY)" - "字母 (Dvorak)" - "字母 (Colemak)" - "字母 (PC)" "Emoji" "新增" "移除" diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ca651edb0..797e84deb 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -49,20 +49,10 @@ "西班牙文 (美國)" "印度英文" "塞爾維亞文 (拉丁文)" - "英文 (英國) (%s)" - "英文 (美國) (%s)" - "西班牙文 (美國) (%s)" - "印度英文 (%s)" - "塞爾維亞文 (%s)" "%s (傳統)" "%s (精簡)" "無語言 (字母)" "字母 (QWERTY)" - "字母 (QWERTZ)" - "字母 (AZERTY)" - "字母 (Dvorak)" - "字母 (Colemak)" - "字母 (PC)" "表情符號" "新增" "移除" diff --git a/app/src/main/res/values-zu/strings.xml b/app/src/main/res/values-zu/strings.xml index a5a5827a2..1ebe72992 100644 --- a/app/src/main/res/values-zu/strings.xml +++ b/app/src/main/res/values-zu/strings.xml @@ -50,20 +50,10 @@ "I-Spanish (US)" "I-Hinglish" "Isi-Serbian (Latin)" - "I-English (UK) ( %s )" - "I-English (US) ( %s )" - "Isi-Spanish (US) ( %s )" - "I-Hinglish (%s)" - "Isi-Serbian (%s)" "Isi-%s (Tradition)" "%s (Okuqoqene ndawonye)" "Alikho ulimi (Alfabhethi)" "Alfabhethi (QWERTY)" - "Alfabhethi (QWERTZ)" - "Alfabhethi (I-AZERTY)" - "Alfabhethi (Dvorak)" - "Alfabhethi (Colemak)" - "Alfabhethi (PC)" "I-Emoji" "Engeza" "Khipha" diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 675128454..a1090ecc3 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -4,21 +4,7 @@ modified SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only --> - - - - en-US - en-GB - es-US - hi-Latn - mns - dru - xdq - sr-Latn - + @@ -28,11 +14,14 @@ xdq sr-Latn - Hinglish - Ма̄ньси - ХӀурухъла лугъат - Хайдаҡьан - Srpski + + + Hinglish + Ма̄ньси + ХӀурухъла лугъат + Хайдаҡьан + Srpski + %s @@ -63,19 +52,6 @@ Bépo PC - - %s (QWERTY) - %s (QWERTZ) - %s (AZERTY) - %s (Dvorak) - %s (Colemak) - %s (Colemak Mod-DH) - %s (Workman) - %s (Bépo) - %s (PC) %s (BDS) @@ -92,6 +68,7 @@ %s (1452-2) + HeliBoard 100% FOSS keyboard, based on AOSP. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 31915e1d6..be594e6c7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,13 +5,12 @@ SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only --> - HeliBoard HeliBoard Spell Checker HeliBoard Settings - HeliBoard Spell Checker Settings + HeliBoard Spell Checker Settings Vibrate on keypress @@ -373,6 +372,8 @@ Spanish (US) + + Serbian (Latin) Hinglish @@ -383,34 +384,11 @@ Dagbani Sesotho - - Serbian (Latin) - - English (UK) (%s) - - English (US) (%s) - - Spanish (US) (%s) - - Hinglish (%s) + Dargwa (Urakhi) %s (Extended) - - Mansi (%s) - Dargwa (Urakhi) - Urakhi (%s) - Kaitag (%s) - - Serbian (%s) + + %1$s (%2$s) %s (Traditional) @@ -431,104 +409,8 @@ %s (Student) +language, hence "No language". --> No language (Alphabet) - - Alphabet (QWERTY) - - Alphabet (QWERTZ) - - Alphabet (AZERTY) - - Alphabet (Dvorak) - - Alphabet (Colemak) - - Alphabet (Colemak Mod-DH) - - Alphabet (Workman) - - Alphabet (Bépo) - Alphabet (PC) Emoji diff --git a/layouts.md b/layouts.md index 75aad7247..d03b20f98 100644 --- a/layouts.md +++ b/layouts.md @@ -125,7 +125,7 @@ You can also specify special key codes like `a|!code/key_action_previous` or `ab * `[number_row]` may contain a custom number row (1-9 and 0 separated by space). * `[extra_keys]` are typically keys shown in the default layout of the language. This is currently only used for latin layouts to avoid duplicating layouts for just adding few keys on the right side. The layout name need to end with `+`, but the `+` is removed when looking up the actual layout. * If you add a new language for which Android does not have a display name, it will be displayed using the language tag - * Avoiding this currently is more complicated than necessary: add the language to [LocaleUtils.doesNotHaveAndroidName](/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt#L210) to have an exception, and add a string named `subtype_` to [`strings.xml`](/app/src/main/res/values/strings.xml). In case you still have it not displayed properly, you may need to add a `subtype_in_root_locale_` to [donottranslate.xml](/app/src/main/res/values/donottranslate.xml), and add the language tag to `subtype_locale_exception_keys` and `subtype_locale_displayed_in_root_locale`. + * To fix this, add the language to [`strings.xml`](/app/src/main/res/values/strings.xml) (common names are `subtype_`), and then in [LocaleUtils.localizedDisplayName](/app/src/main/java/helium314/keyboard/latin/common/LocaleUtils.kt#L179) add an `overrideRedId` for the language tag. For overriding the language name displayed on space bar, you need to add the language tag to `subtype_locale_displayed_in_root_locale`, and the name to `subtype_locale_displayed_in_root_locale_display_names` in [donottranslate.xml](/app/src/main/res/values/donottranslate.xml). * If a newly added language does not use latin script, please update the default scripts method `Locale.script` in [ScriptUtils](app/src/main/java/helium314/keyboard/latin/utils/ScriptUtils.kt) ## Functional key layouts From bf7e0542f5f260b90609d478ac77cdcf3a89ab9f Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 24 May 2025 15:09:22 +0200 Subject: [PATCH 155/175] remove the explicit "alphabet" from no_language (layout is more visible than previously) --- app/src/main/res/values-af/strings.xml | 2 +- app/src/main/res/values-am/strings.xml | 2 +- app/src/main/res/values-ar/strings.xml | 2 +- app/src/main/res/values-az/strings.xml | 2 +- app/src/main/res/values-b+sr+Latn/strings.xml | 2 +- app/src/main/res/values-be/strings.xml | 2 +- app/src/main/res/values-bg/strings.xml | 2 +- app/src/main/res/values-bn/strings.xml | 2 +- app/src/main/res/values-bs/strings.xml | 2 +- app/src/main/res/values-ca/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-da/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-el/strings.xml | 2 +- app/src/main/res/values-en-rAU/strings.xml | 2 +- app/src/main/res/values-en-rCA/strings.xml | 2 +- app/src/main/res/values-en-rGB/strings.xml | 2 +- app/src/main/res/values-en-rIN/strings.xml | 2 +- app/src/main/res/values-en-rXC/strings.xml | 2 +- app/src/main/res/values-es-rUS/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-et/strings.xml | 2 +- app/src/main/res/values-eu/strings.xml | 2 +- app/src/main/res/values-fa/strings.xml | 2 +- app/src/main/res/values-fi/strings.xml | 2 +- app/src/main/res/values-fr-rCA/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-gl/strings.xml | 2 +- app/src/main/res/values-gu/strings.xml | 2 +- app/src/main/res/values-hi/strings.xml | 2 +- app/src/main/res/values-hr/strings.xml | 2 +- app/src/main/res/values-hu/strings.xml | 2 +- app/src/main/res/values-hy/strings.xml | 2 +- app/src/main/res/values-in/strings.xml | 2 +- app/src/main/res/values-is/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-iw/strings.xml | 2 +- app/src/main/res/values-ka/strings.xml | 2 +- app/src/main/res/values-kab/strings.xml | 2 +- app/src/main/res/values-kk/strings.xml | 2 +- app/src/main/res/values-km/strings.xml | 2 +- app/src/main/res/values-kn/strings.xml | 2 +- app/src/main/res/values-ko/strings.xml | 2 +- app/src/main/res/values-ky/strings.xml | 2 +- app/src/main/res/values-lo/strings.xml | 2 +- app/src/main/res/values-lt/strings.xml | 2 +- app/src/main/res/values-lv/strings.xml | 2 +- app/src/main/res/values-mk/strings.xml | 2 +- app/src/main/res/values-ml/strings.xml | 2 +- app/src/main/res/values-mn/strings.xml | 2 +- app/src/main/res/values-mr/strings.xml | 2 +- app/src/main/res/values-ms/strings.xml | 2 +- app/src/main/res/values-my/strings.xml | 2 +- app/src/main/res/values-nb/strings.xml | 2 +- app/src/main/res/values-ne/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 2 +- app/src/main/res/values-pa/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-pt-rPT/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values-ro/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-si/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-sl/strings.xml | 2 +- app/src/main/res/values-sq/strings.xml | 2 +- app/src/main/res/values-sr/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 2 +- app/src/main/res/values-sw/strings.xml | 2 +- app/src/main/res/values-ta/strings.xml | 2 +- app/src/main/res/values-te/strings.xml | 2 +- app/src/main/res/values-th/strings.xml | 2 +- app/src/main/res/values-tl/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- app/src/main/res/values-ur/strings.xml | 2 +- app/src/main/res/values-uz/strings.xml | 2 +- app/src/main/res/values-vi/strings.xml | 2 +- app/src/main/res/values-zh-rHK/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values-zu/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- app/src/main/res/xml/method.xml | 2 +- 84 files changed, 84 insertions(+), 84 deletions(-) diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml index 207dfc7f9..3e374dbf6 100644 --- a/app/src/main/res/values-af/strings.xml +++ b/app/src/main/res/values-af/strings.xml @@ -51,7 +51,7 @@ "Serwies (Latyns)" %s (Tradisioneel) %s (Kompak) - "Geen taal nie (alfabet)" + "Geen taal nie" "Alfabet (QWERTY)" "Emosiekone" "Voeg by" diff --git a/app/src/main/res/values-am/strings.xml b/app/src/main/res/values-am/strings.xml index 0400edb90..c40405a8b 100644 --- a/app/src/main/res/values-am/strings.xml +++ b/app/src/main/res/values-am/strings.xml @@ -51,7 +51,7 @@ "ሰርብያኛ (ላቲን)" "%s (ተለምዷዊ)" "%s (እስግ)" - "ምንም ቋንቋ (ፊደላት)" + "ምንም ቋንቋ" "ፊደላት (QWERTY)" "ኢሞጂ" "አክል" diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index af82279c4..8b34e09df 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -51,7 +51,7 @@ "الصربية (اللاتينية)" %s (التقليدية) %s (مضغوط) - "بدون لغة (أبجدية)" + "بدون لغة" "‏الأبجدية (QWERTY)" "الرموز التعبيرية" أضف diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 0a12b55a5..f41adf0b8 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -51,7 +51,7 @@ "Serb (Latın)" "%s (Ənənəvi)" "%s (Kompakt)" - "Dil yoxdur (Əlifba)" + "Dil yoxdur" "Əlifba (QWERTY)" "Emoji" "Əlavə et" diff --git a/app/src/main/res/values-b+sr+Latn/strings.xml b/app/src/main/res/values-b+sr+Latn/strings.xml index 3da01fdfa..99760bcc7 100644 --- a/app/src/main/res/values-b+sr+Latn/strings.xml +++ b/app/src/main/res/values-b+sr+Latn/strings.xml @@ -51,7 +51,7 @@ "srpski (latinica)" "%s (tradicionalni)" "%s (kompaktna)" - "Nema jezika (abeceda)" + "Nema jezika" "abeceda (QWERTY)" "Emotikoni" "Dodaj" diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 77e9c3e26..1afa5b2d8 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -52,7 +52,7 @@ сербская (Лацініца) %s (Традыцыйная) %s (Кампактная) - стандартная (лацініца) + стандартная "Лацініца (QWERTY)" "Эмодзі" "Дадаць" diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index db4c652e3..285166cda 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -51,7 +51,7 @@ "Сръбска (латиница)" "%s (традиционна клавиатура)" "%s (компактна)" - "Без език (латиница)" + "Без език" "латиница (QWERTY)" "Емотикони" "Добавяне" diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 051b41f59..d15711df9 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -105,7 +105,7 @@ %s (সংক্ষিপ্ত) %s (সেবালসিক ৩৯০) %s (সেবালসিক চূড়ান্ত) - ভাষাহীন (বর্ণমালা) + ভাষাহীন বর্ণমালা (কোয়ার্টি) ইমোজি সংযুক্ত করুন diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index e3bbeb258..a1d389647 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -53,7 +53,7 @@ "Srpski (latinica)" "%s (tradicionalan)" "%s (kompaktan)" - "Nema jezika (abeceda)" + "Nema jezika" "Abeceda (QWERTY)" "Emoji" "Dodaj" diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 6dffe8234..7bc32493f 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -51,7 +51,7 @@ "Serbi (llatí)" %s (Tradicional) %s (Compacte) - Cap idioma (alfabet) + Cap idioma "Alfabet (QWERTY)" Emojis "Afegeix" diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index ccbbc4d37..53e5db8b7 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -52,7 +52,7 @@ srbština (Latinka) "%s (Tradiční)" "%s (Kompaktní)" - standardní (Latinka) + standardní "Latinka (QWERTY)" "Emodži" "Přidat" diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 1dd9ae8b7..c4323a6d2 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -51,7 +51,7 @@ Serbisk (latin) %s (traditionel) %s (kompakt) - "Intet sprog (Alfabet)" + "Intet sprog" "Alfabet (QWERTY)" "Emoji" "Tilføj" diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3abe242bf..02ba8ac1a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -51,7 +51,7 @@ "Serbisch (Lateinisch)" %s (Traditionell) %s (Kompakt) - "Keine Sprache (lat. Alphabet)" + "Keine Sprache" "Lat. Alphabet (QWERTY)" "Emoji" "Hinzufügen" diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 700bc60ee..5ccad3794 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -52,7 +52,7 @@ "Σερβικά (Λατινικά)" "%s (Παραδοσιακά)" "%s (Συμπαγές)" - "Καμία γλώσσα (Αλφάβητο)" + "Καμία γλώσσα" "Αλφάβητο (QWERTY)" "Emoticon" "Προσθήκη" diff --git a/app/src/main/res/values-en-rAU/strings.xml b/app/src/main/res/values-en-rAU/strings.xml index b3525961f..ba855561c 100644 --- a/app/src/main/res/values-en-rAU/strings.xml +++ b/app/src/main/res/values-en-rAU/strings.xml @@ -53,7 +53,7 @@ "Serbian (Latin)" "%s (Traditional)" "%s (Compact)" - "No language (Alphabet)" + "No language" "Alphabet (QWERTY)" "Emoji" "Add" diff --git a/app/src/main/res/values-en-rCA/strings.xml b/app/src/main/res/values-en-rCA/strings.xml index b3525961f..ba855561c 100644 --- a/app/src/main/res/values-en-rCA/strings.xml +++ b/app/src/main/res/values-en-rCA/strings.xml @@ -53,7 +53,7 @@ "Serbian (Latin)" "%s (Traditional)" "%s (Compact)" - "No language (Alphabet)" + "No language" "Alphabet (QWERTY)" "Emoji" "Add" diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 70c9464b7..5aed3b377 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -52,7 +52,7 @@ "Serbian (Latin)" %s (Traditional) %s (Compact) - "No language (Alphabet)" + "No language" "Alphabet (QWERTY)" "Emoji" "Add" diff --git a/app/src/main/res/values-en-rIN/strings.xml b/app/src/main/res/values-en-rIN/strings.xml index 87cd3fc0d..d2a17043c 100644 --- a/app/src/main/res/values-en-rIN/strings.xml +++ b/app/src/main/res/values-en-rIN/strings.xml @@ -53,7 +53,7 @@ "Serbian (Latin)" "%s (Traditional)" "%s (Compact)" - "No language (Alphabet)" + "No language" "Alphabet (QWERTY)" "Emoji" "Add" diff --git a/app/src/main/res/values-en-rXC/strings.xml b/app/src/main/res/values-en-rXC/strings.xml index 906e80956..69208dc16 100644 --- a/app/src/main/res/values-en-rXC/strings.xml +++ b/app/src/main/res/values-en-rXC/strings.xml @@ -52,7 +52,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‏‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‎‎‏‏‏‎Serbian (Latin)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‏‎‏‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ (Traditional)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ (Compact)‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‏‏‎‏‎‎‏‎‎‏‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‏‏‎No language (Alphabet)‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‏‏‎‏‎‎‏‎‎‏‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‏‏‎No language‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‏‎‎‎Alphabet (QWERTY)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‎‎‏‎‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎Emoji‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‎‎‏‏‎‏‏‎‎‎‎‎‎‏‎‎‎‎‎‏‎‎‏‏‎‏‏‏‏‏‎Add‎‏‎‎‏‎" diff --git a/app/src/main/res/values-es-rUS/strings.xml b/app/src/main/res/values-es-rUS/strings.xml index aea7b6756..a33342ab2 100644 --- a/app/src/main/res/values-es-rUS/strings.xml +++ b/app/src/main/res/values-es-rUS/strings.xml @@ -51,7 +51,7 @@ "Serbio (latino)" "%s (tradicional)" "%s (compacto)" - "Ningún idioma (alfabeto)" + "Ningún idioma" "Alfabeto (QWERTY)" "Emoji" "Agregar" diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d1f380471..2fbd48c9b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -51,7 +51,7 @@ "Serbio (latino)" %s (Tradicional) %s (Compacto) - "Ningún idioma (alfabeto)" + "Ningún idioma" "Alfabeto (QWERTY)" "Emoji" "Añadir" diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index bd329f178..0eb47d343 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -51,7 +51,7 @@ "Serbia (ladina)" "%s (traditsiooniline)" "%s (kompaktne)" - "Keel puudub (tähestik)" + "Keel puudub" "Tähestik (QWERTY)" "Emotikon" "Lisa" diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 1263768f7..e7b873ffd 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -51,7 +51,7 @@ "Serbiarra (latindarra)" %s (Tradizionala) %s (Trinkoa) - "Ez dago hizkuntzarik (alfabetoa)" + "Ez dago hizkuntzarik" Alfabetoa (QWERTY) "Emojiak" "Gehitu" diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 0bea7d73e..832f92b0d 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -51,7 +51,7 @@ "صربی (لاتین)" %s (سنتی) %s (فشرده) - "بدون زبان (حروف الفبا)" + "بدون زبان" "‏حروف الفبا (QWERTY)" "اموجی" "افزودن" diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index a2c99618f..b7744bda4 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -51,7 +51,7 @@ "serbialainen (latinal.)" "%s (perinteinen)" "%s (tiivis)" - "Ei kieltä (aakkoset)" + "Ei kieltä" "aakkoset (QWERTY)" "Emoji" "Lisää" diff --git a/app/src/main/res/values-fr-rCA/strings.xml b/app/src/main/res/values-fr-rCA/strings.xml index 700f98635..5a78b6ef3 100644 --- a/app/src/main/res/values-fr-rCA/strings.xml +++ b/app/src/main/res/values-fr-rCA/strings.xml @@ -51,7 +51,7 @@ "Serbe (latin)" "%s (traditionnel)" "%s (compact)" - "Aucune langue (alphabet)" + "Aucune langue" "Alphabet latin (QWERTY)" "Emoji" "Ajouter" diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index eff7b9a6f..9f439a003 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -61,7 +61,7 @@ "Serbe (latin)" %s (Traditionnel) %s (Compact) - "Aucune langue (latin)" + "Aucune langue" "Alphabet latin (QWERTY)" Émoji "Ajouter" diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 357063777..f42c2ad76 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -51,7 +51,7 @@ "Serbio (alfabeto latino)" "%s (tradicional)" "%s (compacto)" - "Ningún idioma (alfabeto)" + "Ningún idioma" "alfabeto (QWERTY)" "Emoji" "Engadir" diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml index 36a152adf..84fcf6773 100644 --- a/app/src/main/res/values-gu/strings.xml +++ b/app/src/main/res/values-gu/strings.xml @@ -51,7 +51,7 @@ "સર્બિયન (લેટિન)" "%s (પરંપરાગત)" "%s (કોમ્પેક્ટ)" - "ભાષા નથી (આલ્ફાબેટ)" + "ભાષા નથી" "આલ્ફાબેટ (QWERTY)" "ઇમોજી" "ઉમેરો" diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 73214a8d4..1e7a07ca6 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -51,7 +51,7 @@ "सर्बियाई (लैटिन)" "%s (पारंपरिक)" "%s (संक्षिप्त)" - "भाषा उपलब्ध नहीं है (लैटिन वर्णाक्षर)" + "भाषा उपलब्ध नहीं है" "वर्णाक्षर (QWERTY)" "Emoji" "जोड़ें" diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 68156c76d..4dbeae327 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -51,7 +51,7 @@ "Srpski (latinica)" %s (traditionalno) %s (kompaktno) - Neodređen jezik (abeceda) + Neodređen jezik Abeceda (QWERTY) "Emoji" "Dodaj" diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 2847f5f35..66ea14332 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -51,7 +51,7 @@ "Szerb (latin)" %s (Hagyományos) %s (Kompakt) - "Nincs nyelv (ábécé)" + "Nincs nyelv" "Ábécé (QWERTY)" "Hangulatjel" "Hozzáadás" diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml index e14c6ed7d..7155266c4 100644 --- a/app/src/main/res/values-hy/strings.xml +++ b/app/src/main/res/values-hy/strings.xml @@ -51,7 +51,7 @@ "Սերբերեն (Լատինական)" "%s (ավանդական)" "%s (սեղմ)" - "Ոչ մի լեզվով (Այբուբեն)" + "Ոչ մի լեզվով" "Այբուբեն (QWERTY)" "Զմայլիկներ" "Ավելացնել" diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index f9dcd2f81..1dc862294 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -51,7 +51,7 @@ "Serbia (Latin)" %s (Tradisional) %s (Ringkas) - "Tidak ada bahasa (Abjad)" + "Tidak ada bahasa" "Abjad (QWERTY)" "Emoji" "Tambahkan" diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 8aa90e1dc..e22dfb1f1 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -51,7 +51,7 @@ "Serbneskt (latneskt)" "%s (hefðbundið)" "%s (lítið)" - "Ekkert tungumál (stafróf)" + "Ekkert tungumál" "Stafróf (QWERTY)" Tjáningartákn "Bæta við" diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index d63f7fe18..594224d87 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -51,7 +51,7 @@ Serbo (Latino) %s (tradizionale) %s (compatto) - "Nessuna lingua (alfabeto)" + "Nessuna lingua" "Alfabeto (QWERTY)" "Emoji" "Aggiungi" diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 14a88373a..36d01f8c5 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -51,7 +51,7 @@ "סרבית (באותיות לטיניות)" "%s (מסורתית)" "%s (קומפקטית)" - "ללא שפה (אלף-בית)" + "ללא שפה" "‏אלף-בית (QWERTY)" "אמוג\'י" "הוסף" diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 2dcc37652..b34adcf6b 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -51,7 +51,7 @@ "სერბული (ლათინური)" %s (ტრადიციული) %s (კომპაქტური) - "ენის გარეშე (ლათინური ანბანი)" + "ენის გარეშე" "ლათ. ანბანი (QWERTY)" "სიცილაკები" "დამატება" diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 1c0496a88..a911067b3 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -90,7 +90,7 @@ Asekcem agetlan Taspenyulit (Iwunak Yeddukklen) Taglizit (Iwunak Yeddukklen) - War tutlayt (Agemmay) + War tutlayt Agemmay alatini (DVORAK) Rnu ɣer umawal Sken ugar n yiniten diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index c3b97069b..118c305c4 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -51,7 +51,7 @@ "Серб (латын жазуы)" "%s (дәстүрлі)" "%s (шағын)" - "Тіл жоқ (әліпби)" + "Тіл жоқ" "Әліпби (QWERTY)" "Эмодзи" "Қосу" diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml index fa2d79c35..3794cf592 100644 --- a/app/src/main/res/values-km/strings.xml +++ b/app/src/main/res/values-km/strings.xml @@ -52,7 +52,7 @@ "សើប (ឡាតាំង​)" "%s (អក្សរ​ពេញ)" "%s (បង្រួម)" - "គ្មាន​ភាសា (អក្សរ​ក្រម)" + "គ្មាន​ភាសា" "តាម​លំដាប់​អក្សរក្រម (QWERTY)" "សញ្ញា​អារម្មណ៍" "បន្ថែម" diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml index e6ee70c29..2336b6958 100644 --- a/app/src/main/res/values-kn/strings.xml +++ b/app/src/main/res/values-kn/strings.xml @@ -52,7 +52,7 @@ "%s (ವಿಸ್ತರಿಸಲಾಗಿದೆ)" "%s (ಸಾಂಪ್ರದಾಯಿಕ)" "%s (ಕಾಂಪ್ಯಾಕ್ಟ್‌‌)" - "ಯಾವುದೇ ಭಾಷೆಯಿಲ್ಲ (ವರ್ಣಮಾಲೆ)" + "ಯಾವುದೇ ಭಾಷೆಯಿಲ್ಲ" "ವರ್ಣಮಾಲೆ (QWERTY)" "ಎಮೋಜಿ" "ಸೇರಿಸು" diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 68ea38926..3907a8b7d 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -51,7 +51,7 @@ "세르비아어(라틴 문자)" %s (번체) %s (소형) - "언어 없음(알파벳)" + "언어 없음" "알파벳(QWERTY)" "이모티콘" "추가" diff --git a/app/src/main/res/values-ky/strings.xml b/app/src/main/res/values-ky/strings.xml index 495759c91..1451a9103 100644 --- a/app/src/main/res/values-ky/strings.xml +++ b/app/src/main/res/values-ky/strings.xml @@ -51,7 +51,7 @@ "Сербче (Латын)" "%s (Салттык)" "%s (Чакан)" - "Тил жок (Алфавит)" + "Тил жок" "Алфавит (QWERTY)" "Эмодзи" "Кошуу" diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index ea113a300..c1c576502 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -52,7 +52,7 @@ "ເຊີ​ບຽນ (​ລາ​ຕິນ)" "%s (ດັ້ງ​ເດີມ)" "%s (ກະ​ທັດ​ຮັດ)" - "ບໍ່ມີພາສາ (ໂຕອັກສອນ)" + "ບໍ່ມີພາສາ" "ໂຕອັກສອນ (QWERTY)" "ອີໂມຈິ" "ເພີ່ມ" diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 6b63b86f8..1a57e1df6 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -51,7 +51,7 @@ "Serbų k. (lot. rašmenys)" "%s (tradicinė)" "%s (kompaktiška)" - "Kalbos nėra (abėcėlė)" + "Kalbos nėra" "Abėcėlė (QWERTY)" "Jaustukai" "Pridėti" diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 23324d3ff..d3f129092 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -51,7 +51,7 @@ "Serbu (latīņu)" "%s (tradicionālā)" "%s (kompaktā)" - "Nav valodas (alfabēts)" + "Nav valodas" "Alfabēts (QWERTY)" "Japāņu emocijzīmes" "Pievienot" diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 6aa873244..4187a86d8 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -51,7 +51,7 @@ "Српски (латиница)" "%s (традиционален)" "%s (Компактна)" - "Нема јазик (азбука)" + "Нема јазик" "Азбука (QWERTY)" "Емотикони" "Додај" diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 23b2fd551..42d739d36 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -51,7 +51,7 @@ "സെർബിയൻ (ലാറ്റിൻ)" %s (പരമ്പരാഗതം) %s (കോം‌പാക്‌ട്) - "ഭാഷയില്ല (അക്ഷരമാല)" + "ഭാഷയില്ല" "അക്ഷരമാല (QWERTY)" "ഇമോജി" "ചേര്‍ക്കുക" diff --git a/app/src/main/res/values-mn/strings.xml b/app/src/main/res/values-mn/strings.xml index c7a2dc27b..258a1aded 100644 --- a/app/src/main/res/values-mn/strings.xml +++ b/app/src/main/res/values-mn/strings.xml @@ -51,7 +51,7 @@ "Серьби хэл (латин)" "%s (уламжлалт)" "%s (Компакт)" - "Хэл байхгүй (Цагаан толгой)" + "Хэл байхгүй" "Цагаан толгой (QWERTY)" "Инээмсэглэл" "Нэмэх" diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml index 26e10c89e..962011288 100644 --- a/app/src/main/res/values-mr/strings.xml +++ b/app/src/main/res/values-mr/strings.xml @@ -51,7 +51,7 @@ "सर्बियन (लॅटिन)" "%s (पारंपारिक)" "%s (संक्षिप्त)" - "भाषा नाही (वर्णमाला)" + "भाषा नाही" "वर्णमाला (QWERTY)" "इमोजी" "जोडा" diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 817f5d9ad..e3e9c7f82 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -52,7 +52,7 @@ "Bahasa Serbia (Latin)" "%s (Tradisional)" "%s (Sarat)" - "Tiada bahasa (Abjad)" + "Tiada bahasa" "Abjad (QWERTY)" "Emoji" "Tambah" diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index 669d9d6fd..ae645a5e5 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -51,7 +51,7 @@ "ဆားဘီယား (လက်တင်)" "%s (ရိုးရာ)" "%s (ကျစ်လစ်သော)" - "ဘာသာစကားမရှိ (ဗျည်းအက္ခရာ)" + "ဘာသာစကားမရှိ" "ဗျည်းအက္ခရာ (ကွာတီ)" "အီမိုဂျီ" "ထည့်ရန်" diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 1b15eb57c..774a11bc0 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -51,7 +51,7 @@ "Serbisk (latin)" "%s (tradisjonelt)" "%s (kompakt)" - "Ingen språk (alfabet)" + "Ingen språk" Alfabet (QWERTY) "Emoji" "Legg til" diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index c89d66c3f..bff63fd39 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -51,7 +51,7 @@ "सर्बियाई (ल्याटिन)" "%s (परम्परागत)" "%s (संकुचित)" - "कुनै भाषा होइन (वर्णमाला)" + "कुनै भाषा होइन" "वर्णमाला (QWERTY)" "इमोजी" "थप्नुहोस्" diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 7aa36b0e1..18d060168 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -51,7 +51,7 @@ "Servisch (Latijns)" %s (Traditional) %s (Compact) - "Geen taal (alfabet)" + "Geen taal" "Alfabet (QWERTY)" "Emoji" "Toevoegen" diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index f446c66aa..578c7594e 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -51,7 +51,7 @@ "ਸਰਬੀਅਨ (ਲਾਤੀਨੀ)" "%s (ਪਰੰਪਰਿਕ)" "%s (ਸੰਖਿਪਤ)" - "ਕੋਈ ਭਾਸ਼ਾ ਨਹੀਂ (ਵਰਨਮਾਲਾ)" + "ਕੋਈ ਭਾਸ਼ਾ ਨਹੀਂ" "ਵਰਨਮਾਲਾ (QWERTY)" "ਇਮੋਜੀ" "ਸ਼ਾਮਲ ਕਰੋ" diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 4350ad2be..e783a8fde 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -52,7 +52,7 @@ serbski (alfabet łaciński) %s (tradycyjny) %s (kompaktowy) - standardowy (Alfabet) + standardowy "Alfabet (QWERTY)" "Emotikony" "Dodaj" diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index f4f4460ca..fbaa38dab 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -108,7 +108,7 @@ Alterar método de entrada com a tecla de espaço Tempo de retenção do histórico Linha de números - Nenhum idioma (Alfabeto) + Nenhum idioma Alfabeto (QWERTY) %s já está ativado nas configurações de \'Idiomas e Entrada\'. Esta etapa já está concluída. Vamos para a próxima! Bem-vindo ao %s diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 03e0b9414..17199ea5a 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -52,7 +52,7 @@ Sérvio (Latino) %s (Tradicional) %s (Compacto) - Nenhum idioma (alfabeto) + Nenhum idioma "Alfabeto (QWERTY)" Emojis "Adicionar" diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index c86114287..f2b149646 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -51,7 +51,7 @@ "Sérvio (Latino)" %s (Tradicional) %s (Compacto) - "Nenhum idioma (alfabeto)" + "Nenhum idioma" "Alfabeto (QWERTY)" "Emojis" "Adicionar" diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 9db923dc4..b1ce8cc6e 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -51,7 +51,7 @@ "Sârbă (caractere latine)" "%s (tradițională)" "%s (Compact)" - "Nicio limbă (alfabet)" + "Nicio limbă" "Alfabet (QWERTY)" "Emoji" Adaugă diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 221eb54ec..0ce679e3e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -54,7 +54,7 @@ Сербский (латиница) %s (Традиционная) %s (Компактная) - Стандартная (латиница) + Стандартная Латиница (QWERTY) Эмодзи Добавить diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index d25f85496..7d3560fc0 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -51,7 +51,7 @@ "සර්බියානු (ලතින්)" "%s (සාම්ප්‍රදායික)" "%s (සංයුක්ත)" - "භාෂාවක් නැත (අකාරාදිය)" + "භාෂාවක් නැත" "අකාරාදිය (QWERTY)" "ඉමොජි" "එක් කරන්න" diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 22c7af031..1be1b1aa6 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -51,7 +51,7 @@ "srbčina (latinka)" "%s (tradičná)" "%s (kompaktná)" - "Žiadny jazyk (latinka)" + "Žiadny jazyk" "latinka (QWERTY)" "Emoji" "Pridať" diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 8c9b545d7..10118eccd 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -51,7 +51,7 @@ "Srbščina (latinica)" "%s (tradicionalna)" "%s (kompaktna)" - "Brez jezika (latinice)" + "Brez jezika" "Latinica (QWERTY)" "Emodžiji" "Dodaj" diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index e9987b4f6..44e62b8a6 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -52,7 +52,7 @@ "serbisht (latin)" "%s (tradicionale)" "%s (kompakte)" - "nuk ka gjuhë (alfabeti)" + "nuk ka gjuhë" "alfabeti (QWERTY)" "\"Emoji\"" "Shto" diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index bb0a812ff..27202c501 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -51,7 +51,7 @@ "српски (латиница)" %s (традиционални) %s (компактна) - "Нема језика (абецеда)" + "Нема језика" "абецеда (QWERTY)" "Емотикони" "Додај" diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index afed73253..395ce8e9b 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -51,7 +51,7 @@ "Serbiska (latinsk)" %s (traditionell) %s (kompakt) - "Inget språk (alfabet)" + "Inget språk" "Alfabet (QWERTY)" Emoji "Lägg till" diff --git a/app/src/main/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml index 6d084a1bb..bcc27c6c9 100644 --- a/app/src/main/res/values-sw/strings.xml +++ b/app/src/main/res/values-sw/strings.xml @@ -52,7 +52,7 @@ "Kiserbia (Kilatino)" "%s (cha Jadi)" "%s (Thabiti)" - "Hakuna lugha (Alfabeti)" + "Hakuna lugha" "Alfabeti (QWERTY)" "Emoji" "Ongeza" diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 17a8b5a16..e913a1635 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -51,7 +51,7 @@ "செர்பியன் (லத்தீன்)" "%s (பாரம்பரியமானது)" "%s (வசதியான)" - "மொழியில்லை (அகரவரிசை)" + "மொழியில்லை" "அகரவரிசை (க்வெர்டி)" "எமோஜி" "சேர்" diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index a0e69a1b8..5e3cfe4e5 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -51,7 +51,7 @@ "సెర్బియన్ (లాటిన్)" "%s (సాంప్రదాయకం)" "%s (కాంపాక్ట్)" - "భాష లేదు (ఆల్ఫాబెట్)" + "భాష లేదు" "ఆల్ఫాబెట్ (QWERTY)" "ఎమోజి" "జోడించండి" diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 6a36a4408..94fc5723d 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -52,7 +52,7 @@ "เซอร์เบีย (ละติน)" "%s (ดั้งเดิม)" "%s (แบบกะทัดรัด)" - "ไม่มีภาษา (ตัวอักษรละติน)" + "ไม่มีภาษา" "ตัวอักษร (QWERTY)" "อีโมจิ" "เพิ่ม" diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml index a48faacbe..e4bac9c9a 100644 --- a/app/src/main/res/values-tl/strings.xml +++ b/app/src/main/res/values-tl/strings.xml @@ -52,7 +52,7 @@ "Serbian (Latin)" "%s (Traditional)" "%s (Compact)" - "Walang wika (Alpabeto)" + "Walang wika" "Alpabeto (QWERTY)" "Emoji" "Idagdag" diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 58386c47f..4538c7467 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -51,7 +51,7 @@ "Sırpça (Latin alfabesi)" %s (Geleneksel) %s (Kompakt) - "Dil yok (Alfabe)" + "Dil yok" "Alfabe (QWERTY)" "Emoji" "Ekle" diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 0a4883c14..16e71bd83 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -52,7 +52,7 @@ Сербська (латиниця) %s (Традиційна) %s (Компактна) - Стандартна (латиниця) + Стандартна "Латиниця (QWERTY)" Емоджі Додати diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index d23a7caef..bedd85e30 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -51,7 +51,7 @@ "سربیائی (لاطینی)" "%s (روایتی)" "%s (کمپیکٹ)" - "کوئی زبان نہیں (الفابیٹ)" + "کوئی زبان نہیں" "‏حروف تہجی (QWERTY)" "Emoji" "شامل کریں" diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index f375de143..a4f07703b 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -51,7 +51,7 @@ "Serb (Lotin)" %s (An’anaviy) %s(Ixcham) - "Til aniqlanmadi (lotin)" + "Til aniqlanmadi" "Lotin (QWERTY)" "Kulgichlar" "Qo‘shish" diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index e7b7793ee..d83f16d5b 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -52,7 +52,7 @@ "Tiếng Serbia (La tinh)" "%s (Truyền thống)" "%s (Viết tắt)" - "Không ngôn ngữ nào (Bảng chữ cái)" + "Không ngôn ngữ nào" "Bảng chữ cái (QWERTY)" "Biểu tượng cảm xúc" "Thêm" diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 1133e16b4..b62642447 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -52,7 +52,7 @@ "塞爾維亞文 (拉丁文)" "%s (傳統)" "%s (精簡版)" - "無語言 (字母)" + "無語言" "字母 (QWERTY)" "Emoji" "新增" diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 797e84deb..e677ba00b 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -51,7 +51,7 @@ "塞爾維亞文 (拉丁文)" "%s (傳統)" "%s (精簡)" - "無語言 (字母)" + "無語言" "字母 (QWERTY)" "表情符號" "新增" diff --git a/app/src/main/res/values-zu/strings.xml b/app/src/main/res/values-zu/strings.xml index 1ebe72992..c35c889ca 100644 --- a/app/src/main/res/values-zu/strings.xml +++ b/app/src/main/res/values-zu/strings.xml @@ -52,7 +52,7 @@ "Isi-Serbian (Latin)" "Isi-%s (Tradition)" "%s (Okuqoqene ndawonye)" - "Alikho ulimi (Alfabhethi)" + "Alikho ulimi" "Alfabhethi (QWERTY)" "I-Emoji" "Engeza" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index be594e6c7..c2d650675 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -410,7 +410,7 @@ - No language (Alphabet) + No language Emoji diff --git a/app/src/main/res/xml/method.xml b/app/src/main/res/xml/method.xml index 23a73dd1a..bd62d77e5 100644 --- a/app/src/main/res/xml/method.xml +++ b/app/src/main/res/xml/method.xml @@ -1263,7 +1263,7 @@ android:isAsciiCapable="true" /> Date: Sat, 24 May 2025 15:43:44 +0200 Subject: [PATCH 156/175] remove unused strings (and rename a string) --- .../settings/dialogs/DictionaryDialog.kt | 9 +----- app/src/main/res/values-af/strings.xml | 8 +---- app/src/main/res/values-am/strings.xml | 8 +---- app/src/main/res/values-ar/strings.xml | 15 +-------- app/src/main/res/values-as/strings.xml | 5 +-- app/src/main/res/values-az/strings.xml | 8 +---- app/src/main/res/values-b+sr+Latn/strings.xml | 8 +---- app/src/main/res/values-be/strings.xml | 15 +-------- app/src/main/res/values-bg/strings.xml | 17 +--------- app/src/main/res/values-bn/strings.xml | 15 +-------- app/src/main/res/values-bs/strings.xml | 8 +---- app/src/main/res/values-ca/strings.xml | 15 +-------- app/src/main/res/values-cs/strings.xml | 15 +-------- app/src/main/res/values-da/strings.xml | 15 +-------- app/src/main/res/values-de/strings.xml | 14 +------- app/src/main/res/values-el/strings.xml | 8 +---- app/src/main/res/values-en-rAU/strings.xml | 8 +---- app/src/main/res/values-en-rCA/strings.xml | 8 +---- app/src/main/res/values-en-rGB/strings.xml | 8 +---- app/src/main/res/values-en-rIN/strings.xml | 8 +---- app/src/main/res/values-en-rXC/strings.xml | 8 +---- app/src/main/res/values-es-rUS/strings.xml | 14 +------- app/src/main/res/values-es/strings.xml | 15 +-------- app/src/main/res/values-et/strings.xml | 17 +--------- app/src/main/res/values-eu/strings.xml | 15 +-------- app/src/main/res/values-fa/strings.xml | 8 +---- app/src/main/res/values-fi/strings.xml | 10 +----- app/src/main/res/values-fr-rCA/strings.xml | 8 +---- app/src/main/res/values-fr/strings.xml | 14 +------- app/src/main/res/values-gl/strings.xml | 16 +--------- app/src/main/res/values-gu/strings.xml | 8 +---- app/src/main/res/values-hi/strings.xml | 8 +---- app/src/main/res/values-hr/strings.xml | 8 +---- app/src/main/res/values-hu/strings.xml | 12 +------ app/src/main/res/values-hy/strings.xml | 8 +---- app/src/main/res/values-in/strings.xml | 15 +-------- app/src/main/res/values-is/strings.xml | 17 +--------- app/src/main/res/values-it/strings.xml | 14 +------- app/src/main/res/values-iw/strings.xml | 15 +-------- app/src/main/res/values-ja/strings.xml | 8 +---- app/src/main/res/values-jpr/strings.xml | 3 -- app/src/main/res/values-ka/strings.xml | 8 +---- app/src/main/res/values-kab/strings.xml | 8 +---- app/src/main/res/values-kk/strings.xml | 8 +---- app/src/main/res/values-km/strings.xml | 8 +---- app/src/main/res/values-kn/strings.xml | 8 +---- app/src/main/res/values-ko/strings.xml | 8 +---- app/src/main/res/values-ky/strings.xml | 8 +---- app/src/main/res/values-lo/strings.xml | 8 +---- app/src/main/res/values-lt/strings.xml | 8 +---- app/src/main/res/values-lv/strings.xml | 8 +---- app/src/main/res/values-mk/strings.xml | 8 +---- app/src/main/res/values-ml/strings.xml | 8 +---- app/src/main/res/values-mn/strings.xml | 8 +---- app/src/main/res/values-mr/strings.xml | 8 +---- app/src/main/res/values-ms/strings.xml | 8 +---- app/src/main/res/values-my/strings.xml | 8 +---- app/src/main/res/values-nb/strings.xml | 12 +------ app/src/main/res/values-ne/strings.xml | 8 +---- app/src/main/res/values-nl/strings.xml | 15 +-------- app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-ota/strings.xml | 1 - app/src/main/res/values-pa-rPK/strings.xml | 1 - app/src/main/res/values-pa/strings.xml | 8 +---- app/src/main/res/values-pl/strings.xml | 14 +------- app/src/main/res/values-pt-rBR/strings.xml | 15 +-------- app/src/main/res/values-pt-rPT/strings.xml | 13 +------- app/src/main/res/values-pt/strings.xml | 8 +---- app/src/main/res/values-ro/strings.xml | 17 +--------- app/src/main/res/values-ru/strings.xml | 11 +------ app/src/main/res/values-si/strings.xml | 8 +---- app/src/main/res/values-sk/strings.xml | 8 +---- app/src/main/res/values-sl/strings.xml | 8 +---- app/src/main/res/values-sq/strings.xml | 8 +---- app/src/main/res/values-sr/strings.xml | 8 +---- app/src/main/res/values-sv/strings.xml | 8 +---- app/src/main/res/values-sw/strings.xml | 8 +---- app/src/main/res/values-ta/strings.xml | 8 +---- app/src/main/res/values-te/strings.xml | 8 +---- app/src/main/res/values-th/strings.xml | 8 +---- app/src/main/res/values-tl/strings.xml | 8 +---- app/src/main/res/values-tr/strings.xml | 14 +------- app/src/main/res/values-uk/strings.xml | 15 +-------- app/src/main/res/values-ur/strings.xml | 8 +---- app/src/main/res/values-uz/strings.xml | 8 +---- app/src/main/res/values-vi/strings.xml | 8 +---- app/src/main/res/values-zh-rCN/strings.xml | 15 +-------- app/src/main/res/values-zh-rHK/strings.xml | 8 +---- app/src/main/res/values-zh-rTW/strings.xml | 8 +---- app/src/main/res/values-zu/strings.xml | 8 +---- app/src/main/res/values/strings.xml | 32 +++++-------------- 91 files changed, 94 insertions(+), 826 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt b/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt index 1e8ecc204..d38f598ac 100644 --- a/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt +++ b/app/src/main/java/helium314/keyboard/settings/dialogs/DictionaryDialog.kt @@ -3,11 +3,8 @@ package helium314.keyboard.settings.dialogs import android.content.Intent import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.EnterTransition -import androidx.compose.animation.expandVertically import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut -import androidx.compose.animation.slideInVertically import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -16,8 +13,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -28,9 +23,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.rotate import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -79,7 +72,7 @@ fun DictionaryDialog( if (mainDict != null) DictionaryDetails(mainDict) if (addonDicts.isNotEmpty()) { - PreferenceCategory(stringResource(R.string.dictionary_settings_title)) + PreferenceCategory(stringResource(R.string.dictionary_category_title)) addonDicts.forEach { DictionaryDetails(it) } } val dictString = createDictionaryTextAnnotated(locale) diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml index 3e374dbf6..014d12d2c 100644 --- a/app/src/main/res/values-af/strings.xml +++ b/app/src/main/res/values-af/strings.xml @@ -52,7 +52,6 @@ %s (Tradisioneel) %s (Kompak) "Geen taal nie" - "Alfabet (QWERTY)" "Emosiekone" "Voeg by" "Verwyder" @@ -68,11 +67,9 @@ Welkom by %s "met Gebaar-tik" "Kom aan die gang" - "Volgende stap" Stel %s op Aktiveer %s Gaan asseblief \"%s\" in jou Tale- en invoer-instellings na. Dit sal dit magtig om op jou toestel te werk. - %s is reeds in jou Tale- en invoer-instellings geaktiveer – dus is hierdie stap klaar. Doen die volgende een! "Aktiveer in instellings" Skakel oor na %s Volgende, kies \"%s\" as jou aktiewe teks-invoermetode. @@ -82,21 +79,18 @@ "Klaar" "Wys program-ikoon" "Wys program-ikoon in die lanseerpoort" - "Voeg woordeboeke by" + "Voeg woordeboeke by" "Woordeboek beskikbaar" - "Geen woordeboeke beskikbaar nie" "Laas opgedateer" "Instellings" "Vee uit" Weergawe %1$s - "Voeg by" "Voeg by woordeboek" "Kortpad:" "Taal:" "Tik \'n woord in" "Opsionele kortpad" "Redigeer woord" - "Jy het geen woorde in die gebruikerwoordeboek nie. Tik op die Voeg By-knoppie (+) om \'n woord by te voeg." "Vir alle tale" "Nog tale…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-am/strings.xml b/app/src/main/res/values-am/strings.xml index c40405a8b..7cad63b57 100644 --- a/app/src/main/res/values-am/strings.xml +++ b/app/src/main/res/values-am/strings.xml @@ -52,7 +52,6 @@ "%s (ተለምዷዊ)" "%s (እስግ)" "ምንም ቋንቋ" - "ፊደላት (QWERTY)" "ኢሞጂ" "አክል" "አስወግድ" @@ -68,11 +67,9 @@ "እንኳን ወደ %s በደህና መጡ" "በጣት ምልክት መተየብ" "ጀምር" - "ቀጣይ ደረጃ" %sን በማዋቀር ላይ\" %sን ያንቁ\" እባክዎ %s»ን በእርስዎ የቋንቋ እና ግቤት ቅንብሮች ውስጥ መኖሩን ያረጋግጡት። ይሄ እሱ በመሣሪያዎ ላይ እንዲሄድ ይፈቅድለታል።\" - "%s አስቀድሞ በእርስዎ ቋንቋ እና ግቤት ቅንብሮች ውስጥ ነቅቷል፣ ስለዚህ ይህ ደረጃ ተከናውኗል። ወደ ቀጣዩ እንሂድ!" "በቅንብሮች ውስጥ ያንቁ" "ወደ %s ይቀይሩ" በመቀጠል %s»ን እንደ የጽሑፍ ግቤት ስልትዎ ይምረጡት።\" @@ -82,21 +79,18 @@ "ጨርሷል" "የመተግበሪያ አዶ አሳይ" "የመተግበሪያ አዶውን በማስጀመሪያው ውስጥ አሳይ" - "ጭማሪ መዝገበ-ቃላት" + "ጭማሪ መዝገበ-ቃላት" "መዝገበ-ቃላት ይገኛል" - "ምንም መዝገበ-ቃላት የሉም" "ለመጨረሻ ጊዜ የተዘመነው" "ቅንብሮች" "ሰርዝ" "ሥሪት %1$s" - "አክል" "ወደ መዝገበ-ቃላት አክል" "አቋራጭ፦" "ቋንቋ፦" "አንድ ቃል ይተይቡ" "አማራጭ አቋራጭ" "ቃሉን አርትዕ" - "በተጠቃሚ መዝገበ-ቃላቱ ውስጥ ምንም ቃላት የለዎትም። አንድ ቃል ለማከል የአክል (+) አዝራሩን መታ ያድርጉ።" "ለሁሉም ቋንቋዎች" "ተጨማሪ ቋንቋዎች…" " ሀለሐመሠረሰሸቀበቨተቸኀነኘአከኸወዐዘዠየደጀገጠጨጰጸፀፈፐ" diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 8b34e09df..8ba681553 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -52,7 +52,6 @@ %s (التقليدية) %s (مضغوط) "بدون لغة" - "‏الأبجدية (QWERTY)" "الرموز التعبيرية" أضف "إزالة" @@ -68,11 +67,9 @@ مرحبًا بكم في %s مع الكتابة بالإيماءة "بدء الاستخدام" - "الخطوة التالية" قيد الإعداد %s مكِّن %s يُرجى التحقق من \"%s\" في إعدادات الإدخال واللغات. سيؤدي ذلك إلى تمكين لوحة المفاتيح على جهازك. - <xliff:g id=\"APPLICATION_NAME\" مثال=\"لوحة مفاتيح أندرويد\">%s</xliff:g> ممكّن بالفعل في إعدادات اللغات &amp؛ إعدادات الإدخال، لذا فقد تم الانتهاء من هذه الخطوة. إلى الخطوة التالية! "تفعيل في الإعدادات" بدّل إلى %s بعد ذلك، اختر \"%s” كطريقة إدخال النص النشط. @@ -82,21 +79,18 @@ "إنهاء العملية" اعرض رمز التطبيق اعرض رمز التطبيق في المشغل - "القواميس الإضافية" + "القواميس الإضافية" "القاموس متاح" - "لا تتوفر أي قواميس" "تاريخ آخر تحديث" "إعدادات" "حذف" الإصدار %1$s - أضف أضف إلى القاموس "الاختصار:" "اللغة:" "اكتب كلمة" "اختصار اختياري" "تعديل كلمة" - "ليس هناك أي كلمات في قاموس المستخدم. لإضافة كلمة، انقر على زر الإضافة (+)." "لجميع اللغات" "مزيد من اللغات…" " أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي" @@ -167,7 +161,6 @@ خلفية لوحة المفاتيح نص الأزرار اختيار تلقائي للون - انقر للمعانية الإصدار غلق المظهر @@ -265,13 +258,11 @@ اليسار الكامل اليمين الكامل أظهِر تلميحات إذا كان الضغط لفترة طويلة على المفتاح يؤدي إلى تشغيل وظائف إضافية - كايتاج (%s) تعيين الصورة لوضع النهار أو الليل؟ صباح %s (Sebeolsik Final) حدد ملفًا بتنسيق متوافق. المعلومات حول التنسيقات متاحة %s. انسخ التخطيط الموجود - تعيين اسم التخطيط هل تريد حقًا حذف التخطيط المخصص %s؟ خطأ في التخطيط: %s انقر لتحرير التخطيط الأولي @@ -315,7 +306,6 @@ %s (Probhat) %s (Sebeolsik 390) اختر ترتيب المفاتيح المنبثقه - الأبجدية (بيبو) اضغط لفترة طويلة على مفتاح الرموز للوحة الرقمية قصّ %s (طالب) @@ -325,7 +315,6 @@ حدد مفاتيح شريط أدوات الحافظة %s (Extended) مانسي - مانسي (%s) أظهِر المزيد من الالوان يعرض هذا الإعداد كافة الألوان المستخدمة داخليًا. قد تتغير قائمة الألوان في أي وقت. اللون الافتراضي عشوائي، ولن تتم ترجمة الأسماء. مفاتيح وظيفية @@ -349,7 +338,6 @@ حمّل احفظ إلى الملف انسخ إلى الحافظة - سيؤدي التحميل إلى استبدال السمة الحالية بداية الصفحة نهاية الصفحة كلمة لليسار @@ -396,7 +384,6 @@ درغوة (أوراخي) اختصار التصحيح التلقائي قد يتم توسيع الاختصارات عند تمكينها بواسطة التصحيح التلقائي - أوراخي (%s) تعيين خط مخصص من الملف الاهتزاز في وضع عدم الازعاج %s (صوتي) diff --git a/app/src/main/res/values-as/strings.xml b/app/src/main/res/values-as/strings.xml index 25e970ef6..29ee765b6 100644 --- a/app/src/main/res/values-as/strings.xml +++ b/app/src/main/res/values-as/strings.xml @@ -58,17 +58,14 @@ "ডিফ\'ল্ট" "আঙুলি পিছলাই দিয়া নিৰ্দেশেৰে টাইপ কৰাৰ সুবিধাৰ সৈতে" "আৰম্ভ কৰক" - "পৰৱৰ্তী পদক্ষেপ" "সম্পূৰ্ণ হ’ল" "এপৰ আইকন দেখুৱাওক" "লঞ্চাৰত এপ্লিকেশ্বন আইকন দেখুৱাওক" - "অতিৰিক্ত অভিধান" + "অতিৰিক্ত অভিধান" "অভিধান উপলব্ধ" - "কোনো অভিধান নাই" "অন্তিমবাৰ আপডে’ট কৰা হৈছিল" "ছেটিংসমূহ" "মচক" - "যোগ কৰক" "অভিধানত যোগ কৰক" "শ্বৰ্টকাট:" "ভাষা:" diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index f41adf0b8..f91d5befe 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -52,7 +52,6 @@ "%s (Ənənəvi)" "%s (Kompakt)" "Dil yoxdur" - "Əlifba (QWERTY)" "Emoji" "Əlavə et" "Ləğv et" @@ -68,11 +67,9 @@ %s təbiqinə xoş gəlmisiniz\" "Jest Yazısı ilə" "Başlayın" - "Növbəti addım" %s quraşdırılır\" %s tətbiqini aktivləşdir\" "Lütfən, \"%s\" tətbiqini Dillər və daxiletmə ayarlarında yoxlayın. Bununla tətbiqin cihazınızda işləməsinə icazə veriləcək." - "%s artıq Dillər və daxiletmə ayarlarında aktivləşdirildi, beləliklə da bu mərhələ tamamlandı. İndi isə növbəti mərhələyə keçin!" "Parametrlərdə aktivləşdir" %s tətbiqinə keçin\" "Sonra, \"%s\" tətbiqini aktiv mətn-daxiletmə metodu olaraq seçin." @@ -82,21 +79,18 @@ "Sona çatdı" "Tətbiq ikonasını göstər" "Başlatma panelində tətbiq ikonasını göstər" - "Əlavə lüğətlər" + "Əlavə lüğətlər" "Lüğət mövcuddur" - "Lüğət mövcud deyil" "Son yeniləmə" "Ayarlar" "Sil" "%1$s nömrəli versiya" - "Əlavə edin" "Lüğətə əlavə edin" "Qısayol:" "Dil:" "Bir söz yazın" "Qısayol" "Sözü redaktə edin" - "İstifadəçi lüğətinizdə heç bir söz yoxdur. Söz əlavə etmək üçün Əlavə et (+) düyməsinə tıklayın." "Bütün dillər üçün" "Digər dillər…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-b+sr+Latn/strings.xml b/app/src/main/res/values-b+sr+Latn/strings.xml index 99760bcc7..72e752066 100644 --- a/app/src/main/res/values-b+sr+Latn/strings.xml +++ b/app/src/main/res/values-b+sr+Latn/strings.xml @@ -52,7 +52,6 @@ "%s (tradicionalni)" "%s (kompaktna)" "Nema jezika" - "abeceda (QWERTY)" "Emotikoni" "Dodaj" "Ukloni" @@ -68,11 +67,9 @@ "Dobro došli u %s" "pomoću Kucanja pokretima" "Započnimo" - "Sledeći korak" "Podešavanje aplikacije %s" "Omogućite aplikaciju %s" Potvrdite aplikaciju %s“ u Podešavanjima jezika i unosa. Tako joj odobravate pokretanje na uređaju.\" - "Aplikacija %s je već omogućena u Podešavanjima jezika i unosa, pa je ovaj korak gotov. Pređimo na sledeći!" "Omogući u Podešavanjima" "Prebacite na %s" Zatim izaberite %s“ kao aktivni metod unosa teksta.\" @@ -82,21 +79,18 @@ "Završeno" "Prikaži ikonu aplikacije" "Ikona aplikacije se prikazuje u pokretaču" - "Pomoćni rečnici" + "Pomoćni rečnici" "Rečnik je dostupan" - "Nema dostupnih rečnika" "Poslednje ažuriranje" "Podešavanja" "Izbriši" "Verzija %1$s" - "Dodaj" "Dodavanje u rečnik" "Prečica:" "Jezik:" "Unesite reč" "Opcionalna prečica" "Izmena reči" - "Nemate nijednu reč u korisničkom rečniku. Da biste dodali reč, dodirnite dugme Dodaj (+)." "Za sve jezike" "Još jezika…" " ABVGDĐEŽZIJKLLJMNNJOPRSTĆUFHCČDŽŠ" diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 1afa5b2d8..12492d6db 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -53,7 +53,6 @@ %s (Традыцыйная) %s (Кампактная) стандартная - "Лацініца (QWERTY)" "Эмодзі" "Дадаць" "Выдаліць" @@ -69,11 +68,9 @@ Вітаем ў %s з ўводам жэстамі Пачаць працу - "Далей" Наладка %s Ўключыць %s Праверце праграму \"%s\" ў сваіх наладах «Мова і ўвод». Гэта дазволіць ёй працаваць на вашай прыладзе. - Праграма %s ўжо ўключана ў наладах «Мова і ўвод». Перайдзіце да наступнага кроку! Ўключыць ў наладах Пераключыцца на %s Выберыце «%s» бягучым метадам ўводу. @@ -83,21 +80,18 @@ "Гатова" "Паказаць значок прыкладання" Паказаць значок праграмы ў панэлi запуску - "Дадатковыя слоўнікі" + "Дадатковыя слоўнікі" "Даступны слоўнік" - "Слоўнікаў няма" "Апошняе абнаўленне" "Налады" "Выдаліць" Версія %1$s - "Дадаць" Дадаць ў слоўнік "Гарачая клавіша:" "Мова:" Ўвядзіце слова "Неабавязковая гарачая клавіша" "Рэдагаваць слова" - Ў карыстальніцкім слоўніку няма ніводнага слова. Каб дадаць слова, дакраніце да кнопкі «Дадаць» (+). "Для ўсіх моў" "Іншыя мовы…" " АБВГДЕЁЖЗІЙКЛМНОПРСТУЎФХЦЧШЫЬЭЮЯ'" @@ -137,7 +131,6 @@ Карыстацкая Карыстацкая (цёмная тэма) Аўтаматычны выбар колеру - Націсніце для прадпрагляду Абярыце колеру для тэксту і фону Фон клавіятуры Тэкст клавіш @@ -235,7 +228,6 @@ Раскладка Лакалізаваць лікавы радок Выкарыстоўваць асабісты слоўнік прылады для захоўвання вывучаных слоў - Кайтагская (%s) %s (Прабгат) %s (Себяольсік 390) %s (Себяольсік фінальная) @@ -248,7 +240,6 @@ Воблачна Доўгі націск клавішы сімвалаў для лічбавай клавіятуры Скапіяваць бягучую раскладку - Задаць імя раскладкі Сапраўды выдаліць карыстацкую раскладку %s? Памылка загрузкі файла слоўніка кайтагскі @@ -303,7 +294,6 @@ Карычневы Ўвод жэстамі Захаваць лог - Алфавіт (Бепо) Замяніць карыстацкі слоўнік «%1$s»? \n \nБягучы слоўнік: \n%2$s \n \nНовы слоўнік: \n%3$s Без слоўніка вы будзеце атрымліваць прапановы толькі для ўведзенага раней тэксту.<br> \nВы можаце загрузіць слоўнікі %1$s або праверыць, ці можна загрузіць слоўнік для «%2$s» напрамую %3$s. сховішча, абароненае прыладай @@ -332,7 +322,6 @@ Выбраць замацаваныя клавішы панэлі інструментаў Панэль інструментаў Мансійская - Мансійская (%s) Паказаць больш колераў Функцыянальныя клавішы Функцыянальныя клавішы (Сімвалы) @@ -342,7 +331,6 @@ Захаваць у файл Скапіяваць у буфер абмену Загрузіць - Загрузка перазапіша бягучую тэму Старонка ўверх Старонка ўніз Пачатак старонкі @@ -383,7 +371,6 @@ Усталяваць фонавы малюнак (альбомная) Перавызначыць версію эмодзі Даргінскі (Урахі) - Урахінскі (%s) Код клавішы Сапраўды выдаліць %s? Усталяваць карыстацкі шрыфт з файла diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 285166cda..b11c394c6 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -52,7 +52,6 @@ "%s (традиционна клавиатура)" "%s (компактна)" "Без език" - "латиница (QWERTY)" "Емотикони" "Добавяне" "Премахване" @@ -68,11 +67,9 @@ "Добре дошли в/ъв %s" "с въвеждане чрез жест" "Първи стъпки" - "Следваща стъпка" "Настройване на %s" "Активирайте %s" Моля, проверете \\%s\" на вашите Езици & входни настройки. Това ще го разреши да работи на вашето устройство. - "Приложението %s вече е активирано от „Език и въвеждане“, така че тази стъпка е изпълнена. Преминете към следващата!" "Активиране в настройките" "Превключете към %s" След това изберете \"%s\" като активен метод за въвеждане на текст. @@ -82,21 +79,18 @@ Завършено Показване на иконата на приложението "Показване на иконата на приложението в стартовия панел" - "Добавени речници" + "Добавени речници" "Речникът е налице" - "Няма налични речници" Последна актуализация "Настройки" "Изтриване" "Версия %1$s" - "Добавяне" "Добавяне в речника" "Пряк път:" "Език:" "Напишете дума" "Незадължителен пряк път" "Редактиране на дума" - "Нямате думи в потребителския речник. За да добавите, докоснете бутона за добавяне (+)." "За всички езици" "Още езици…" " АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЪЮЯ" @@ -260,7 +254,6 @@ Задаване на основен и до 6 допълнителни символа на валута, разделени с интервал Изберете речник за добавяне. Речниците във формат .dict могат да бъдат изтеглени %s. Числа - Задайте име на оформлението Наистина ли изтривате персонализирано оформление %s? Добавете персонализирано оформление Изберете файл в съвместим формат. Информация за форматите е налична %s. @@ -305,7 +298,6 @@ Грешка при зареждането на речниковия файл Синьо сиво Кафяво - Кликнете за преглед Запазване на дневника Текст на лентата с предложения Клавиши фон @@ -329,7 +321,6 @@ Стил Закръглена Шоколадово - Зареждането ще презапише текущата тема Фон на клавиатурата Функционален клавишен фон Фон на интервала @@ -373,17 +364,14 @@ Пространство (оформление с числа) Пясък Изтриване - Мансийски (%s) %s (Пробхат) %s мин %s (Себолсик 390) Кайтагски %s (Разширено) - Кайтагски (%s) %s (Студент) %s (Себолсик Финална) %s (Akkhor) - Латиница (Бепо) ► Продължителното натискане на фиксирани клавиши на лентата с инструменти води до допълнителна функционалност: <br> \n\t• клипборд &#65515; паста <br> \n\t• движение наляво/надясно &#65515; дума ляво/дясно <br> @@ -421,14 +409,11 @@ \n► Когато използвате многоезично въвеждане, интервалът ще покаже стойност на достоверност, използвана за определяне на използвания в момента език. <br> <br> \n► Предложенията ще имат малки числа отгоре, показващи някакъв вътрешен резултат и изходен речник (може да бъде деактивиран). Мансийски - Латиница (Workman) - Латиница (Colemak Mod-DH) Кошче Наистина ли нулирате всички персонализирани икони? Вибриране в режим „Не ме безпокойте“ %s (Фонетичен) Замяна на версията на емотиконите - Уракски (%s) Даргва (Уракски) Преки пътища за автоматично коригиране Когато са активирани, преките пътища може да бъдат разширени чрез автоматично коригиране diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index d15711df9..f91b5ccd3 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -106,7 +106,6 @@ %s (সেবালসিক ৩৯০) %s (সেবালসিক চূড়ান্ত) ভাষাহীন - বর্ণমালা (কোয়ার্টি) ইমোজি সংযুক্ত করুন অপসারণ করুন @@ -122,11 +121,9 @@ %s এ স্বাগত অঙ্গুলিহেলন টাইপিংয়ের সাথে শুরু করা যাক - পরবর্তী পদক্ষেপ %s সন্নিবেশিত হচ্ছে %s সক্ষম করুন ভাষা ও ইনপুট সেটিংসে \"%s\" সক্রিয় করুন। ফলে এটি আপনার ডিভাইসে চলার অনুমোদন পাবে। - আপনার ভাষা ও ইনপুট সেটিংসে ইতোমধ্যে %s সক্ষম করা হয়েছে; তাই এই পদক্ষেপটি সমাপ্ত হয়েছে। পরবর্তীটিতে যান! সেটিংসে সক্ষম করুন %s এ পরিবর্তন করুন এখন সক্রিয় লিখন-ইনপুট পদ্ধতি হিসেবে \"%s\" বেছে নিন। @@ -137,7 +134,7 @@ সম্পন্ন অ্যাপ আইকন প্রদর্শন লঞ্চারে অ্যাপ আইকন প্রদর্শন - অ্যাড-অন অভিধান + অ্যাড-অন অভিধান অভিধান অভ্যন্তরীণ মূল অভিধান "ফাইল থেকে অভিধান সংযুক্তি" @@ -155,19 +152,16 @@ তবুও ব্যবহৃত হবে অভিধান ফাইল অধিযোজন করতে ত্রুটি অভিধান উপলব্ধ - কোনো অভিধান উপলব্ধ নয় সর্বশেষ আপডেট সেটিংস বিলোপ করুন সংস্করণ %1$s - সংযুক্ত করুন অভিধানে যোগ শর্টকাট: ভাষা: শব্দ টাইপ করুন ঐচ্ছিক শর্টকাট শব্দ সম্পাদনা - ব্যবহারকারী অভিধানে আপনার কোনো শব্দ নেই। শব্দ যোগ করতে (+) বোতামটি ট্যাপ করুন। সব ভাষার জন্য আরও ভাষা… \u0020অআইঈউঊঋএঐওঔংঃকখগঘঙচছজঝঞটঠডঢণতথদধনপফবভমযরলশষসহ @@ -186,7 +180,6 @@ ব্যবহারকারী নির্ধারিত ব্যবহারকারী নির্ধারিত (অন্ধকার) স্বয়ংক্রিয় রং নির্বাচন - প্রাগ্‌দর্শনের জন্য ক্লিক করুন লেখা এবং পটভূমির জন্য রং নির্বাচন কিবোর্ডের পটভূমি বোতামের লেখা @@ -226,7 +219,6 @@ অপরিচিত লাইব্রেরি ফাইল। আপনি কি নিশ্চিত যে এটি একটি বিশ্বস্ত উৎস থেকে প্রাপ্ত এবং \'%s\' এর জন্য? পরিবর্তনশীল রং কাইডাগ - কাইডাগ (%s) কেবল মূল রং প্রদর্শন প্রতীক প্রতীক (আরবি) @@ -256,7 +248,6 @@ ফাইল অধিযোগ অপঠনযোগ্য ফাইল বিদ্যমান লেআউট অনুলিপি - লেআউটের নাম লেআউট ত্রুটি: %s মূল লেআউট সম্পাদনা করতে ট্যাপ করুন অধিক প্রতীক @@ -297,7 +288,6 @@ টুলবার বোতাম নির্বাচন সম্পূর্ণ ডান নিম্ন প্যাডিং স্কেল - বর্ণমালা (Bépo) সামঞ্জস্যপূর্ণ ফরম্যাটে ফাইল নির্বাচন করুন। %s ফরম্যাট সম্পর্কিত তথ্য রয়েছে। নিজস্বীকৃত লেআউট সংযুক্তি নিজস্বীকৃত লেআউট %s বিলোপ করতে নিশ্চিত? @@ -329,7 +319,6 @@ সর্বদা মধ্যবর্তী পরামর্শ ব্যবহার করবে স্পেস বা বিরামচিহ্ন চাপ দিলে মধ্যবর্তী পরামর্শ সন্নিবেশিত হবে মানসি - মানসি (%s) পিন করা নেই এমন অন্য টুলবার বোতামের দীর্ঘচাপের কার্যাবলি নিষ্ক্রিয় করবে অধিক রং প্রদর্শন এই সেটিংস অভ্যন্তরীণভাবে ব্যবহৃত সকল রং প্রকাশ করে। রঙের তালিকা যেকোনো সময় পরিবর্তিত হতে পারে। ডিফল্ট রং যেকোনো একটি হতে পারে এবং রঙের নাম অনুবাদ করা হবে না। @@ -343,7 +332,6 @@ ফাইল হিসেবে সংরক্ষণ ক্লিপবোর্ডে অনুলিপি অধিযোগ - অধিযোজন করলে তা বর্তমান থিমকে প্রতিস্থাপন করবে শব্দের বাম শব্দের ডান পাতার উপর @@ -393,7 +381,6 @@ %s (ফোনেটিক) ইমোজি সংস্করণ অগ্রাহ্যকরণ দারগয়া (উরাখি) - উরাখি (%s) স্বতঃসংশোধন শর্টকাট সক্রিয় থাকলে স্বতঃসংশোধন দ্বারা শর্টকাট বর্ধিত হতে পারে ফাইল থেকে নিজস্বীকৃত ফন্ট নির্ধারণ diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index a1d389647..ae6ae8836 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -54,7 +54,6 @@ "%s (tradicionalan)" "%s (kompaktan)" "Nema jezika" - "Abeceda (QWERTY)" "Emoji" "Dodaj" "Ukloni" @@ -70,11 +69,9 @@ "Dobro došli u aplikaciju %s" "s Pisanjem pokretima" "Započnite" - "Sljedeći korak" "Postavljanje aplikacije %s" "Omogući aplikaciju %s" "Označite aplikaciju \"%s\" u postavkama odjeljka Jezici i unos. Na taj način ćete joj dozvoliti da se pokrene na vašem uređaju." - "Aplikacija %s je već omogućena u vašim postavkama odjeljka Jezici i unos, tako da je ovaj korak završen. Pređite na sljedeći!" "Omogući u Postavkama" "Prebacite se na aplikaciju %s" "Zatim odaberite aplikaciju \"%s\" kao vaš aktivni način unosa teksta." @@ -84,21 +81,18 @@ "Završeno" "Prikaži ikonu aplikacije" "Prikazivanje ikone aplikacije na pokretaču" - "Dodatni rječnici" + "Dodatni rječnici" "Rječnik je dostupan" - "Nema dostupnih rječnika" "Posljednji put ažurirano" "Postavke" "Izbriši" "Verzija %1$s" - "Dodaj" "Dodaj u rječnik" "Prečica:" "Jezik:" "Unesite riječ" "Opcionalna prečica" "Uređivanje riječi" - "Nemate nijednu riječ u korisničkom rječniku. Za dodavanje riječi, dodirnite dugme Dodaj (+)" "Za sve jezike" "Više jezika…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 7bc32493f..9067880bc 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -52,7 +52,6 @@ %s (Tradicional) %s (Compacte) Cap idioma - "Alfabet (QWERTY)" Emojis "Afegeix" "Elimina" @@ -68,11 +67,9 @@ Us donem la benvinguda a %s amb escriptura gestual "Comença" - "Pas següent" S\'està configurant %s Habilitar %s Comproveu «%s» a la configuració d\'idiomes i entrada. Això li permetrà executar-se al vostre dispositiu. - %s ja està activada a la configuració d\'idiomes i entrada, així que ja s\'ha acabat aquest pas. Cap al següent! Habilita a la configuració Canviar a %s A continuació, seleccioneu «%s» com a mètode d\'entrada de text actiu. @@ -82,21 +79,18 @@ "Finalitzat" "Mostra la icona de l\'aplicació" "Mostra la icona de l\'aplicació al menú d\'aplicacions" - "Diccionaris complementaris" + "Diccionaris complementaris" "Diccionari disponible" - "Cap diccion. dispon." "Última actualització" "Configuració" "Suprimeix" Versió %1$s - "Afegeix" "Afegeix al diccionari" "Drecera:" "Idioma:" "Escriu una paraula" "Drecera opcional" "Edició de la paraula" - "No tens cap paraula al diccionari de l\'usuari. Toca el botó Afegeix (+) per afegir-n\'hi una." "Per a tots els idiomes" "Més idiomes…" " ABCÇDEFGHIJKLMNOPQRSTUVWXYZ" @@ -202,7 +196,6 @@ Eliminar realment el diccionari afegit per l\'usuari «%s»? Selecciona les tecles de la barra d\'eines del porta-retalls Tanca l\'historial del porta-retalls - Estableix el nom de la disposició Símbols (Àrab) Símbols Carrega @@ -225,7 +218,6 @@ %s (Estès) Carrega fitxer %s (Fonètic) - Alfabet (Bépo) Afegeix una disposició personalitzada Copia al porta-retalls Copia la disposició existent @@ -233,7 +225,6 @@ Telefon Anul·la la versió d\'emojis Darguà (Urakhi) - Darguà (%s) Símbols telefònics Nombres Teclat numèric @@ -270,7 +261,6 @@ Esborra el porta-retalls Entrada de veu Estableix un tipus de lletra personalitzat des de fitxer - Mansi (%s) Teclat numèric (apaïsat) Estableix imatge de fons (apaïsat) Si no s\'estableix, s\'utilitzarà la imatge vertical @@ -280,7 +270,6 @@ Nit %s (Probhat) Mostra consells funcionals - Kaytak (%s) %s (Sebeolsik 390) %s (Sebeolsik Final) Canvia al teclat principal després de… @@ -341,8 +330,6 @@ Cap Codi de tecla Arrodonit - La càrrega sobreescriurà el tema actual - Feu clic per a una vista prèvia Mostra només els colors principals Aquesta configuració exposa tots els colors que s\'utilitzen internament. La llista de colors pot canviar en qualsevol moment. El color predeterminat és aleatori i els noms no es traduiran. Descripció de les característiques ocultes diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 53e5db8b7..909a87bec 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -53,7 +53,6 @@ "%s (Tradiční)" "%s (Kompaktní)" standardní - "Latinka (QWERTY)" "Emodži" "Přidat" "Odebrat" @@ -69,11 +68,9 @@ "Vítá vás %s" "s psaním gesty" "Začínáme" - "Další krok" "Nastavení aplikace %s" "Zapnutí aplikace %s" Povolte aplikaci „%s“ v nastavení Jazyky a zadávání. Tím povolíte její spuštění ve vašem zařízení. - Aplikace %s je již v nastavení Jazyky a zadávání zapnuta, tento krok je tedy již proveden. Pokračujte dalším! "Aktivovat v nastavení" "Přepnutí na aplikaci %s" Poté vyberte jako aktivní metodu zadávání textu možnost „%s“. @@ -83,21 +80,18 @@ "Hotovo" "Zobrazit ikonu aplikace" "Zobrazí ikonu aplikace ve spouštěči" - "Doplňkové slovníky" + "Doplňkové slovníky" "Slovník k dispozici" - "Žádné slovníky" "Poslední aktualizace" "Nastavení" "Smazat" "Verze %1$s" - "Přidat" "Přidat do slovníku" "Zkratka:" "Jazyk:" "Napište slovo" "Volitelná zkratka" "Upravit slovo" - "V uživatelském slovníku nejsou žádná slova. Slovo můžete přidat klepnutím na tlačítko Přidat (+)." "Pro všechny jazyky" "Další jazyky…" " ABCČDEFGHChIJKLMNOPQRŘSŠTUVWXYZŽ" @@ -207,9 +201,7 @@ Zavřít historii schránky Výběr kláves panelu nástrojů schránky Měřítko dolního odsazení - Kaitag (%s) Zkopírovat stávající rozložení - Nastavit název rozvržení Vybrat soubor v kompatibilním formátu. Informace o formátech jsou k dispozici %s. Symboly Symboly (arabské) @@ -273,7 +265,6 @@ %s (Akkhor) %s (Sebeolsik 390) %s (Sebeolsik Final) - Abeceda (Bépo) Načíst soubor Přidat slovo Světlý @@ -316,7 +307,6 @@ Vybrat barvu automaticky Zobrazit pouze hlavní barvy Zobrazit všechny barvy - Klikněte pro náhled %s (Student) Chování klávesy pro přepínání jazyků Vibrace v režimu nerušit @@ -394,10 +384,8 @@ Varování: rozložení se aktuálně používá Opravdu chcete odstranit %s? Nastavit vlastní písmo ze souboru - Urakhi (%s) Nastavit obrázek na pozadí (na šířku) Pokud není nastaven, bude použit obrázek na výšku - Načtením přepíšete aktuální motiv Panel nástrojů Kód dlouhého stisknutí Přepnout stranu režimu jedné ruky @@ -413,7 +401,6 @@ Stisknutí klávesy Enter nebo mezerníku v zobrazení znaků Toto nastavení odhalí všechny interně používané barvy. Seznam barev se může kdykoli změnit. Výchozí barva je náhodná a názvy se nepřekládají. Mansijština - Mansijština (%s) Funkční klávesy Funkční klávesy (znaky) Funkční klávesy (další znaky) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index c4323a6d2..b460e7a9a 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -52,7 +52,6 @@ %s (traditionel) %s (kompakt) "Intet sprog" - "Alfabet (QWERTY)" "Emoji" "Tilføj" "Fjern" @@ -68,11 +67,9 @@ Velkommen til%s "med glidende indtastning" Kom i gang - "Næste trin" %s konfigureres Aktivér%s Markér \"%s\" i dine indstillinger for sprog og indtastning. Dermed får appen tilladelse til at køre på din enhed. - %s er allerede aktiveret i dine indstillinger for sprog og indtastning, så dette trin er gennemført. Fortsæt til næste! "Aktivér i Indstillinger" Skift til%s Vælg derefter \\%s\" som din aktive tekstinputmetode.\" @@ -82,21 +79,18 @@ "Afslut" "Vis appikon" Vis applikationsikon i launcheren - "Ekstra ordbøger" + "Ekstra ordbøger" Ordbog tilgængelig - "Ingen tilg. ordbøger" "Sidst opdateret" "Indstillinger" "Slet" Version %1$s - "Tilføj" "Føj til ordbog" "Genvej:" "Sprog:" "Skriv et ord" "Valgfri genvej" "Rediger ord" - Du har ingen ord i brugerordbogen. Tilføj et ord ved at trykke på knappen Tilføj (+). Til alle sprog "Flere sprog…" " ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ" @@ -233,7 +227,6 @@ Tilføj meget almindelige varianter (standard) URL-registrering Prøv at registrere URL\'er og lignende som et enkelt ord - Indstil layoutnavn Foreslå indhold fra udklipsholder Vis nyligt kopieret udklipsholderindhold som forslag Gem eller indlæs fra fil. Advarsel: Gendannelse overskriver eksisterende data @@ -284,10 +277,6 @@ Mansi %s (udvidet) Skift til hovedtastatur efter… - Mansi (%s) - Urakhi (%s) - Kaitag (%s) - Alfabet (Bépo) Sekundære layouts "Uden en ordbog får du kun forslag til tekst, du har indtastet før.<br>\n Du kan hente ordbøger %1$s eller tjekke, om en ordbog for \"%2$s\" kan hentes direkte %3$s." Vælg en fil i et kompatibelt format. Oplysninger om formaterne er tilgængelige %s. @@ -296,7 +285,6 @@ Indhold kopieret Brugerdefineret Auto-vis værktøjslinje - Tryk for forhåndsvisning Luk Udseende Tastetekst @@ -350,7 +338,6 @@ Auto-skjul værktøjslinje Skjul værktøjslinjen, når forslag bliver tilgængelige Tastekode - Indlæsning overskriver det nuværende tema Ryd alle tilpassede tastekoder? Ugyldigt navn diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 02ba8ac1a..ecc301766 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -52,7 +52,6 @@ %s (Traditionell) %s (Kompakt) "Keine Sprache" - "Lat. Alphabet (QWERTY)" "Emoji" "Hinzufügen" "Entfernen" @@ -68,11 +67,9 @@ Willkommen bei %s mit Gesten-Tippen "Jetzt starten" - "Nächster Schritt" %s einrichten %s aktivieren Bitte aktiviere %s\" unter der Systemeinstellung „Sprachen und Eingabe“. - %s ist bereits in Ihren Sprachen & Eingabeeinstellungen aktiviert, so dass dieser Schritt abgeschlossen ist. Weiter zum nächsten Schritt! "In den Einstellungen aktivieren" Zu %s wechseln Wähle als nächstes %s\" als deine aktive Bildschirmtastatur. @@ -82,21 +79,18 @@ "Fertig" "App-Symbol anzeigen" "App-Symbol in der Übersicht anzeigen" - "Erweiterte Wörterbücher" + "Erweiterte Wörterbücher" "Wörterbuch verfügbar" - Keine Wörterbücher verfügbar "Zuletzt aktualisiert" "Einstellungen" "Löschen" Version %1$s - "Hinzufügen" "Zum Wörterbuch hinzufügen" "Tastaturkürzel:" "Sprache:" "Wort eingeben" "Optionales Tastaturkürzel" "Wort bearbeiten" - Es sind noch keine Wörter in deinem Wörterbuch vorhanden. Du kannst Wörter hinzufügen, indem du auf das „+“-Symbol tippst. "Für alle Sprachen" "Weitere Sprachen…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -202,7 +196,6 @@ Hell Wort hinzufügen Textfarbe Wortvorschlag - Für Vorschau klicken In den Tastatursprachen definierte Varianten anzeigen Gemeinsame Varianten hinzufügen Benutzerdefiniert @@ -263,7 +256,6 @@ Teilungsabstand Gewichtung: Ignoriere Anfragen anderer Apps, Vorschläge zu deaktivieren (kann Probleme verursachen) - Layout-Name festlegen Sprache wechseln Zwischenablage löschen Nacht @@ -299,7 +291,6 @@ Ziffernblock Ziffernblock (Querformat) Kaitakisch - Kaitakisch (%s) Vertikale Wischgeste der Leertaste Nichts Cursor bewegen @@ -326,7 +317,6 @@ Symbolleisten-Taste bei langem Drücken anheften Symbolleiste Emoji - Mansi (%s) Mansi Mehr Farben anzeigen Diese Einstellung legt alle intern verwendeten Farben offen. Die Liste der Farben kann sich jederzeit ändern. Die Standardfarbe ist zufällig und die Namen werden nicht übersetzt. @@ -340,7 +330,6 @@ Laden In Datei speichern In Zwischenablage kopieren - Laden wird die aktuelle Darstellung überschreiben Seitenende Linkes Wort Rechtes Wort @@ -404,7 +393,6 @@ Sprachen mit Wörterbüchern Du kannst Farben im %s finden und teilen. Dargwa (Urakhi) - Urakhi (%s) Sekundäre Layouts Funktionstasten (großer Bildschirm) Randabstand unten (Querformat) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 5ccad3794..18c326c14 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -53,7 +53,6 @@ "%s (Παραδοσιακά)" "%s (Συμπαγές)" "Καμία γλώσσα" - "Αλφάβητο (QWERTY)" "Emoticon" "Προσθήκη" "Κατάργηση" @@ -69,11 +68,9 @@ "Καλώς ορίσατε στο %s" "με Πληκτρολόγηση με κίνηση" "Έναρξη" - "Επόμενο βήμα" "Ρύθμιση της εφαρμογής %s" "Ενεργοποιήστε την εφαρμογή %s" "Επιλέξτε \"%s\" στις Ρυθμίσεις γλώσσας και εισαγωγής, για να το εξουσιοδοτήσετε να εκτελείται στη συσκευή σας." - "Το %s είναι ήδη ενεργοποιημένο στις Ρυθμίσεις γλώσσας και εισαγωγής, συνεπώς το βήμα έχει ολοκληρωθεί. Πάμε στο επόμενο!" "Ενεργοποίηση στις Ρυθμίσεις" "Μετάβαση στην εφαρμογή %s" "Στη συνέχεια, επιλέξτε \"%s\" ως την ενεργή μέθοδο εισαγωγής κειμένου." @@ -83,21 +80,18 @@ "Ολοκληρώθηκε" "Εμφάνιση εικονιδίου εφαρμογής" "Εμφάνιση εικονιδίου εφαρμογής στο πρόγραμμα εκκίνησης" - "Πρόσθετα λεξικά" + "Πρόσθετα λεξικά" "Διαθέσιμο λεξικό" - "Δεν υπάρχουν λεξικά" "Τελευταία ενημέρωση" "Ρυθμίσεις" "Διαγραφή" "Έκδοση %1$s" - "Προσθήκη" "Προσθήκη στο λεξικό" "Συντόμευση:" "Γλώσσα:" "Πληκτρολογήστε μια λέξη" "Προαιρετική συντόμευση" "Επεξεργασία λέξης" - "Δεν υπάρχουν καταχωρισμένες λέξεις στο λεξικό χρήστη. Για να προσθέσετε μια λέξη, πατήστε το κουμπί Προσθήκης (+)." "Για όλες τις γλώσσες" "Περισσότερες γλώσσες…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-en-rAU/strings.xml b/app/src/main/res/values-en-rAU/strings.xml index ba855561c..252f73c2c 100644 --- a/app/src/main/res/values-en-rAU/strings.xml +++ b/app/src/main/res/values-en-rAU/strings.xml @@ -54,7 +54,6 @@ "%s (Traditional)" "%s (Compact)" "No language" - "Alphabet (QWERTY)" "Emoji" "Add" "Remove" @@ -70,11 +69,9 @@ "Welcome to %s" "with Gesture Typing" "Get started" - "Next step" "Setting up %s" "Enable %s" "Please tick \"%s\" in your Languages & input settings. This will authorise it to run on your device." - "%s is already enabled in your Languages & input settings, so this step is complete. On to the next one." "Enable in Settings" "Switch to %s" "Next, select \"%s\" as your active text-input method." @@ -84,21 +81,18 @@ "Finished" "Show app icon" "Display application icon in the launcher" - "Add-on dictionaries" + "Add-on dictionaries" "Dictionary available" - "No dictionaries available" "Last updated" "Settings" "Delete" "Version %1$s" - "Add" "Add to dictionary" "Shortcut:" "Language:" "Type a word" "Optional shortcut" "Edit word" - "You don\'t have any words in the user dictionary. To add a word, tap the Add (+) button." "For all languages" "More languages…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-en-rCA/strings.xml b/app/src/main/res/values-en-rCA/strings.xml index ba855561c..252f73c2c 100644 --- a/app/src/main/res/values-en-rCA/strings.xml +++ b/app/src/main/res/values-en-rCA/strings.xml @@ -54,7 +54,6 @@ "%s (Traditional)" "%s (Compact)" "No language" - "Alphabet (QWERTY)" "Emoji" "Add" "Remove" @@ -70,11 +69,9 @@ "Welcome to %s" "with Gesture Typing" "Get started" - "Next step" "Setting up %s" "Enable %s" "Please tick \"%s\" in your Languages & input settings. This will authorise it to run on your device." - "%s is already enabled in your Languages & input settings, so this step is complete. On to the next one." "Enable in Settings" "Switch to %s" "Next, select \"%s\" as your active text-input method." @@ -84,21 +81,18 @@ "Finished" "Show app icon" "Display application icon in the launcher" - "Add-on dictionaries" + "Add-on dictionaries" "Dictionary available" - "No dictionaries available" "Last updated" "Settings" "Delete" "Version %1$s" - "Add" "Add to dictionary" "Shortcut:" "Language:" "Type a word" "Optional shortcut" "Edit word" - "You don\'t have any words in the user dictionary. To add a word, tap the Add (+) button." "For all languages" "More languages…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 5aed3b377..c27c9ba9d 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -53,7 +53,6 @@ %s (Traditional) %s (Compact) "No language" - "Alphabet (QWERTY)" "Emoji" "Add" "Remove" @@ -69,11 +68,9 @@ Welcome to %s "with Gesture Typing" "Get started" - "Next step" Setting up %s Enable %s Please tick \"%s\" in your Languages & input settings. This will authorise it to run on your device. - %s is already enabled in your Languages & input settings, so this step is done. On to the next one! "Enable in Settings" Switch to %s Next, select \"%s\" as your active text-input method. @@ -83,21 +80,18 @@ "Finished" "Show app icon" "Display application icon in the launcher" - "Add-on dictionaries" + "Add-on dictionaries" "Dictionary available" - "No dictionaries available" "Last updated" "Settings" "Delete" Version %1$s - "Add" "Add to dictionary" "Shortcut:" "Language:" "Type a word" "Optional shortcut" "Edit word" - "You don\'t have any words in the user dictionary. To add a word, tap the Add (+) button." "For all languages" "More languages…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-en-rIN/strings.xml b/app/src/main/res/values-en-rIN/strings.xml index d2a17043c..9f5095052 100644 --- a/app/src/main/res/values-en-rIN/strings.xml +++ b/app/src/main/res/values-en-rIN/strings.xml @@ -54,7 +54,6 @@ "%s (Traditional)" "%s (Compact)" "No language" - "Alphabet (QWERTY)" "Emoji" "Add" "Remove" @@ -70,11 +69,9 @@ "Welcome to %s" "with Gesture Typing" "Get started" - "Next step" "Setting up %s" "Enable %s" "Please tick \"%s\" in your Languages & input settings. This will authorise it to run on your device." - "%s is already enabled in your Languages & input settings, so this step is complete. On to the next one." "Enable in Settings" "Switch to %s" "Next, select \"%s\" as your active text-input method." @@ -84,21 +81,18 @@ "Finished" "Show app icon" "Display application icon in the launcher" - "Add-on dictionaries" + "Add-on dictionaries" "Dictionary available" - "No dictionaries available" "Last updated" "Settings" "Delete" "Version %1$s" - "Add" "Add to dictionary" "Shortcut:" "Language:" "Type a word" "Optional shortcut" "Edit word" - "You don\'t have any words in the user dictionary. To add a word, tap the Add (+) button." "For all languages" "More languages…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-en-rXC/strings.xml b/app/src/main/res/values-en-rXC/strings.xml index 69208dc16..0a2c86239 100644 --- a/app/src/main/res/values-en-rXC/strings.xml +++ b/app/src/main/res/values-en-rXC/strings.xml @@ -53,7 +53,6 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‏‎‏‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ (Traditional)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ (Compact)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‏‏‎‏‎‎‏‎‎‏‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‏‏‎No language‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‏‎‎‎Alphabet (QWERTY)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‎‎‏‎‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎Emoji‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‎‎‏‏‎‏‏‎‎‎‎‎‎‏‎‎‎‎‎‏‎‎‏‏‎‏‏‏‏‏‎Add‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‎‏‎‏‎‏‏‏‎‏‎‏‏‎‏‎‏‎‎‏‎‏‏‎‎‎‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎Remove‎‏‎‎‏‎" @@ -69,11 +68,9 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‏‎‏‎‎‎‏‏‎‏‎‏‏‏‏‎‏‎‏‎‎‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎Welcome to ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‏‏‏‏‏‎with Gesture Typing‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‏‏‎‎‎‏‎‎‏‎‏‎‏‏‎‏‎‏‏‎‏‎‏‎Get started‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎‎‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‎‏‏‏‎‏‎‎‎‎‎‎‎‎‏‎‏‎‏‎‏‏‏‎‏‎‎‏‏‏‎‎‎‏‏‏‎Next step‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‏‎‏‎‏‎‏‎‏‎‏‏‎‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎Setting up ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎Enable ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‎‏‎‎‎‏‏‏‏‏‏‎‏‎Please check \"‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎\" in your Languages & input settings. This will authorize it to run on your device.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‎‏‏‎‏‏‏‎‏‏‎‏‎‎‏‏‎‏‎‎‏‏‎‏‏‏‏‎‏‎‏‏‎‎‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ is already enabled in your Languages & input settings, so this step is done. On to the next one!‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‏‏‏‏‎‎‎‏‏‏‎‏‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‏‎‏‎‏‎‏‏‎‏‏‎‎‎‏‎‎‎‎‎‎Enable in Settings‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‎‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‏‎‎‎‏‎‎Switch to ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‎‏‎‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‏‎‎‎‎Next, select \"‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎\" as your active text-input method.‎‏‎‎‏‎" @@ -83,21 +80,18 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‎‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‎‏‏‎‎‎‎‎‎‎‏‏‏‎‏‏‎‎‎Finished‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‏‎‎‎‏‏‏‎‏‎‎‎‏‏‎‎‎‏‎‏‎‏‏‎‎‎‎‏‏‏‏‏‎Show app icon‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‎‎‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‎Display application icon in the launcher‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‎Add-on dictionaries‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‎Add-on dictionaries‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‎‏‏‏‏‎‏‏‎‎‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‎‎‏‎‏‎Dictionary available‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‎‎‏‎‎‎‏‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‏‏‏‎‎‎‎‎‏‏‏‎‏‏‏‎‎No dictionaries available‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‎‏‎‎‏‏‏‏‏‎‎‎‎‎‎‏‎‎‏‏‎‎‎Last updated‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‎‎‏‏‎‎‏‎‏‎‎‏‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‎‎‏‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‎‎‎Settings‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‏‏‎‎‏‎‎‎Delete‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‎‏‏‎‎‎‏‎‎‏‎Version ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‏‏‎‎‎‎‎‏‏‎‏‎‎‎‎‏‎‎‏‎‏‏‏‏‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‎‏‏‎Add‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‎‏‎‎‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎‏‏‎‏‎‎‎‎‎‎‎Add to dictionary‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‎‎‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎Shortcut:‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‏‎‎‏‎‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‏‎Language:‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‎‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‏‎‏‎‏‏‎Type a word‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‎‏‏‏‎‎‏‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎‎‎‏‎‎‎‎‎‏‏‏‎‏‏‏‎‎Optional shortcut‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‏‏‎‏‎‎‏‎‏‎‏‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‎‎‏‏‏‎‏‎‎‎‎‏‏‎Edit word‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‏‏‎‎‎‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‎‎‎‎‎‎‎‏‏‏‎‎‏‎You don\'t have any words in the user dictionary. To add a word, tap the Add (+) button.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‎‏‎‎‎‎‏‎‎‏‎‏‏‏‎‎‎‏‎‎For all languages‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‏‎‏‎‎‎‏‏‎‎‏‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‏‎‎More languages…‎‏‎‎‏‎" " ‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‎‎‏‏‎‎‏‎‏‎‎‏‎‏‏‏‎‏‎‏‏‎‏‎‏‎‏‏‏‏‏‎‏‎‎‏‎‏‎‏‎‎ ABCDEFGHIJKLMNOPQRSTUVWXYZ‎‏‎‎‏‎" diff --git a/app/src/main/res/values-es-rUS/strings.xml b/app/src/main/res/values-es-rUS/strings.xml index a33342ab2..20a94d249 100644 --- a/app/src/main/res/values-es-rUS/strings.xml +++ b/app/src/main/res/values-es-rUS/strings.xml @@ -52,7 +52,6 @@ "%s (tradicional)" "%s (compacto)" "Ningún idioma" - "Alfabeto (QWERTY)" "Emoji" "Agregar" "Eliminar" @@ -68,11 +67,9 @@ "Te damos la bienvenida a %s" "con escritura gestual" "Comenzar" - "Siguiente paso" "Configurando %s…" "Habilitar %s" "Marca \"%s\" en Teclado e idioma para permitir que la app se ejecute en tu dispositivo." - "Debido a que la app de %s ya está habilitada en Teclado e idioma, pasaremos al siguiente paso." "Habilitar en Configuración" "Cambiar a %s" "A continuación, selecciona \"%s\" como tu método de entrada de texto activo." @@ -82,21 +79,18 @@ "Listo" "Mostrar ícono de aplicación" "Mostrar ícono de aplicación en el selector" - "Diccionarios complementarios" + "Diccionarios complementarios" "Diccionario disponible" - "No hay diccionarios." "Última actualización" "Configuración" "Eliminar" "Versión %1$s" - "Agregar" "Agregar al diccionario" "Acceso directo:" "Idioma:" "Escribe una palabra" "Acceso directo opcional" "Editar palabra" - "El diccionario del usuario no contiene ninguna palabra. Para agregar una, presiona el botón Agregar (+)." "Todos los idiomas" "Más idiomas" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -226,13 +220,11 @@ Pulsación larga de la tecla de símbolos para cambiar al teclado numérico Reducir la distancia de las teclas Kaitag - Alfabeto (Bépo) Añadir diseño personalizado Cargar archivo No se puede leer el archivo Seleccione un archivo en un formato compatible. La información sobre los formatos está disponible %s. Copiar diseño existente - Establecer el nombre del diseño ¿Borrar realmente el diseño personalizado %s? Error de diseño: %s Pulse para editar el diseño sin procesar @@ -276,7 +268,6 @@ Escoger colores automáticamente Mostrar sólo los colores principales Mostrar todos los colores - Haga clic para ver la vista previa Seleccionar colores para el texto y los fondos Fondo del teclado Texto de la tira de sugerencias @@ -316,7 +307,6 @@ Ignorar la petición de otras aplicaciones de desactivar las sugerencias (puede producir problemas) Mostrar pistas de funciones Escala del borde inferior - Kaitag (%s) "Sin diccionario, sólo obtendrá sugerencias para el texto que haya introducido anteriormente.<br> \n Puede descargar los diccionarios %1$s, o comprobar si se puede descargar directamente un diccionario para \"%2$s\" %3$s." ► Pulsando prolongadamente la tecla del portapapeles (la opcional en la tira de sugerencias) se pega el contenido del portapapeles del sistema. <br> <br> ► Al pulsar prolongadamente las teclas de la barra de sugerencias, éstas se fijan a la barra de sugerencias. <br> <br> ► Pulse prolongadamente la tecla Coma para acceder a la vista del portapapeles, la vista de emoji, el modo de una mano, Ajustes o Cambiar idioma: <br> \t• La vista Emoji y el cambio de idioma desaparecerán si tienes activada la tecla correspondiente; <br> \t• Para algunas distribuciones no es la tecla Coma, sino la tecla en la misma posición (por ejemplo, es \'q\' para la distribución Dvorak). <br> <br> ► Cuando el modo incógnito está activado, no se aprende ninguna palabra ni se añaden emojis a los favoritos. <br> <br> ► Pulse el icono Incógnito para acceder a la barra de herramientas. <br> <br> ► Tecla deslizante: Desliza desde Mayúsculas a otra tecla para escribir una sola mayúscula: <br> \t• Esto también funciona con la tecla \'?123\' para escribir un solo símbolo del teclado de símbolos, y con las teclas relacionadas. <br> <br> ► Mantenga pulsada una sugerencia en la tira de sugerencias para mostrar más sugerencias, y el botón suprimir para eliminar esta sugerencia. <br> <br> ► Desliza el dedo hacia arriba desde una sugerencia para abrir más sugerencias y suéltalo para seleccionarla. <br> <br> ► Mantén pulsada una entrada del historial del portapapeles para anclarla (se mantendrá en el portapapeles hasta que la desancles). <br> <br> ► Puedes añadir diccionarios abriéndolos en un explorador de archivos: <br> \t• Esto sólo funciona con <i>content-uris</i> y no con <i>file-uris</i>, lo que significa que puede no funcionar con algunos exploradores de archivos. <br> <br> <i>Modo depuración / depurar APK</i> <br> <br> \t• Pulsa prolongadamente una sugerencia para mostrar el diccionario de origen.<br> <br> \t• Cuando se utiliza el APK de depuración, se puede encontrar la Configuración de Depuración dentro de las Preferencias Avanzadas, aunque la utilidad es limitada excepto para volcar diccionarios en el registro. <br> <br> \t• En caso de que se bloquee una aplicación, se te preguntará si quieres los registros de bloqueo cuando abras la Configuración. <br> <br> \t• Al utilizar la escritura multilingüe, la barra espaciadora mostrará un indicador de confianza utilizado para determinar el idioma utilizado en ese momento. <br> <br> \t• Las sugerencias tendrán unos pequeños números en la parte superior mostrando alguna puntuación interna y el diccionario de fuentes (se puede desactivar). <br> <br> ► Para usuarios que realizan copias de seguridad manuales con acceso root: A partir de Android 7, el archivo de preferencias compartidas no está en la ubicación predeterminada, porque la aplicación está utilizando %s. <br> Esto es necesario para poder leer los ajustes antes de desbloquear el dispositivo, por ejemplo, en el arranque. <br> El archivo se encuentra en /data/user_de/0/package_id/shared_prefs/, aunque esto puede depender del dispositivo y de la versión de Android. @@ -326,7 +316,6 @@ Seleccionar teclas de la barra de herramientas del portapapeles %s (Extendido) Mansi - Mansi (%s) Mostrar más colores Esta configuración muestra todos los colores que se utilizan internamente. La lista de colores puede cambiar en cualquier momento. El color predeterminado es aleatorio, y los nombres no se traducirán. Teclas funcionales @@ -346,7 +335,6 @@ Enfriamiento de escritura rápida Siempre iniciar instantáneamente Personalizar divisas - La carga sobrescribirá el tema actual Final de página Inicio de página Palabra izquierda diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 2fbd48c9b..06a41f483 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -52,7 +52,6 @@ %s (Tradicional) %s (Compacto) "Ningún idioma" - "Alfabeto (QWERTY)" "Emoji" "Añadir" "Quitar" @@ -68,11 +67,9 @@ Bienvenido a %s "con escritura gestual" "Empezar" - "Siguiente paso" Configurando %s Activar %s Por favor, compruebe \"%s\" en sus ajustes de entrada de Idiomas. Esto lo autorizará a ejecutarse en su dispositivo.\" - %s ya está habilitado en sus idiomas & configuración de entrada, por lo que este paso está hecho. ¡En el siguiente! "Habilitar en Ajustes" Cambiar a %s A continuación, seleccione \\%s\" como su método de entrada de texto activo.\" @@ -82,21 +79,18 @@ "Listo" "Mostrar icono de aplicación" "Mostrar icono de aplicación en menú de aplicaciones" - "Diccionarios complementarios" + "Diccionarios complementarios" "Diccionario disponible" - "No hay diccionarios" "Última actualización" "Ajustes" "Eliminar" Versión %1$s - "Añadir" "Añadir al diccionario" "Acceso directo:" "Idioma:" "Escribe una palabra" "Introducir" "Editar palabra" - "No tienes ninguna palabra en el diccionario del usuario. Toca el botón (+) para añadir una." "Todos los idiomas" "Más idiomas…" " ABCDEFGHIJKLMNÑOPQRSTUVWXYZ" @@ -193,7 +187,6 @@ Cargar archivo Error al leer archivo Copiar diseño existente - Definir el nombre del diseño ¿Desea borrar el diseño personalizado %s? aquí %s (experimental) @@ -288,7 +281,6 @@ Día Dirección variable de la barra de herramientas Kaitag - Kaitag (%s) Cerrar historial del portapapeles Seleccionar teclas de la barra de herramientas del portapapeles Mostar indicaciones funcionales @@ -327,13 +319,10 @@ Bosque Índigo Océano - Alfabeto (Bépo) Mostrar la barra de herramientas si se ingresa o selecciona texto Mansi - Mansi (%s) Definido por el usuario (noche) Esta configuración muestra todos los colores que se usan internamente. La lista de colores puede cambiar en cualquier momento. El color por defecto es aleatorio y los nombres no serán traducidos. - Toca para previsualizar Seleccionar colores para el texto y fondos Texto del indicio de tecla Fondo de tecla @@ -392,14 +381,12 @@ Código de presión prolongada Personalizar iconos Añadir variantes muy comunes (defecto) - Cargar sobreescribirá el tema actual Papelera ¿Realmente restablecer todos los íconos personalizados? Vibrar en el modo No molestar %s (Fonético) Sustituir versión de Emoji Dargwa (Urakhi) - Urakhi (%s) Si se activa, los accesos directos pueden expandirse con la autocorrección Atajos de autocorrección Establecer una fuente personalizada desde un archivo diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 0eb47d343..3d23d63e6 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -52,7 +52,6 @@ "%s (traditsiooniline)" "%s (kompaktne)" "Keel puudub" - "Tähestik (QWERTY)" "Emotikon" "Lisa" "Eemalda" @@ -68,11 +67,9 @@ "Tere tulemast rakendusse %s" "joonistusega sisestamisega" Alusta siit - "Järgmine toiming" "Rakenduse %s seadistamine" Võta %s kasutusele Palun märgi nutiseadme keele- ja sisendiseadetes „%s“ lubatuks. See võimaldab rakenduse kasutamist sinu nutiseadmes. - xliff:g id=\"APPLICATION_NAME\" example=\"Android Keyboard\">%s</xliff:g> on sinu nutiseadme keele- ja sisendiseadetes juba lubatud, seega on see toiming tehtud. Asu järgmise toimingu juurde! "Luba seadetes" Võta %s kõikjal kasutusele Järgmisena vali aktiivseks tekstisisestusmeetodiks rakendus „%s“. @@ -82,21 +79,18 @@ "Lõpetatud" "Kuva rakenduse ikoon" "Rakenduse ikooni kuvamine käivitajas" - "Pistiksõnastikud" + "Pistiksõnastikud" "Sõnastik on saadaval" - "Sõnastikke pole" "Viimati värskendatud" "Seaded" "Kustuta" "Versioon %1$s" - "Lisa" "Sõnaraamatusse lisamine" "Otsetee:" "Keel:" "Sisestage sõna" "Valikuline otsetee" "Sõna muutmine" - "Kasutaja sõnaraamatus ei ole ühtki sõna. Sõna lisamiseks puudutage nuppu Lisa (+)." "Kõikides keeltes" "Rohkem keeli …" " ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY" @@ -117,7 +111,6 @@ Lõikelaua ajalugu Sisend Lisaklahvid - Eelvaateks klõpsi Vaheta sisestusmeetodit tühikuklahviga Seadista klahvistikku HeliBoardi õigekirjakontroll @@ -128,7 +121,6 @@ Klahvistiku kõrguse proportsioonid Pika vajutusega tühikuklahvile avaneb sisestusmeetodite valiku menüü Viga: märgistik ei ühildu selle klahvistikuga - Mansi (%s) Numbririda Ujuv eelvaade Viipamisel kuvatakse soovitatud sõna klahvistiku kohal @@ -227,7 +219,6 @@ Laadi fail Mansi Sinu tekst tühikuklahvil - Anna paigutusele nimi Vali lõikelaua nupud tööriistariba jaoks %s (laiendatud) Laadi @@ -285,7 +276,6 @@ %s (Õpilaste) Funktsiooniklahvid %s (Sebeolsiku lõppvariant) - Kaitagi (%s) Peidetud funktsionaalsuse kirjeldus seadme turvatud andmekogu Funktsiooniklahvid (sümbolid) @@ -321,7 +311,6 @@ Sinu määratud Sinu määratud (öövaade) Näita kõiki värve - Uue välimuse laadimine asendab praeguse Vali värv automaatselt Näita vaid põhivärve Šokolaadipruun @@ -419,9 +408,6 @@ Funktsiooniklahvid (täiendavad sümbolid) %s (Probhat) %s (Sebeolsik 390) - Tähestik (Workman) - Tähestik (Colemak Mod-DH) - Tähestik (Bépo) Tööriistariba Prügikast Kas kindlasti soovid lähtestada kõik sinu seadistatud ikoonid? @@ -429,7 +415,6 @@ %s (Phonetic) Ära arvesta emojide versiooni Androidis Dargi (Urahhi) - Urahhi (%s) Paranda lühendid automaatselt Selle valikuga luuakse lühendist või sõnaosast terve sõna Vali taustapilt (rõhtvormingus) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index e7b873ffd..2874c69b2 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -52,7 +52,6 @@ %s (Tradizionala) %s (Trinkoa) "Ez dago hizkuntzarik" - Alfabetoa (QWERTY) "Emojiak" "Gehitu" "Kendu" @@ -68,11 +67,9 @@ Ongi etorri %s aplikaziora Keinu-idazketarekin "Hasi erabiltzen" - "Hurrengo urratsa" %s konfiguratzen %s gaitu Hautatu \"%s\" Hizkuntza eta idazketa ataleko ezarpenetan &. Horrek gailuan exekutatzea baimenduko dio. - %s gaituta duzu Hizkuntza eta idazketa ataleko ezarpenetan & beraz, urratsa eginda dago. Ekin hurrengoari! Gaitu Ezarpenetan Aldatu %s aplikaziora Ondoren, hautatu \"%s\" idazketa-metodo aktibo gisa. @@ -82,21 +79,18 @@ "Amaituta" "Erakutsi aplikazioaren ikonoa" Bistaratu aplikazioaren ikonoa panelean - "Hiztegi gehigarriak" + "Hiztegi gehigarriak" "Hiztegia erabilgarri" - "Ez dago hiztegirik erabilgarri" "Azken eguneratzea" "Ezarpenak" "Ezabatu" %1$s bertsioa - "Gehitu" "Gehitu hiztegian" "Lasterbidea:" "Hizkuntza:" "Idatzi hitz bat" "Aukerako lasterbidea" "Editatu hitza" - "Hutsik daukazu erabiltzailearen hiztegia. Hitzak gehitzeko, sakatu Gehitu (+) botoia." "Hizkuntza guztietan" "Hizkuntza gehiago…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -191,12 +185,10 @@ Sakatu luze ikurren tekla teklatu numerikorako Murriztu teklen arteko tarteak Beheko betegarriaren eskala - Kaitag (%s) ikurrak Pisua: Marroia Erabiltzaileak definituta (gauekoa) - Egin klik aurrebista ikusteko Hautatu koloreak testurako eta atzeko planoetarako Kaitag Itxi @@ -234,13 +226,11 @@ Hautatu hitza %s (Sebeolsik 390) %s (Sebeolsik Final) - Alfabetoa (Bépo) Gehitu diseinu pertsonalizatua Hautatu fitxategi bat formatu bateragarri batean. Formatuei buruzko informazioa eskuragarri dago %s. Kargatu fitxategia Ezin da fitxategia irakurri Kopiatu lehendik dagoen diseinua - Ezarri diseinuaren izena Benetan ezabatu %s diseinu pertsonalizatua? Sakatu diseinu gordina editatzeko Ikurrak (Arabiarrak) @@ -341,7 +331,6 @@ Hizkuntza aldatzeko teklaren portaera Ezkutatu tresna-barra iradokizunak erabilgarri daudenean Hasi beti berehala - Mansi (%s) Idazketa azkarraren itxaron denbora %s (Extended) Emojia @@ -360,7 +349,6 @@ Hitzaren eskuinean Orria behera Orria gora - Kargatzeak uneko gaia gainidatziko du Iradoki arbeleko edukia Erakutsi duela gutxi kopiatutako arbeleko edukia iradokizun gisa Mugitu aurrebista keinu egitean @@ -442,7 +430,6 @@ Emojien eskala Neutroa Dargwa (Urakhi) - Urakhi (%s) % s-n diseinuak aurki eta parteka ditzakezu. eztabaiden atala Izen baliogabea diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 832f92b0d..ad3a58a09 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -52,7 +52,6 @@ %s (سنتی) %s (فشرده) "بدون زبان" - "‏حروف الفبا (QWERTY)" "اموجی" "افزودن" "حذف" @@ -68,11 +67,9 @@ به %s خوش آمدید "با ورودی اشاره‌ای" "شروع به کار" - "مرحله بعد" راه‌اندازی %s فعال‌سازی %s لطفاً «%s» را در تنظیمات «زبان‌ها و ورودی» علامت بزنید. این کار مجوز اجرا در دستگاه است. - %s از قبل در تنظیمات «زبان‌ها و ورودی» شما فعال شده است، بنابراین این مرحله تمام است. به مرحله بعد بروید! "فعال‌سازی در تنظیمات" به %s تعویض کنید در مرحله بعد، «%s» را به عنوان روش ورودی نوشتار فعال خود انتخاب کنید. @@ -82,21 +79,18 @@ "تمام شد" "نمایش نماد برنامه" "نمایش نماد برنامه در راه‌انداز" - "واژه‌نامه‌های برافزا" + "واژه‌نامه‌های برافزا" "واژه‌نامه موجود است" - "هیچ فرهنگ لغتی موجود نیست" "آخرین به‌روزرسانی" "تنظیمات" "حذف" نسخه %1$s - "افرودن" "افزودن به واژه‌نامه" "میان‌بر:" "زبان:" "کلمه‌ای تایپ کنید" "میان‌بر اختیاری" "ویرایش کلمه" - "واژه‌ای در واژه‌نامه کاربر ندارید. برای افزودن واژه، روی دکمه افزودن (+) ضربه بزنید." "برای همه زبان‌ها" "زبان‌های بیشتر…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index b7744bda4..364534bca 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -52,7 +52,6 @@ "%s (perinteinen)" "%s (tiivis)" "Ei kieltä" - "aakkoset (QWERTY)" "Emoji" "Lisää" "Poista" @@ -68,11 +67,9 @@ "Tervetuloa käyttämään sovellusta %s" "ja piirtokirjoitus" "Aloita" - "Seuraava vaihe" "Sovelluksen %s asetukset" "Ota %s käyttöön" Valitse%s Kielet ja syöttötapa ‑asetuksissa. Se antaa sovellukselle luvan toimia laitteellasi.\" - "%s on jo otettu käyttöön Kielet ja syöttötapa ‑asetuksissa, joten tämä vaihe on valmis. Siirrytään eteenpäin!" "Ota käyttöön asetuksissa" "Siirry sovellukseen %s" Valitse%s käytössä olevaksi tekstinsyöttötavaksi.\" @@ -82,21 +79,18 @@ "Valmis" "Näytä sovelluskuvake" Näytä sovelluskuvake käynnistysohjelmassa - "Sanakirjalisäosat" + "Sanakirjalisäosat" "Sanakirja saatavilla" - "Ei sanak. saatavilla" "Päivitetty viimeksi" "Asetukset" "Poista" "Versio %1$s" - "Lisää" "Lisää sanakirjaan" "Pikanäppäin:" "Kieli:" "Kirjoita sana" "Valinnainen pikanäppäin" "Muokkaa sanaa" - "Käyttäjän sanakirjassa ei ole sanoja. Lisää sana koskettamalla Lisää (+) ‑painiketta." "Kaikille kielille" "Lisää kieliä…" " ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ" @@ -190,7 +184,6 @@ Tummempi Pilvinen Värit (yö) - Lataaminen korvaa nykyisen teeman Ulkoasu seuraa järjestelmän asetuksia Näppäimistön tausta Emoji @@ -217,7 +210,6 @@ Tyhjennä leikepöytä Valitse tekstin ja taustan värit - Anna asettelulle nimi Korvaa sanakirja Tyyli %s (kokeellinen) diff --git a/app/src/main/res/values-fr-rCA/strings.xml b/app/src/main/res/values-fr-rCA/strings.xml index 5a78b6ef3..4dd53601d 100644 --- a/app/src/main/res/values-fr-rCA/strings.xml +++ b/app/src/main/res/values-fr-rCA/strings.xml @@ -52,7 +52,6 @@ "%s (traditionnel)" "%s (compact)" "Aucune langue" - "Alphabet latin (QWERTY)" "Emoji" "Ajouter" "Supprimer" @@ -68,11 +67,9 @@ "Bienvenue dans %s" "avec la saisie gestuelle" "Commencer" - "Étape suivante" "Configurer %s" "Activer %s" Cochez «%s » dans le menu Langues et méthodes d\'entrée. Cela permettra à l\'application de fonctionner sur votre appareil.\" - "%s est déjà activée dans le menu Langues et méthodes d\'entrée. Excellent, passons à la prochaine étape!" "Activer le clavier dans les paramètres" "Basculer vers %s" "Sélectionnez ensuite \"%s\" comme mode de saisie actif." @@ -82,21 +79,18 @@ "OK" "Afficher icône application" "Afficher l\'icône de l\'application dans le lanceur" - "Dictionnaires complémentaires" + "Dictionnaires complémentaires" "Dictionnaire disponible" - "Aucun dictionnaire" "Dernière mise à jour" "Paramètres" "Supprimer" "Version %1$s" - "Ajouter" "Ajouter au dictionnaire" "Raccourci :" "Langue :" "Entrez un mot" "Raccourci facultatif" "Modifier le mot" - "Votre dictionnaire personnel ne contient aucun mot. Pour ajouter un mot, touchez le bouton d\'ajout (+)." "Pour toutes les langues" "Plus de langues…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 9f439a003..402365bae 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -62,7 +62,6 @@ %s (Traditionnel) %s (Compact) "Aucune langue" - "Alphabet latin (QWERTY)" Émoji "Ajouter" "Supprimer" @@ -73,7 +72,6 @@ Sélectionner un fichier dans un format compatible. Des informations sur les formats sont disponibles %s. Charger fichier Copier une disposition existante - Définir le nom de la disposition Souhaitez-vous réellement supprimer la disposition personnalisée %s ? Erreur de disposition : %s Appuyez pour modifier la disposition d\'origine @@ -91,11 +89,9 @@ Bienvenue sur %s "avec la saisie gestuelle" "Commencer" - "Étape suivante" Configurer %s Activer %s Veuillez vérifier que %s est activé dans vos paramètres de langue et de saisie. Cela autorisera son fonctionnement sur votre appareil. - L’application %s est déjà activée dans vos paramètres « Langues et saisie ». Passez à l’étape suivante ! "Activer le clavier dans les paramètres" Basculer vers %s Sélectionnez ensuite « %s » comme méthode de saisie active. @@ -106,7 +102,7 @@ "OK" "Afficher l\'icône de l\'application" "Affiche l\'icône de l\'application dans le lanceur" - "Dictionnaires complémentaires" + "Dictionnaires complémentaires" Dictionnaires Dictionnaires intégrés "Ajouter dictionnaire" @@ -129,11 +125,9 @@ Nouveau dictionnaire: "Utiliser quand même" "Erreur de chargement du fichier dictionnaire" "Dictionnaire disponible" - "Aucun dictionnaire" "Dernière mise à jour" "Supprimer" Version %1$s - "Ajouter" "Ajouter au dictionnaire" "Raccourci :" Poids : @@ -141,7 +135,6 @@ Nouveau dictionnaire: "Saisissez un mot" "Raccourci facultatif" "Modifier le mot" - "Votre dictionnaire personnel ne contient aucun mot. Pour ajouter un mot, appuyez sur le bouton d\'ajout \"+\"." "Pour toutes les langues" "Plus de langues…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -231,7 +224,6 @@ Nouveau dictionnaire: Choix automatique de la couleur Afficher les couleurs principales Afficher toutes les couleurs - Cliquez pour voir l\'aperçu Sélection des couleurs du texte et de l\'arrière-plan Arrière-plan du clavier Texte des touches @@ -305,7 +297,6 @@ Nouveau dictionnaire: Balayage horizontal de la barre d\'espace Pavé numérique (paysage) Couper - Kaitag (%s) Symboles (Arabe) Symboles du pavé téléphonique Chiffres @@ -322,7 +313,6 @@ Nouveau dictionnaire: Sélectionner les touches de la barre d\'outils du presse-papiers %s (Étendu) Mansi - Mansi (%s) Afficher plus de couleurs Ce paramètre expose toutes les couleurs utilisées en interne. La liste des couleurs peut être modifiée à tout moment. La couleur par défaut est aléatoire et les noms ne seront pas traduits. Touches fonctionnelles @@ -354,7 +344,6 @@ Nouveau dictionnaire: Mot de droite Haut de page Bas de page - Le chargement écrasera le thème actuel Basculer vers le pavé numérique Passer au clavier principal après avoir… Sélectionné une entrée dans l\'historique du presse-papiers @@ -396,7 +385,6 @@ Nouveau dictionnaire: %s (Phonétique) Remplacer la version des émojis Dargwa (Urakhi) - Urakhi (%s) Correction automatique des raccourcis Lorsque les raccourcis sont activés, ils peuvent être étendus par correction automatique Définir une police personnalisée à partir d\'un fichier diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index f42c2ad76..b34acf1b1 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -52,7 +52,6 @@ "%s (tradicional)" "%s (compacto)" "Ningún idioma" - "alfabeto (QWERTY)" "Emoji" "Engadir" "Eliminar" @@ -68,11 +67,9 @@ Ben vida a %s "con escritura por xestos" "Comezar" - "Seguinte paso" "Configurando %s" "Activar %s" Comproba a aplicación%s\" na configuración Idioma e introdución de texto para que se poida executar no teu dispositivo.\" - %s xa está activada en Idiomas e Axustes de escritura, así que isto xa está. Imos ao seguinte paso!\" "Activar en Configuración" "Cambiar a %s" "A continuación, selecciona \"%s\" como o método de introdución de texto activo." @@ -82,21 +79,18 @@ "Finalizado" "Mostrar icona da aplicación" "Mostra a icona da aplicación no Launcher" - "Dicionarios complementarios" + "Dicionarios complementarios" "Dicionario dispoñible" - "Non hai dicionarios" "Última actualización" "Configuración" "Eliminar" "Versión %1$s" - "Engadir" "Engadir ao dicionario" "Atallo:" "Idioma:" "Escribe unha palabra" "Atallo opcional" "Editar palabra" - "Non tes ningunha palabra no dicionario de usuario. Toca o botón Engadir (+) para engadir unha palabra." "Para todos os idiomas" "Máis idiomas…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -144,7 +138,6 @@ Elixir cor automáticamente Mostrar só cores principais Mostrar todas as cores - Preme para vista previa Elixe as cores do texto e fondo Fodo do teclado Texto da tecla @@ -245,13 +238,11 @@ Escala de altura do teclado Escala do espazo inferior do teclado %s (Sebeolsik Final) - Alfabeto (Colemak Mod-DH) Engadir disposición persoal Elixe un ficheiro cun formato compatible. Tes información sobre os formatos en %s. Cargar ficheiro Non se puido ler o ficheiro Copiar disposición existente - Dar nome á disposición Queres eliminar a disposición persoal %s? Erro na disposición: %s Toca para editar a disposición @@ -289,7 +280,6 @@ aquí Fondo da tecla función O ficheiro seleccionado é para %1$s, mais agardábase %2$s. Usar igualmente para %2$s? - Alfabeto (Workman) Revisor de Ortografía Axustes do revisor de Ortografía de HeliBoard Vas precisar a biblioteca para \'%s\': As bibliotecas incompatibles podería estragar a app ao escribir. @@ -309,7 +299,6 @@ Teclado numérico Teclado Num (paisaxe) ► Coa pulsación longa na tecla do Portapapeis (opcional nas barra coas suxestións) pegas o contido do portapapeis. <br><br> ► Coa pulsación longa nunha tecla la barra de suxestións fíxala na barra. <br> <br> ► Coa pulsación longa na telca da vírgula accedes a Vista do Portapapeis, Vista de Emojis, Modo dunha soa man, Axustes ou Cambiar de Idioma: <br> • A Vista de Emoji e Cambio de Idioma aparecerán se tes a tecla correspondente activada; <br> \t • Nalgunhas disposicións non é a tecla da Vírgula, se non a tecla que está na mesma posición (ex. é \'q\' no teclado Dvorak). <br> <br> ► Co modo Incógnito activado, non aprenderá palabras, e tampouco se engaden emojis aos recentes. <br> <br> ► Preme na icona Incógnito para acceder ás ferramentas. <br> <br> ► Escribir con tecla esvaradía: Despraza desde a tecla Shift hacia outra letra para escribir unha sóa maiúscula: <br> \t• Isto tamén funciona para a tecla \'?123\" para escribir un só símbolo dos do teclado de símbolos, e as teclas relacionadas. <br> <br> ► Coa pulsación longa nunha suxestión da barra de suxestións aparecen máis suxestións, e tamén un botón para eliminar esa suxestión. <br> <br> ► Desprázate hacia arriba para ter máis suxestións, e solta onde estea suxestión que queres. <br> <br> ► Fixa unha entrada do historial do portapapeis coa pulsación longa sobre ela (mantela no portapapeis ata que a liberes). <br> <br> ► Podes engadir dicionarios abríndoos nun explorador de ficheiros: <br> \t• Isto só funciona con <i>content-uris</i> e non con <i>file-uris</i>, polo que podería non funcionar nalgúns exploradores de ficheiros. <br> <br> <i>Modo depuración / APK debug</i> <br> <br> \t • Pulsación longa sobre unha suxestión para mostrar o dicionario de orixe.<br> <br> \t • No modo depuración APK, podes atopar os Axustes de Depuración dentro de Preferencias Avanzadas, aínda que a utilidade é limitada excepto para meter os dicionarios no ficheiro de depuración.<br> <br> \t • Se fallase a aplicación, pediráseche se queres ver os ficheiros de depuración ao abrir os Axustes. <br> <br> \t• Ao usar a escritura multi-idioma, a barra espazadora mostrará un valor de confianza usado para determinar o idioma que estás a usar. <br> <br> \t• As suxestións terán un número pequeniño enriba mostrando unha puntuación interna e o dicionario de orixe (pode desactivarse).<br> <br> ► Para as usuarias que fan copias de apoio con acceso root: Desde Android 7, o ficheiro de preferencias compartidas non está na localización por defecto, xa que a app usa %s. <br> isto é preciso para que os axustes se poidan ler antes de que o dispositivo se desbloquee, por exemplo no inicio (boot). <br> O ficheiro está en /data/user_de/0/package_id/shared_prefs/, aínda que podería depender da versión do dispositivo Android. - Kaitag (%s) Kaitag Xesto de desprazamento vertical na barra Xesto de desprazamento horizontal na barra @@ -327,7 +316,6 @@ Pechar historial do portapapeis %s (Extendido) Mansi - Mansi (%s) Mostrar máis cores Este axuste expón todas as cores que se usan internamente. A lista de cores pode cambiar en calquera momento. A cor por defecto é aleatoria, e os nomes non serán traduciddos. Teclas función @@ -351,7 +339,6 @@ Gardar nun ficheiro Copiar ao Portapapeis Cargar - Ao cargar sobreescribe o decorado actual Inicio da páxina Final da páxina Esquerda da palabra @@ -400,7 +387,6 @@ %s (Fonético) Sobrescribir versión Emoji Dargwa (Urakhi) - Urakhi (%s) Atallos para autocorrector Ao activar os atallos poderían despregarse polo autocorrector Establecer tipo de letra persoal desde ficheiro diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml index 84fcf6773..88fd4a48e 100644 --- a/app/src/main/res/values-gu/strings.xml +++ b/app/src/main/res/values-gu/strings.xml @@ -52,7 +52,6 @@ "%s (પરંપરાગત)" "%s (કોમ્પેક્ટ)" "ભાષા નથી" - "આલ્ફાબેટ (QWERTY)" "ઇમોજી" "ઉમેરો" "દૂર કરો" @@ -68,11 +67,9 @@ %s પર સ્વાગત છે\" "સાંકેતિક ટાઇપિંગ દ્વારા" "પ્રારંભ કરો" - "આગલું પગલું" %s સેટ કરી રહ્યું છે\" %s સક્ષમ કરો\" "કૃપા કરીને \"%s\" ને તમારી ભાષાઓ અને ઇનપુટ સેટિંગ્સમાં તપાસો. આ તેને તમારા ઉપકરણ પર ચાલવા માટે અધિકૃત કરશે." - "%s એ તમારી ભાષાઓ અને ઇનપુટ સેટિંગ્સમાં પહેલાથી જ સક્ષમ કરેલું છે, તેથી આ પગલું પૂર્ણ થયું. હવે આગલા પર!" "સેટિંગ્સમાં સક્ષમ કરો" %s પર સ્વિચ કરો\" "આગલું, \"%s\" ને તમારા સક્રિય ટેક્સ્ટ-ઇનપુટ પદ્ધતિ તરીકે પસંદ કરો." @@ -82,21 +79,18 @@ "સમાપ્ત થયું" "ઍપ્લિકેશન આયકન બતાવો" "લોંચરમાં ઍપ્લિકેશન આયકન પ્રદર્શિત કરો" - "એડ-ઓન શબ્દકોશ" + "એડ-ઓન શબ્દકોશ" "શબ્દકોશ ઉપલબ્ધ છે" - "કોઈ શબ્દકોશ ઉપલબ્ધ નથી" "છેલ્લે અપડેટ કર્યું" "સેટિંગ્સ" "કાઢી નાખો" "સંસ્કરણ %1$s" - "ઉમેરો" "શબ્દકોષમાં ઉમેરો" "શોર્ટકટ:" "ભાષા:" "એક શબ્દ લખો" "વૈકલ્પિક શોર્ટકટ" "શબ્દ સંપાદિત કરો" - "તમારી પાસે વપરાશકર્તા શબ્દકોશમાં કોઈપણ શબ્દ નથી. શબ્દને ઉમેરવા માટે, ઉમેરો (+) બટન ટૅપ કરો." "તમામ" "વધુ ભાષાઓ…" " [અ આ ઇ ઈ ઉ ઊ ઋ એ ઐ ઓ ઔ ક ખ ગ ઘ ઙ ચ છ જ ઝ ઞ ટ ઠ ડ ઢ ણ ત થ દ ધ ન પ ફ બ ભ મ ય ર લ વ શ ષ સ હ ળ]" diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 1e7a07ca6..4c48fddf7 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -52,7 +52,6 @@ "%s (पारंपरिक)" "%s (संक्षिप्त)" "भाषा उपलब्ध नहीं है" - "वर्णाक्षर (QWERTY)" "Emoji" "जोड़ें" "निकालें" @@ -68,11 +67,9 @@ %s में आपका स्वागत है\" "जेस्चर टाइपिंग के साथ" "आरंभ करें" - "अगला चरण" %s सेट करना\" %s को चालू करें\" "कृपया अपनी भाषा और इनपुट सेटिंग में \"%s\" को सही का निशान लगाकर चुनें. इससे उसे आपके डिवाइस पर चलने की अनुमति मिल जाएगी." - "%s आपकी भाषा और इनपुट सेटिंग में पहले से सक्षम है, इसलिए यह चरण पूरा हो गया है. अगले चरण पर जाएं!" "सेटिंग में चालू करें" %s पर स्विच करें\" "इसके बाद, \"%s\" को अपने सक्रिय पाठ-इनपुट के तरीके के तौर पर चुनें." @@ -82,21 +79,18 @@ "खत्म" "ऐप्लिकेशन का आइकॉन दिखाएं" "लॉन्चर में ऐप आइकॉन दिखाएं" - "अन्य शब्दकोष" + "अन्य शब्दकोष" "शब्दकोश उपलब्‍ध" - "डिक्‍शनरी अनुपलब्‍ध" "आख़री बार अपडेट किया गया" "सेटिंग" "मिटाएं" "वर्शन %1$s" - "जोड़ें" "शब्दकोश में जोड़ें" "शॉर्टकट:" "भाषा:" "कोई शब्द लिखें" "वैकल्पिक शॉर्टकट" "शब्द बदलें" - "आपके पास उपयोगकर्ता डिक्शनरी में कोई भी शब्द नहीं है. कोई शब्द जोड़ने के लिए, जोड़ें (+) बटन छूएं." "सभी भाषाओं के लिए" "ज़्यादा भाषाएं…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 4dbeae327..5817279a9 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -52,7 +52,6 @@ %s (traditionalno) %s (kompaktno) Neodređen jezik - Abeceda (QWERTY) "Emoji" "Dodaj" "Ukloni" @@ -68,11 +67,9 @@ Dobro došli u %s "s Pisanjem kretnjama" "Počnite s radom" - "Sljedeći korak" Postavljanje aplikacije %s Aktiviraj %s Označi „%s” u postavkama jezika i unosa. Time se omogućuje izvođenje aplikacije na uređaju. - Aplikacija %s je već aktivirana u postavkama jezika i unosa, stoga je taj korak gotov. Nastavi sa sljedećim korakom! Aktiviraj u postavkama Prijeđi na %s Zatim odaberi „%s” kao aktivan način unosa teksta. @@ -82,21 +79,18 @@ "Završeno" "Prikaži ikonu aplikacije" "Prikazivanje ikone aplikacije u pokretaču" - "Rječnici kao dodaci" + "Rječnici kao dodaci" "Dostupan je rječnik" - "Rječnici nedostupni" "Zadnje ažuriranje" "Postavke" "Izbriši" Verzija %1$s - "Dodavanje" "Dodaj u rječnik" "Prečac:" "Jezik:" "Upišite riječ" "Neobavezni prečac" "Uređivanje riječi" - "Nemate nijednu riječ u korisničkom rječniku. Da biste dodali riječ, dodirnite gumb Dodaj (+)." "Za sve jezike" "Više jezika…" " ABCČĆDDŽĐEFGHIJKLLJMNNJOPRSŠTUVZŽ" diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 66ea14332..02e61eb3d 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -52,7 +52,6 @@ %s (Hagyományos) %s (Kompakt) "Nincs nyelv" - "Ábécé (QWERTY)" "Hangulatjel" "Hozzáadás" "Eltávolítás" @@ -68,11 +67,9 @@ Üdvözöljük a %s gesztusokkal történő bevitellel "Első lépések" - "Következő lépés" Beállítani a %s-t %s engedélyezése Ellenőrizze a \"%s\" saját nyelvén a beviteli beállításokban. Ezzel engedélyezheti, hogy fusson a készülékén. - %s már engedélyezve van a nyelve beviteli beállításainál, így ez a lépés nem szükséges. Lépjen a következőre! Engedélyezés a Beállításokban Váltás a %s Válassza ki a \"%s\" mint aktív szövegbeviteli eszközét. @@ -82,21 +79,18 @@ "Befejeződött" "Alkalmazásikon megjelenítése" "Alkalmazásikon megjelenítése az indítóban" - Bővítmény szótárak + Bővítmény szótárak "Van rendelkezésre álló szótár" - Nem elérhető szótár "Legutóbb frissítve" "Beállítások" "Törlés" Verzió %1$s - "Hozzáadás" "Hozzáadás a szótárhoz" "Gyorsparancs:" "Nyelv:" "Írjon be egy szót" "Választható gyorsparancs" "Szó szerkesztése" - Nincsenek szavak a felhasználói szótárban. Új szavakat a Hozzáadás (+) gombra nyomva vehet fel. Minden nyelvhez "További nyelvek…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -231,7 +225,6 @@ Visszavon Helyrehoz Funkcionális gombok mutatása - Kaitag (%s) %s (Akkhor) %s (Sebeolsik 390) %s (Sebeolsik Végleges) @@ -239,7 +232,6 @@ Fájl betöltése Fájl nem olvasható Már létező elrendezés másolása - Elrendezés név beállítása Törölni kívánja a %s egyéni elrendezést? Elrendezés hiba: %s Több szimbólum @@ -248,7 +240,6 @@ Numerikus Numerikus (táj) Háttérkép beállítása - Ábécé (Bépo) Legyen külön kép nappali és éjjeli módban? Nappal Éjjel @@ -294,7 +285,6 @@ Szín automatikus kiválasztása Csak fő színek mutatása Minden szín mutatása - Nyomjon rá az előnézethez Billentyűzet háttér Gomb szöveg Gomb tipp szöveg diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml index 7155266c4..777d54d84 100644 --- a/app/src/main/res/values-hy/strings.xml +++ b/app/src/main/res/values-hy/strings.xml @@ -52,7 +52,6 @@ "%s (ավանդական)" "%s (սեղմ)" "Ոչ մի լեզվով" - "Այբուբեն (QWERTY)" "Զմայլիկներ" "Ավելացնել" "Հեռացնել" @@ -68,11 +67,9 @@ "Բարի գալուստ %s" "Ժեստային մուտքագրմամբ" "Սկսել" - "Հաջորդ քայլը" "Տեղադրվում է %s-ը" "Միացնել %s-ը" Նշեք %s» հավելվածը Լեզուների և մուտքագրման կարգավորումներում՝ ձեր սարքում դրա աշխատանքը թույլ տալու համար:\" - "%s-ն արդեն միացված է ձեր Լեզուների և մուտքագրման կարգավորումներում, այնպես որ այս քայլն արդեն կատարված է:Անցեք հաջորդին:" "Միացնել կարգավորումներից" "Փոխարկել %s-ին" Հաջորդիվ, ընտրեք %s»-ը որպես ձեր ակտիվ տեքստային մուտքագրման եղանակ:\" @@ -82,21 +79,18 @@ "Ավարտված" "Ցույց տալ հավելվածի պատկերակը" "Ցուցադրել հավելվածի պատկերակը գործարկիչում" - "Հավելյալ բառարաններ" + "Հավելյալ բառարաններ" "Բառարանն առկա է" - "Բառարաններ չկան" "Վերջին անգամ թարմացվել է" "Կարգավորումներ" "Ջնջել" "Տարբերակ %1$s" - "Ավելացնել" "Ավելացնել բառարանում" "Դյուրանցումը՝" "Lեզուն՝" "Մուտքագրեք բառը" "Ընտրովի դյուրանցում" "Խմբագրել բառը" - "Օգտատիրոջ բառարանում ոչ մի բառ չկա: Բառեր ավելացնելու համար հպեք Ավելացնել (+) կոճակին:" "Բոլոր լեզուներով" "Ավելի շատ լեզուներով…" " ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՈՒՓՔԵւՕՖ" diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 1dc862294..3517f4071 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -52,7 +52,6 @@ %s (Tradisional) %s (Ringkas) "Tidak ada bahasa" - "Abjad (QWERTY)" "Emoji" "Tambahkan" "Hapus" @@ -68,11 +67,9 @@ Selamat datang di %s "dengan Ketikan Gestur" "Memulai" - "Langkah berikutnya" Menyiapkan %s Aktifkan %s Harap periksa \"%s\" di setelan Bahasa masukan Anda. Ini akan mengizinkannya untuk berjalan di perangkat Anda. - %s sudah diaktifkan di pengaturan Bahasa masukan Anda, jadi langkah ini sudah selesai. Lanjut ke langkah berikutnya! "Aktifkan dalam Setelan" Beralih ke %s Selanjutnya, pilih \"%s\" sebagai metode input teks aktif Anda. @@ -82,21 +79,18 @@ "Selesai" "Tampilkan ikon aplikasi" "Menampillkan ikon aplikasi di peluncur" - "Kamus pengaya" + "Kamus pengaya" "Kamus yang tersedia" - "Tidak tersedia kamus" "Terakhir diperbarui" "Setelan" "Hapus" Versi %1$s - "Tambahkan" "Tambahkan ke kamus" "Pintasan:" "Bahasa:" "Ketik kata" "Pintasan opsional" "Edit kata" - Belum ada kata di dalam kamus pengguna Anda. Untuk menambahkan kata, ketuk tombol Tambahkan (+). "Untuk semua bahasa" "Bahasa lainnya…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -196,7 +190,6 @@ Muat file File tidak terbaca Salin tata letak saat ini - Ubah nama tata letak Yakin ingin menghapus tata letak kustom %s? Kesalahan tata letak: %s Tekan untuk mengubah tata letak versi polos @@ -213,7 +206,6 @@ \nPeringatan: memuat kode eksternal dapat menimbulkan resiko keamanan. Gunakan pustaka yang hanya Anda percaya. Mencoba untuk mendeteksi URL dan sejenisnya sebagai kata tunggal Tampilkan petunjuk fungsional - Alfabet (Bépo) Pilih file dalam format yang kompatibel. Informasi tentang format tersedia %s. Ganti Bahasa Pilih sumber petunjuk @@ -282,7 +274,6 @@ Pilih warna secara otomatis Tampilkan warna utama saja Tampilkan semua warna - Klik untuk melihat pratinjau Pilih warna untuk teks dan latar belakang Latar belakang papan ketik Tombol teks @@ -311,13 +302,11 @@ Ungu lembayung Lisensi Publik Umum GPU v3.0 Kaitag - Kaitag (%s) Tutup riwayat papan klip Emoji Potong %s (Probhat) Mansi - Mansi (%s) Tampilkan lebih banyak warna Pendinginan pengetikan cepat Selalu mulai secara instan @@ -354,7 +343,6 @@ Ganti versi Emoji Kode tekan lama Dargwa (Urakhi) - Urakhi (%s) Kode kunci Kunci huruf kapital Spasi (tata letak angka) @@ -367,7 +355,6 @@ Pilih tombol bilah alat yang disematkan Halaman atas Kata yang tepat - Memuat akan menimpa tema saat ini Atur font khusus dari file Salin ke papan klip Mengatur gambar latar belakang (lanskap) diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index e22dfb1f1..920d25dec 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -52,7 +52,6 @@ "%s (hefðbundið)" "%s (lítið)" "Ekkert tungumál" - "Stafróf (QWERTY)" Tjáningartákn "Bæta við" "Fjarlægja" @@ -68,11 +67,9 @@ "Velkomin(n) í %s" "með bendingainnslætti" "Hefjast handa" - "Næsta skref" "Uppsetning %s" "Virkjaðu %s" Merktu við %s“ í stillingum tungumálsins þíns og innsláttar. Þetta veitir því heimild til að keyra í tækinu.\" - "%s er þegar virkt í stillingum tungumáls og innsláttar og lokið hefur verið við þetta skref. Vindum okkur í næsta!" "Virkja í stillingum" "Skiptu yfir í %s" Næst skaltu velja %s“ sem virka innsláttaraðferð fyrir texta.\" @@ -82,21 +79,18 @@ "Lokið" "Sýna forritstákn" "Sýna forritstákn í ræsiforritinu" - Viðbótarorðasöfn + Viðbótarorðasöfn Orðasafn í boði - Engin orðasöfn eru í boði "Síðast uppfært" "Stillingar" "Eyða" "Útgáfa %1$s" - "Bæta við" Bæta við orðasafni Stytting: "Tungumál:" "Sláðu inn orð" Valfrjáls stytting "Breyta orði" - Engin orð eru í orðasafni notanda. Bættu við orðum með því að ýta á hnappinn Bæta við (+). "Fyrir öll tungumál" "Fleiri tungumál…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -122,7 +116,6 @@ Sérsníða gjaldmiðla Litir Rúnnað - Kaitag (%s) Stíll Stafsetningarleiðrétting HeliBoard Stillingar HeliBoard @@ -178,7 +171,6 @@ Tungumál og framsetning Alltaf sýna talnaröð Talnaröð - Urakhi (%s) Afrita fyrirliggjandi framsetningu Tungumál (forgangs) Klippispjald @@ -211,7 +203,6 @@ Upphaf síðu Endir síðu Færa bendil - Mansi (%s) Ekki birta þetta aftur Lykilkóði Stroka til að eyða @@ -242,7 +233,6 @@ Titra í \'Ekki ónáða\'-ham Lengd skiptingar Alltaf birta tillögur - Stilla heiti framsetningar Virkilega eyða sérsniðnu framsetningunni %s? Bæta við sérsniðinni framsetningu Fleiri sjálfvirkar leiðréttingar @@ -284,7 +274,6 @@ Sjálfvirkur dags-/næturhamur Viltu í alvörunni hreinsa alla sérsniðna lyklakóða? Velja lit sjálfvirkt - Smelltu til að forskoða Sýna fleiri liti Sýna alla liti Færsla / Enter @@ -316,11 +305,8 @@ Fela verkfærastiku sjálfvirkt Tími sem á að geyma breytingaferil %s (námsmanna) - Stafróf (Workman) - Stafróf (Colemak Mod-DH) Sjálfvirkt bil á eftir greinamerkjum Velja sérsniðið letur úr skrá - Stafróf (Bépo) Veldu uppruna ábendinga Veldu lykla á verkfærastiku Veldu klippispjaldslykla á verkfærastiku @@ -358,7 +344,6 @@ Kvarði leturs í tjáningartáknasýn Kvarði fyllingar til hliðar Kvarði fyllingar til hliðar (lárétt) - Að hlaða inn þessu mun skrifa yfir fyrirliggjandi þema Lýsing á földum eiginleikum Gera óvirkt að læra ný orð Festa verkfærastikulykil við að ýta lengi diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 594224d87..696d6438c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -52,7 +52,6 @@ %s (tradizionale) %s (compatto) "Nessuna lingua" - "Alfabeto (QWERTY)" "Emoji" "Aggiungi" "Rimuovi" @@ -68,11 +67,9 @@ Benvenuto in %s con digitazione gestuale "Inizia" - "Passaggio successivo" Configura %s Attiva %s Scegli %s nelle impostazioni \'Lingua e immissione\' per autorizzare l\'app. - %s è già attiva nelle impostazioni Lingua e immissione.\" Attiva nelle impostazioni Passa a %s Infine, attiva %s come metodo di immissione di testo. @@ -82,21 +79,18 @@ Fine Mostra l\'icona dell\'app Mostra HeliBoard tra le app di Android - Dizionari + Dizionari "Dizionario disponibile" - "Nessun dizionario" "Ultimo aggiornamento" "Impostazioni" "Elimina" Versione %1$s - "Aggiungi" "Aggiungi al dizionario" "Scorciatoia:" "Lingua:" "Digita una parola" Scorciatoia (opzionale) "Modifica parola" - Il dizionario utente è vuoto. Premi \'Aggiungi\' (+) per aggiungere manualmente una parola. "Per tutte le lingue" "Altre lingue…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -197,7 +191,6 @@ Correzione automatica aggiuntiva Distanza tra le due parti Ignora la richiesta di altre applicazioni di disabilitare i suggerimenti (potrebbe causare problemi) - Nome del layout Cambia lingua Svuota gli appunti Riduci lo spazio tra i tasti @@ -253,7 +246,6 @@ Chiaro Aggiungi una parola Testo dei suggerimenti - Tocca per vedere l\'anteprima Personalizzato (tema chiaro) Sostituisci dizionario Sfondo della tastiera @@ -310,7 +302,6 @@ Nessuno Scorrimento orizzontale sulla barra spaziatrice Sposta il cursore - Kaitag (%s) %s (Probhat) Pressione lunga sul tasto simboli per aprire il tastierino numerico Taglia @@ -327,7 +318,6 @@ Mostra automaticamente la barra degli strumenti Le azioni alternative su pressione lunga saranno disponibili solo sui tasti già fissati %s (Extended) - Mansi (%s) Tasti funzione (Simboli) Tasti funzione (Altri simboli) Barra degli strumenti @@ -364,7 +354,6 @@ Passa al tastierino numerico Rimuovi i tasti popup ripetuti Rimuovi i tasti popup già presenti nel layout base - Attenzione: l\'importazione sovrascriverà il tema attuale Mostra dinamicamente le parole suggerite durante l\'inserimento Durata della traccia del gesto Anteprima mobile dinamica @@ -398,7 +387,6 @@ %s (Fonetico) Forza la versione delle emoji Dargwa (Urakhi) - Urakhi (%s) Tastiera divisa (orizzontale) Distanza (orizzontale) Tastiera divisa diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 36d01f8c5..6173e61ef 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -52,7 +52,6 @@ "%s (מסורתית)" "%s (קומפקטית)" "ללא שפה" - "‏אלף-בית (QWERTY)" "אמוג\'י" "הוסף" "הסר" @@ -68,11 +67,9 @@ "ברוכים הבאים אל %s" "עם הקלדה רציפה" "תחילת העבודה" - "השלב הבא" "הגדרת %s" "הפעל את %s" "סמן את \"%s\" בהגדרות השפה והקלט שלך. פעולה זו תאפשר לה לפעול במכשיר." - "האפליקציה %s כבר פועלת בהגדרות השפה והקלט שלך, אז השלב הזה הסתיים. ממשיכים הלאה לשלב הבא!" "הפעל בהגדרות" "עבור אל %s" בשלב הבא, יש לבחור ב-\"%s\" כשיטת ההזנה הפעילה להזנת מלל. @@ -82,21 +79,18 @@ "סיום" "הצג את סמל האפליקציה" "הצג את סמל האפליקציה במפעיל" - "תוספי מילונים" + "תוספי מילונים" "מילון זמין" - "אין מילונים זמינים" "עודכן לאחרונה" "הגדרות" "מחק" "גרסה %1$s" - "הוסף" הוספה למילון "קיצור דרך:" "שפה:" "הקלד מילה" "קיצור דרך אופציונלי" "עריכת מילה" - "לא מוגדרות מילים במילון המשתמש. הוסף מילה על ידי הקשה על לחצן \'הוסף\' (+)." "לכל השפות" "עוד שפות…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -203,7 +197,6 @@ סימנים שכפול פריסה קיימת הקובץ אינו ניתן לקריאה - הגדרת שם הפריסה באמת להסיר את המילון שנוסף ע\"י המשתמש \"%s\"? "ללא מילון, תקבלו הצעות למלל שהקלדתם בעבר בלבד.<br>\n באפשרותך להוריד מילונים %1$s, או לבדוק אם מילון עבור \"%2$s\" ניתן להורדה ישירות %3$s." לא להציג שוב @@ -303,10 +296,8 @@ טעינת קובץ הגדרת תמונת רקע הצגת כל הצבעים - הטעינה תחליף את ערכת הנושא הנוכחית בחירת צבעים למלל ולרקעים רקע המקלדת - לחיצה לתצוגה מקדימה מעוגל שמירת לוג מטה @@ -356,7 +347,6 @@ כפתורים פונקציונליים כפתורים פונקציונליים (סימנים) כפתורים פונקציונליים (סימנים נוספים) - קייטאג(%s) תצוגה מקדימה צפה הצגת המילה המוצעת תוך כדי מחווה משך הצגת עקבת נתיב המחווה @@ -366,9 +356,7 @@ ◄ לחיצה ממושכת על כפתורי סרגל הכלים מאפשרת פונקציונליות נוספת: <br> \n\t• לוח &#65515; הדבקה <br> \n\t• תזוזה שמאלה/ימינה &#65515; מילה שמאלה/ימינה <br> \n\t• תזוזה למעלה/למטה &#65515; דף למעלה/למטה <br> \n\t• מילה שמאלה/ימינה &#65515; תחילת שורה/סוף שורה <br> \n\t• דף למעלה/למטה &#65515; תחילת דף/סוף דף <br> \n\t• העתקה &#65515; גזירה <br> \n\t• בחירת מילה &#8596; בחירת הכל <br> \n\t• ביטול &#8596; ביצוע בשנית <br> <br> \n◄ לחיצה ממושכת על כפתורים בסרגל ההצעות של סרגל הכלים נועצת אותם בסרגל ההצעות. <br> <br> \n◄ לחיצה ממושכת על מקש פסיק לגישה לתצוגת הלוח, תצוגת אימוג\'ים, מצב עבודה ביד אחת, הגדרות, או מעבר שפה: <br> \n\t• תצוגת אימוג\'ים ומעבר שפה לא יוצגו אם הכפתורים המתאימים כבר מוצגים; <br> \n\t• בחלק מהפריסות האפשרות איננה במקש הפסיק, אלא במקש המוצג באותו מקום (לדוגמה, בפריסת Dvorak התו \'q\'). <br> <br> \n◄ כאשר מצב פרטיות מופעל, לא יילמדו כלל מילים, ולא יתווספו אימוג\'ים ל\'בשימוש לאחרונה\'. <br> <br> \n◄ ליחצו על סמל הפרטיות לגישה לסרגל הכלים. <br> <br> \n◄ הקלדה בהחלקה: החליקו מ-shift למקש אחר כדי להקיש אות גדולה יחידה: <br> \n\t• זה עובד באופן דומה גם למקש \'?123\' להקלדת סימן יחיד מלוח הסמלים, ולמקשים קשורים. <br> <br> \n◄ ליחצו על shift או על מקש הסמלים, ליחצו על מקש אחד או יותר, ואז הרפו מ-shift או ממקש הסמלים לחזרה למקלדת הקודמת. <br> <br> \n◄ לחיצה ממושכת על הצעה בסרגל ההצעות להצגת הצעות נוספות, ומקש מחיקה להסרת הצעה זו. <br> <br> \n◄ החליקו למעלה מהצעה לפתיחת הצעות נוספות, והרפו על ההצעה הרצויה לבחירתה. <br> <br> \n◄ לחיצה ממושכת על רשומה בהיסטוריית הלוח לנעיצתה (שמירתה בלוח עד לביטול הנעיצה). <br> <br> \n◄ החלקה שמאלה על רשומה בתצוגת הלוח להסרתה מהלוח (אם היא לא נעוצה) <br> <br> \n◄ בחירת מלל ולחיצה על shift למעבר בין אותיות גדולות, אותיות קטנות ורישיות מילים גדולות. <br> <br> \n◄ ניתן להוסיף מילונים ע\"י פתיחתם באמצעות יישום סייר קבצים: <br> \n\t• פועל רק עם <i>content-uris</i> ולא עם <i>file-uris</i>, ז\"א שזה עלול שלא לעבוד בחלק מיישומי סייר קבצים. <br> <br> \n◄ משתמשים המבצעים גיבויים ידניים עם הרשאת גישה root: <br> \n\t• החל באנדרואיד 7, קובץ ההעדפות המשותף איננו בנתיב ברירת המחדל, כיוון שהיישום עושה שימוש ב %s. הדבר נחוץ כדי שההגדרות יהיו קריאות לפני שהמכשיר נפתח, לדוגמה: בהפעלה; <br> \n\t• הקובץ ממוקם בנתיב /data/user_de/0/package_id/shared_prefs/ אך זה עשוי להשתנות בתלות בגירסאות המכשיר ומערכת אנדרואיד. <br> <br> \n<i><b>Debug mode / debug APK</b></i> <br> <br> \n◄ לחיצה ממושכת על הצעה להצגת מילון המקור. <br> <br> \n◄ בשימוש ב-debug APK, באפשרותך למצוא את הגדרות ה-Debug Settings בהעדפות המתקדמות,אך השימושיות מוגבלת למעט dumping של מילונים ליומן (log). <br> \n\t• עבור APK רשמי, עליך ללחוץ על הגירסה <i>About</i> מספר פעמים, ואז ניתן למצוא אתהגדרות ה-debug ב-<i>העדפות מתקדמות</i>. <br> \n\t• כאשר מופעלת <i>הצגת מידע על הצעות</i>, יוצגו מספרים זעירים בסמוך להצעות המייצגים דירוג פנימי ומילון מקור. <br> <br> \n◄ במקרה של קריסת יישום, תוצג לך שאלה האם ברצונך ביומני הקריסה בפתיחת ההגדרות. <br> <br> \n◄ בעת שימוש בהקלדה מרובת שפות, מקש הרווח יציג מדד אמון המשמש לברירת השפה שבשימוש כעת. <br> <br> \n◄ בסמוך להצעות יוצגו מספרים זעירים המייצגים דירוג פנימי ומילון מקור (התצוגה ניתנת להשבתה). %s (Probhat) %s (Sebeolsik 390) - אלפבית (Bépo) %s (Student) - מנסי (%s) סגנון הסמלים שורת המספרים מלל מותאם על מקש הרווח @@ -419,7 +407,6 @@ התרעה: הפריסה בשימוש כעת מקשים פונקציונליים (מסך גדול) דרגווה (אוראקי) - אוראקי(%s) באמת למחוק את %s? פריסות משניות שפות ומילונים diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 9cdc3555f..c9e0618a6 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -52,7 +52,6 @@ "%s(伝統言語)" "%s(コンパクト)" "言語なし(アルファベット)" - "アルファベット(QWERTY)" "絵文字" "追加" "削除" @@ -68,11 +67,9 @@ %sへようこそ\" "新しいジェスチャー入力をお試しください" "開始" - "次のステップ" %sの設定\" %sの有効化\" [言語と入力] 設定で%s」のチェックボックスをオンにしてください。これで、このデバイスで利用できるようになります。\" - "[言語と入力] 設定で「%s」は既に有効になっているため、このステップは完了です。次のステップに進んでください。" "設定での有効化" %sへの切り替え\" 次に、有効なテキスト入力方法として%s」を選択します。\" @@ -82,21 +79,18 @@ "完了" "アプリアイコンを表示" "ランチャーにアプリアイコンを表示します" - "アドオン辞書" + "アドオン辞書" "辞書を利用できます" - "辞書はありません" "最終更新" "設定" "削除" "バージョン%1$s" - "追加" "辞書に追加" "ショートカット:" "言語:" "単語を入力します" "オプションのショートカット" "語句の編集" - "単語リストに登録がありません。単語を追加するには、追加ボタン [+] をタップします。" "すべての言語用" "その他の言語…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-jpr/strings.xml b/app/src/main/res/values-jpr/strings.xml index ca462e407..f21caecba 100644 --- a/app/src/main/res/values-jpr/strings.xml +++ b/app/src/main/res/values-jpr/strings.xml @@ -50,10 +50,8 @@ שאם פישפֿרץֿ שרוע בה כאר - מרחלה בעד תמאם שוד לגֿאת - אפֿרודן וזן:‏ זבאן:‏ רפֿתן @@ -62,7 +60,6 @@ מכת אנתטׄאר בסיאר שדיד - חרוףֿ אלפֿבא (QWERTY) באזאנגׄאם בעדי קבלי diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index b34adcf6b..88212abef 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -52,7 +52,6 @@ %s (ტრადიციული) %s (კომპაქტური) "ენის გარეშე" - "ლათ. ანბანი (QWERTY)" "სიცილაკები" "დამატება" "ამოშლა" @@ -68,11 +67,9 @@ მოგესალმებათ %s "ჟესტებით წერით" "დაწყება" - "შემდეგი საფეხური" %s-ის მორგება %s-ის ჩართვა შეყვანის პარამეტრებში გადაამოწმეთ %s&. ეს თქვენს მოწყობილობაზე გაშვების ავტორიზაციას მოგცემთ. - %s& თქვენი შეყვანის ენის პარამეტრებში უკვე ჩართულია. შემდეგ საფეხური! "პარამეტრებში გააქტიურება" გადაერთეთ %s-ზე შემდეგ, აირჩიეთ „%s“ თქვენს აქტიურ შეყვანის მეთოდად. @@ -82,21 +79,18 @@ "დასრულებული" "აპის ხატულის ჩვენება" "აპის ხატულის ჩვენება გამშვებში" - "დამატებითი ლექსიკონები" + "დამატებითი ლექსიკონები" "ხელმისაწვდომია ლექსიკონი" - "ლექსიკონები მიუწვდომელია" "ბოლო განახლება" "პარამეტრები" "წაშლა" ვერსია %1$s - "დამატება" "ლექსიკონში დამატება" "მალსახმობი:" "ენა:" "შიყვანეთ სიტყვა" "არასავალდებულო მალსა" "სიტყვის შესწორება" - "მომხმარებლის ლექსიკონში სიტყვები არ არის. სიტყვის დასამატებლად, შეეხეთ დამატების (+) ღილაკს." "ყველა ენისთვის" "სხვა ენები…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index a911067b3..f9d088583 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -7,7 +7,6 @@ Imenyafen Iɣewwaren n HeliBoard Wiyyaḍ - Rnu Tutlayt : Beddel awal-a Sekles @@ -53,9 +52,6 @@ Taglizit (Tagelda Yedduklen) Agemmay alatini (AZERTY) Agemmay alatini (Colemak) - Agemmay (Workman) - Agemmay (Bépo) - Agemmay (Colemak Mod-DH) Fren tarrayt n usekcem %s ms Ulac tilisa @@ -65,7 +61,6 @@ Ssken-d isumar n useɣti Iḍ Ur ttεawad ara ad d-tsekneḍ - Ulac imawalen yellan Aseɣti n uḍris Iseɣtiyen Taqeffalt n ubeddel n tutlayin @@ -99,7 +94,6 @@ Anekcam n taɣect Tutlayin akked tneɣrufin Tiqeffalin nniḍen - Agemmay alatini (QWERTY) Aberkan Aḍris n tqeffalin Ɛebbi afaylu @@ -122,5 +116,5 @@ Afeggag n ifecka Ubrik Kaitag - Imawalen nniḍen + Imawalen nniḍen diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index 118c305c4..9af388696 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -52,7 +52,6 @@ "%s (дәстүрлі)" "%s (шағын)" "Тіл жоқ" - "Әліпби (QWERTY)" "Эмодзи" "Қосу" "Өшіру" @@ -68,11 +67,9 @@ %s қолданбасына қош келдіңіз\" "Қимылмен теру арқылы" "Іске қосылды" - "Келесі қадам" %s орнату\" %s қосу\" "\"Тілдер және енгізу\" параметрлерінде %s қолданбасына құсбелгі қойыңыз. Сонда оны құрылғыңызда қолдануға рұқсат беріледі." - "%s қолданбасы \"Тілдер және енгізу\" параметрлерінде бұрыннан қосылған. Келесі қадамға өтіңіз!" "Параметрлер ішінде қосу" %s қолданбасына ауыстыру\" "Одан кейін \"%s\" қолданбасын белсенді мәтінді енгізу әдісі ретінде таңдаңыз." @@ -82,21 +79,18 @@ "Аяқталған" "Қолданба белгішесін көрсету" "Іске қосу құралында қолданба белгішесін көрсету" - "Қосымша сөздіктер" + "Қосымша сөздіктер" "Сөздік қолжетімді" - "Сөздіктер қолжетімсіз" "Соңғы жаңартылған" "Параметрлер" "Жою" "%1$s нұсқасы" - "Қосу" "Сөздікке қосу" "Пернелер тіркесімі:" "Тіл:" "Сөзді теріңіз" "Қосымша пернелер тіркесімі" "Сөзді өңдеу" - "Пайдаланушы сөздігінде сөздер жоқ. Сөзді қосу үшін \"Қосу\" (+) түймесін түртіңіз." "Барлық тілдер үшін" "Қосымша тілдер…" " АӘБВГҒДЕЁЖЗИЙКҚЛМНҢОӨПРСТУҰҮФХҺЦЧШЩЪЫІЬЭЮЯ" diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml index 3794cf592..e312c3c62 100644 --- a/app/src/main/res/values-km/strings.xml +++ b/app/src/main/res/values-km/strings.xml @@ -53,7 +53,6 @@ "%s (អក្សរ​ពេញ)" "%s (បង្រួម)" "គ្មាន​ភាសា" - "តាម​លំដាប់​អក្សរក្រម (QWERTY)" "សញ្ញា​អារម្មណ៍" "បន្ថែម" "លុប​ចេញ" @@ -69,11 +68,9 @@ "សូម​ស្វាគមន៍​មក​កាន់ %s" "ជាមួយ​​​ការ​វាយ​បញ្ចូល​ដោយ​ប្រើ​​​កាយវិការ" "បាន​ចាប់ផ្ដើម" - "ជំហាន​បន្ទាប់" "រៀបចំ %s" "បើក %s" "សូមពិនិត្យ \"%s\" ក្នុងការកំណត់ភាសា និងបញ្ចូលរបស់អ្នក។ វានឹងផ្តល់សិទ្ធិឲ្យកម្មវិធីនេះដំណើរការនៅលើឧបករណ៍របស់អ្នក។" - "%s ត្រូវបានបើកដំណើរការនៅក្នុងការកំណត់ភាសា និងបញ្ចូលរបស់អ្នករួចហើយ ដូច្នេះជំហ៊ាននេះបានបញ្ចប់ហើយ។ ចូលទៅជំហ៊ានបន្ទាប់!" "បើក​នៅ​ក្នុង​ការ​កំណត់" "ប្ដូរ​ទៅ %s" "បន្ទាប់ ជ្រើស \"%s\" ជា​វិធី​សាស្ត្រ​បញ្ចូល​អត្ថបទ​សកម្ម​របស់​អ្នក។" @@ -83,21 +80,18 @@ "បាន​បញ្ចប់" "បង្ហាញ​រូប​កម្មវិធី" "បង្ហាញ​រូប​កម្មវិធី​នៅ​ក្នុង​កម្ម​​វិធី​ចាប់ផ្ដើម" - "ផ្នែក​បន្ថែម​វចនានុក្រម​​" + "ផ្នែក​បន្ថែម​វចនានុក្រម​​" "វចនានុក្រម​​​អាច​ប្រើ​បាន" - "គ្មាន​វចនានុក្រម" "បាន​ធ្វើ​បច្ចុប្បន្នភាព​ចុងក្រោយ" "ការ​កំណត់" "លុប" "កំណែ %1$s" - "បន្ថែម" "បន្ថែម​ទៅ​វចនានុក្រម" "ផ្លូវកាត់​៖" "ភាសា៖" "វាយ​បញ្ចូល​ពាក្យ​" "ផ្លូវកាត់​ជា​ជម្រើស" "កែ​ពាក្យ" - "អ្នកមិនមានពាក្យនៅក្នុងវចនានុក្រមអ្នកប្រើទេ។ ដើម្បីបន្ថែមពាក្យ សូមប៉ះប៊ូតុងបន្ថែម (+)។" "សម្រាប់​ភាសា​ទាំងអស់" "ភាសា​ច្រើន​ទៀត…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml index 2336b6958..3db3e406b 100644 --- a/app/src/main/res/values-kn/strings.xml +++ b/app/src/main/res/values-kn/strings.xml @@ -53,7 +53,6 @@ "%s (ಸಾಂಪ್ರದಾಯಿಕ)" "%s (ಕಾಂಪ್ಯಾಕ್ಟ್‌‌)" "ಯಾವುದೇ ಭಾಷೆಯಿಲ್ಲ" - "ವರ್ಣಮಾಲೆ (QWERTY)" "ಎಮೋಜಿ" "ಸೇರಿಸು" "ತೆಗೆದುಹಾಕಿ" @@ -69,11 +68,9 @@ %s ಗೆ ಸುಸ್ವಾಗತ\" "ಗೆಶ್ಚರ್ ಟೈಪಿಂಗ್‌ನೊಂದಿಗೆ" "ಪ್ರಾರಂಭ" - "ಮುಂದಿನ ಹಂತ" %s ಅನ್ನು ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ\" %s ಸಕ್ರಿಯಗೊಳಿಸಿ\" "ನಿಮ್ಮ ಭಾಷೆಗಳು & ಇನ್‌ಪುಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ದಯವಿಟ್ಟು \"%s\" ಅನ್ನು ಪರಿಶೀಲಿಸಿ. ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಅದನ್ನು ರನ್ ಮಾಡಲು ಅದು ಅನುಮತಿ ನೀಡುತ್ತದೆ." - "%s ಅನ್ನು ಈಗಾಗಲೇ ನಿಮ್ಮ ಭಾಷೆಗಳು & ಇನ್‌ಪುಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ, ಹೀಗಾಗಿ ಈ ಹಂತ ಮುಗಿದಿದೆ. ಮುಂದಿನದಕ್ಕೆ ತೆರಳಿ!" "ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸು" %s ಗೆ ಬದಲಾಯಿಸಿ\" "ಮುಂದೆ, ನಿಮ್ಮ ಸಕ್ರಿಯ ಪಠ್ಯ-ಇನ್‌ಪುಟ್ ವಿಧಾನವಾಗಿ \"%s\" ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ." @@ -83,21 +80,18 @@ "ಮುಕ್ತಾಯಗೊಂಡಿದೆ" "ಅಪ್ಲಿಕೇಶನ್ ಐಕಾನ್ ತೋರಿಸು" "ಲಾಂಚರ್‌ನಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಐಕಾನ್ ಪ್ರದರ್ಶಿಸು" - "ಆಡ್-ಆನ್ ನಿಘಂಟುಗಳು" + "ಆಡ್-ಆನ್ ನಿಘಂಟುಗಳು" "ನಿಘಂಟು ಲಭ್ಯವಿದೆ" - "ನಿಘಂಟುಗಳು ಲಭ್ಯವಿಲ್ಲ" "ಕೊನೆಯದಾಗಿ ನವೀಕರಿಸಿರುವುದು" "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ಅಳಿಸಿ" "ಆವೃತ್ತಿ %1$s" - "ಸೇರಿಸು" "ನಿಘಂಟಿಗೆ ಸೇರಿಸಿ" "ಶಾರ್ಟ್‌ಕಟ್:" "ಭಾಷೆ:" "ಪದವನ್ನು ಟೈಪ್ ಮಾಡಿ" "ಐಚ್ಛಿಕ ಶಾರ್ಟ್‌ಕಟ್" "ಪದವನ್ನು ಎಡಿಟ್ ಮಾಡಿ" - "ಬಳಕೆದಾರರ ನಿಘಂಟಿನಲ್ಲಿ ನೀವು ಯಾವುದೇ ಪದಗಳನ್ನು ಹೊಂದಿಲ್ಲ. ಪದವನ್ನು ಸೇರಿಸಲು, ಸೇರಿಸು (+) ಬಟನ್ ಟ್ಯಾಪ್ ಮಾಡಿ." "ಎಲ್ಲ ಭಾಷೆಗಳಿಗೆ" "ಇನ್ನಷ್ಟು ಭಾಷೆಗಳು…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 3907a8b7d..a9a8b904d 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -52,7 +52,6 @@ %s (번체) %s (소형) "언어 없음" - "알파벳(QWERTY)" "이모티콘" "추가" "삭제" @@ -68,11 +67,9 @@ %s에 오신 것을 환영합니다 "제스처 타이핑 사용" "시작하기" - "다음 단계" %s 설정 %s 사용 설정 & 입력 설정에서 \"%s\" 를 확인해주세요. 이것은 이 기기에서 작동하기 위해 인증합니다. - %s 은(는) 언어 및 입력 설정에서 이미 사용하도록 설정되어 있으므로 이 단계는 완료되었습니다. 다음 단계로 이동하세요! "\'설정\'에서 사용 설정" %s(으)로 전환 그리고, 텍스트 입력 방법으로 \'%s\'을(를) 선택합니다. @@ -82,21 +79,18 @@ "완료됨" "앱 아이콘 표시" "런처에 애플리케이션 아이콘 표시" - "사전 추가" + "사전 추가" "사전 사용 가능" - "사용할 수 있는 사전이 없습니다." "최종 업데이트" "설정" "삭제" 버전 %1$s - "추가" "사전에 추가" "단축키:" "언어:" "단어 입력" "선택적 단축키" "단어 수정" - "사용자 사전에 단어가 없습니다. 추가(+) 버튼을 탭하여 단어를 추가할 수 있습니다." "모든 언어" "더보기…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-ky/strings.xml b/app/src/main/res/values-ky/strings.xml index 1451a9103..a90de6a4f 100644 --- a/app/src/main/res/values-ky/strings.xml +++ b/app/src/main/res/values-ky/strings.xml @@ -52,7 +52,6 @@ "%s (Салттык)" "%s (Чакан)" "Тил жок" - "Алфавит (QWERTY)" "Эмодзи" "Кошуу" "Алып салуу" @@ -68,11 +67,9 @@ %s кош келиңиз\" "Жаңсап терүү менен" "Баштоо" - "Кийинки кадам" %s орнотулууда\" %s иштетүү\" "Тилдер жана киргизүү жөндөөлөрүнөн \"%s\" колдонмосун караңыз. Ушуну менен аны түзмөгүңүздө иштете аласыз." - "%s мурунтан эле Тилдер жана киргизүү жөндөөлөрүндө иштетилгендиктен бул кадам аткарылды деп, кийинкисине өтө бериңиз!" "Жөндөөлөрдөн иштетүү" %s которулуу\" "Андан соң, \"%s\" жигердүү текст киргизүү ыкмасы катары коюңуз." @@ -82,21 +79,18 @@ "Аяктады" "Колдонмонун сүрөтчөсүн көрсөтүү" "Колдонмонун сүрөтчөсү иштетүү тактасында көрүнөт" - "Кошумча сөздүктөр" + "Кошумча сөздүктөр" "Сөздүк бар" - "Сөздүктөр жок" "Акыркы жолу жаңыртылган" "Жөндөөлөр" "Жок кылуу" "Версиясы %1$s" - "Кошуу" "Сөздүккө кошуу" "Кыска жол:" "Тил:" "Сөз териңиз" "Кошумча кыска жол" "Сөздү түзөтүү" - "Колдонуучу сөздүгүңүздө бир дагы сөз жок. Сөз кошуу үчүн кошуу (+) баскычын таптап коюңуз." "Бардык тилдер үчүн" "Дагы тилдер…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index c1c576502..6e48c6476 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -53,7 +53,6 @@ "%s (ດັ້ງ​ເດີມ)" "%s (ກະ​ທັດ​ຮັດ)" "ບໍ່ມີພາສາ" - "ໂຕອັກສອນ (QWERTY)" "ອີໂມຈິ" "ເພີ່ມ" "ລຶບອອກ" @@ -69,11 +68,9 @@ "ຍິນ​ດີ​ຕ້ອນ​ຮັບສູ່ %s" "ດ້ວຍການພິມແບບ Gesture" "ເລີ່ມຕົ້ນ" - "ຂັ້ນຕອນຕໍ່ໄປ" "ຕັ້ງຄ່າ %s" "ເປີດນຳໃຊ້ %s" "ກະລຸນາກວດເບິ່ງ \"%s\" ໃນການຕັ້ງຄ່າພາສາ ແລະ ການປ້ອນຂໍ້ມູນຂອງທ່ານ. ນີ້ຈະເປັນການອະນຸຍາດໃຫ້ມັນເຮັດວຽກໃນອຸປະກອນຂອງທ່ານ." - "%s ຖືກເປີດນຳໃຊ້ໃນການຕັ້ງຄ່າພາສາ ແລະ ການປ້ອນຂໍ້ມູນຂອງທ່ານແລ້ວ, ສະນັ້ນຂັ້ນຕອນນີ້ແມ່ນສຳເລັດໄປແລ້ວ. ໄປທີ່ຂັ້ນຕອນຕໍ່ໄປ!" "ເປີດນຳໃຊ້ໃນການຕັ້ງຄ່າ" "ປ່ຽນເປັນ %s" "ຕໍ່ໄປ, ເລືອກເອົາ \"%s\" ເປັນຮູບແບບການປ້ອນຂໍ້ມູນຂອງທ່ານ." @@ -83,21 +80,18 @@ "ສຳເລັດແລ້ວ" "ສະແດງໄອຄອນຂອງແອັບ" "ສະແດງໄອຄອນຂອງແອັບໃນ Launcher" - "ໂຕເສີມວັດຈະນານຸກົມ" + "ໂຕເສີມວັດຈະນານຸກົມ" "ມີວັດຈະນານຸກົມ" - "ບໍ່ມີວັດຈະນານຸກົມ" "ອັບເດດຫຼ້າສຸດ" "ການຕັ້ງຄ່າ" "ລຶບ" "ເວີຊັນ %1$s" - "ເພີ່ມ" "ເພີ່ມໄປທີ່ວັດຈະນານຸກົມ" "ທາງລັດ:" "ພາສາ:" "ພິມ​ຄໍາ​ສັບ​ໃດ​ນຶ່ງ" "ຕົວເລືອກທາງລັດ" "ແກ້ໄຂຄຳສັບ" - "ທ່ານບໍ່ມີຄຳສັບໃດໆໃນວັດຈະນານຸກົມຜູ້ໃຊ້ເທື່ອ. ເພື່ອເພີ່ມຄຳສັບ, ໃຫ້ແຕະປຸ່ມເພີ່ມ (+)." "ສໍາ​ລັບ​ທຸກໆ​ພາ​ສາ" "ພາສາອື່ນໆ…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 1a57e1df6..ddc193c0c 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -52,7 +52,6 @@ "%s (tradicinė)" "%s (kompaktiška)" "Kalbos nėra" - "Abėcėlė (QWERTY)" "Jaustukai" "Pridėti" "Pašalinti" @@ -68,11 +67,9 @@ "Sveiki! Tai „%s“" "naudojant įvestį gestais" "Pradėti" - "Kitas veiksmas" "„%s“ sąranka" "Įgalinkite „%s“" Skiltyje „Kalbos ir įvesties nustatymai“ žr. %s“. Programa bus įgalinta veikti įrenginyje.\" - "„%s“ jau įgalinta jūsų „Kalbos ir įvesties nustatymuose“, todėl šis veiksmas yra atliktas. Galite pereiti prie kito!" "Įgalinti nustatymuose" "Perjungimas į „%s“" Toliau pasirinkite %s“ kaip aktyvų teksto įvesties metodą.\" @@ -82,23 +79,20 @@ "Baigta" "Rodyti programos piktogramą" "Pateikti programos piktogramą paleidimo priemonėje" - "Papildomi žodynai" + "Papildomi žodynai" "Galimas žodynas" - "Nėra galimų žodynų" "Paskutinį kartą atnaujinta" "Nustatymai" "Ištrinti" "%1$s versija" - "Pridėti" "Pridėti prie žodyno" "Spartusis klavišas:" "Kalba:" "Įveskite žodį" "Pasirenkamasis spartusis klavišas" "Redaguoti žodį" - "Neturite jokių žodžių naudotojo žodyne. Kad pridėtumėte žodį, palieskite mygtuką „Pridėti“ (+)." "Visos kalbos" "Daugiau kalbų…" " AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ" diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index d3f129092..c6e7d4bdd 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -52,7 +52,6 @@ "%s (tradicionālā)" "%s (kompaktā)" "Nav valodas" - "Alfabēts (QWERTY)" "Japāņu emocijzīmes" "Pievienot" "Noņemt" @@ -68,11 +67,9 @@ "Laipni lūdzam pakalpojumā %s," "kurā varat izmantot ievadi ar žestiem" "Sākt darbu" - "Nākamā darbība" "Lietojumprogrammas %s iestatīšana" "Lietojumprogrammas %s iespējošana" Valodu un ievades iestatījumos atzīmējiet lietotni %s”, autorizējot tās palaišanu savā ierīcē.\" - "Tā kā lietotne %s jau ir iespējota valodu un ievades iestatījumos, šī darbība ir pabeigta. Veiciet nākamo darbību!" "Iespējot iestatījumos" "Pārslēgšanās uz lietojumprogrammu %s" Pēc tam atlasiet %s” kā aktīvo ievades metodi.\" @@ -82,21 +79,18 @@ "Pabeigts" "Rādīt lietotnes ikonu" "Rādīt palaidēja ekrānā lietojumprogrammas ikonu" - "Papildināmas vārdnīcas" + "Papildināmas vārdnīcas" "Vārdnīca ir pieejama" - "Vārdn. nav pieejamas" "Pēdējo reizi atjaunināts" "Iestatījumi" "Dzēst" "Versija %1$s" - "Pievienot" "Pievienot vārdnīcai" "Saīsne:" "Valoda:" "Ierakstiet vārdu." "Izvēles saīsne" "Vārda rediģēšana" - "Lietotāja vārdnīcā nav neviena vārda. Lai pievienotu vārdu, pieskarieties pogai Pievienot (+)." "Visās valodās" "Citas valodas…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 4187a86d8..dcd780b6b 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -52,7 +52,6 @@ "%s (традиционален)" "%s (Компактна)" "Нема јазик" - "Азбука (QWERTY)" "Емотикони" "Додај" "Отстрани" @@ -68,11 +67,9 @@ "Добре дојдовте во %s" "со Пишување со движење" "Започнете" - "Следен чекор" "Се поставува %s" "Овозможи %s" Означете ја апликацијата %s“ во поставките за Јазици и внесување. Со тоа ќе авторизирате да се активира на уредот.\" - "%s веќе е овозможена во поставките за Jазици и внесување, така што завршивте со овој чекор. Одете на следниот." "Овозможи во Поставки" "Префрлете се на %s" Следно, изберете %s“ како активен метод за внесување текст.\" @@ -82,21 +79,18 @@ "Завршено" "Покажи икона на апликација" "Прикажи икона на апликација во стартувачот" - "Додатоци за речници" + "Додатоци за речници" "Речникот е достапен" - "Нема достапен речник" "Последен пат ажурирано" "Поставки" "Избриши" "Верзија %1$s" - "Додај" "Додај во речник" "Кратенка:" "Јазик:" "Внесете збор" "Изборна кратенка" "Измени збор" - "Немате зборови во корисничкиот речник. За да додадете збор, допрете го копчето Додај (+)." "За сите јазици" "Повеќе јазици…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 42d739d36..904526ec7 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -52,7 +52,6 @@ %s (പരമ്പരാഗതം) %s (കോം‌പാക്‌ട്) "ഭാഷയില്ല" - "അക്ഷരമാല (QWERTY)" "ഇമോജി" "ചേര്‍ക്കുക" "നീക്കംചെയ്യുക" @@ -68,11 +67,9 @@ %s എന്നതിലേക്ക് സ്വാഗതം "വിരൽചലിത ടൈപ്പിംഗിനൊപ്പം" "ആരംഭിക്കുക" - "അടുത്ത ചുവട്" %s സജ്ജമാക്കുന്നു %s പ്രവർത്തനക്ഷമമാക്കുക ഭാഷയും ഇൻപുട്ടും ക്രമീകരണത്തിൽ \"%s\" ചെക്കുചെയ്യുക. ചെക്കുചെയ്യുന്നത് ഉപകരണത്തിൽ പ്രവർത്തിക്കാൻ ഇതിന് അംഗീകാരം നൽകും. - ഭാഷയും ഇൻപുട്ടും ക്രമീകരണത്തിൽ ഇതിനകം തന്നെ %s പ്രവർത്തനക്ഷമമാക്കിയതിനാൽ ഈ ഘട്ടം പൂർത്തിയായി. അടുത്ത ഘട്ടത്തിലേക്ക് പോകുക! "ക്രമീകരണങ്ങളിൽ പ്രവർത്തനക്ഷമമാകുക" %s എന്നതിലേക്ക് മാറുക അടുത്തത്, \"%s\" എന്നതിനെ നിങ്ങളുടെ സജീവ വാചക-ടൈപ്പുചെയ്യൽ രീതിയായി തിരഞ്ഞെടുക്കുക. @@ -82,21 +79,18 @@ "പൂർത്തിയായി" "അപ്ലിക്കേഷൻ ഐക്കൺ കാണിക്കുക" "ലോഞ്ചറിൽ അപ്ലിക്കേഷൻ ഐക്കൺ പ്രദർശിപ്പിക്കുക" - "ആഡ്-ഓൺ നിഘണ്ടുക്കൾ" + "ആഡ്-ഓൺ നിഘണ്ടുക്കൾ" "നിഘണ്ടു ലഭ്യമാണ്" - "നിഘണ്ടുക്കളൊന്നും ലഭ്യമല്ല" "അവസാനം അപ്ഡേറ്റുചെയ്തത്" "ക്രമീകരണം" "ഇല്ലാതാക്കുക" വേർഷൻ %1$s - "ചേര്‍ക്കുക" "നിഘണ്ടുവിൽ ചേർക്കുക" "കുറുക്കുവഴി:" "ഭാഷ:" "ഒരു പദം ടൈപ്പുചെയ്യുക" "ഓപ്‌ഷണൽ കുറുക്കുവഴി" "പദം എഡിറ്റുചെയ്യുക" - "ഉപയോക്തൃ നിഘണ്ടുവിൽ നിങ്ങൾക്ക് പദങ്ങളൊന്നുമില്ല. ഒരു പദം ചേർക്കുന്നതിന്, ചേർക്കുക (+) ബട്ടൺ ടാപ്പ് ചെയ്യുക." "എല്ലാ ഭാഷകൾക്കുമായി" "കൂടുതൽ ഭാഷകൾ…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-mn/strings.xml b/app/src/main/res/values-mn/strings.xml index 258a1aded..14cebb5b6 100644 --- a/app/src/main/res/values-mn/strings.xml +++ b/app/src/main/res/values-mn/strings.xml @@ -52,7 +52,6 @@ "%s (уламжлалт)" "%s (Компакт)" "Хэл байхгүй" - "Цагаан толгой (QWERTY)" "Инээмсэглэл" "Нэмэх" "Устгах" @@ -68,11 +67,9 @@ "Та %s-д тавтай морилно уу" "Зангаагаар бичихээр" "Эхлэх" - "Дараагийн алхам" %s-г тохируулж байна\" %s-г идэвхжүүлэх\" "Хэл, оролтын тохиргоо хэсгээс \"%s\"-г сонгоно уу. Ингэснээр үүнийг таны төхөөрөмжид ажиллах зөвшөөрлийг өгөх болно." - "%s-г Хэл, оролтын тохиргоонд аль хэдийн идэвхжүүлснээр энэ алхам дууслаа. Дараагийн алхмыг хийцгээе!" "Тохиргоо дотроос идэвхжүүлэх" %s рүү шилжих\" "Дараа нь \"%s\"-г өөрийн идэвхтэй текст-оруулах аргаар сонгоно уу." @@ -82,21 +79,18 @@ "Дууссан" "Апп дүрсийг харуулах" "Эхлүүлэгч дээр аппликейшний дүрсийг харуулах" - "Нэмэлт толь бичгүүд" + "Нэмэлт толь бичгүүд" "Толь бичиг байна" - "Толь бичиг байхгүй" "Сүүлд шинэчлэгдсэн" "Тохиргоо" "Устгах" "Хувилбар %1$s" - "Нэмэх" "Толь бичигт нэмэх" "Товчилбор:" "Хэл:" "Үг оруулна уу" "Зайлшгүй биш товчилбор" "Үг засах" - "Таны хэрэглэгчийн толь бичигт ямар ч үг байхгүй байна. Үг нэмэхийн тулд Нэмэх (+) товчлуурыг дарна уу." "Бүх хэлэнд" "Өөр хэлүүд…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml index 962011288..c79b900af 100644 --- a/app/src/main/res/values-mr/strings.xml +++ b/app/src/main/res/values-mr/strings.xml @@ -52,7 +52,6 @@ "%s (पारंपारिक)" "%s (संक्षिप्त)" "भाषा नाही" - "वर्णमाला (QWERTY)" "इमोजी" "जोडा" "काढा" @@ -68,11 +67,9 @@ %s वर स्वागत आहे\" "जेश्चर टायपिंग करून" "सुरू करा" - "पुढील चरण" %s सेट अप करत आहे\" %s सुरू करा\" "कृपया आपल्या भाषांमध्ये आणि इनपुट सेटिंग्जमध्ये \"%s\" तपासा. आपल्या डिव्हाइसवर चालण्यासाठी त्यास हे अधिकृत करेल." - "%s आपल्या भाषांमध्ये आणि इनपुट सेटिंग्जमध्ये आधीपासून सक्षम केला आहे, त्यामुळे हे चरण पूर्ण झाले आहे. पुढील चरणावर!" "सेटिंग्जमध्ये सुरू करा" %s वर स्विच करा\" "पुढे, तुमची सक्रिय मजकूर-इनपुट पद्धत म्हणून \"%s\" निवडा." @@ -82,21 +79,18 @@ "समाप्त" "अ‍ॅप आयकन दर्शवा" "लाँचर मध्ये ॲप्लिकेशन आयकन दाखवा" - "ॲड-ऑन शब्दकोश" + "ॲड-ऑन शब्दकोश" "शब्दकोश उपलब्ध" - "कोणतेही शब्दकोश उपलब्ध नाहीत" "अंतिम अपडेट" "सेटिंग्ज" "हटवा" "आवृत्ती %1$s" - "जोडा" "डिक्शनरीत जोडा" "शॉर्टकट:" "भाषा:" "एक शब्द टाईप करा" "पर्यायी शॉर्टकट" "शब्द संपादित करा" - "वापरकर्ता डिक्शनरीमध्ये तुमच्याकडे कोणतेही शब्द नाहीत. एखादा शब्द जोडण्यासाठी, जोडा (+) बटणावर टॅप करा." "सर्व भाषांसाठी" "अधिक भाषा…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index e3e9c7f82..32ddc3f80 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -53,7 +53,6 @@ "%s (Tradisional)" "%s (Sarat)" "Tiada bahasa" - "Abjad (QWERTY)" "Emoji" "Tambah" "Alih Keluar" @@ -69,11 +68,9 @@ "Selamat datang ke %s" "dengan Taipan Gerak Isyarat" "Bermula" - "Langkah seterusnya" "Menyediakan %s" "Dayakan %s" "Sila tandai \"%s\" dalam tetapan Bahasa & input anda. Tindakan ini akan membenarkan apl itu dijalankan pada peranti anda." - "%s sudah didayakan dalam tetapan Bahasa & input anda, jadi langkah ini telah selesai. Beralih ke langkah seterusnya!" "Dayakan dalam Tetapan" "Beralih ke %s" "Seterusnya, pilih \"%s\" sebagai kaedah input teks aktif anda." @@ -83,21 +80,18 @@ "Selesai" "Tunjukkan ikon apl" "Paparkan ikon apl dalam pelancar" - "Kamus tambahan" + "Kamus tambahan" "Kamus tersedia" - "Tiada kamus tersedia" "Kali terakhir dikemas kini" "Tetapan" "Padam" "Versi %1$s" - "tambah" "Tambah ke kamus" "Pintasan:" "Bahasa:" "Taip perkataan" "Pintasan pilihan" "Edit perkataan" - "Anda tiada sebarang perkataan dalam kamus pengguna. Untuk menambahkan perkataan, ketik butang Tambah (+)." "Untuk semua bahasa" "Lebih banyak bahasa…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index ae645a5e5..7a1985db0 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -52,7 +52,6 @@ "%s (ရိုးရာ)" "%s (ကျစ်လစ်သော)" "ဘာသာစကားမရှိ" - "ဗျည်းအက္ခရာ (ကွာတီ)" "အီမိုဂျီ" "ထည့်ရန်" "ဖယ်ရှားပါ" @@ -68,11 +67,9 @@ %s မှကြိုဆိုပါသည်\" "အမူယာ ရိုက်ခြင်းဖြင့်" "စတင်ပါတော့" - "နောက်တစ်ဆင့်" %s တပ်ဆင်ရန်\" %s ဖွင့်ရန်\" "\"%s\" ကို ဘာသာစကားနှင့် စာရိုက်စနစ်တွင် စစ်ပါ။ ဤသို့ဖြင့် သင့်စက်ပစ္စည်းပေါ်တွင် ၎င်းကိုဖွင့်ရန်အတည်ပြုပေးပါလိမ့်မည်။" - "%s ကို သင့်ဘာသာစကားနှင့် စာရိုက်စနစ်ဆက်တင်များတွင် ဖွင့်ထားပြီးဖြစ်၍ ဤအဆင့်ပြီးပါပြီ။ နောက်တစ်ခုသို့ သွားပါ။" "ဆက်တင်များတွင် ဖွင့်ရန်" %s သို့ပြောင်းမည်\" "ရှေ့၊ \"%s\" အားသင်၏ ပွင့်နေသည့်ထည့်သွင်းမှု နည်းလမ်းအဖြစ်ရွေးပါ။" @@ -82,21 +79,18 @@ "ပြီးဆုံးသွားပြီ" "အက်ပ်သင်္ကေတပြခြင်း" "launcher တွင် အပလီကေးရှင်း သင်္ကေတကိုပြရန်" - "ပေါင်းထည့်ထားသည့် အဘိဓါန်များ" + "ပေါင်းထည့်ထားသည့် အဘိဓါန်များ" "အဘိဓါန်ရရှိနိုင်" - "အဘိဓါန်မရှိ" "နောက်ဆုံး အသစ်မွမ်းမံမှု" "ဆက်တင်များ" "ဖျက်ရန်" "ဗားရှင်း %1$s" - "ထည့်ရန်" "အဘိဓာန်ထဲ ထည့်ပါ" "အတိုကောက်:" "ဘာသာစကား:" "စကားလုံးတစ်လုံး ရိုက်ပါ" "ရွေးစရာအတိုကောက်" "စာလုံးကို ပြင်ဆင်မည်" - "အသုံးပြုသူ အဘိဓာန်တွင် မည်သည့်စကားလုံးမျှ မရှိပါ။ စကားလုံးကိုပေါင်းထည့်ရန် (+) ခလုတ် ကိုတို့ပါ။" "ဘာသာစကားအားလုံးအတွက်" "ဘာသာစကားပိုများများ…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 774a11bc0..207439c12 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -52,7 +52,6 @@ "%s (tradisjonelt)" "%s (kompakt)" "Ingen språk" - Alfabet (QWERTY) "Emoji" "Legg til" "Fjern" @@ -68,11 +67,9 @@ "Velkommen til %s" "med Ordføring" "Startveiledning" - "Neste trinn" Sett opp %s Skru på %s Sjekk «%s» i Språk og inndata-innstillingene dine. Dette tillater programmet å kjøre på enheten. - "%s er allerede slått på i Språk og inndata-innstillingene dine, så dette trinnet er fullført. Gå til neste trinn!" Skru på i programinnstillingene "Bytt til %s" Deretter velger du «%s» som aktiv inndatametode for tekst. @@ -82,21 +79,18 @@ "Ferdig" "Vis app-ikonet" "Vis app-ikonet i appoversikten" - "Tilleggsordlister" + "Tilleggsordlister" "Ordliste tilgjengelig" - "Fant ingen ordlister" "Sist oppdatert" "Innstillinger" "Slett" "Versjon %1$s" - "Legg til" "Legg til i ordlisten" "Snarvei:" "Språk:" "Skriv inn et ord" "Valgfri snarvei" "Rediger ord" - "Du har ingen ord i brukerordlisten. Du kan legge til ord ved å trykke på Legg til-knappen (+)." "For alle språk" Flere språk… " ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ" @@ -240,7 +234,6 @@ %s (Sebeolsik Final) Last inn fil Kopier eksisterende oppsett - Sett navn på oppsett Oppsettsfeil: %s Sett bakgrunnsbilde Sett bilde for dag- eller natt-modus? @@ -278,7 +271,6 @@ Indigo Fiolett Brukerdefinert - Klikk for forhåndsvisning Velg farger for tekst og bakgrunner Tastaturbakgrunn Tastaturtekst @@ -311,9 +303,7 @@ Dette ordet finnes allerede i %s brukerordbok. Vennligst skriv et annet. Nederste polstringsskala %s (Probhat) - Alfabet (Bépo) Fargepreg - Kaitag (%s) ► Et langt trykk på utklippstavlen (den valgfrie i forslagsstripen) limer inn innholdet i systemets utklippstavle. <br> <br> ► Et langt trykk på tastene på verktøylinjen for forslagsstripen fester dem til forslagsstripen. <br> <br> ► Trykk lenge på komma-tasten for å få tilgang til utklippstavlevisning, emojivisning, enhåndsmodus, innstillinger eller språkbytte: <br> \t• Emoji View og språkbytteknappen forsvinner hvis du har den tilsvarende nøkkelen aktivert; <br> \t• For noen oppsett er det ikke kommatasten, men tasten i samme posisjon (f.eks. er det \"q\" for Dvorak-oppsettet). <br> <br> ► Når inkognitomodus er aktivert, vil ingen ord læres, og ingen emojier blir lagt til i \"nylige\". <br> <br> ► Trykk på inkognitoikonet for å få tilgang til verktøylinjen. <br> <br> ► Skyvetastinntasting: Sveip fra skift til en annen tast for å skrive inn en enkelt stor bokstav: <br> \t• Dette fungerer også for \'?123\'-tasten for å skrive inn et enkelt symbol fra symboltastaturet, og for relaterte taster. <br> <br> ► Trykk lenge på et forslag i forslagsstripen for å vise flere forslag, og sletteknappen for å fjerne dette forslaget. <br> <br> ► Sveip opp fra et forslag for å åpne flere forslag, og slipp forslaget for å velge det. <br> <br> ► Trykk lenge på en oppføring i utklippstavleloggen for å feste den (behold den i utklippstavlen til du løsner den). <br> <br> ► Du kan legge til ordbøker ved å åpne dem i en filutforsker: <br> \t• Dette fungerer bare med <i>content-uris</i> og ikke med <i>file-uris</i>, noe som betyr at det kanskje ikke fungerer med enkelte filutforskere. <br> <br> <i>Feilsøkingsmodus / feilsøk APK</i> <br> <br> \t• Trykk lenge på et forslag for å vise kildeordboken.<br> <br> \t• Når du bruker debug APK, kan du finne feilsøkingsinnstillinger i de avanserte innstillingene, selv om nytten er begrenset bortsett fra å dumpe ordbøker i loggen. <br> <br> \t• Ved et programkrasj vil du bli spurt om du vil ha krasjloggene når du åpner Innstillinger. <br> <br> \t• Når du bruker flerspråklig skriving, vil mellomromstasten vise en konfidensverdi som brukes til å bestemme språket som brukes for øyeblikket. <br> <br> \t• \"Forslag\" vil ha noen små tall på toppen som viser noe internt partitur og kildeordbok (kan deaktiveres). <br> <br> ► For brukere som tar manuelle sikkerhetskopier med rottilgang: Fra og med Android 7 er ikke den delte preferansefilen på standardplasseringen, fordi appen bruker %s. <br> Dette er nødvendig for at innstillingene kan leses før enheten låses opp, f.eks. ved oppstart. <br> Filen ligger i /data/user_de/0/package_id/shared_prefs/, men dette kan avhenge av enheten og Android-versjonen. %s (Student) diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index bff63fd39..d69667ecf 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -52,7 +52,6 @@ "%s (परम्परागत)" "%s (संकुचित)" "कुनै भाषा होइन" - "वर्णमाला (QWERTY)" "इमोजी" "थप्नुहोस्" "हटाउनुहोस्" @@ -68,11 +67,9 @@ "तपाईँलाई स्वागत छ%s" "इशारा टाइप गर्नेसँग" "सुरु गरौं" - "अर्को चरण" "स्थापना गर्दै %s" "सक्षम पार्नुहोस् %s" "कृपया आफ्नो भाषा र इनपुट सम्बन्धी सेटिङहरूमा \"%s\" अनुप्रयोगलाई जाँच गर्नुहोस्। यस कारबाहीले अनुप्रयोगलाई तपाईँको यन्त्रमा सञ्चालन हुन आधिकार प्रदान गर्ने छ।" - "तपाईँको भाषा र इनपुट सम्बन्धी सेटिङहरूमा %s लाई पहिले नै सक्रिय गरिएको छ, त्यसैले यो चरण सम्पन्न भइसकेको छ। अर्को चरणमा जानुहोस्!" "सेटिङहरूमा सक्षम पार्नुहोस्" %sमा स्विच गर्नुहोस्\" "त्यसपछि, \"%s\" लाई तपाईँको सक्रिय पाठ इनपुट विधिका रूपमा चयन गर्नुहोस्।" @@ -82,21 +79,18 @@ "समाप्त भयो" "अनुप्रयोग आइकन देखाउनुहोस्" "लन्चरमा अनुप्रयोग आइकन देखाउनुहोस्" - "एड-अन शब्दकोश" + "एड-अन शब्दकोश" "उपलब्ध शब्दकोश" - "शब्दकोशहरू उपलब्ध छैनन्" "पछिल्लो अद्यावधिक" "सेटिङहरू" "मेट्नुहोस्" "संस्करण %1$s" - "थप्नुहोस्" "शब्दकोशमा थप्नुहोस्" "सर्टकट:" "भाषा:" "एउटा शब्द टाइप गर्नुहोस्" "वैकल्पिक सर्टकट" "शब्द सम्पादन गर्नुहोस्" - "तपाईँको प्रयोगकर्ता शब्दकोषमा कुनै पनि शब्दहरू छैनन्। शब्द थप्न थप्नुहोस् (+) बटनलाई ट्याप गर्नुहोस्।" "सबै भाषाहरूका लागि" "थप भाषाहरू…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 18d060168..0138c6d7e 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -52,7 +52,6 @@ %s (Traditional) %s (Compact) "Geen taal" - "Alfabet (QWERTY)" "Emoji" "Toevoegen" "Verwijderen" @@ -68,11 +67,9 @@ Welkom bij %s met Typen met gebaren "Aan de slag" - "Volgende stap" %s instellen %s inschakelen Selecteer %s in de instellingen bij \'Talen & invoer\'. De app kan dan worden uitgevoerd op dit apparaat. - %s is al ingeschakeld in de instellingen bij \'Talen & invoer\', dus deze stap is voltooid. Op naar de volgende! "Inschakelen in \'Instellingen\'" Overschakelen naar %s Selecteer vervolgens %s als actieve methode voor tekstinvoer. @@ -82,21 +79,18 @@ "Voltooid" "App-pictogram weergeven" "App-pictogram weergeven in het opstartprogramma" - Aanvullende woordenboeken + Aanvullende woordenboeken "Woordenboek beschikbaar" - "Geen woordenboeken" "Laatst bijgewerkt" "Instellingen" "Verwijderen" Versie %1$s - "Toevoegen" "Toevoegen aan woordenboek" "Sneltoets:" "Taal:" "Typ een woord" "Optionele snelkoppeling" "Woord bewerken" - "Er staan geen woorden in het gebruikerswoordenboek. Tik op de knop Toevoegen (+) om een woord toe te voegen." "Voor alle talen" "Meer talen…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -198,7 +192,6 @@ Volgorde pop-up toets kiezen Cijferregel Bodemafstand schaal - Naam van lay-out instellen Aangepaste lay-out %s verwijderen? Symbolen (Arabisch) Aangepast @@ -255,8 +248,6 @@ Fout: Geselecteerd bestand is geen geldig woordenboekbestand Telefoonsymbolen Mansi - Mansi (%s) - Kaitag (%s) %s (Sebeolsik 390) %s (Sebeolsik Final) %s (Student) @@ -291,7 +282,6 @@ Meer kleuren tonen Alle kleuren tonen Deze instelling toont alle kleuren bloot die intern worden gebruikt. De lijst met kleuren kan op elk moment veranderen. Er is een willekeurige standaardkleur en de namen worden niet vertaald. - Klik voor een voorbeeld Toetsenbord-achtergrond Toetstekst Toets-achtergrond @@ -320,7 +310,6 @@ \nJe kunt woordenboeken %1$s downloaden, of een woordenboek voor \"%2$s\" %3$s direct downloaden. Varianten gedefinieerd in toetsenbordtalen weergeven Functionele hints weergeven - Alfabet (Bépo) Het geselecteerde bestand is voor %1$s, maar %2$s werd verwacht. Toch gebruiken voor %2$s? Fout bij terugzetten van de back-up: %s Selecteer een woordenboek om toe te voegen. Woordenboeken in .dict-indeling kunnen %s worden gedownload. @@ -384,7 +373,6 @@ Valuta aanpassen Opslaan naar bestand Kopiëren naar klembord - Laden zal het huidige thema overschrijven Laden Pagina-einde Pagina-begin @@ -436,7 +424,6 @@ Emoji-versie overschrijven %s (Phonetic) Dargwa (Urakhi) - Urakhi (%s) Sneltoetsen autom. corrigeren Indien ingeschakeld, kunnen sneltoetsen worden uitgebreid met autocorrectie Aangepast lettertype instellen vanuit bestand diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 2b8696741..0c0b1e4b4 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -7,7 +7,6 @@ ଵିଵିଧ ଭାଷା - ଯୋଡ଼ନ୍ତୁ ଅଭିଧାନରେ ଯୋଡ଼ନ୍ତୁ ଭାଷା: ଶବ୍ଦ ସମ୍ପାଦନା diff --git a/app/src/main/res/values-ota/strings.xml b/app/src/main/res/values-ota/strings.xml index c160d2aa7..b25c0f9ed 100644 --- a/app/src/main/res/values-ota/strings.xml +++ b/app/src/main/res/values-ota/strings.xml @@ -49,7 +49,6 @@ وارصاییلان سوزلوكلر سیل - اكلە سیقلق: دیل: یووارلادلمش diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index 21cc6ddc4..13b37aed5 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -26,7 +26,6 @@ ایموجی کیبورڈ دی چوݨ مٹاؤ - شامل کرو بولی خود بخود اکھر کیپیٹل ورتݨ بند diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 578c7594e..fa2d03fb0 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -52,7 +52,6 @@ "%s (ਪਰੰਪਰਿਕ)" "%s (ਸੰਖਿਪਤ)" "ਕੋਈ ਭਾਸ਼ਾ ਨਹੀਂ" - "ਵਰਨਮਾਲਾ (QWERTY)" "ਇਮੋਜੀ" "ਸ਼ਾਮਲ ਕਰੋ" "ਹਟਾਓ" @@ -68,11 +67,9 @@ %s ਤੇ ਸੁਆਗਤ ਹੈ\" "ਸੰਕੇਤ ਟਾਈਪਿੰਗ ਨਾਲ" "ਸ਼ੁਰੂਆਤ ਕਰੋ" - "ਅਗਲਾ ਸਟੈਪ" %s ਸੈਟ ਅਪ ਕਰ ਰਿਹਾ ਹੈ\" %s ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ\" "ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੀਆਂ ਭਾਸ਼ਾਵਾਂ ਅਤੇ ਇਨਪੁੱਟ ਸੈਟਿੰਗਾਂ ਵਿੱਚ \"%s\" \'ਤੇ ਸਹੀ ਦਾ ਨਿਸ਼ਾਨ ਲਗਾਓ। ਇਹ ਉਸ ਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਚੱਲਣ ਲਈ ਅਧਿਕਾਰਿਤ ਕਰੇਗਾ।" - "%s ਨੂੰ ਪਹਿਲਾਂ ਹੀ ਤੁਹਾਡੀਆਂ ਭਾਸ਼ਾਵਾਂ ਅਤੇ ਇਨਪੁੱਟ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਚਾਲੂ ਕੀਤਾ ਗਿਆ ਹੈ, ਇਸ ਲਈ ਇਹ ਪੜਾਅ ਪੂਰਾ ਹੋ ਗਿਆ ਹੈ। ਅਗਲੇ ਪੜਾਅ \'ਤੇ ਜਾਓ!" "ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਚਾਲੂ ਕਰੋ" %s \'ਤੇ ਸਵਿੱਚ ਕਰੋ\" "ਫਿਰ, \"%s\" ਨੂੰ ਆਪਣੀ ਕਿਰਿਆਸ਼ੀਲ ਲਿਖਤ-ਇਨਪੁੱਟ ਵਿਧੀ ਦੇ ਤੌਰ ਤੇ ਚੁਣੋ।" @@ -82,21 +79,18 @@ "ਪੂਰਾ ਹੋਇਆ" "ਐਪ ਪ੍ਰਤੀਕ ਦਿਖਾਓ" "ਲਾਂਚਰ ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨ ਪ੍ਰਤੀਕ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ" - "ਐਡ-ਆਨ ਸ਼ਬਦਕੋਸ਼" + "ਐਡ-ਆਨ ਸ਼ਬਦਕੋਸ਼" "ਸ਼ਬਦਕੋਸ਼ ਉਪਲਬਧ" - "ਕੋਈ ਸ਼ਬਦਕੋਸ਼ ਉਪਲਬਧ ਨਹੀਂ" "ਆਖਰੀ ਵਾਰ ਅੱਪਡੇਟ ਕੀਤਾ" "ਸੈਟਿੰਗਾਂ" "ਮਿਟਾਓ" "ਰੂਪ %1$s" - "ਸ਼ਾਮਲ ਕਰੋ" "ਸ਼ਬਦਕੋਸ਼ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" "ਸ਼ਾਰਟਕੱਟ:" "ਭਾਸ਼ਾ:" "ਇੱਕ ਸ਼ਬਦ ਟਾਈਪ ਕਰੋ" "ਵਿਕਲਪਕ ਸ਼ਾਰਟਕੱਟ" "ਸ਼ਬਦ ਦਾ ਸੰਪਾਦਨ ਕਰੋ" - "ਤੁਹਾਡੇ ਕੋਲ ਵਰਤੋਂਕਾਰ ਸ਼ਬਦਕੋਸ਼ ਵਿੱਚ ਕੋਈ ਸ਼ਬਦ ਨਹੀਂ ਹਨ। ਇੱਕ ਸ਼ਬਦ ਸ਼ਾਮਲ ਕਰਨ ਲਈ \'ਸ਼ਾਮਲ ਕਰੋ\' (+) ਬਟਨ \'ਤੇ ਟੈਪ ਕਰੋ।" "ਸਾਰੀਆਂ ਭਾਸ਼ਾਵਾਂ ਲਈ" "ਹੋਰ ਭਾਸ਼ਾਵਾਂ…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index e783a8fde..289c82a0d 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -53,7 +53,6 @@ %s (tradycyjny) %s (kompaktowy) standardowy - "Alfabet (QWERTY)" "Emotikony" "Dodaj" "Usuń" @@ -69,11 +68,9 @@ Witamy w aplikacji %s "z pisaniem gestami" "Rozpocznij" - "Następny krok" Konfigurowanie aplikacji %s Włącz aplikację %s Zaznacz aplikację %s w ustawieniach Język i wprowadzanie tekstu. Umożliwi to jej uruchamianie na urządzeniu. - Aplikacja %s jest już włączona w ustawieniach Język i wprowadzanie tekstu. Przejdź do następnego kroku! "Włącz w Ustawieniach" Przełącz się na aplikację %s Następnie wybierz %s jako aktywną metodę wprowadzania tekstu. @@ -83,21 +80,18 @@ Zakończ "Pokaż ikonę aplikacji" "Wyświetlaj ikonę aplikacji w programie uruchamiającym" - "Słowniki dodatkowe" + "Słowniki dodatkowe" Dostępny słownik - "Brak słowników" "Ostatnia aktualizacja" "Ustawienia" "Usuń" Wersja %1$s - "Dodaj" "Dodaj do słownika" "Skrót:" "Język:" "Wpisz słowo" "Opcjonalny skrót" "Edytuj słowo" - "Brak słów w słowniku użytkownika. Aby dodać słowo, kliknij przycisk Dodaj (+)." "Dla wszystkich języków" "Więcej języków…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -240,7 +234,6 @@ Jasne Dodaj słowo Tekst paska sugestii - Dotknij, aby wyświetlić podgląd Pokaż warianty zdefiniowane w językach klawiatury Pokaż popularne warianty Własne @@ -307,7 +300,6 @@ Szerokość podziału Wartość: Ignoruj prośby innych aplikacji o wyłączenie sugestii (może powodować problemy) - Nazwij układ Bez słownika będziesz otrzymywać jedynie sugestie dotyczące tekstu, który został wpisany wcześniej.<br> \nSłowniki możesz pobrać %1$s lub sprawdź, czy słownik \"%2$s\" można pobrać bezpośrednio %3$s. Zmień język @@ -339,7 +331,6 @@ Symbole (arabski) Telefon kaitag - kaitag (%s) Klawiatura numeryczna Klawiatura numeryczna (poziomo) Liczby @@ -359,7 +350,6 @@ Zamknij schowek Wybierz klawisze paska narzędzi w schowku %s (rozszerzony) - mansyjski (%s) mansyjski Pokaż więcej kolorów To ustawienie wyświetla wszystkie kolory używane wewnętrznie. Lista kolorów może w każdej chwili ulec zmianie. Domyślny kolor jest losowy, a nazwy nie zostaną przetłumaczone. @@ -381,7 +371,6 @@ Dostosuj waluty Dodaj Skopiuj do schowka - Ładowanie spowoduje zastąpienie bieżącego motywu Zapisz do pliku Na początek strony Na koniec strony @@ -434,7 +423,6 @@ Wibracje w trybie nie przeszkadzać %s (fonetyczny) Dargwa (Urakhi) - Urakhi (%s) Zastąp wersję emoji Autokorekta skrótów Po włączeniu skróty mogą być rozwijane przez autokorektę diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index fbaa38dab..c6d371975 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -67,22 +67,18 @@ Padrão com Digitação por Gestos Começar - Próxima etapa Ative %s Ativar nas Configurações Alterar os métodos de entrada Parabéns, está tudo pronto! Mostrar ícone do app - Adicionar dicionários - Nenhum dicionário disponível + Adicionar dicionários Última atualização em Configurações Excluir - Adicionar Atalho: Idioma: Editar palavra - Você não tem nenhuma palavra no dicionário do usuário. Para adicionar uma palavra, toque no botão Adicionar (+). Para todos os idiomas Mais idiomas… " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -109,8 +105,6 @@ Tempo de retenção do histórico Linha de números Nenhum idioma - Alfabeto (QWERTY) - %s já está ativado nas configurações de \'Idiomas e Entrada\'. Esta etapa já está concluída. Vamos para a próxima! Bem-vindo ao %s Mostrar a paleta de emojis ao tocar na tecla Alt física Configurando %s @@ -186,7 +180,6 @@ Salvar ou carregar para/de um arquivo. Aviso: A restauração substituirá dados existentes Carregar arquivo Não foi possível ler o arquivo - Definir nome do layout Erro de layout: %s Definir imagem para o modo de dia ou noite? Dia @@ -201,12 +194,10 @@ Definir imagem de fundo Configurar o teclado Adicionar dicionário por um arquivo - Clique para uma pré-visualização Fundo do teclado Espera %s (Probhat) "Sem um dicionário, você receberá apenas sugestões para o texto digitado antes.<br>\n Você pode baixar dicionários %1$s, ou verifique se um dicionário para \"%2$s\" pode ser baixado diretamente %3$s." - Alfabeto (Bépo) Essa palavra já está presente no dicionário do usuário %s. Digite outra. Definido pelo usuário (noite) Texto da tecla @@ -223,7 +214,6 @@ Mostrar dicas se um toque longo numa tecla ativa funcionalidade adicional Escala do preenchimento da parte inferior Kaitag - Kaitag (%s) Destaque Gesto de deslizar horizontal na barra de espaço Mover cursor @@ -350,9 +340,7 @@ Sugerir conteúdo da área de transferência Mostrar conteúdo recentemente copiado da área de transferência como uma sugestão Página para cima - O carregamento substituirá o tema atual Mansi - Mansi (%s) Mostrar mais cores Teclas funcionais Teclas funcionais (Símbolos) @@ -405,7 +393,6 @@ Definir imagem de fundo (paisagem) Se não definido, a imagem de retrato será usada Dargínico (Urakhi) - Urakhi (%s) Escala do espaço inferior (paisagem) Escala da fonte do teclado Escala da fonte na visualização de emoji diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 17199ea5a..4a29f316d 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -53,7 +53,6 @@ %s (Tradicional) %s (Compacto) Nenhum idioma - "Alfabeto (QWERTY)" Emojis "Adicionar" "Remover" @@ -69,11 +68,9 @@ Bem-vindo ao%s "com a Escrita com Gestos" "Começar" - "Passo seguinte" A configurar%s Ative o%s Assinale %s na área \"Idioma e introdução\" das definições. Assim, já poderá executar a aplicação no dispositivo. - %s já está ativado em Idiomas e definições de entrada, pelo que este passo está concluído. Vamos avançar para a próxima!\" Ativar nas definições Alternar para%s De seguida, selecione %s\" como método de introdução ativo.\" @@ -83,21 +80,18 @@ "Concluído" "Mostrar ícone da aplicação" "Mostrar ícone da aplicação no iniciador" - "Dicionários suplementares" + "Dicionários suplementares" "Dicionário disponível" - "Nenhum dicionário" "Última atualização" "Definições" "Eliminar" Versão %1$s - "Adicionar" "Adicionar ao dicionário" "Atalho:" Língua: "Escreva uma palavra" "Atalho opcional" "Editar palavra" - "Não tem palavras no dicionário do utilizador. Para adicionar uma palavra, toque no botão Adicionar (+)." "Em todos os idiomas" Mais línguas… " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -189,7 +183,6 @@ %s (Fonético) Substituir a versão de Emoji Dargínico (Urakhi) - Urakhi (%s) Atalhos de correção automática Quando ativado, os atalhos podem ser expandidos pela correção automática Definir imagem de fundo (paisagem) @@ -216,7 +209,6 @@ Área de transferência Fixar tecla da barra de ferramentas em toque longo Selecionar teclas fixadas da barra de ferramentas - Alfabeto (Bépo) Conteúdo copiado Mudar o lado do modo de uma mão Não foi possível ler o ficheiro @@ -276,7 +268,6 @@ Mostrar funções que podem passar despercebidas Selecionar ordem do popup de teclas Copiar para a Área de Transferência - Definir nome do layout Aviso: o layout está em uso atualmente Erro de layout: %s Toque para editar o layout bruto @@ -342,7 +333,6 @@ Carregar ficheiro Definido pelo utilizador Definido pelo utilizador (noite) - O carregamento irá substituir o tema atual Mostrar todas as cores Ocultar barra de ferramentas automaticamente Ocultar barra de ferramentas quando sugestões ficam disponíveis @@ -365,7 +355,6 @@ Arredondado Cores Cores (noite) - Clique para uma pré-visualização Licença de código aberto Altere para o teclado principal depois… A selecionar emoji no ecrã de emojis diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index f2b149646..c6373b323 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -52,7 +52,6 @@ %s (Tradicional) %s (Compacto) "Nenhum idioma" - "Alfabeto (QWERTY)" "Emojis" "Adicionar" "Remover" @@ -68,11 +67,9 @@ Bem-vindo ao %s "com entrada por gestos" "Começar" - "Próxima etapa" A configurar %s Ative o %s Assinale %s na área \"Idioma e introdução\" das definições. Assim, já poderá executar a aplicação no dispositivo. - %s já está ativado nas nas definições de idioma e introdução. Esta etapa está concluída. Vamos avançar para a próxima! Ativar nas definições Alternar para %s De seguida, selecione \"%s\" como método de introdução. @@ -82,21 +79,18 @@ "Concluído" "Mostrar ícone do app" "Mostrar ícone do app no iniciador" - "Dicionários complementares" + "Dicionários complementares" "Dicionário disponível" - "Nenhum dicionário disponível" "Última atualização" "Configurações" "Excluir" Versão %1$s - "Adicionar" "Adicionar ao dicionário" "Atalho:" "Idioma:" "Digite uma palavra" "Atalho opcional" "Editar palavra" - "Você não tem nenhuma palavra no dicionário do usuário. Para adicionar uma palavra, toque no botão de adição (+)." "Para todos os idiomas" "Mais idiomas…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index b1ce8cc6e..5d7a2a61c 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -52,7 +52,6 @@ "%s (tradițională)" "%s (Compact)" "Nicio limbă" - "Alfabet (QWERTY)" "Emoji" Adaugă Elimină @@ -68,11 +67,9 @@ "Bun venit la %s" "cu Tastarea gestuală" Începe - "Pasul următor" Se configurează %s Activează %s Bifează %s în „Limbi și introducerea textului”. Astfel, o vei autoriza să ruleze pe dispozitiv. - %s este activată deja în „Limbi și introducerea textului”, deci ai finalizat pasul. Treci la următorul! Activează în Setări Comută la %s Apoi, selectează \"%s\" ca metodă de introducere a textului. @@ -82,21 +79,18 @@ "Finalizat" Afișează pictograma aplicației Afișează pictograma aplicației în lansator - "Dicționare suplimentare" + "Dicționare suplimentare" "Dicționar disponibil" - "Niciun dicționar" "Data ultimei modificări" "Setări" Șterge Versiunea %1$s - "Adăugați" Adaugă în dicționar "Comandă rapidă:" "Limbă:" Introdu un cuvânt "Comandă rapidă opțională" Editează cuvântul - Nu ai niciun cuvânt în dicționarul utilizatorului. Pentru a adăuga un cuvânt, atinge butonul Adaugă (+). "Pentru toate limbile" "Mai multe limbi…" " AĂÂBCDEFGHIÎJKLMNOPQRSȘTȚUVWXYZ" @@ -194,12 +188,10 @@ Inversează direcția când este selectat un subtip de tastatură de la dreapta la stânga Direcție variabilă a barei de instrumente Apasă lung tasta simbol pentru tastatura numerică - Alfabet (Workman) Adaugă un aspect personalizat Selectează un fișier într-un format compatibil. Informațiile despre formate sunt disponibile %s. Încarcă fișierul Nu se poate citi fișierul - Setează numele aspectului Atinge pentru a edita aspectul brut Simboluri Simboluri (Arabă) @@ -224,7 +216,6 @@ Noros Pădure Indigo - Clic pentru previzualizare Selectează culorile pentru text și fundal Fundalul tastaturii Descrierea caracteristicilor ascunse @@ -254,8 +245,6 @@ Eroare de aspect: %s Violet Adaugă dicționar din fișier - Alfabet (Colemak Mod-DH) - Alfabet (Bépo) Ștergi cu adevărat aspectul personalizat %s? "Fără un dicționar, vei primi doar sugestii pentru textul pe care l-ai introdus anterior.<br>\n\n Poți descărca dicționare %1$s sau poți verifica dacă un dicționar pentru „%2$s” poate fi descărcat direct %3$s." Greutate: @@ -286,7 +275,6 @@ Scala de umplere inferioară Stânga integral Dreapta integral - Kaitag (%s) %s (Akkhor) Selectează un dicționar de adăugat. Dicționarele în format .dict pot fi descărcate %s. Întunecată @@ -315,7 +303,6 @@ %s (Student) Începe întotdeauna instantaneu Text personalizat pe bara de spațiu - Mansi (%s) Afișare automată bară de instrumente Personalizează monedele Setează simboluri valutare principale și până la 6 secundare, separate prin spațiu @@ -343,7 +330,6 @@ Rând de numere %s (Fonetic) Dargwa (Urakhi) - Urakhi (%s) Cod tastă Cod apăsare lungă Conținut copiat @@ -351,7 +337,6 @@ Suprascrie versiunea Emoji Previzualizare plutitoare Stilul pictogramei - Încărcarea va suprascrie tema curentă Personalizează codurile tastelor din bara de instrumente Sugerează conținut din clipboard Afișează conținutul clipboard copiat recent ca sugestie diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 0ce679e3e..96f881bef 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -55,7 +55,6 @@ %s (Традиционная) %s (Компактная) Стандартная - Латиница (QWERTY) Эмодзи Добавить Удалить @@ -71,11 +70,9 @@ Добро пожаловать в %s с непрерывным вводом Начать работу - Далее Настроить %s Включить %s Убедитесь, что приложение \"%s\" включено в настройках языка и ввода. Это позволит ему работать на вашем устройстве. - Приложение %s уже включено в настройках языка и ввода, так что этот шаг выполнен. Переходим к следующему! Включить в настройках Переключитесь на %s Теперь выберите \"%s\" в качестве активного метода ввода текста. @@ -85,21 +82,18 @@ Готово Показывать значок приложения Отображать значок приложения на панели запуска - Дополнительные словари + Дополнительные словари Доступный словарь - Словарей нет Последнее обновление Настройки Удалить Версия %1$s - Добавить Добавление в словарь "Быстрые клавиши:" "Язык:" Введите слово Ярлык для фразы (необязательно) Изменение слова - В пользовательском словаре пока ничего нет. Добавлять слова можно с помощью кнопки Добавить (+). Для всех языков Другие языки… " АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ" @@ -163,7 +157,6 @@ Пользовательская Пользовательская (тёмная тема) Автоматический выбор цвета - Нажмите для предпросмотра Выберите цвета для текста и фона Фон клавиатуры Текст клавиш @@ -282,7 +275,6 @@ Заменить пользовательский словарь \"%1$s\"?\n\nТекущий словарь:\n%2$s\n\nНовый словарь:\n%3$s Полностью вправо Вес: - Задать имя раскладки Загрузить файл Скопировать текущую раскладку Ошибка раскладки: %s @@ -339,7 +331,6 @@ Загрузить Сохранить в файл Скопировать в буфер обмена - Загрузка перезапишет текущую тему Начало страницы Конец страницы Слово левее diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 7d3560fc0..06c000c09 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -52,7 +52,6 @@ "%s (සාම්ප්‍රදායික)" "%s (සංයුක්ත)" "භාෂාවක් නැත" - "අකාරාදිය (QWERTY)" "ඉමොජි" "එක් කරන්න" "ඉවත් කරන්න" @@ -68,11 +67,9 @@ %s වෙත සාදරයෙන් පිළිගනිමු\" "ඉංගිත ටයිප් කිරීම් සමග" "අරඹන්න" - "ඊළඟ පියවර" %s සැකසෙමින් පවතී\" %s සබල කරන්න\" "කරණාකර ඔබගේ භාෂාව සහ ආදාන සැකසීම් තුළ \"%s\" පරීක්ෂා කරන්න. මෙය ඔබගේ උපාංගය මත එයට ධාවනය වීමට අනුමැතිය දෙනු ඇත." - "%s දැනටමත් ඔබගේ භාෂාව සහ ආදාන සැකසීම් තුළ සබල කර ඇත, එම නිසා මෙම පියවර නිමයි. ඊළඟ එක වෙතට!" "සැකසීම් තුළ සබල කරන්න" %s වෙත මාරුවන්න\" "ඊළඟට, ඔබගේ සක්‍රිය පෙළ-ආදාන ක්‍රමය ලෙස \"%s\" තෝරන්න." @@ -82,21 +79,18 @@ "අවසන්" "යෙදුම් නිරූපකය පෙන්වන්න" "දියත්කරනය තුළ යෙදුම් නිරූපකය දර්ශනය කරන්න" - "ඈඳුම් ශබ්ද කෝෂ" + "ඈඳුම් ශබ්ද කෝෂ" "ශබ්දකෝෂය ලබාගත හැක" - "ශබ්ද කෝෂ ලබාගත නොහැක" "අවසන් වරට යාවත්කාලීන කළේ" "සැකසීම්" "මකන්න" "%1$s අනුවාදය" - "එක් කරන්න" "ශබ්ද කෝෂය වෙත එක් කරන්න" "කෙටිමග:" "භාෂාව:" "වචනයක් ටයිප් කරන්න" "විකල්පමය කෙටිමග" "වචනය සංස්කරණය කරන්න" - "ඔබට පරිශීලක ශබ්ද කෝෂය තුළ වචන කිසිවක් නැත. වචනයක් එක් කිරීමට, එක් කිරීමේ (+) බොත්තම තට්ටු කරන්න." "සියලු භාෂාවන් සඳහා" "තවත් භාෂා…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 1be1b1aa6..a8571e85b 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -52,7 +52,6 @@ "%s (tradičná)" "%s (kompaktná)" "Žiadny jazyk" - "latinka (QWERTY)" "Emoji" "Pridať" "Odstrániť" @@ -68,11 +67,9 @@ "Vitajte v aplikácii %s" "s funkciou Písanie gestami" "Začať" - "Ďalší krok" "Nastavenie aplikácie %s" "Povoľte aplikáciu %s" V nastaveniach Jazyky a vstup začiarknite políčko%s. Týmto aplikácii povolíte spustenie v zariadení.\" - "Aplikácia %s je už v nastaveniach Jazyky a vstup povolená. Prejdite na ďalší krok." "Povoliť v Nastaveniach" "Prepnite na aplikáciu %s." Potom vyberte aplikáciu%s ako aktívnu metódu textového vstupu.\" @@ -82,21 +79,18 @@ "Hotovo" "Zobraziť ikonu aplikácie" "Zobrazenie ikony aplikácie v spúšťači" - "Doplnkové slovníky" + "Doplnkové slovníky" "K dispozícii je slovník" - "Slovníky sú nedostupné" "Posledná aktualizácia" "Nastavenia" "Odstrániť" "Verzia %1$s" - "Pridať" "Pridať do slovníka" "Klávesová skratka" "Jazyk:" "Zadajte slovo" "Voliteľná skratka" "Upraviť slovo" - "V používateľskom slovníku nie sú žiadne slová. Slovo pridáte klepnutím na tlačidlo Pridať (+)." "pre všetky jazyky" "Ďalšie jazyky…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 10118eccd..fe2246b2c 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -52,7 +52,6 @@ "%s (tradicionalna)" "%s (kompaktna)" "Brez jezika" - "Latinica (QWERTY)" "Emodžiji" "Dodaj" "Odstrani" @@ -68,11 +67,9 @@ "Pozdravljeni v aplikaciji %s" "s pisanjem s kretnjami" "Začnite" - "Naslednji korak" "Nastavitev aplikacije %s" "Omogočanje aplikacije %s" V nastavitvah »Jeziki in vnos« izberite aplikacijo %s«. S tem ji omogočite izvajanje v napravi.\" - "Aplikacija %s je že omogočena v nastavitvah »Jeziki in vnos«, zato je to že opravljeno. Nadaljujte." "Omogoči v nastavitvah" "Preklop na aplikacijo %s" Nato izberite aplikacijo %s« kot aktivni način vnosa besedila.\" @@ -82,21 +79,18 @@ "Končano" "Pokaži ikono aplikacije" "Prikaz ikone aplikacije v zaganjalniku" - "Dodatni slovarji" + "Dodatni slovarji" "Slovar je na voljo" - "Ni slovarjev" "Nazadnje posodobljeno" "Nastavitve" "Izbriši" "Različica %1$s" - "Dodaj" "Dodaj v slovar" "Bližnjica:" "Jezik:" "Vnesite besedo" "Izbirna bližnjica" "Uredi besedo" - "V uporabniškem slovarju ni besed. Če želite dodati besedo, se dotaknite gumba za dodajanje (+)." "Za vse jezike" "Več jezikov …" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 44e62b8a6..b193f107b 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -53,7 +53,6 @@ "%s (tradicionale)" "%s (kompakte)" "nuk ka gjuhë" - "alfabeti (QWERTY)" "\"Emoji\"" "Shto" "Hiq" @@ -69,11 +68,9 @@ "Mirë se erdhe në %s" "me \"Shkrimin me gjeste\"" "Fillo" - "Hapi tjetër" "Po konfiguron %s" "Aktivizo %s" "Kontrollo \"%s\" te \"Cilësimet e gjuhës dhe hyrjes\". Kjo do ta autorizojë atë që të ekzekutohet në pajisjen tënde." - "%s është i aktivizuar tashmë te \"Cilësimet e gjuhës dhe të hyrjes\", kështu që ky hap ka mbaruar. Vazhdo me hapin tjetër!" "Aktivizo te \"Cilësimet\"" "Kalo në %s" "Më pas, përzgjidh \"%s\" si metodën tënde aktive të hyrjes së tekstit." @@ -83,21 +80,18 @@ "U përfundua" "Shfaq ikonën e aplikacionit" "Shfaq ikonën e aplikacionit në mekanizimin e nisjes" - "Fjalorë shtesë" + "Fjalorë shtesë" "Fjalor i përdorshëm" - "Nuk mund të përdoret asnjë fjalor" "Përditësimi i fundit" "Cilësimet" "Fshi" "Versioni %1$s" - "Shto" "Shto në fjalor" "Shkurtorja:" "Gjuha:" "Shkruaj një fjalë" "Shkurtore opsionale" "Redakto fjalën" - "Nuk ke asnjë fjalë në fjalorin e përdoruesit. Për të shtuar një fjalë, trokit te butoni \"Shto (+)\"." "Për të gjitha gjuhët" "Gjuhë të tjera…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 27202c501..f18427034 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -52,7 +52,6 @@ %s (традиционални) %s (компактна) "Нема језика" - "абецеда (QWERTY)" "Емотикони" "Додај" "Уклони" @@ -68,11 +67,9 @@ Добро дошли у %s "помоћу Куцања покретима" "Започнимо" - "Следећи корак" Подешавање апликације %s Омогућите апликацију %s Потврдите апликацију %s“ у Подешавањима језика и уноса. Тако јој одобравате покретање на уређају.\" - "Апликација %s је већ омогућена у Подешавањима језика и уноса, па је овај корак готов. Пређимо на следећи!" "Омогући у Подешавањима" "Пребаците на %s" Затим изаберите %s“ као активни метод уноса текста.\" @@ -82,21 +79,18 @@ "Завршено" "Прикажи икону апликације" "Икона апликације се приказује у покретачу" - "Помоћни речници" + "Помоћни речници" "Речник је доступан" - "Нема доступних речника" "Последње ажурирање" "Подешавања" "Избриши" "Верзија %1$s" - "Додај" "Додавање у речник" "Пречица:" "Језик:" "Унесите реч" "Опционална пречица" "Измена речи" - "Немате ниједну реч у корисничком речнику. Да бисте додали реч, додирните дугме Додај (+)." "За све језике" "Још језика…" " АБВГДЂЕЖЗИЈКЛЉМНЊОПРСТЋУФХЦЧЏШ" diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 395ce8e9b..268c042d2 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -52,7 +52,6 @@ %s (traditionell) %s (kompakt) "Inget språk" - "Alfabet (QWERTY)" Emoji "Lägg till" "Ta bort" @@ -68,11 +67,9 @@ Välkommen till %s "med svepskrivning" "Kom igång" - "Nästa steg" Konfigurerar %s Aktivera %s Markera \"%s\" i dina Språk & inmatning-inställningar. Detta kommer att tillåta att den körs på din enhet. - %s är redan aktiverad i dina Språk & inmatning-inställningar, så detta steg är färdigt. Vidare till nästa! Aktivera i Inställningar Byt till %s Välj sedan \"%s\" som din aktiva textinmatningsmetod. @@ -82,21 +79,18 @@ Slutförd "Visa appikon" "Visa appikonen i startprogrammet" - "Tilläggsordlistor" + "Tilläggsordlistor" Ordlista tillgänglig - Inga ordlistor tillgängliga "Informationen uppdaterades senast" "Inställningar" "Ta bort" Version %1$s - "Lägg till" "Lägg till i ordlista" "Genväg:" "Språk:" "Skriv ett ord" "Valfri genväg" "Redigera ord" - "Du har inga ord i din egen ordlista. Tryck på knappen Lägg till (+) om du vill lägga till ett ord." "För alla språk" "Fler språk …" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml index bcc27c6c9..1fc88bc10 100644 --- a/app/src/main/res/values-sw/strings.xml +++ b/app/src/main/res/values-sw/strings.xml @@ -53,7 +53,6 @@ "%s (cha Jadi)" "%s (Thabiti)" "Hakuna lugha" - "Alfabeti (QWERTY)" "Emoji" "Ongeza" "Ondoa" @@ -69,11 +68,9 @@ "Karibu kwenye %s" "kwa Kuandika kwa ishara" "Anza kutumia" - "Hatua inayofuata" "Inasanidi %s" "Washa %s" "Tafadhali angalia \"%s\" katika mipangilio yako ya Lugha na mbinu ya kuingiza data. Hatua hii itairuhusu kutumika kwenye kifaa chako." - "%s tayari imewashwa katika mipangilio yako ya Lugha na kuingiza data, kwa hivyo hatua hii imekamilika. Nenda kwenye hatua inayofuata!" "Washa katika Mipangilio" "Badilisha kwenda %s" "Kisha, chagua \"%s\" kama mbinu yako inayotumika ya kuingiza data ya maandishi." @@ -83,21 +80,18 @@ "Imemaliza" "Onyesha aikoni ya programu" "Onyesha aikoni ya programu kwenye kifungua programu" - "Kamusi za nyongeza" + "Kamusi za nyongeza" "Kamusi inapatikana" - "Hakuna kamusi inayopatikana" "Ilibadilishwa mwisho" "Mipangilio" "Futa" "Toleo la %1$s" - "Ongeza" "Ongeza kwenye kamusi" "Njia ya mkato:" "Lugha:" "Chapa neno" "Njia ya mkato ya hiari" "Badilisha neno" - "Huna maneno yoyote katika kamusi ya mtumiaji. Gusa kitufe cha Ongeza (+) ili kuongeza neno." "Ya lugha zote" "Lugha zingine…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index e913a1635..f085d1bc1 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -52,7 +52,6 @@ "%s (பாரம்பரியமானது)" "%s (வசதியான)" "மொழியில்லை" - "அகரவரிசை (க்வெர்டி)" "எமோஜி" "சேர்" "அகற்று" @@ -68,11 +67,9 @@ %s பயன்பாட்டிற்கு வரவேற்கிறோம்\" "ஸ்வைப் உள்ளீடு மூலம்" "தொடங்குக" - "அடுத்த கட்டம்" %s ஆப்ஸை அமைக்கிறது\" %s ஆப்ஸை இயக்கவும்\" "மொழி & உள்ளீட்டு அமைப்புகளில் \"%s\" ஆப்ஸைத் தேர்வு செய்யவும். இதனால், சாதனத்தில் ஆப்ஸை இயக்கலாம்." - "மொழி & உள்ளீட்டு அமைப்புகளில் %s ஏற்கனவே இயக்கப்பட்டுள்ளதால் இப்படிமுறை முடிந்தது. அடுத்த படிமுறைக்குச் செல்லவும்!" "அமைப்புகளில் இயக்கு" %s க்கு மாறவும்\" "அடுத்து, உங்கள் செயலில் உள்ள உரை உள்ளீட்டு முறையாக \"%s\" பயன்பாட்டைத் தேர்ந்தெடுக்கவும்." @@ -82,21 +79,18 @@ "முடிந்தது" "ஆப்ஸ் ஐகானைக் காட்டு" "துவக்கியில் ஆப்ஸ் ஐகானைக் காட்டும்" - "துணை அகராதிகள்" + "துணை அகராதிகள்" "அகராதி கிடைக்கிறது" - "அகராதிகள் எதுவும் இல்லை" "இறுதியாகப் புதுப்பித்தது" "அமைப்பு" "நீக்கு" "%1$s பதிப்பு" - "சேர்" "அகராதியில் சேர்" "ஷார்ட்கட்:" "மொழி:" "வார்த்தையை உள்ளிடவும்" "விருப்பத்திற்குரிய ஷார்ட்கட்" "வார்த்தையைத் திருத்து" - "பயனர் அகராதியில் எந்தச் சொற்களும் இல்லை. சொல்லைச் சேர்க்க, சேர் (+) எனும் பொத்தானைத் தட்டவும்." "எல்லா மொழிகளுக்கும்" "மேலும் மொழிகள்…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 5e3cfe4e5..223983aa3 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -52,7 +52,6 @@ "%s (సాంప్రదాయకం)" "%s (కాంపాక్ట్)" "భాష లేదు" - "ఆల్ఫాబెట్ (QWERTY)" "ఎమోజి" "జోడించండి" "తీసివేయి" @@ -68,11 +67,9 @@ %sకు స్వాగతం\" "సంజ్ఞ టైపింగ్‌తో" "ప్రారంభించండి" - "తర్వాత దశ" %sని సెటప్ చేయడం\" %sని ప్రారంభించండి\" "దయచేసి మీ భాషలు & ఇన్‌పుట్ సెట్టింగ్‌ల్లో \"%s\" తనిఖీ చేయండి. ఇది మీ పరికరంలో అమలు కావడానికి దీన్ని ప్రామాణీకరిస్తుంది." - "%s ఇప్పటికే మీ భాషలు & ఇన్‌పుట్ సెట్టింగ్‌ల్లో ప్రారంభించబడింది, కనుక ఈ దశ పూర్తయింది. తర్వాత దశకు వెళ్లండి!" "సెట్టింగ్‌ల్లో ప్రారంభించండి" %sకు మారండి\" "తర్వాత, \"%s\"ని మీ సక్రియ వచన-ఇన్‌పుట్ పద్ధతిగా ఎంచుకోండి." @@ -82,21 +79,18 @@ "పూర్తయింది" "యాప్‌ చిహ్నాన్ని చూపు" "లాంచర్‌లో యాప్‌ చిహ్నాన్ని ప్రదర్శించు" - "ఇతర నిఘంటువులు" + "ఇతర నిఘంటువులు" "నిఘంటువు అందుబాటులో ఉంది" - "నిఘంటువులు ఏవీ అందుబాటులో లేవు" "చివరిగా నవీకరించబడినది" "సెట్టింగ్‌లు" "తొలగించు" "వెర్షన్ %1$s" - "జోడించు" "నిఘంటువుకి జోడించు" "షార్ట్‌కట్:" "భాష:" "పదాన్ని టైప్ చేయండి" "ఐచ్ఛిక షార్ట్‌కట్" "పదాన్ని సవరించు" - "మీరు వినియోగదారు నిఘంటువులో పదాలు ఏవీ కలిగి లేరు. పదాన్ని జోడించడానికి, జోడించు (+) బటన్‌ను నొక్కండి." "అన్ని భాషల కోసం" "మరిన్ని భాషలు…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 94fc5723d..e62599477 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -53,7 +53,6 @@ "%s (ดั้งเดิม)" "%s (แบบกะทัดรัด)" "ไม่มีภาษา" - "ตัวอักษร (QWERTY)" "อีโมจิ" "เพิ่ม" "ลบ" @@ -69,11 +68,9 @@ "ยินดีต้อนรับสู่ %s" "พร้อมการป้อนข้อมูลด้วยท่าทาง" "เริ่มต้นใช้งาน" - "ขั้นตอนถัดไป" "การตั้งค่า %s" "เปิดใช้งาน %s" "โปรดตรวจสอบ \"%s\" ในการตั้งค่าภาษาและการป้อนข้อมูลของคุณ ซึ่งจะอนุญาตให้แอปทำงานบนอุปกรณ์ของคุณ" - "%s เปิดใช้ในการตั้งค่าภาษาและการป้อนข้อมูลของคุณอยู่แล้ว ขั้นตอนนี้จึงเสร็จสิ้นแล้ว ไปยังขั้นตอนถัดไปเลย!" "เปิดใช้งานในการตั้งค่า" "สลับไปใช้ %s" "ถัดไป เลือก \"%s\" เป็นวิธีการป้อนข้อความที่ใช้งานของคุณ" @@ -83,21 +80,18 @@ "เสร็จสิ้น" "แสดงไอคอนแอป" "แสดงไอคอนแอปพลิเคชันในตัวเรียกใช้งาน" - "พจนานุกรมส่วนเสริม" + "พจนานุกรมส่วนเสริม" "มีพจนานุกรมให้ใช้งาน" - "ไม่มีพจนานุกรม" "ปรับปรุงแก้ไขครั้งล่าสุด" "การตั้งค่า" "ลบ" "เวอร์ชัน %1$s" - "เพิ่ม" "เพิ่มในพจนานุกรม" "ทางลัด:" "ภาษา:" "พิมพ์คำ" "ทางลัดที่ไม่บังคับ" "แก้ไขคำ" - "คุณยังไม่มีคำในพจนานุกรมผู้ใช้ หากต้องการเพิ่มคำ ให้แตะปุ่มเพิ่ม (+)" "สำหรับทุกภาษา" "ภาษาเพิ่มเติม…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml index e4bac9c9a..87cc604f3 100644 --- a/app/src/main/res/values-tl/strings.xml +++ b/app/src/main/res/values-tl/strings.xml @@ -53,7 +53,6 @@ "%s (Traditional)" "%s (Compact)" "Walang wika" - "Alpabeto (QWERTY)" "Emoji" "Idagdag" "Alisin" @@ -69,11 +68,9 @@ "Maligayang pagdating sa %s" "gamit ang Gesture na Pagta-type" "Magsimula" - "Susunod na hakbang" "Sine-set up ang %s" "Paganahin ang %s" "Pakitingnan ang \"%s\" sa iyong Mga setting ng wika at input. Papahintulutan nitong gumana ito sa iyong device." - "Naka-enable na ang %s sa iyong Mga setting ng wika at input, kaya tapos na ang hakbang na ito. Magpatuloy sa susunod!" "I-enable sa Mga Setting" "Lumipat sa %s" "Susunod, piliin ang \"%s\" bilang iyong aktibong pamamaraan ng pag-input ng teksto." @@ -83,21 +80,18 @@ "Tapos na" "Ipakita ang icon ng app" "Ipakita ang icon ng application sa launcher" - "Mga add-on na diksyunaryo" + "Mga add-on na diksyunaryo" "Available ang diksyunaryo" - "Walang mga diksyunaryo" "Huling na-update" "Mga Setting" "I-delete" "Bersyon %1$s" - "Idagdag" "Idagdag sa diksyunaryo" "Shortcut:" "Wika:" "Mag-type ng salita" "Opsyonal na shortcut" "I-edit ang salita" - "Wala kang anumang salita sa diksyunaryo ng user. Para magdagdag ng salita, i-tap ang button na Magdagdag (+)." "Para sa lahat ng wika" "Higit pang mga wika…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 4538c7467..377635bb2 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -52,7 +52,6 @@ %s (Geleneksel) %s (Kompakt) "Dil yok" - "Alfabe (QWERTY)" "Emoji" "Ekle" "Kaldır" @@ -68,11 +67,9 @@ %s uygulamasına hoş geldiniz "Hareketle Yazmayı içerir" "Başlayın" - "Sonraki adım" %s uygulamasını kurma %s uygulamasını etkinleştirin Lütfen \"%s\" uygulamasını Dil ve giriş ayarlarınızda işaretleyin. Bu, uygulamaya cihazınızda çalışma yetkisi verecektir. - %s, Dil ve giriş ayarlarınızda önceden etkinleştirildiği için bu adım tamamlandı. Bir sonraki adıma ilerleyin! "Ayarlarda etkinleştir" %s uygulamasına geçin Sonra, \"%s\" uygulamasını etkin metin giriş yönteminiz olarak seçin. @@ -82,21 +79,18 @@ "Tamamlandı" "Uygulama simgesini göster" "Uygulama simgesini başlatıcıda gösterir" - "Ek sözlükler" + "Ek sözlükler" "Sözlük mevcut" - "Kullanılabilir sözlük yok" "Son güncelleme tarihi" "Ayarlar" "Sil" Sürüm %1$s - "Ekle" "Sözlüğe ekle" "Kısayol:" "Dil:" Bir kelime yaz "İsteğe bağlı kısayol" "Kelimeyi düzenle" - Kullanıcı sözlüğünde kelime yok. Kelime eklemek için Ekle (+) düğmesine dokun. "Tüm diller için" "Diğer diller…" " ABCÇDEFGĞHIİJKLMNOÖPQRSŞTUÜVWXYZ" @@ -182,7 +176,6 @@ Araç çubuğu tuşlarını seç Pano Panoyu temizle - Düzen adını ayarla İşlevsel tuşlar İşlevsel tuşlar (Semboller) İşlevsel tuşlar (Daha fazla sembol) @@ -204,7 +197,6 @@ Para birimlerini özelleştir Yalnızca ana renkleri göster Tüm renkleri göster - Önizleme için tıkla Ana ve en fazla 6 ikincil para birimi sembolünü boşlukla ayırarak ayarla Anahtar boşluklarını daralt Sayısal tuş takımı için sembol tuşuna uzun bas @@ -289,7 +281,6 @@ Kum Kullanıcı tanımlı (gece) Rengi otomatik olarak seç - Yükleme mevcut temanın üzerine yazılacak Kapat Ayarları açmak için dile dokun Hareketle yazma kitaplığını yükle @@ -299,7 +290,6 @@ \nUyarı: Harici kodun yüklenmesi güvenlik riski oluşturabilir. Yalnızca güvenilir bir kaynaktan gelen kitaplığı kullan. Açılır tuş sırasını seç İpucu kaynağını seç - Kaitag (%s) Emoji Sözlüğü değiştir Sürüm @@ -333,7 +323,6 @@ İşlevsel ipuçlarını göster Sabitlenmiş araç çubuğu tuşlarını seç Uzun basıldığında araç çubuğu tuşunu sabitle - Alfabe (Bépo) %s (Sebeolsik 390) %s (Sebeolsik Final) Stil @@ -365,7 +354,6 @@ Mansi Bağlantı tespiti Diğer uygulamaların önerileri devre dışı bırakma isteklerini göz ardı et (sorunlara neden olabilir) - Mansi (%s) Görünüm Kaydet yada dosyadan yükle. Uyarı: geri yükleme mevcut verilerin üzerine yazacaktır "Sözlük olmadan yalnızca daha önce girdiğin metin için öneriler alırsın.<br> diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 16e71bd83..9207ff909 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -53,7 +53,6 @@ %s (Традиційна) %s (Компактна) Стандартна - "Латиниця (QWERTY)" Емоджі Додати Видалити @@ -69,11 +68,9 @@ Вітаємо в%s з функцією «Ввід жестами» Розпочати - Наступний крок Налаштування%s Увімкнути%s Перевірте застосунок \\%s у налаштуваннях «Мова та введення». Це дозволить йому працювати на вашому пристрої. - Застосунок %s уже увімкнено в налаштуваннях «Мова та введення». Переходьте до наступного кроку! Увімкнути в налаштуваннях Перемкнути на%s Виберіть \\%s поточним методом введення. @@ -83,21 +80,18 @@ Завершено Показувати піктограму програми Відображати піктограму програми нв лаунчері - Додаткові словники + Додаткові словники Словник доступний - Словники недоступні Останнє оновлення Налаштування Видалити Версія %1$s - Додати Додати в словник "Ярлик:" "Мова:" Введіть слово "Необов’язковий ярлик" Редагувати слово - У словнику користувача нічого немає. Щоб додати слово, торкніться кнопки «Додати» (+). Для всіх мов "Інші мови…" " АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ" @@ -132,7 +126,6 @@ Користувацька Користувацька (темна) Автоматичний вибір кольору - Натисніть, щоб переглянути Виберіть кольори для тексту та фону Фон клавіатури Текст клавіш @@ -251,11 +244,9 @@ Показати функціональні підказки Показувати підказки, якщо тривале натискання клавіші запускає додаткові функції Кайтазька - Кайтазька (%s) Використовувати особистий словник для зберігання вивчених слів Ігнорувати запити інших застосунків про вимкнення пропозицій (може викликати проблеми) Більше автокорекції - Алфавіт (Бепо) Натисніть, щоб відредагувати базову розкладку Символи телефону Числа @@ -269,7 +260,6 @@ Завантажити файл Неможливо прочитати файл Копіювати поточну розкладку - Вказати ім\'я розкладки Справді видалити власну розкладку %s? Помилка розкладки: %s %s (Пробгат) @@ -328,7 +318,6 @@ При натисканні точки або пунктуації буде використано середню пропозицію Закрити буфер обміну Завантажити - Завантаження перезапише поточну тему Емоджі Запропонувати вміст буфера обміну Показати нещодавно скопійований вміст буфера обміну як пропозицію @@ -352,7 +341,6 @@ Видалити спливні клавіші, які є в базовій розкладці Мансійська %s (Розширена) - Мансійська (%s) Ця установка показує всі кольори, які використовуються всередині програми. Список кольорів може змінюватись. Стандартний колір є випадковим, і імена не будуть переведені. Показати більше кольорів Видалити зайві спливні вікна @@ -392,7 +380,6 @@ Вібрація в режимі «Не турбувати» Відстань розділення (альбомна) Даргинська (Урахі) - Урахінський (%s) Розділена клавіатура Увімкнути розділену клавіатуру (альбомну) %s (Фонетика) diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index bedd85e30..3b2b4a7df 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -52,7 +52,6 @@ "%s (روایتی)" "%s (کمپیکٹ)" "کوئی زبان نہیں" - "‏حروف تہجی (QWERTY)" "Emoji" "شامل کریں" "ہٹائیں" @@ -68,11 +67,9 @@ %s میں خوش آمدید\" "اشارہ ٹائپنگ کے ساتھ" "شروع کریں" - "اگلا مرحلہ" %s ترتیب دینا\" %s کو فعال کریں\" "براہ کرم \"%s\" کو اپنی زبانوں اور ان پٹ ترتیبات میں چیک کریں۔ اس سے اس کو آپ کے آلہ پر چلنے کی اجازت مل جائے گی۔" - "‏%s پہلے ہی آپ کی زبانوں ‎اور‎ ان پٹ ترتیبات میں فعال ہے، لہذا یہ مرحلہ مکمل ہو گیا ہے۔ اگلے پر چلتے ہیں!" "ترتیبات میں فعال کریں" %s پر سوئچ کریں\" "آگے، \"%s\" کو اپنے فعال متنی اندراج کے طریقہ کے بطور منتخب کریں۔" @@ -82,21 +79,18 @@ "مکمل ہو گیا" "ایپ آئیکن دکھائیں" "لانچر میں ایپلیکیشن آئیکن کو ڈسپلے کریں" - "اضافی لغات" + "اضافی لغات" "لغت دستیاب ہے" - "کوئی لغت دستیاب نہیں" "آخری بار اپ ڈیٹ کردہ" "ترتیبات" "حذف کریں" "ورژن %1$s" - "شامل کریں" "لغت میں شامل کریں" "شارٹ کٹ:" "زبان:" "ایک لفظ ٹائپ کریں" "اختیاری شارٹ کٹ" "لفظ میں ترمیم کریں" - "صارف لغت میں آپ کے پاس کوئی الفاظ نہيں ہیں۔ کوئی لفظ شامل کرنے کیلئے شامل کریں (+) بٹن تھپتھپائیں۔" "سبھی زبانوں کیلئے" "مزید زبانیں…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index a4f07703b..907a94c95 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -52,7 +52,6 @@ %s (An’anaviy) %s(Ixcham) "Til aniqlanmadi" - "Lotin (QWERTY)" "Kulgichlar" "Qo‘shish" "Olib tashlash" @@ -68,11 +67,9 @@ %s ilovasiga xush kelibsiz! "qo‘l uzmasdan yozish" "Boshladik" - "Keyingi qadam" %s sozlanmoqda Yoqish %s Matn kiritishda foydalanish uchun “Tillar va matn kiritish” sozlamalarida “%s” bandiga belgi qo‘ying. - %s ilovasi allaqachon “Tillar va matn kiritish” sozlamalarida yoqilgan, shuning uchun keyingi qadamga o‘tish mumkin! "Sozlamalardan yoqish" %s ga o‘zgartirish Endi, joriy matn kiritish usuli sifatida “%s” ilovasini tanlang. @@ -82,21 +79,18 @@ "Tugallandi" "Ilova ikonkasini chiqarish" "Launcherga ilova ikonkasini chiqarish" - "Qo‘shimcha lug‘atlar" + "Qo‘shimcha lug‘atlar" "Lug‘at mavjud" - "Lug‘at mavjud emas" "So‘nggi marta yangilandi" "Sozlamalar" "O‘chirish" %1$s versiya - "Qo‘shish" "Lug‘atga kiritish" "Qisqartma:" "Til:" "So‘zni kiriting" "Ibora uchun qisqartma (ixtiyoriy)" "So‘zni tahrirlash" - "Shaxsiy lug‘atingizda hech narsa yo‘q. Unga so‘zlarni qo‘shish uchun “Qo‘shish” (+) tugmasidan foydalaning." "Barcha tillar uchun" "Ko‘proq tillar…" " ABDEFGHIJKLMNOPQRSTUVXYZO‘G‘SHCH" diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index d83f16d5b..da5fde0c8 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -53,7 +53,6 @@ "%s (Truyền thống)" "%s (Viết tắt)" "Không ngôn ngữ nào" - "Bảng chữ cái (QWERTY)" "Biểu tượng cảm xúc" "Thêm" "Xóa" @@ -69,11 +68,9 @@ "Chào mừng bạn đến với %s" "với Nhập bằng cử chỉ" "Bắt đầu" - "Bước tiếp theo" "Thiết lập %s" "Bật %s" "Hãy chọn \"%s\" trong cài đặt Ngôn ngữ và phương thức nhập. Thao tác này sẽ cho phép ứng dụng chạy trên thiết bị của bạn." - "%s đã được bật trong cài đặt Ngôn ngữ và phương thức nhập, do đó bước này đã hoàn tất. Hãy chuyển sang bước tiếp theo!" "Bật trong Cài đặt" "Chuyển sang %s" "Tiếp theo, chọn \"%s\" làm phương thức nhập văn bản hoạt động của bạn." @@ -83,21 +80,18 @@ "Đã xong" "Hiển thị biểu tượng ứng dụng" "Hiển thị biểu tượng ứng dụng trong trình chạy" - "Từ điển bổ sung" + "Từ điển bổ sung" "Từ điển có sẵn" - "Không có từ điển nào" "Cập nhật lần cuối" "Cài đặt" "Xóa" "Phiên bản %1$s" - "Thêm" "Thêm vào từ điển" "Phím tắt:" "Ngôn ngữ:" "Nhập từ" "Phím tắt tùy chọn" "Chỉnh sửa từ" - "Bạn không có bất kỳ từ nào trong từ điển người dùng. Để thêm từ, hãy nhấn vào nút Thêm (+)." "Cho tất cả ngôn ngữ" "Ngôn ngữ khác…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 643f455fb..d877a9d61 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -52,7 +52,6 @@ %s(传统) %s (紧凑型) 无语言(字母表) - 字母表(QWERTY) "表情符号" "添加" 移除 @@ -68,11 +67,9 @@ 欢迎使用 %s 带有滑行输入 "开始" - "下一步" 设置 %s 启用 %s 请在“语言和输入法”设置中选中“%s”,授权该应用在您的设备上运行。 - 您已在“语言和输入法”中启用了 %s,因此这一步骤已完成。继续下一步吧! "在设置中启用" 切换到 %s 接下来,请选择“%s”作为您要使用的文本输入法。 @@ -82,21 +79,18 @@ 完成了 "显示应用图标" "在启动器中显示应用图标" - 附加词典 + 附加词典 词典可供下载 - 没有可供下载的词典 最后更新时间 "设置" "删除" 版本 %1$s - "添加" 添加到词典 "快捷键:" "语言:" 输入单词 可选快捷键 编辑单词 - 用户词典中没有任何单词。要添加单词,请点击添加(+)按钮。 对于所有语言 "更多语言…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -159,7 +153,6 @@ 浅色 沙滩 紫罗兰 - 加载将覆盖当前主题 工具栏 自定义货币 黑色 @@ -296,10 +289,8 @@ 靛蓝 功能键背景 %s (Probhat) - 凯塔格语 (%s) 凯塔格语 保存到文件 - 设置布局名称 确定要删除自定义布局 %s? 符号(阿拉伯语) 用户自定义 @@ -319,11 +310,9 @@ 添加一个单词 移除基础布局上已存在的弹出键 移除多余弹出 - 曼西语 (%s) %s (Student) 曼西语 符号 - 点击预览 为文本和背景选择颜色 键盘背景 按键文本 @@ -345,7 +334,6 @@ 在滑行输入过程中移动预览 快速输入冷却 未知库文件。是否确定是从可信来源获得并且是“%s”的? - 字母表(Bépo) 点击语言以打开设置 隐藏功能的描述 自动显示工具栏 @@ -393,7 +381,6 @@ %s(注音) 覆盖表情符号版本 达尔格瓦语 (Urakhi) - Urakhi (%s) 自动更正快捷方式 从文件设置自定义字体 如果未设置,将使用纵向图片 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index b62642447..f5718fc15 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -53,7 +53,6 @@ "%s (傳統)" "%s (精簡版)" "無語言" - "字母 (QWERTY)" "Emoji" "新增" "移除" @@ -69,11 +68,9 @@ "歡迎使用「%s」" "配備手勢輸入功能" "開始" - "下一步" "設定「%s」" "啟用「%s」" "請在「語言和輸入」設定中勾選「%s」。這將允許裝置執行此應用程式。" - "您已在「語言和輸入」設定中啟用「%s」。因此這個步驟已完成,請繼續執行下一個步驟!" "在設定中啟用" "切換至「%s」" "接著,請選取「%s」作為目前使用的文字輸入方法。" @@ -83,21 +80,18 @@ "完成" "顯示應用程式圖示" "在啟動器中顯示圖示" - "附加字典" + "附加字典" "可使用字典" - "沒有可用的字典" "上次更新日期" "設定" "刪除" "版本 %1$s" - "新增" "加入字典" "快速鍵:" "語言:" "輸入字詞" "自選快速鍵" "編輯字詞" - "您的用戶字典中沒有任何字詞。如要新增字詞,請輕按 [新增] (+) 按鈕。" "所有語言" "更多語言…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e677ba00b..d34d24ad8 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -52,7 +52,6 @@ "%s (傳統)" "%s (精簡)" "無語言" - "字母 (QWERTY)" "表情符號" "新增" "移除" @@ -68,11 +67,9 @@ "歡迎使用 %s" "含滑行輸入功能" "開始設定" - "下一步" "正在設定「%s」" "啟用「%s」" "請在 [語言與輸入設定] 中勾選 [%s],授權該應用程式在你的裝置上執行。" - "你已在 [語言與輸入設定] 中啟用 %s,因此這個步驟已經完成。請進行下一個步驟!" "在設定中啟用" "切換至「%s」" "接著,請選取「%s」做為目前使用的文字輸入法。" @@ -82,21 +79,18 @@ "完成" "顯示應用程式圖示" "在啟動器中顯示應用程式圖示" - "外掛字典" + "外掛字典" "可用的字典" - "沒有可用的字典" "上次更新時間:" "設定" "刪除" "版本 %1$s" - "新增" "加入字典" "快速鍵:" "語言:" "輸入字詞" "可選用的快速鍵" "編輯字詞" - "使用者字典中沒有任何字詞。如要新增字詞,請輕觸「新增」(+) 按鈕。" "所有語言" "更多語言…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values-zu/strings.xml b/app/src/main/res/values-zu/strings.xml index c35c889ca..03604b7b3 100644 --- a/app/src/main/res/values-zu/strings.xml +++ b/app/src/main/res/values-zu/strings.xml @@ -53,7 +53,6 @@ "Isi-%s (Tradition)" "%s (Okuqoqene ndawonye)" "Alikho ulimi" - "Alfabhethi (QWERTY)" "I-Emoji" "Engeza" "Khipha" @@ -69,11 +68,9 @@ "Siyakwamukela ku-%s" "nokuthayipha ngokuthinta" "Qalisa" - "Isinyathelo esilandelayo" "Kusethwa i-%s" "Nika amandla i-%s" "Sicela uhlole i-\"%s\" kulimi lwakho nezilungiselelo zokokufaka. Lokhu kuzoyigunyaza ukuthi isebenze kudivayisi yakho." - "I-%s isivele inikwe amandla kulimi lwakho nakuzilungiselelo zokufaka, ngakho-ke lesi sinyathelo senziwe. Qhubekela kwesilandelayo!" "Nika amandla kuzilungiselelo" "Shintshela ku-%s." "Okulandelayo, khetha i-\"%s\" njengendlela yakho yokufaka umbhalo osebenzayo." @@ -83,21 +80,18 @@ "Iqedile" "Bonisa isithonjana sohlelo lokusebenza" "Bonisa isithonjana sohlelo lokusebenza kusiqalisi" - "Izichazamazwi ezingezwayo" + "Izichazamazwi ezingezwayo" "Isichazamazwi siyatholakala" - "Azikho izachazimazwi ezitholakalayo" "Igcine ukulungiswa" "Izilungiselelo" "Susa" "Inguqulo engu-%1$s" - "Engeza" "Faka kusichazamazwi" "Isinqamulelo:" "Ulimi:" "Thayipha igama" "Ukunqamulela okukhethekayo" "Hlela igama" - "Awunawo amagama kwisichazamazwi somsebenzisi. Ukuze ungeze igama, thepha inkinobho (+)." "Okwazo zonke izilimi" "Izilimi eziningi…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c2d650675..4e500f6df 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -280,7 +280,7 @@ Replace period key popups with top level domains when typing URLs and email addresses Number row - Language + @string/subtype_locale Language (priority) Layout Symbols @@ -438,9 +438,7 @@ language, hence "No language". --> Cannot read file - Copy existing layout - - Set layout name + Really delete custom layout %s? @@ -529,16 +527,12 @@ language, hence "No language". --> with Gesture Typing Get started - - Next step "Setting up %s" "Enable %s" "Please check \"%s\" in your Languages & input settings. This will authorize it to run on your device." - - "%s is already enabled in your Languages & input settings, so this step is done. On to the next one!" Enable in Settings @@ -559,8 +553,8 @@ language, hence "No language". --> Show app icon Display application icon in the launcher - - Add-on dictionaries + + Add-on dictionaries Dictionaries @@ -595,25 +589,21 @@ New dictionary: "Error: Selected file is not a valid dictionary file" - "The selected file is for %1$s, but %2$s was expected. Still use it for %2$s?" + "Error: script not compatible with this keyboard" - "Still use" + "Error loading dictionary file" Dictionary available - - No dictionaries available Last updated Delete Version %1$s - - Add Add to dictionary @@ -628,8 +618,6 @@ New dictionary: Optional shortcut Edit word - - You don\'t have any words in the user dictionary. To add a word, tap the Add (+) button. For all languages @@ -703,14 +691,10 @@ New dictionary: Show more colors Show all colors - - Loading will overwrite the current theme This setting exposes all colors that are used internally. The list of colors may change at any time. The default color is random, and the names will not be translated. - - Click for preview - Select colors for text and backgrounds + Keyboard background @@ -752,7 +736,7 @@ New dictionary: Close - "Use system languages" + Tap the language to open settings From ed540466e9409cec0c8a4d959003552c7f1e5b6b Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 24 May 2025 16:04:56 +0200 Subject: [PATCH 157/175] remove the xliff tags from stings caused some issues with weblate, and meaning of %s is now in comment --- app/src/main/res/values-af/strings.xml | 26 +++---- app/src/main/res/values-am/strings.xml | 22 +++--- app/src/main/res/values-ar/strings.xml | 40 +++++----- app/src/main/res/values-az/strings.xml | 22 +++--- app/src/main/res/values-b+sr+Latn/strings.xml | 22 +++--- app/src/main/res/values-be/strings.xml | 36 ++++----- app/src/main/res/values-bg/strings.xml | 40 +++++----- app/src/main/res/values-bn/strings.xml | 40 +++++----- app/src/main/res/values-bs/strings.xml | 22 +++--- app/src/main/res/values-ca/strings.xml | 40 +++++----- app/src/main/res/values-cs/strings.xml | 40 +++++----- app/src/main/res/values-da/strings.xml | 30 ++++---- app/src/main/res/values-de/strings.xml | 40 +++++----- app/src/main/res/values-el/strings.xml | 26 +++---- app/src/main/res/values-en-rAU/strings.xml | 22 +++--- app/src/main/res/values-en-rCA/strings.xml | 22 +++--- app/src/main/res/values-en-rGB/strings.xml | 26 +++---- app/src/main/res/values-en-rIN/strings.xml | 22 +++--- app/src/main/res/values-en-rXC/strings.xml | 22 +++--- app/src/main/res/values-es-rUS/strings.xml | 36 ++++----- app/src/main/res/values-es/strings.xml | 40 +++++----- app/src/main/res/values-et/strings.xml | 40 +++++----- app/src/main/res/values-eu/strings.xml | 40 +++++----- app/src/main/res/values-fa/strings.xml | 26 +++---- app/src/main/res/values-fi/strings.xml | 24 +++--- app/src/main/res/values-fil/strings.xml | 4 +- app/src/main/res/values-fr-rCA/strings.xml | 22 +++--- app/src/main/res/values-fr/strings.xml | 40 +++++----- app/src/main/res/values-gl/strings.xml | 40 +++++----- app/src/main/res/values-gu/strings.xml | 22 +++--- app/src/main/res/values-hi/strings.xml | 22 +++--- app/src/main/res/values-hr/strings.xml | 26 +++---- app/src/main/res/values-hu/strings.xml | 30 ++++---- app/src/main/res/values-hy/strings.xml | 22 +++--- app/src/main/res/values-in/strings.xml | 40 +++++----- app/src/main/res/values-is/strings.xml | 38 +++++----- app/src/main/res/values-it/strings.xml | 40 +++++----- app/src/main/res/values-iw/strings.xml | 40 +++++----- app/src/main/res/values-ja/strings.xml | 22 +++--- app/src/main/res/values-ka/strings.xml | 26 +++---- app/src/main/res/values-kab/strings.xml | 2 +- app/src/main/res/values-kk/strings.xml | 22 +++--- app/src/main/res/values-km/strings.xml | 22 +++--- app/src/main/res/values-kn/strings.xml | 24 +++--- app/src/main/res/values-ko/strings.xml | 26 +++---- app/src/main/res/values-ky/strings.xml | 22 +++--- app/src/main/res/values-lo/strings.xml | 22 +++--- app/src/main/res/values-lt/strings.xml | 24 +++--- app/src/main/res/values-lv/strings.xml | 22 +++--- app/src/main/res/values-mk/strings.xml | 22 +++--- app/src/main/res/values-ml/strings.xml | 26 +++---- app/src/main/res/values-mn/strings.xml | 22 +++--- app/src/main/res/values-mr/strings.xml | 22 +++--- app/src/main/res/values-ms/strings.xml | 22 +++--- app/src/main/res/values-my/strings.xml | 22 +++--- app/src/main/res/values-nb/strings.xml | 34 ++++----- app/src/main/res/values-ne/strings.xml | 22 +++--- app/src/main/res/values-nl/strings.xml | 40 +++++----- app/src/main/res/values-pa/strings.xml | 22 +++--- app/src/main/res/values-pl/strings.xml | 40 +++++----- app/src/main/res/values-pt-rBR/strings.xml | 40 +++++----- app/src/main/res/values-pt-rPT/strings.xml | 28 +++---- app/src/main/res/values-pt/strings.xml | 26 +++---- app/src/main/res/values-ro/strings.xml | 40 +++++----- app/src/main/res/values-ru/strings.xml | 40 +++++----- app/src/main/res/values-si/strings.xml | 22 +++--- app/src/main/res/values-sk/strings.xml | 22 +++--- app/src/main/res/values-sl/strings.xml | 24 +++--- app/src/main/res/values-sq/strings.xml | 22 +++--- app/src/main/res/values-sr/strings.xml | 26 +++---- app/src/main/res/values-sv/strings.xml | 26 +++---- app/src/main/res/values-sw/strings.xml | 22 +++--- app/src/main/res/values-ta/strings.xml | 22 +++--- app/src/main/res/values-te/strings.xml | 22 +++--- app/src/main/res/values-th/strings.xml | 22 +++--- app/src/main/res/values-tl/strings.xml | 22 +++--- app/src/main/res/values-tr/strings.xml | 36 ++++----- app/src/main/res/values-uk/strings.xml | 38 +++++----- app/src/main/res/values-ur/strings.xml | 22 +++--- app/src/main/res/values-uz/strings.xml | 26 +++---- app/src/main/res/values-vi/strings.xml | 22 +++--- app/src/main/res/values-zh-rCN/strings.xml | 40 +++++----- app/src/main/res/values-zh-rHK/strings.xml | 24 +++--- app/src/main/res/values-zh-rTW/strings.xml | 22 +++--- app/src/main/res/values-zu/strings.xml | 22 +++--- app/src/main/res/values/strings.xml | 74 +++++++++---------- app/src/main/res/xml/method.xml | 2 +- 87 files changed, 1217 insertions(+), 1217 deletions(-) diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml index 014d12d2c..f63635025 100644 --- a/app/src/main/res/values-af/strings.xml +++ b/app/src/main/res/values-af/strings.xml @@ -16,7 +16,7 @@ "Aktiveer verdeelde sleutelbord" "Skakel oor na die ander invoermetodes" "Taal-wisselsleutel" - %sms + %sms "Stelsel se verstek" "Gebruik name van kontakte vir voorstelle en korreksies" "Gepersonaliseerde voorstelle" @@ -49,8 +49,8 @@ "Spaans (VS)" "Hinglish" "Serwies (Latyns)" - %s (Tradisioneel) - %s (Kompak) + %s (Tradisioneel) + %s (Kompak) "Geen taal nie" "Emosiekone" "Voeg by" @@ -64,18 +64,18 @@ "Emosiekone vir fisieke sleutelbord" "Fisieke Alt-sleutel wys die emosiekoon-palet" "Verstek" - Welkom by %s + Welkom by %s "met Gebaar-tik" "Kom aan die gang" - Stel %s op - Aktiveer %s - Gaan asseblief \"%s\" in jou Tale- en invoer-instellings na. Dit sal dit magtig om op jou toestel te werk. + Stel %s op + Aktiveer %s + Gaan asseblief \"%s\" in jou Tale- en invoer-instellings na. Dit sal dit magtig om op jou toestel te werk. "Aktiveer in instellings" - Skakel oor na %s - Volgende, kies \"%s\" as jou aktiewe teks-invoermetode. + Skakel oor na %s + Volgende, kies \"%s\" as jou aktiewe teks-invoermetode. "Wissel invoermetodes" "Veels geluk, jy\'s gereed!" - Nou kan jy in al jou gunsteling-programme tik met %s. + Nou kan jy in al jou gunsteling-programme tik met %s. "Klaar" "Wys program-ikoon" "Wys program-ikoon in die lanseerpoort" @@ -84,7 +84,7 @@ "Laas opgedateer" "Instellings" "Vee uit" - Weergawe %1$s + Weergawe %1$s "Voeg by woordeboek" "Kortpad:" "Taal:" @@ -98,7 +98,7 @@ Voorstelle Eksperimenteel Allerlei - %smin. + %smin. Geen beperking Aktiveer knipbord geskiedenis Indien gedeaktiveerd, sal knipbord sleutel plak as dit inhoud het @@ -115,7 +115,7 @@ Skrap met vee Emoji sleutel Doen \'n vee van die skrap sleutel om \'n groter seleksie van teks eenmaal te skrap - %s (Akkhor) + %s (Akkhor) Dwing incognito-modus Deaktiveer die leer van nuwe woorde Meer sleutels diff --git a/app/src/main/res/values-am/strings.xml b/app/src/main/res/values-am/strings.xml index 7cad63b57..5953a6151 100644 --- a/app/src/main/res/values-am/strings.xml +++ b/app/src/main/res/values-am/strings.xml @@ -16,7 +16,7 @@ "የተከፈለ ቁልፍ ሰሌዳ አንቃ" "ወደ ሌሎች የግቤት ስልቶች ቀይር" "የቋንቋ መቀየሪያ ቁልፍ" - "%sሚሊሰከንድ" + "%sሚሊሰከንድ" "የስርዓት ነባሪ" "ከዕውቂያዎች ለጥቆማዎች እና ማስተካከያዎች ስሞች ተጠቀም" "ግላዊ የጥቆማ አስተያየቶች" @@ -49,8 +49,8 @@ "ስፓኒሽኛ (ዩኤስ)" "ሂንግሊሽ" "ሰርብያኛ (ላቲን)" - "%s (ተለምዷዊ)" - "%s (እስግ)" + "%s (ተለምዷዊ)" + "%s (እስግ)" "ምንም ቋንቋ" "ኢሞጂ" "አክል" @@ -64,18 +64,18 @@ "ስሜት ገላጭ ምስሎች ለአካላዊ ቁልፍ ሰሌዳ" "አካላዊ Alt ቁልፍ የስሜት ገላጭ ቤተ-ስዕልን ያሳያል" "ነባሪ" - "እንኳን ወደ %s በደህና መጡ" + "እንኳን ወደ %s በደህና መጡ" "በጣት ምልክት መተየብ" "ጀምር" - %sን በማዋቀር ላይ\" - %sን ያንቁ\" - እባክዎ %s»ን በእርስዎ የቋንቋ እና ግቤት ቅንብሮች ውስጥ መኖሩን ያረጋግጡት። ይሄ እሱ በመሣሪያዎ ላይ እንዲሄድ ይፈቅድለታል።\" + %sን በማዋቀር ላይ\" + %sን ያንቁ\" + እባክዎ %s»ን በእርስዎ የቋንቋ እና ግቤት ቅንብሮች ውስጥ መኖሩን ያረጋግጡት። ይሄ እሱ በመሣሪያዎ ላይ እንዲሄድ ይፈቅድለታል።\" "በቅንብሮች ውስጥ ያንቁ" - "ወደ %s ይቀይሩ" - በመቀጠል %s»ን እንደ የጽሑፍ ግቤት ስልትዎ ይምረጡት።\" + "ወደ %s ይቀይሩ" + በመቀጠል %s»ን እንደ የጽሑፍ ግቤት ስልትዎ ይምረጡት።\" "የግቤት ስልቶችን ቀያይር" "እንኳን ደስ አለዎት፣ በቃ ጨርሰዋል!" - "አሁን በሁሉም ተወዳጅ መተግበሪያዎችዎ ላይ በ%s መተየብ ይችላሉ።" + "አሁን በሁሉም ተወዳጅ መተግበሪያዎችዎ ላይ በ%s መተየብ ይችላሉ።" "ጨርሷል" "የመተግበሪያ አዶ አሳይ" "የመተግበሪያ አዶውን በማስጀመሪያው ውስጥ አሳይ" @@ -84,7 +84,7 @@ "ለመጨረሻ ጊዜ የተዘመነው" "ቅንብሮች" "ሰርዝ" - "ሥሪት %1$s" + "ሥሪት %1$s" "ወደ መዝገበ-ቃላት አክል" "አቋራጭ፦" "ቋንቋ፦" diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 8ba681553..0163df4c4 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -16,7 +16,7 @@ فعّل تقسيم لوحة المفاتيح "التبديل إلى أسلوب إدخال آخر" "مفتاح تبديل اللغة" - %s ملي ثانية + %s ملي ثانية "الضبط التلقائي للنظام" "استخدام الأسماء من جهات الاتصال للاقتراحات والتصحيحات" "اقتراحات مخصصة" @@ -49,8 +49,8 @@ "الإسبانية (الأميركية)" "هنجليزية" "الصربية (اللاتينية)" - %s (التقليدية) - %s (مضغوط) + %s (التقليدية) + %s (مضغوط) "بدون لغة" "الرموز التعبيرية" أضف @@ -64,18 +64,18 @@ "الرموز التعبيرية للوحة مفاتيح فعلية" "‏مفتاح Alt الفعلي يعرض لوحة الرموز التعبيرية" "التلقائية" - مرحبًا بكم في %s + مرحبًا بكم في %s مع الكتابة بالإيماءة "بدء الاستخدام" - قيد الإعداد %s - مكِّن %s - يُرجى التحقق من \"%s\" في إعدادات الإدخال واللغات. سيؤدي ذلك إلى تمكين لوحة المفاتيح على جهازك. + قيد الإعداد %s + مكِّن %s + يُرجى التحقق من \"%s\" في إعدادات الإدخال واللغات. سيؤدي ذلك إلى تمكين لوحة المفاتيح على جهازك. "تفعيل في الإعدادات" - بدّل إلى %s - بعد ذلك، اختر \"%s” كطريقة إدخال النص النشط. + بدّل إلى %s + بعد ذلك، اختر \"%s” كطريقة إدخال النص النشط. "تبديل أساليب الإدخال" تهانينا ، لقد انتهيت من الإعداد! - الآن أصبح بإمكانك الكتابة في جميع تطبيقاتك المفضلة باستخدام %s. + الآن أصبح بإمكانك الكتابة في جميع تطبيقاتك المفضلة باستخدام %s. "إنهاء العملية" اعرض رمز التطبيق اعرض رمز التطبيق في المشغل @@ -84,7 +84,7 @@ "تاريخ آخر تحديث" "إعدادات" "حذف" - الإصدار %1$s + الإصدار %1$s أضف إلى القاموس "الاختصار:" "اللغة:" @@ -125,11 +125,11 @@ "اختيار أسلوب الإدخال" أظهِر تلميحات المفاتيح عند الضغط لفترة طويلة سيقوم الضغط المطول على مفتاح المسافة بإظهار قائمة اختيار أساليب الإدخال - %s (أخور) + %s (أخور) ضع مسافةً بعد علامات الترقيم تلقائيًا أدرج مسافةً تلقائيًا بعد علامة الترقيم عند كتابة كلمة جديدة افرض وضع التخفي - %s min + %s min ثقة التصحيح التلقائي "تراجع" "إعادة" @@ -260,7 +260,7 @@ أظهِر تلميحات إذا كان الضغط لفترة طويلة على المفتاح يؤدي إلى تشغيل وظائف إضافية تعيين الصورة لوضع النهار أو الليل؟ صباح - %s (Sebeolsik Final) + %s (Sebeolsik Final) حدد ملفًا بتنسيق متوافق. المعلومات حول التنسيقات متاحة %s. انسخ التخطيط الموجود هل تريد حقًا حذف التخطيط المخصص %s؟ @@ -303,17 +303,17 @@ تفضيل المحلية على الأرقام اللاتينية حدد الألوان للنص والخلفيات "بدون قاموس، ستحصل فقط على اقتراحات للنص الذي أدخلته من قبل.<br>\n يمكنك تنزيل القواميس %1$s، أو التحقق مما إذا كان يمكن تنزيل قاموس لـ \"%2$s\" مباشرةً %3$s." - %s (Probhat) - %s (Sebeolsik 390) + %s (Probhat) + %s (Sebeolsik 390) اختر ترتيب المفاتيح المنبثقه اضغط لفترة طويلة على مفتاح الرموز للوحة الرقمية قصّ - %s (طالب) + %s (طالب) استخدم دائمًا الاقتراح الأوسط عند الضغط على مسافة أو علامات الترقيم، سيتم إدخال الاقتراح الأوسط إغلاق تاريخ الحافظة حدد مفاتيح شريط أدوات الحافظة - %s (Extended) + %s (Extended) مانسي أظهِر المزيد من الالوان يعرض هذا الإعداد كافة الألوان المستخدمة داخليًا. قد تتغير قائمة الألوان في أي وقت. اللون الافتراضي عشوائي، ولن تتم ترجمة الأسماء. @@ -386,7 +386,7 @@ قد يتم توسيع الاختصارات عند تمكينها بواسطة التصحيح التلقائي تعيين خط مخصص من الملف الاهتزاز في وضع عدم الازعاج - %s (صوتي) + %s (صوتي) هل تريد إعادة تعيين جميع الأيقونات المخصصة؟ تجاوز إصدار الرموز التعبيرية تعيين صورة الخلفية (أفقي) @@ -413,7 +413,7 @@ يمكنك العثور على المخططات ومشاركتها في %s. قسم المناقشة نوع فرعي مخصّص - %s (Baishakhi) + %s (Baishakhi) أظهِر مفاتيح TLD المنبثقة استبدل مفتاح الفترة المنبثقة مع مجالات المستوى الأعلى عند كتابة عناوين URL وعناوين البريد الإلكتروني الضغط على إدخال أو مساحة بعد مفاتيح أخرى في لوحة الأرقام diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index f91d5befe..ee4d4a5ef 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -16,7 +16,7 @@ "Klaviaturanı ayırmağa icazə verin" "Digər daxiletmə metodlarına keçin" "Dil keçidi düyməsi" - "%s millisaniyə" + "%s millisaniyə" "Sistem defoltu" "Təklif və korreksiya üçün Kontaktlardakı adlardan istifadə edin" "Fərdiləşmiş təkliflər" @@ -49,8 +49,8 @@ "İspan (ABŞ)" "Hingilis" "Serb (Latın)" - "%s (Ənənəvi)" - "%s (Kompakt)" + "%s (Ənənəvi)" + "%s (Kompakt)" "Dil yoxdur" "Emoji" "Əlavə et" @@ -64,18 +64,18 @@ "Fiziki klaviatura üçün emoji" "Fiziki ALt düyməsi emoji palletini göstərir" "Defolt" - %s təbiqinə xoş gəlmisiniz\" + %s təbiqinə xoş gəlmisiniz\" "Jest Yazısı ilə" "Başlayın" - %s quraşdırılır\" - %s tətbiqini aktivləşdir\" - "Lütfən, \"%s\" tətbiqini Dillər və daxiletmə ayarlarında yoxlayın. Bununla tətbiqin cihazınızda işləməsinə icazə veriləcək." + %s quraşdırılır\" + %s tətbiqini aktivləşdir\" + "Lütfən, \"%s\" tətbiqini Dillər və daxiletmə ayarlarında yoxlayın. Bununla tətbiqin cihazınızda işləməsinə icazə veriləcək." "Parametrlərdə aktivləşdir" - %s tətbiqinə keçin\" - "Sonra, \"%s\" tətbiqini aktiv mətn-daxiletmə metodu olaraq seçin." + %s tətbiqinə keçin\" + "Sonra, \"%s\" tətbiqini aktiv mətn-daxiletmə metodu olaraq seçin." "Daxil metodlarına keç" "Təbrik edirik, tam hazırsınız!" - "İndi siz %s ilə bütün sevimli tətbiqlərinizdə yaza bilərsiniz." + "İndi siz %s ilə bütün sevimli tətbiqlərinizdə yaza bilərsiniz." "Sona çatdı" "Tətbiq ikonasını göstər" "Başlatma panelində tətbiq ikonasını göstər" @@ -84,7 +84,7 @@ "Son yeniləmə" "Ayarlar" "Sil" - "%1$s nömrəli versiya" + "%1$s nömrəli versiya" "Lüğətə əlavə edin" "Qısayol:" "Dil:" diff --git a/app/src/main/res/values-b+sr+Latn/strings.xml b/app/src/main/res/values-b+sr+Latn/strings.xml index 72e752066..9278bc669 100644 --- a/app/src/main/res/values-b+sr+Latn/strings.xml +++ b/app/src/main/res/values-b+sr+Latn/strings.xml @@ -16,7 +16,7 @@ "Omogući podeljenu tastaturu" "Prebaci na druge metode unosa" "Taster za prebacivanje jezika" - "%s ms" + "%s ms" "Podrazumevano" "Koristi imena iz Kontakata za predloge i ispravke" "Personalizovani predlozi" @@ -49,8 +49,8 @@ "španski (SAD)" "hengleski" "srpski (latinica)" - "%s (tradicionalni)" - "%s (kompaktna)" + "%s (tradicionalni)" + "%s (kompaktna)" "Nema jezika" "Emotikoni" "Dodaj" @@ -64,18 +64,18 @@ "Emodži za fizičku tastaturu" "Fizički taster Alt pokazuje paletu emodžija" "Podrazumevano" - "Dobro došli u %s" + "Dobro došli u %s" "pomoću Kucanja pokretima" "Započnimo" - "Podešavanje aplikacije %s" - "Omogućite aplikaciju %s" - Potvrdite aplikaciju %s“ u Podešavanjima jezika i unosa. Tako joj odobravate pokretanje na uređaju.\" + "Podešavanje aplikacije %s" + "Omogućite aplikaciju %s" + Potvrdite aplikaciju %s“ u Podešavanjima jezika i unosa. Tako joj odobravate pokretanje na uređaju.\" "Omogući u Podešavanjima" - "Prebacite na %s" - Zatim izaberite %s“ kao aktivni metod unosa teksta.\" + "Prebacite na %s" + Zatim izaberite %s“ kao aktivni metod unosa teksta.\" "Prebaci metode unosa" "Čestitamo, sve je spremno!" - "Sada možete da kucate u svim omiljenim aplikacijama pomoću %s." + "Sada možete da kucate u svim omiljenim aplikacijama pomoću %s." "Završeno" "Prikaži ikonu aplikacije" "Ikona aplikacije se prikazuje u pokretaču" @@ -84,7 +84,7 @@ "Poslednje ažuriranje" "Podešavanja" "Izbriši" - "Verzija %1$s" + "Verzija %1$s" "Dodavanje u rečnik" "Prečica:" "Jezik:" diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 12492d6db..0af4e4d33 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -17,7 +17,7 @@ Ўключыць раздзеленую клавіятуру Змена метадаў ўводу Клавіша змены мовы - %s мс. + %s мс. "Стандартныя сістэмныя" Падказваць выпраўленні на аснове імёнаў са спісу кантактаў "Персанальныя прапановы" @@ -50,8 +50,8 @@ "Іспанская (ЗША)" хінгліш сербская (Лацініца) - %s (Традыцыйная) - %s (Кампактная) + %s (Традыцыйная) + %s (Кампактная) стандартная "Эмодзі" "Дадаць" @@ -65,18 +65,18 @@ "Эмодзі для фізічнай клавіятуры" "Фізічная клавіша Alt паказвае ўсе даступныя эмодзі" "Па змаўчанні" - Вітаем ў %s + Вітаем ў %s з ўводам жэстамі Пачаць працу - Наладка %s - Ўключыць %s - Праверце праграму \"%s\" ў сваіх наладах «Мова і ўвод». Гэта дазволіць ёй працаваць на вашай прыладзе. + Наладка %s + Ўключыць %s + Праверце праграму \"%s\" ў сваіх наладах «Мова і ўвод». Гэта дазволіць ёй працаваць на вашай прыладзе. Ўключыць ў наладах - Пераключыцца на %s - Выберыце «%s» бягучым метадам ўводу. + Пераключыцца на %s + Выберыце «%s» бягучым метадам ўводу. Змена спосабаў ўводу Ўсё гатова! - Цяпер вы можаце пісаць ва ўсіх вашых любімых праграмах з дапамогай %s. + Цяпер вы можаце пісаць ва ўсіх вашых любімых праграмах з дапамогай %s. "Гатова" "Паказаць значок прыкладання" Паказаць значок праграмы ў панэлi запуску @@ -85,7 +85,7 @@ "Апошняе абнаўленне" "Налады" "Выдаліць" - Версія %1$s + Версія %1$s Дадаць ў слоўнік "Гарачая клавіша:" "Мова:" @@ -101,7 +101,7 @@ Эксперыментальныя Рознае Без абмежаванняў - %s хв. + %s хв. Налады праверкі правапісу HeliBoard Клавіша эмодзі Налады HeliBoard @@ -153,7 +153,7 @@ Паказаць функцыі, якія могуць застацца незаўважанымі Заўсёды паказваць лічбавы радок Выдаліць свайпам - %s (Акхор) + %s (Акхор) Павялічаныя клавішы Шкала вышыні клавіятуры Выяўленне URL-адрасу @@ -228,9 +228,9 @@ Раскладка Лакалізаваць лікавы радок Выкарыстоўваць асабісты слоўнік прылады для захоўвання вывучаных слоў - %s (Прабгат) - %s (Себяольсік 390) - %s (Себяольсік фінальная) + %s (Прабгат) + %s (Себяольсік 390) + %s (Себяольсік фінальная) Выдаліць карыстальніцкі слоўнік «%s»? Шэраг з лічбамі Выберыце парадак ўсплывальных клавіш @@ -301,7 +301,7 @@ Дадаць слоўнік з файла Вага: Пошук - %s (Студэнцкая) + %s (Студэнцкая) Заўсёды пачынаць неадкладна Хаваць панэль інструментаў пры з\'яўленні прапаноў Замацоўваць клавішы панэлі інструментаў пры працяглым націску @@ -317,7 +317,7 @@ Пры націску кропкі або пунктуацыі будзе выкарыстана сярэдняя прапанова Гэта адключыць астатнія функцыі клавіш панэлі інструментаў пры працяглым націску Закрыць буфер абмену - %s (Пашыраная) + %s (Пашыраная) Эмодзі Выбраць замацаваныя клавішы панэлі інструментаў Панэль інструментаў diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index b11c394c6..46e25e82f 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -16,7 +16,7 @@ "Активиране на разделената клавиатура" Превключване към други методи на въвеждане "Клавиш за превкл. на езика" - "%s милисек" + "%s милисек" "Станд. за системата" "Използване на имена от „Контакти“ за предложения и поправки" "Персонализ. предложения" @@ -49,8 +49,8 @@ "испански (САЩ)" "Хинглиш" "Сръбска (латиница)" - "%s (традиционна клавиатура)" - "%s (компактна)" + "%s (традиционна клавиатура)" + "%s (компактна)" "Без език" "Емотикони" "Добавяне" @@ -64,18 +64,18 @@ "Емотикони за физическа клавиатура" "При натискане на клавиша „Alt“ се показва панелът за емотикони" "Стандартно" - "Добре дошли в/ъв %s" + "Добре дошли в/ъв %s" "с въвеждане чрез жест" "Първи стъпки" - "Настройване на %s" - "Активирайте %s" - Моля, проверете \\%s\" на вашите Езици & входни настройки. Това ще го разреши да работи на вашето устройство. + "Настройване на %s" + "Активирайте %s" + Моля, проверете \\%s\" на вашите Езици & входни настройки. Това ще го разреши да работи на вашето устройство. "Активиране в настройките" - "Превключете към %s" - След това изберете \"%s\" като активен метод за въвеждане на текст. + "Превключете към %s" + След това изберете \"%s\" като активен метод за въвеждане на текст. "Превключване на методите на въвеждане" "Поздравления! Вече сте готови!" - Вече можете да пишете във всичките си любими приложения с %s. + Вече можете да пишете във всичките си любими приложения с %s. Завършено Показване на иконата на приложението "Показване на иконата на приложението в стартовия панел" @@ -84,7 +84,7 @@ Последна актуализация "Настройки" "Изтриване" - "Версия %1$s" + "Версия %1$s" "Добавяне в речника" "Пряк път:" "Език:" @@ -364,14 +364,14 @@ Пространство (оформление с числа) Пясък Изтриване - %s (Пробхат) - %s мин - %s (Себолсик 390) + %s (Пробхат) + %s мин + %s (Себолсик 390) Кайтагски - %s (Разширено) - %s (Студент) - %s (Себолсик Финална) - %s (Akkhor) + %s (Разширено) + %s (Студент) + %s (Себолсик Финална) + %s (Akkhor) ► Продължителното натискане на фиксирани клавиши на лентата с инструменти води до допълнителна функционалност: <br> \n\t• клипборд &#65515; паста <br> \n\t• движение наляво/надясно &#65515; дума ляво/дясно <br> @@ -412,7 +412,7 @@ Кошче Наистина ли нулирате всички персонализирани икони? Вибриране в режим „Не ме безпокойте“ - %s (Фонетичен) + %s (Фонетичен) Замяна на версията на емотиконите Даргва (Уракски) Преки пътища за автоматично коригиране @@ -441,7 +441,7 @@ раздел за обсъждане Можете да намирате и споделяте цветове в %s. Персонализиран подтип - %s (Байсахи) + %s (Байсахи) Показване на TLD изскачащи клавиши Заместване на изскачащите прозорци с клавиши за период с домейни от първо ниво при въвеждане на URL и имейл адреси Натискане на въвеждане или интервал след други клавиши в цифровата клавиатура diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index f91b5ccd3..b30b48fcc 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -29,8 +29,8 @@ উভয় পরিবর্তন ভাষা পরিবর্তন বোতাম ইমোজি বোতাম - %s মিলিসেকেন্ড - %s মিনিট + %s মিলিসেকেন্ড + %s মিনিট সিস্টেম ডিফল্ট সীমাহীন পরামর্শ ও সংশোধনীর জন্য পরিচিতি থেকে নাম ব্যবহার @@ -98,13 +98,13 @@ ডিভাইস সুরক্ষিত স্টোরেজ ► পিন করে রাখা টুলবার বোতামে দীর্ঘ চাপ দিলে তা অতিরিক্ত কাজ করবে: <br> \n\t• ক্লিপবোর্ড &#65515; পেস্ট <br> \n\t• বামে/ডানে স্থানান্তর &#65515; সম্পূর্ণ বামে/ডানে স্থানান্তর <br> \n\t• উপরে/নিচে স্থানান্তর &#65515; পৃষ্ঠার উপরে/নিচে <br> \n\t• শব্দের ডানে/বামে &#65515; লাইনের শুরু/শেষ <br> \n\t• পাতার উপরে/নিচে &#65515; পাতার শুরু/শেষ <br> \n\t• অনুলিপি &#65515; কর্তন <br> \n\t• শব্দ নির্বাচন &#8596; সমস্ত নির্বাচন <br> \n\t• পূর্বাবস্থা &#8596; পুনরাবৃত্তি <br> <br> \n► পরামর্শ ফলকের টুলবারের কোনো বোতামে দীর্ঘ চাপ দিলে তা পরামর্শ ফলকে আবদ্ধ হবে। <br> <br> \n► কমা বোতামে দীর্ঘ চাপ দিলে ক্লিপবোর্ড দর্শন, ইমোজি দর্শন, একক হাত মোড, সেটিংস অথবা ভাষা পরিবর্তন বোতাম উপলব্ধ হবে:<br> \n\t• সংশ্লিষ্ট বোতাম সক্ষম থাকলে ইমোজি দর্শন বা ভাষা পরিবর্তন বোতাম দৃশ্যমান থাকবে না; <br> \n\t• কিছু লেআউটের জন্য কমা বোতাম নয়, কিন্তু একই জায়গার বোতামটি, যেমন: Dvorak লেআউটে \'q\' বোতাম। <br> <br> \n► ছদ্মবেশী মোড সক্রিয় থাকলে শব্দ শিখন বন্ধ থাকবে, এবং সাম্প্রতিকে কোনো ইমোজি যুক্ত হবে না। <br> <br> \n► ছদ্মবেশী বোতামে চাপ দিলে টুলবার উপলব্ধ হবে। <br> <br> \n► স্লাইডিং কি ইনপুট: বড়ো হাতের অক্ষর লেখার জন্য শিফট বোতাম থেকে অন্য বোতামে অভিস্পর্শ করুন: <br> \n\t• সিম্বল কিবোর্ড থেকে সিম্বল এবং সম্পর্কিত অক্ষর লেখার জন্য \'?123\' বোতামেও এটি কাজ করে।<br> <br> \n► শিফট অথবা প্রতীক বোতাম চেপে ধরে এক বা একাধিক বোতাম চাপার পর শিফট অথবা প্রতীক বোতাম ছেড়ে দিলে তা পূর্ববর্তী কিবোর্ডে নিয়ে যাবে। <br> <br> \n► পরামর্শ ফলকে কোনো পরামর্শে দীর্ঘ চাপ দিলে আরও পরামর্শ, বিলোপ করার জন্য অপসারণ বোতাম প্রদর্শিত হবে। <br> <br> \n► আরও পরামর্শ খুলতে কোনো পরামর্শ থেকে উপরে অভিস্পর্শ করুন এবং নির্দিষ্ট পরামর্শ নির্বাচনের জন্য ছেড়ে দিন। <br> <br> \n► ক্লিপবোর্ড ইতিহাসে কোনো অন্তর্ভুক্তিতে দীর্ঘ চাপ দিয়ে তা পিন করা যাবে (আনপিন না করা পর্যন্ত তা ক্লিপবোর্ডে থাকবে) \n► ক্লিপবোর্ড দর্শনে বাম পাশে অভিস্পর্শ করলে অন্তর্ভুক্তি অপসারণ হবে (যদি না সেটি পিন করা থাকে)। <br> <br> \n► লেখা সিলেক্ট করে শিফট চাপলে তা বড়ো হাতের অক্ষর, ছোটো হাতের অক্ষর এবং সব অক্ষর বড়ো হাতের হবে। <br> <br> \n► আপনি ফাইল এক্সপ্লোরারে খোলার মাধ্যমে অভিধান সংযুক্ত করতে পারেন: <br> \n\t• এটি কেবল <i>content-uris</i> এর সাথে কাজ করে, <i>file-uris</i> এর সাথে নয়। অর্থাৎ কিছু ফাইল এক্সপ্লোরারের সাথে নাও কাজ করতে পারে। <br> <br> \n► রুট উপলব্ধতাসহ ম্যানুয়াল ব্যাকআপ করা ব্যবহারকারীদের জন্য: <br> \nঅ্যান্ড্রয়েড ৭ থেকে শেয়ারড্ প্রেফারেন্স ফাইল ডিফল্ট জায়গা নয়। কারণ অ্যাপ %s ব্যবহার করছে। ডিভাইস আনলকের আগে সেটিংস খোলার জন্য এটি প্রয়োজনীয়, যেমন: বুট করার সময়। <br> \nফাইলটি /data/user_de/0/package_id/shared_prefs/ থাকে। যদিও এটা ডিভাইস এবং অ্যান্ড্রয়েড সংস্করণের উপরে নির্ভর করে। <br> <br> \n<i><b>কেবল ডিবাগ এপিকে</b></i> <br> <br> \n► পরামর্শে দীর্ঘ চাপ দিলে তার উৎস-অভিধান দেখাবে। <br> <br> \n► ডিবাগ সেটিংস উচ্চতর সেটিংসে উপলব্ধ। যদিও লগ ফাইলে অভিধান অবমুক্ত করা ছাড়া এর ব্যবহারযোগ্যতা সীমিত। <br> \n\t• রিলিজ এপিকে এর জন্য <i>সম্পর্কে</i> এর সংস্করণে কয়েকবার চাপ দিতে হবে। তাহলে <i>উচ্চতর</i>-এ ডিবাগ সেটিংস উপলব্ধ হবে। <br> \n\t• <i>পরামর্শ তথ্য প্রদর্শন</i> চালু করলে পরামর্শের উপরে কিছু ছোটো নম্বর থাকবে যা অভ্যন্তরীণ হিসাব ও উৎস অভিধান নির্দেশ করে। <br> <br> \n► অ্যাপ্লিকেশন ক্র্যাশের পরে সেটিংস খুললে আপনি ক্র্যাশ লগ চান কি না তা জিজ্ঞেস করা হবে৷ <br> <br> \n► বহুভাষী টাইপিং ব্যবহারের সময় স্পেসবার বর্তমান ভাষা নির্ধারণের জন্য একটি দৃঢ়তা মান দেখাবে। <br> <br> \n► পরামর্শের উপরে কিছু ছোটো নম্বর থাকবে যা অভ্যন্তরীণ হিসাব ও উৎস অভিধান নির্দেশ করে (নিষ্ক্রিয় করা যেতে পারে)। সার্বিয়ান (ল্যাটিন) - %s (প্রথাগত) - %s (অক্ষর) - %s (প্রভাত) - %s (বৈশাখী) - %s (সংক্ষিপ্ত) - %s (সেবালসিক ৩৯০) - %s (সেবালসিক চূড়ান্ত) + %s (প্রথাগত) + %s (অক্ষর) + %s (প্রভাত) + %s (বৈশাখী) + %s (সংক্ষিপ্ত) + %s (সেবালসিক ৩৯০) + %s (সেবালসিক চূড়ান্ত) ভাষাহীন ইমোজি সংযুক্ত করুন @@ -118,18 +118,18 @@ ভৌত কিবোর্ডের জন্য ইমোজি ভৌত Alt বোতামে ইমোজি প্যালেট প্রদর্শন ডিফল্ট - %s এ স্বাগত + %s এ স্বাগত অঙ্গুলিহেলন টাইপিংয়ের সাথে শুরু করা যাক - %s সন্নিবেশিত হচ্ছে - %s সক্ষম করুন - ভাষা ও ইনপুট সেটিংসে \"%s\" সক্রিয় করুন। ফলে এটি আপনার ডিভাইসে চলার অনুমোদন পাবে। + %s সন্নিবেশিত হচ্ছে + %s সক্ষম করুন + ভাষা ও ইনপুট সেটিংসে \"%s\" সক্রিয় করুন। ফলে এটি আপনার ডিভাইসে চলার অনুমোদন পাবে। সেটিংসে সক্ষম করুন - %s এ পরিবর্তন করুন - এখন সক্রিয় লিখন-ইনপুট পদ্ধতি হিসেবে \"%s\" বেছে নিন। + %s এ পরিবর্তন করুন + এখন সক্রিয় লিখন-ইনপুট পদ্ধতি হিসেবে \"%s\" বেছে নিন। ইনপুট পদ্ধতি পরিবর্তন "অভিনন্দন, আপনি পুরোপুরি প্রস্তুত!" - এখন %s দিয়ে আপনার সব পছন্দের অ্যাপে লিখতে পারবেন। + এখন %s দিয়ে আপনার সব পছন্দের অ্যাপে লিখতে পারবেন। কিবোর্ড সংস্থাপন সম্পন্ন অ্যাপ আইকন প্রদর্শন @@ -155,7 +155,7 @@ সর্বশেষ আপডেট সেটিংস বিলোপ করুন - সংস্করণ %1$s + সংস্করণ %1$s অভিধানে যোগ শর্টকাট: ভাষা: @@ -302,7 +302,7 @@ টুলবারের পরিবর্তনশীল দিক ডান থেকে বাম কিবোর্ড নির্বাচন করলে দিক বিপরীত হবে ভাষা পরিবর্তন অভিস্পর্শের দূরত্ব - %s (শিক্ষার্থী) + %s (শিক্ষার্থী) ভাষা পরিবর্তন বোতামের আচরণ পিন করে রাখা টুলবার বোতাম নির্বাচন টুলবার বোতামে দীর্ঘ চাপ পিন করবে @@ -313,7 +313,7 @@ স্বয়ংক্রিয় টুলবার প্রদর্শন ক্লিপবোর্ড ইতিহাস বন্ধকরণ ক্লিপবোর্ড টুলবার বোতাম নির্বাচন - %s (বর্ধিত) + %s (বর্ধিত) ইমোজি টুলবার সর্বদা মধ্যবর্তী পরামর্শ ব্যবহার করবে @@ -378,7 +378,7 @@ বিলোপাধার নিজস্বীকৃত আইকন পুনঃসংস্থাপন করতে নিশ্চিত? বিরক্ত করবেন না মোডে কম্পন - %s (ফোনেটিক) + %s (ফোনেটিক) ইমোজি সংস্করণ অগ্রাহ্যকরণ দারগয়া (উরাখি) স্বতঃসংশোধন শর্টকাট diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index ae6ae8836..e5a022ba4 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -18,7 +18,7 @@ "Omogući podijeljenu tastaturu" "Prebacite na druge načine unosa" "Tipka za zamjenu jezika" - "%sms" + "%sms" "Sistemski zadano" "Za prijedloge i ispravke koristi imena iz Kontakata" "Prilagođeni prijedlozi" @@ -51,8 +51,8 @@ "španski (SAD)" "Hindu engleski" "Srpski (latinica)" - "%s (tradicionalan)" - "%s (kompaktan)" + "%s (tradicionalan)" + "%s (kompaktan)" "Nema jezika" "Emoji" "Dodaj" @@ -66,18 +66,18 @@ "Emoji za fizičku tastaturu" "Tipka Alt na fizičkoj tastaturi aktivira paletu za emoji" "Zadano" - "Dobro došli u aplikaciju %s" + "Dobro došli u aplikaciju %s" "s Pisanjem pokretima" "Započnite" - "Postavljanje aplikacije %s" - "Omogući aplikaciju %s" - "Označite aplikaciju \"%s\" u postavkama odjeljka Jezici i unos. Na taj način ćete joj dozvoliti da se pokrene na vašem uređaju." + "Postavljanje aplikacije %s" + "Omogući aplikaciju %s" + "Označite aplikaciju \"%s\" u postavkama odjeljka Jezici i unos. Na taj način ćete joj dozvoliti da se pokrene na vašem uređaju." "Omogući u Postavkama" - "Prebacite se na aplikaciju %s" - "Zatim odaberite aplikaciju \"%s\" kao vaš aktivni način unosa teksta." + "Prebacite se na aplikaciju %s" + "Zatim odaberite aplikaciju \"%s\" kao vaš aktivni način unosa teksta." "Zamijeni načine unosa" "Odlično, sve je spremno!" - "Sada možete upisivati u svim omiljenim aplikacijama pomoću aplikacije %s." + "Sada možete upisivati u svim omiljenim aplikacijama pomoću aplikacije %s." "Završeno" "Prikaži ikonu aplikacije" "Prikazivanje ikone aplikacije na pokretaču" @@ -86,7 +86,7 @@ "Posljednji put ažurirano" "Postavke" "Izbriši" - "Verzija %1$s" + "Verzija %1$s" "Dodaj u rječnik" "Prečica:" "Jezik:" diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 9067880bc..639d04b00 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -16,7 +16,7 @@ Activa el teclat dividit "Altres mètodes d\'introducció" "Tecla de canvi d\'idioma" - %s ms + %s ms "Predeterminat" "Utilitza els noms de contactes per fer suggeriments i correccions" "Suggeriments personalitzats" @@ -49,8 +49,8 @@ "Espanyol (EUA)" Hinglish "Serbi (llatí)" - %s (Tradicional) - %s (Compacte) + %s (Tradicional) + %s (Compacte) Cap idioma Emojis "Afegeix" @@ -64,18 +64,18 @@ Emojis amb el teclat físic Amb la tecla Alt del teclat físic es mostra la paleta d\'emojis "Predeterminat" - Us donem la benvinguda a %s + Us donem la benvinguda a %s amb escriptura gestual "Comença" - S\'està configurant %s - Habilitar %s - Comproveu «%s» a la configuració d\'idiomes i entrada. Això li permetrà executar-se al vostre dispositiu. + S\'està configurant %s + Habilitar %s + Comproveu «%s» a la configuració d\'idiomes i entrada. Això li permetrà executar-se al vostre dispositiu. Habilita a la configuració - Canviar a %s - A continuació, seleccioneu «%s» com a mètode d\'entrada de text actiu. + Canviar a %s + A continuació, seleccioneu «%s» com a mètode d\'entrada de text actiu. Canvia els mètodes d\'entrada "Enhorabona, ja has acabat!" - Ara ja podeu escriure en totes les vostres aplicacions preferides amb %s. + Ara ja podeu escriure en totes les vostres aplicacions preferides amb %s. "Finalitzat" "Mostra la icona de l\'aplicació" "Mostra la icona de l\'aplicació al menú d\'aplicacions" @@ -84,7 +84,7 @@ "Última actualització" "Configuració" "Suprimeix" - Versió %1$s + Versió %1$s "Afegeix al diccionari" "Drecera:" "Idioma:" @@ -100,7 +100,7 @@ Temps de manteniment a l\'historial Llisqueu damunt de la tecla d\'esborrar per seleccionar i treure grans parts de text d\'un sol cop Força el mode d\'incògnit - %s min + %s min Corrector ortogràfic de l\'HeliBoard Configuració del corrector ortogràfic de l\'HeliBoard Esborra amb lliscament @@ -125,7 +125,7 @@ Mantenint premuda la barra espaiadora s\'obrirà el menú de selecció del mètode d\'entrada Canvia el mètode d\'entrada amb la barra espaiadora Mostra consells quan es mantingui premuda una tecla - %s (Akkhor) + %s (Akkhor) Escala de l\'alçada del teclat L\'aspecte seguirà la configuració del sistema Confidència d\'autocorrecció @@ -215,9 +215,9 @@ Dreta Idiomes i disposicions Kaytak - %s (Estès) + %s (Estès) Carrega fitxer - %s (Fonètic) + %s (Fonètic) Afegeix una disposició personalitzada Copia al porta-retalls Copia la disposició existent @@ -268,10 +268,10 @@ Establir la imatge per al mode dia o nocturn? Dia Nit - %s (Probhat) + %s (Probhat) Mostra consells funcionals - %s (Sebeolsik 390) - %s (Sebeolsik Final) + %s (Sebeolsik 390) + %s (Sebeolsik Final) Canvia al teclat principal després de… Seleccionar l\'entrada de l\'historial del porta-retalls Seleccionar emoji a la visualització d\'emojis @@ -283,7 +283,7 @@ Tecles funcionals (Símbols) Tecles funcionals (Més símbols) Mansi - %s (Estudiant) + %s (Estudiant) Blau Gris Tancar Llicència pública general GNU v3.0 @@ -399,7 +399,7 @@ Tecles de funció (pantalla gran) Nom no vàlid Subtipus personalitzat - %s (Baishakhi) + %s (Baishakhi) Avís: la disposició s\'està utilitzant actualment Idiomes amb diccionaris Podeu trobar i compartir colors a %s. diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 909a87bec..7ef8486cc 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -17,7 +17,7 @@ "Aktivovat rozdělenou klávesnici" "Přepínat metody zadávání" "Klávesa přepínání jazyka" - "%s ms" + "%s ms" "Výchozí nastavení" Použít jména ze seznamu kontaktů k návrhům a opravám "Personalizované návrhy" @@ -50,8 +50,8 @@ "Španělština (USA)" Hinglish srbština (Latinka) - "%s (Tradiční)" - "%s (Kompaktní)" + "%s (Tradiční)" + "%s (Kompaktní)" standardní "Emodži" "Přidat" @@ -65,18 +65,18 @@ "Emodži pro fyzickou klávesnici" Paletu emodži zobrazíte stisknutím fyzické klávesy Alt "Výchozí" - "Vítá vás %s" + "Vítá vás %s" "s psaním gesty" "Začínáme" - "Nastavení aplikace %s" - "Zapnutí aplikace %s" - Povolte aplikaci „%s“ v nastavení Jazyky a zadávání. Tím povolíte její spuštění ve vašem zařízení. + "Nastavení aplikace %s" + "Zapnutí aplikace %s" + Povolte aplikaci „%s“ v nastavení Jazyky a zadávání. Tím povolíte její spuštění ve vašem zařízení. "Aktivovat v nastavení" - "Přepnutí na aplikaci %s" - Poté vyberte jako aktivní metodu zadávání textu možnost „%s“. + "Přepnutí na aplikaci %s" + Poté vyberte jako aktivní metodu zadávání textu možnost „%s“. "Přepnout metody zadávání" Gratulujeme, vše je připraveno! - Nyní můžete ve všech svých oblíbených aplikacích psát pomocí aplikace %s. + Nyní můžete ve všech svých oblíbených aplikacích psát pomocí aplikace %s. "Hotovo" "Zobrazit ikonu aplikace" "Zobrazí ikonu aplikace ve spouštěči" @@ -85,7 +85,7 @@ "Poslední aktualizace" "Nastavení" "Smazat" - "Verze %1$s" + "Verze %1$s" "Přidat do slovníku" "Zkratka:" "Jazyk:" @@ -101,7 +101,7 @@ "Vybrat metodu zadávání" Experimentální Různé - %s min. + %s min. Bez limitu Povolit historii schránky Doba zachování historie @@ -262,9 +262,9 @@ Hlasové zadávání Úplně vpravo Zobrazit tipy, pokud dlouhé stisknutí klávesy aktivuje další funkce - %s (Akkhor) - %s (Sebeolsik 390) - %s (Sebeolsik Final) + %s (Akkhor) + %s (Sebeolsik 390) + %s (Sebeolsik Final) Načíst soubor Přidat slovo Světlý @@ -286,7 +286,7 @@ \n \nVarování: načítání externího kódu může představovat bezpečnostní riziko. Používejte pouze knihovnu ze zdroje, kterému důvěřujete. Popis skrytých funkcí - %s (Rozšířené) + %s (Rozšířené) ► Dlouhý stisk kláves na připnuté liště nástrojů vyvolá další funkce: <br> \n\t• schránka &#65515; vložit <br> \n\t• pohyb doleva/doprava &#65515; slovo doleva/doprava <br> \n\t• pohyb nahoru/dolů &#65515; stránka nahoru/dolů <br> \n\t• slovo doleva/doprava &#65515; začátek/konec řádku <br> \n\t• stránka nahoru/dolů &#65515; začátek/konec stránky <br> \n\t• kopírovat &#65515; vystřihnout <br> \n\t• vybrat slovo &#8596; vybrat vše <br> \n\t• zrušit &#8596; opakovat <br> <br> \n► Dlouhý stisk kláves v liště s návrhy je připne. <br> <br> \n► Dlouhý stisk klávesy čárky pro přístup k zobrazení schránky, zobrazení emodži, režimu pro jedno ruce, nastavení nebo přepnutí jazyka: <br> \n\t• Zobrazení emodži a přepnutí jazyka zmizí, pokud máte odpovídající klávesu povolenou; <br> \n\t• U některých rozložení to není klávesa čárky, ale klávesa na stejné pozici (např. u Dvorak rozložení je to klávesa \'q\'). <br> <br> \n► Při zapnutém inkognito režimu se nebudou učit žádná slova a žádná emodži nebudou přidána do historie. <br> <br> \n► Stiskněte ikonu inkognito pro přístup k liště nástrojů. <br> <br> \n► Posuvný vstup klávesy: Přejeďte od klávesy Shift na jinou klávesu pro napsání jednoho velkého písmene: <br> \n\t• Toto také funguje pro klávesu \'?123\' pro napsání jednoho symbolu z klávesnice symbolů a pro související klávesy. <br> <br> \n► Držte klávesu Shift nebo symbolu, stiskněte jednu nebo více kláves a pak uvolněte Shift nebo symbolovou klávesu pro návrat na předchozí klávesnici. <br> <br> \n► Dlouhý stisk návrhu v liště návrhů pro zobrazení více návrhů a tlačítko pro smazání tohoto návrhu. <br> <br> \n► Přejeďte prstem nahoru z návrhu pro otevření více návrhů a uvolněte prst na návrhu pro jeho výběr. <br> <br> \n► Dlouhý stisk položky v historii schránky pro její připnutí (udržení v schránce, dokud ji neodpinete). <br> <br> \n► Přejeďte prstem doleva ve zobrazení schránky pro odstranění položky (kromě případů, kdy je připnuta). <br> <br> \n► Vyberte text a stiskněte Shift pro přepínání mezi velkými písmeny, malými písmeny a velkými prvními písmeny slov. <br> <br> \n► Můžete přidat slovníky otevřením v průzkumníku souborů: <br> \n\t• Toto funguje pouze s <i>content-uris</i>, nikoliv s <i>file-uris</i>, což znamená, že to nemusí fungovat u některých průzkumníků souborů. <br> <br> \n► Pro uživatele provádějící manuální zálohy s root přístupem: <br> \n\t• Začínaje Androidem 7, soubor sdílených preferencí není na výchozím místě, protože aplikace používá %s. To je nutné, aby nastavení mohla být přečtena před odemknutím zařízení, např. při spuštění; <br> \n\t• Soubor se nachází v /data/user_de/0/package_id/shared_prefs/, i když to může záviset na zařízení a verzi Androidu. <br> <br> \n<i><b>Režim ladění / ladící APK</b></i> <br> <br> \n► Dlouhý stisk návrhu pro zobrazení zdrojového slovníku. <br> <br> \n► Při používání ladícího APK najdete Nastavení ladění v pokročilých preferencích, i když jejich užitečnost je omezená, kromě dumpování slovníků do logu. <br> \n\t• Pro vydané APK je nutné několikrát stisknout verzi v <i>O aplikaci</i>, poté najdete nastavení ladění v <i>Pokročilých preferencích</i>. <br> \n\t• Při povolení <i>Zobrazit informace o návrzích</i> budou návrhy mít malá čísla nahoře ukazující interní skóre a zdrojový slovník. <br> <br> \n► Při pádu aplikace budete vyzváni, zda chcete získat záznamy o pádu, když otevřete Nastavení. <br> <br> \n► Při používání vícejazyčného psaní bude klávesa mezerníku zobrazovat hodnotu důvěry, která se používá k určení aktuálně používaného jazyka. <br> <br> \n► Návrhy budou mít malá čísla nahoře ukazující interní skóre a zdrojový slovník (může být vypnuto). Nelze přečíst soubor Další symboly @@ -299,7 +299,7 @@ GNU General Public License v3.0 Zavřít Klepnutím na jazyk otevřete nastavení - %s (Probhat) + %s (Probhat) Výběr barev pro text a pozadí Fialový Uživatelsky definovaný @@ -307,7 +307,7 @@ Vybrat barvu automaticky Zobrazit pouze hlavní barvy Zobrazit všechny barvy - %s (Student) + %s (Student) Chování klávesy pro přepínání jazyků Vibrace v režimu nerušit Mezerník @@ -357,7 +357,7 @@ Číselný řádek (základní) Shift (stisknutý) Obsah zkopírován - %s (Baishakhi) + %s (Baishakhi) Ukončit režim jedné ruky Vlastní text na mezerníku Zobrazit další barvy @@ -365,7 +365,7 @@ Emodži Hlasový vstup zakázán Přizpůsobit měny - %s (fonetická) + %s (fonetická) Dargwa (Urakhi) Zkopírovat do schránky Přepsat verzi emodži diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index b460e7a9a..ddbc3cbe3 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -16,7 +16,7 @@ Aktivér opdelt tastatur "Skift inputmetode" Tast til sprogskift - %s ms + %s ms "Systemstandard" "Brug navne fra Kontakter til forslag og rettelser" Personlige forslag @@ -49,8 +49,8 @@ "Spansk (USA)" "Hinglish" Serbisk (latin) - %s (traditionel) - %s (kompakt) + %s (traditionel) + %s (kompakt) "Intet sprog" "Emoji" "Tilføj" @@ -64,18 +64,18 @@ "Emoji på fysisk tastatur" Alt-tast på fysisk tastatur viser emoji-paletten "Standard" - Velkommen til%s + Velkommen til%s "med glidende indtastning" Kom i gang - %s konfigureres - Aktivér%s - Markér \"%s\" i dine indstillinger for sprog og indtastning. Dermed får appen tilladelse til at køre på din enhed. + %s konfigureres + Aktivér%s + Markér \"%s\" i dine indstillinger for sprog og indtastning. Dermed får appen tilladelse til at køre på din enhed. "Aktivér i Indstillinger" - Skift til%s - Vælg derefter \\%s\" som din aktive tekstinputmetode.\" + Skift til%s + Vælg derefter \\%s\" som din aktive tekstinputmetode.\" Skift inputmetode Tillykke, du er klar! - Nu kan du skrive i alle dine favoritapps med %s. + Nu kan du skrive i alle dine favoritapps med %s. "Afslut" "Vis appikon" Vis applikationsikon i launcheren @@ -84,7 +84,7 @@ "Sidst opdateret" "Indstillinger" "Slet" - Version %1$s + Version %1$s "Føj til ordbog" "Genvej:" "Sprog:" @@ -105,7 +105,7 @@ Tastekanter Automatisk dag-/nattilstand Udseende følger systemindstillinger - %s min. + %s min. HeliBoard-stavekontrol Vis tastehints Talrække @@ -117,7 +117,7 @@ Indstillinger for HeliBoard-stavekontrol Indsæt automatisk mellemrum efter skilletegn, når du skriver et nyt ord Auto-mellemrum efter skilletegn - %s (Akkhor) + %s (Akkhor) HeliBoard-indstillinger Input Yderligere taster @@ -175,7 +175,7 @@ Sprog Indstil primær og op til 6 sekundære valutasymboler, adskilt med mellemrum Vis funktionelle hints - %s (Sebeolsik 390) + %s (Sebeolsik 390) Kaitag Vælg sprog %s (eksperimentel) @@ -275,7 +275,7 @@ Skala for padding i siderne Skala for padding i bunden (liggende) Mansi - %s (udvidet) + %s (udvidet) Skift til hovedtastatur efter… Sekundære layouts "Uden en ordbog får du kun forslag til tekst, du har indtastet før.<br>\n Du kan hente ordbøger %1$s eller tjekke, om en ordbog for \"%2$s\" kan hentes direkte %3$s." diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ecc301766..0e9f906fb 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -16,7 +16,7 @@ "Geteilte Tastatur aktivieren" "Eingabemethoden wechseln" Sprachwechseltaste - "%s ms" + "%s ms" Systemstandard Namen aus Kontakten für Vorschläge und Korrekturen verwenden "Personalisierte Vorschläge" @@ -49,8 +49,8 @@ "Spanisch (USA)" Hinglisch "Serbisch (Lateinisch)" - %s (Traditionell) - %s (Kompakt) + %s (Traditionell) + %s (Kompakt) "Keine Sprache" "Emoji" "Hinzufügen" @@ -64,18 +64,18 @@ "Emoji für physische Tastatur" "Emoji-Palette auf physischen Tastaturen über Alt-Taste aufrufen" "Standard" - Willkommen bei %s + Willkommen bei %s mit Gesten-Tippen "Jetzt starten" - %s einrichten - %s aktivieren - Bitte aktiviere %s\" unter der Systemeinstellung „Sprachen und Eingabe“. + %s einrichten + %s aktivieren + Bitte aktiviere %s\" unter der Systemeinstellung „Sprachen und Eingabe“. "In den Einstellungen aktivieren" - Zu %s wechseln - Wähle als nächstes %s\" als deine aktive Bildschirmtastatur. + Zu %s wechseln + Wähle als nächstes %s\" als deine aktive Bildschirmtastatur. "Eingabemethode wechseln" Hurra, die Einrichtung ist abgeschlossen! - Jetzt kannst du in all deinen Lieblingsapps mit %s schreiben. + Jetzt kannst du in all deinen Lieblingsapps mit %s schreiben. "Fertig" "App-Symbol anzeigen" "App-Symbol in der Übersicht anzeigen" @@ -84,7 +84,7 @@ "Zuletzt aktualisiert" "Einstellungen" "Löschen" - Version %1$s + Version %1$s "Zum Wörterbuch hinzufügen" "Tastaturkürzel:" "Sprache:" @@ -103,7 +103,7 @@ HeliBoard-Einstellungen Experimentell Keine Begrenzung - %s Min. + %s Min. HeliBoard-Rechtschreibprüfung Emoji-Taste Eingabe @@ -129,7 +129,7 @@ Aussehen (hell/dunkel) folgt der Systemeinstellung für den Tag-/Nachtmodus Tastenränder Automatischer Tag-/Nachtmodus - %s (Bengali) + %s (Bengali) Vertrauen in die Autokorrektur Rückgängig "Wiederholen" @@ -156,13 +156,13 @@ Fehler beim Wiederherstellen der Sicherung: %s Farben Funktionstastenhintergrund - %s (Sebeolsik 390) + %s (Sebeolsik 390) Persönliches Wörterbuch des Gerätes verwenden, um gelernte Wörter zu speichern Dieses Wort ist bereits im Benutzer-Wörterbuch %s vorhanden. Bitte gib ein anderes Wort ein. Abgerundet Sicherung Schwarz - %s (Sebeolsik Final) + %s (Sebeolsik Final) Schokolade Soll das vom Benutzer hinzugefügte Wörterbuch \"%s\" wirklich entfernt werden? Wolkig @@ -299,13 +299,13 @@ Ausschneiden Variable Symbolleisten-Richtung Richtung umkehren, wenn die Tastatur einer Rechts-nach-Links-Sprache ausgewählt ist - %s (Student) - %s (Probhat) + %s (Student) + %s (Probhat) Bei Eingabe eines Leerzeichens oder eines Punktes wird der mittlere Vorschlag gewählt Zwischenablage-Verlauf schließen Immer mittleren Vorschlag verwenden Tasten der Symbolleiste für die Zwischenablage auswählen - %s (Erweitert) + %s (Erweitert) Angeheftete Tasten der Symbolleiste auswählen Dadurch werden andere Langdruck-Aktionen für Tasten der Symbolleiste, die nicht angeheftet sind, deaktiviert Inhalt kopiert @@ -398,14 +398,14 @@ Randabstand unten (Querformat) Seitenabstand Seitenabstand (Querformat) - %s (Phonetisch) + %s (Phonetisch) Warnung: Das Layout wird derzeit verwendet Du kannst Layouts im %s finden und freigeben. Diskussionsbereich %s wirklich löschen? Ungültiger Name Benutzerdefinierter Subtyp - %s (Baisakhi) + %s (Baisakhi) Zeige TLD-Popup-Tasten Ersetze Punkt-Tastenpopups mit Top-Level-Domains wenn URLs und Mailadressen eingegeben werden Nicht immer Vorschläge für Web-Editierfelder anzeigen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 18c326c14..1f4c9966a 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -17,7 +17,7 @@ "Ενεργοποίηση διαχωρισμού πληκτρολογίου" "Άλλη μέθοδος εισόδου" "Πλήκτρο εναλλαγής γλώσσας" - "%sχλστ. δ." + "%sχλστ. δ." "Προεπιλογή" "Χρησιμοποιήστε ονόματα από τις Επαφές για προτάσεις και διορθ." "Εξατομικευμένες προτάσεις" @@ -50,8 +50,8 @@ "Ισπανικά (ΗΠΑ)" "Hinglish" "Σερβικά (Λατινικά)" - "%s (Παραδοσιακά)" - "%s (Συμπαγές)" + "%s (Παραδοσιακά)" + "%s (Συμπαγές)" "Καμία γλώσσα" "Emoticon" "Προσθήκη" @@ -65,18 +65,18 @@ "Emoji για φυσικό πληκτρολόγιο" "Το φυσικό πλήκτρο Alt εμφανίζει την παλέτα emoji" "Προεπιλογή" - "Καλώς ορίσατε στο %s" + "Καλώς ορίσατε στο %s" "με Πληκτρολόγηση με κίνηση" "Έναρξη" - "Ρύθμιση της εφαρμογής %s" - "Ενεργοποιήστε την εφαρμογή %s" - "Επιλέξτε \"%s\" στις Ρυθμίσεις γλώσσας και εισαγωγής, για να το εξουσιοδοτήσετε να εκτελείται στη συσκευή σας." + "Ρύθμιση της εφαρμογής %s" + "Ενεργοποιήστε την εφαρμογή %s" + "Επιλέξτε \"%s\" στις Ρυθμίσεις γλώσσας και εισαγωγής, για να το εξουσιοδοτήσετε να εκτελείται στη συσκευή σας." "Ενεργοποίηση στις Ρυθμίσεις" - "Μετάβαση στην εφαρμογή %s" - "Στη συνέχεια, επιλέξτε \"%s\" ως την ενεργή μέθοδο εισαγωγής κειμένου." + "Μετάβαση στην εφαρμογή %s" + "Στη συνέχεια, επιλέξτε \"%s\" ως την ενεργή μέθοδο εισαγωγής κειμένου." "Εναλλαγή μεθόδων εισαγωγής" "Συγχαρητήρια, είστε έτοιμοι!" - "Πλέον μπορείτε να πληκτρολογήσετε όλες τις αγαπημένες σας εφαρμογές με το %s." + "Πλέον μπορείτε να πληκτρολογήσετε όλες τις αγαπημένες σας εφαρμογές με το %s." "Ολοκληρώθηκε" "Εμφάνιση εικονιδίου εφαρμογής" "Εμφάνιση εικονιδίου εφαρμογής στο πρόγραμμα εκκίνησης" @@ -85,7 +85,7 @@ "Τελευταία ενημέρωση" "Ρυθμίσεις" "Διαγραφή" - "Έκδοση %1$s" + "Έκδοση %1$s" "Προσθήκη στο λεξικό" "Συντόμευση:" "Γλώσσα:" @@ -111,7 +111,7 @@ Ρυθμίσεις ορθογραφικού ελέγχου HeliBoard Ιστορικό πρόχειρου Διάφορα - %smin. + %smin. Εάν είναι απενεργοποιημένο, το πλήκτρο του προχείρου θα επικολλήσει το περιεχόμενο του προχείρου εάν υπάρχει Περίγραμμα πλήκτρου Αυτόματη λειτουργία ημέρας/νύχτας @@ -120,7 +120,7 @@ Αριθμητική σειρά Να εμφανίζεται πάντα η αριθμητική σειρά Αλλάξτε τη μέθοδο εισαγωγής με το πλήκτρο διαστήματος - %s (Akkhor) + %s (Akkhor) Η εμφάνιση θα ακολουθεί τις ρυθμίσεις του συστήματος Αυτόματο κενό μετά τη στίξη Ρυθμίσεις HeliBoard diff --git a/app/src/main/res/values-en-rAU/strings.xml b/app/src/main/res/values-en-rAU/strings.xml index 252f73c2c..22e8d9a76 100644 --- a/app/src/main/res/values-en-rAU/strings.xml +++ b/app/src/main/res/values-en-rAU/strings.xml @@ -17,7 +17,7 @@ "Enable split keyboard" "Switch to other input methods" "Language switch key" - "%sms" + "%sms" "System default" "Use names from Contacts for suggestions and corrections" "Personalised suggestions" @@ -51,8 +51,8 @@ "Hinglish" "Kaitag" "Serbian (Latin)" - "%s (Traditional)" - "%s (Compact)" + "%s (Traditional)" + "%s (Compact)" "No language" "Emoji" "Add" @@ -66,18 +66,18 @@ "Emoji for physical keyboard" "Physical Alt key shows the emoji palette" "Default" - "Welcome to %s" + "Welcome to %s" "with Gesture Typing" "Get started" - "Setting up %s" - "Enable %s" - "Please tick \"%s\" in your Languages & input settings. This will authorise it to run on your device." + "Setting up %s" + "Enable %s" + "Please tick \"%s\" in your Languages & input settings. This will authorise it to run on your device." "Enable in Settings" - "Switch to %s" - "Next, select \"%s\" as your active text-input method." + "Switch to %s" + "Next, select \"%s\" as your active text-input method." "Switch input methods" "Congratulations, you\'re all set!" - "Now you can type in all your favourite apps with %s." + "Now you can type in all your favourite apps with %s." "Finished" "Show app icon" "Display application icon in the launcher" @@ -86,7 +86,7 @@ "Last updated" "Settings" "Delete" - "Version %1$s" + "Version %1$s" "Add to dictionary" "Shortcut:" "Language:" diff --git a/app/src/main/res/values-en-rCA/strings.xml b/app/src/main/res/values-en-rCA/strings.xml index 252f73c2c..22e8d9a76 100644 --- a/app/src/main/res/values-en-rCA/strings.xml +++ b/app/src/main/res/values-en-rCA/strings.xml @@ -17,7 +17,7 @@ "Enable split keyboard" "Switch to other input methods" "Language switch key" - "%sms" + "%sms" "System default" "Use names from Contacts for suggestions and corrections" "Personalised suggestions" @@ -51,8 +51,8 @@ "Hinglish" "Kaitag" "Serbian (Latin)" - "%s (Traditional)" - "%s (Compact)" + "%s (Traditional)" + "%s (Compact)" "No language" "Emoji" "Add" @@ -66,18 +66,18 @@ "Emoji for physical keyboard" "Physical Alt key shows the emoji palette" "Default" - "Welcome to %s" + "Welcome to %s" "with Gesture Typing" "Get started" - "Setting up %s" - "Enable %s" - "Please tick \"%s\" in your Languages & input settings. This will authorise it to run on your device." + "Setting up %s" + "Enable %s" + "Please tick \"%s\" in your Languages & input settings. This will authorise it to run on your device." "Enable in Settings" - "Switch to %s" - "Next, select \"%s\" as your active text-input method." + "Switch to %s" + "Next, select \"%s\" as your active text-input method." "Switch input methods" "Congratulations, you\'re all set!" - "Now you can type in all your favourite apps with %s." + "Now you can type in all your favourite apps with %s." "Finished" "Show app icon" "Display application icon in the launcher" @@ -86,7 +86,7 @@ "Last updated" "Settings" "Delete" - "Version %1$s" + "Version %1$s" "Add to dictionary" "Shortcut:" "Language:" diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index c27c9ba9d..848286f3b 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -16,7 +16,7 @@ "Enable split keyboard" "Switch to other input methods" "Language switch key" - "%s ms" + "%s ms" "System default" "Use names from Contacts for suggestions and corrections" "Personalised suggestions" @@ -50,8 +50,8 @@ "Hinglish" "Kaitag" "Serbian (Latin)" - %s (Traditional) - %s (Compact) + %s (Traditional) + %s (Compact) "No language" "Emoji" "Add" @@ -65,18 +65,18 @@ "Emoji for physical keyboard" "Physical Alt key shows the emoji palette" "Default" - Welcome to %s + Welcome to %s "with Gesture Typing" "Get started" - Setting up %s - Enable %s - Please tick \"%s\" in your Languages & input settings. This will authorise it to run on your device. + Setting up %s + Enable %s + Please tick \"%s\" in your Languages & input settings. This will authorise it to run on your device. "Enable in Settings" - Switch to %s - Next, select \"%s\" as your active text-input method. + Switch to %s + Next, select \"%s\" as your active text-input method. "Switch input methods" "Congratulations, you\'re all set!" - Now you can type in all your favourite apps with %s. + Now you can type in all your favourite apps with %s. "Finished" "Show app icon" "Display application icon in the launcher" @@ -85,7 +85,7 @@ "Last updated" "Settings" "Delete" - Version %1$s + Version %1$s "Add to dictionary" "Shortcut:" "Language:" @@ -122,11 +122,11 @@ Long pressing space key will prompt input method selection menu No limit Clipboard history - %s min + %s min Enable clipboard history If disabled, clipboard key will paste clipboard content if any History retention time - %s (Akkhor) + %s (Akkhor) Autospace after punctuation Automatically insert space after punctuation when typing a new word "Use system languages" diff --git a/app/src/main/res/values-en-rIN/strings.xml b/app/src/main/res/values-en-rIN/strings.xml index 9f5095052..8aae2be22 100644 --- a/app/src/main/res/values-en-rIN/strings.xml +++ b/app/src/main/res/values-en-rIN/strings.xml @@ -17,7 +17,7 @@ "Enable split keyboard" "Switch to other input methods" "Language switch key" - "%sms" + "%sms" "System default" "Use names from Contacts for suggestions and corrections" "Personalised suggestions" @@ -51,8 +51,8 @@ "Hinglish" "Kaitag" "Serbian (Latin)" - "%s (Traditional)" - "%s (Compact)" + "%s (Traditional)" + "%s (Compact)" "No language" "Emoji" "Add" @@ -66,18 +66,18 @@ "Emoji for physical keyboard" "Physical Alt key shows the emoji palette" "Default" - "Welcome to %s" + "Welcome to %s" "with Gesture Typing" "Get started" - "Setting up %s" - "Enable %s" - "Please tick \"%s\" in your Languages & input settings. This will authorise it to run on your device." + "Setting up %s" + "Enable %s" + "Please tick \"%s\" in your Languages & input settings. This will authorise it to run on your device." "Enable in Settings" - "Switch to %s" - "Next, select \"%s\" as your active text-input method." + "Switch to %s" + "Next, select \"%s\" as your active text-input method." "Switch input methods" "Congratulations, you\'re all set!" - "Now you can type in all your favourite apps with %s." + "Now you can type in all your favourite apps with %s." "Finished" "Show app icon" "Display application icon in the launcher" @@ -86,7 +86,7 @@ "Last updated" "Settings" "Delete" - "Version %1$s" + "Version %1$s" "Add to dictionary" "Shortcut:" "Language:" diff --git a/app/src/main/res/values-en-rXC/strings.xml b/app/src/main/res/values-en-rXC/strings.xml index 0a2c86239..c0680a9c6 100644 --- a/app/src/main/res/values-en-rXC/strings.xml +++ b/app/src/main/res/values-en-rXC/strings.xml @@ -17,7 +17,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‎‏‎‎‎‏‏‏‎‎‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‎‏‏‎‏‎‎‏‏‏‎‏‎‎‎‏‏‎‏‏‏‎‎‏‎‎Enable split keyboard‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‏‏‏‎‏‎‏‏‎Switch to other input methods‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‎‏‏‎‎‎‎‎‏‏‎Language switch key‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‎‎‎‎‎‏‏‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎‏‏‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ms‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‎‎‎‎‎‏‏‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎‏‏‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ms‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‎‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‎‎‎‏‎‏‎‎‎‏‎‎‏‎‎‎‎‎‎‏‏‎‎‏‎‏‎‏‏‏‎System default‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‏‎‏‎‏‏‎‎‏‏‎‏‎Use names from Contacts for suggestions and corrections‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‎‏‏‏‎‎‎‏‏‎‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‏‎‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‏‏‏‎Personalized suggestions‎‏‎‎‏‎" @@ -50,8 +50,8 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‎‏‎‏‎‎‎‎‎‎‏‎‎‏‏‎‏‎‏‏‎‏‎‎‎‎Spanish (US)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‏‎‎‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‏‎‎‏‏‎‎‎‏‎‎‎‏‏‏‏‏‎Hinglish‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‏‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎‏‎‎‏‏‏‎Serbian (Latin)‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‏‎‏‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ (Traditional)‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ (Compact)‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‏‎‏‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ (Traditional)‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ (Compact)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‏‏‎‏‎‎‏‎‎‏‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‏‏‎No language‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‎‎‏‎‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎Emoji‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‎‎‏‏‎‏‏‎‎‎‎‎‎‏‎‎‎‎‎‏‎‎‏‏‎‏‏‏‏‏‎Add‎‏‎‎‏‎" @@ -65,18 +65,18 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‏‏‏‏‎‎‎‎‏‎‎‏‏‏‎‎‏‎‏‏‎‎‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‎‎Emoji for physical keyboard‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‏‎‏‏‎‎‏‎‎Physical Alt key shows the emoji palette‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‎‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‏‎‎‏‎‏‎‎‎Default‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‏‎‏‎‎‎‏‏‎‏‎‏‏‏‏‎‏‎‏‎‎‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎Welcome to ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‏‎‏‎‎‎‏‏‎‏‎‏‏‏‏‎‏‎‏‎‎‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎Welcome to ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‏‏‏‏‏‎with Gesture Typing‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‏‏‎‎‎‏‎‎‏‎‏‎‏‏‎‏‎‏‏‎‏‎‏‎Get started‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‏‎‏‎‏‎‏‎‏‎‏‏‎‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎Setting up ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎Enable ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‎‏‎‎‎‏‏‏‏‏‏‎‏‎Please check \"‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎\" in your Languages & input settings. This will authorize it to run on your device.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‏‎‏‎‏‎‏‎‏‎‏‏‎‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎Setting up ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎Enable ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‎‏‎‎‎‏‏‏‏‏‏‎‏‎Please check \"‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎\" in your Languages & input settings. This will authorize it to run on your device.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‏‏‏‏‎‎‎‏‏‏‎‏‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‏‎‏‎‏‎‏‏‎‏‏‎‎‎‏‎‎‎‎‎‎Enable in Settings‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‎‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‏‎‎‎‏‎‎Switch to ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‎‏‎‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‏‎‎‎‎Next, select \"‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎\" as your active text-input method.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‎‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‏‎‎‎‏‎‎Switch to ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‎‏‎‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‏‎‎‎‎Next, select \"‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎\" as your active text-input method.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‏‎‏‎‏‎‏‏‎‏‏‎‎‏‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‎‏‎‎‎‏‎Switch input methods‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‎‏‏‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‏‏‏‏‏‎‎‏‏‏‎‏‎‎‏‎Congratulations, you\'re all set!‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎Now you can type in all your favorite apps with ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎Now you can type in all your favorite apps with ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‎‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‎‏‏‎‎‎‎‎‎‎‏‏‏‎‏‏‎‎‎Finished‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‏‎‎‎‏‏‏‎‏‎‎‎‏‏‎‎‎‏‎‏‎‏‏‎‎‎‎‏‏‏‏‏‎Show app icon‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‎‎‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‎Display application icon in the launcher‎‏‎‎‏‎" @@ -85,7 +85,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‎‏‎‎‏‏‏‏‏‎‎‎‎‎‎‏‎‎‏‏‎‎‎Last updated‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‎‎‏‏‎‎‏‎‏‎‎‏‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‎‎‏‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‎‎‎Settings‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‏‏‎‎‏‎‎‎Delete‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‎‏‏‎‎‎‏‎‎‏‎Version ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‎‏‏‎‎‎‏‎‎‏‎Version ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‎‏‎‎‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎‏‏‎‏‎‎‎‎‎‎‎Add to dictionary‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‎‎‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎Shortcut:‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‏‎‎‏‎‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‏‎Language:‎‏‎‎‏‎" diff --git a/app/src/main/res/values-es-rUS/strings.xml b/app/src/main/res/values-es-rUS/strings.xml index 20a94d249..80027c77c 100644 --- a/app/src/main/res/values-es-rUS/strings.xml +++ b/app/src/main/res/values-es-rUS/strings.xml @@ -16,7 +16,7 @@ "Habilitar teclado dividido" "Otros métodos de entrada" "Tecla de selección de idioma" - "%s ms" + "%s ms" "Predeterminado/a" Usar nombres de los contactos para sugerencias y correcciones "Sugerenc. personalizadas" @@ -49,8 +49,8 @@ "Español (EE.UU.)" "Hinglish" "Serbio (latino)" - "%s (tradicional)" - "%s (compacto)" + "%s (tradicional)" + "%s (compacto)" "Ningún idioma" "Emoji" "Agregar" @@ -64,18 +64,18 @@ "Emoji para teclado físico" "La tecla Alt física muestra la paleta de emojis" "Predeterminado" - "Te damos la bienvenida a %s" + "Te damos la bienvenida a %s" "con escritura gestual" "Comenzar" - "Configurando %s…" - "Habilitar %s" - "Marca \"%s\" en Teclado e idioma para permitir que la app se ejecute en tu dispositivo." + "Configurando %s…" + "Habilitar %s" + "Marca \"%s\" en Teclado e idioma para permitir que la app se ejecute en tu dispositivo." "Habilitar en Configuración" - "Cambiar a %s" - "A continuación, selecciona \"%s\" como tu método de entrada de texto activo." + "Cambiar a %s" + "A continuación, selecciona \"%s\" como tu método de entrada de texto activo." "Cambiar métodos de entrada" "¡Felicitaciones, ya terminaste!" - "Ahora puedes escribir en todas las aplicaciones que quieras con %s." + "Ahora puedes escribir en todas las aplicaciones que quieras con %s." "Listo" "Mostrar ícono de aplicación" "Mostrar ícono de aplicación en el selector" @@ -84,7 +84,7 @@ "Última actualización" "Configuración" "Eliminar" - "Versión %1$s" + "Versión %1$s" "Agregar al diccionario" "Acceso directo:" "Idioma:" @@ -96,7 +96,7 @@ " ABCDEFGHIJKLMNOPQRSTUVWXYZ" Habilitar historial del portapapeles Tiempo para mantener el historial - %smin. + %smin. Corrector ortográfico de HeliBoard Ajustes del corrector ortográfico de HeliBoard Escala de altura del teclado @@ -117,7 +117,7 @@ Deshabilitar aprendizaje de nuevas palabras Fila de números Cambiar el método de entrada con la barra espaciadora - %s (Akkhor) + %s (Akkhor) Más teclas Mostrar símbolos sugeridos Bordes de teclas @@ -287,9 +287,9 @@ Mostrar características que pueden pasar desapercibidas Dirección variable de la barra de herramientas Invertir la dirección cuando se selecciona un subtipo de teclado de derecha a izquierda - %s (Probhat) - %s (Sebeolsik 390) - %s (Sebeolsik Final) + %s (Probhat) + %s (Sebeolsik 390) + %s (Sebeolsik Final) Océano Oscuro Más oscuro @@ -302,7 +302,7 @@ Bosque Indigo A la izquierda - %s (Student) + %s (Student) Utilizar el diccionario personal del dispositivo para almacenar las palabras aprendidas Ignorar la petición de otras aplicaciones de desactivar las sugerencias (puede producir problemas) Mostrar pistas de funciones @@ -314,7 +314,7 @@ Al presionar espacio o puntuación, se ingresará la sugerencia central Cerrar el historial del portapapeles Seleccionar teclas de la barra de herramientas del portapapeles - %s (Extendido) + %s (Extendido) Mansi Mostrar más colores Esta configuración muestra todos los colores que se utilizan internamente. La lista de colores puede cambiar en cualquier momento. El color predeterminado es aleatorio, y los nombres no se traducirán. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 06a41f483..af8adef7a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -16,7 +16,7 @@ "Habilitar teclado dividido" "Otros métodos de introducción" "Tecla para cambiar de idioma" - "%s ms" + "%s ms" "Predeterminado" Utilizar nombres de contactos para sugerencias y correcciones "Sugerencias personalizadas" @@ -49,8 +49,8 @@ "Español (EE.UU.)" inglés indio "Serbio (latino)" - %s (Tradicional) - %s (Compacto) + %s (Tradicional) + %s (Compacto) "Ningún idioma" "Emoji" "Añadir" @@ -64,18 +64,18 @@ "Emojis para teclado físico" "La tecla Alt física muestra la lista de emojis" "Predeterminado" - Bienvenido a %s + Bienvenido a %s "con escritura gestual" "Empezar" - Configurando %s - Activar %s - Por favor, compruebe \"%s\" en sus ajustes de entrada de Idiomas. Esto lo autorizará a ejecutarse en su dispositivo.\" + Configurando %s + Activar %s + Por favor, compruebe \"%s\" en sus ajustes de entrada de Idiomas. Esto lo autorizará a ejecutarse en su dispositivo.\" "Habilitar en Ajustes" - Cambiar a %s - A continuación, seleccione \\%s\" como su método de entrada de texto activo.\" + Cambiar a %s + A continuación, seleccione \\%s\" como su método de entrada de texto activo.\" Cambiar métodos de entrada "¡Enhorabuena, has terminado!" - Ahora puedes escribir en todas tus aplicaciones favoritas con %s. + Ahora puedes escribir en todas tus aplicaciones favoritas con %s. "Listo" "Mostrar icono de aplicación" "Mostrar icono de aplicación en menú de aplicaciones" @@ -84,7 +84,7 @@ "Última actualización" "Ajustes" "Eliminar" - Versión %1$s + Versión %1$s "Añadir al diccionario" "Acceso directo:" "Idioma:" @@ -123,8 +123,8 @@ Sin límite Habilitar el historial del portapapeles Tiempo a mantener guardado el historial - %s min - %s (Akkhor) + %s min + %s (Akkhor) Si está deshabilitada, la tecla del portapapeles pegará el contenido del portapapeles, si lo hay Espacio automático después del punto Insertar un espacio automático después del punto cuando se escriba una nueva palabra @@ -286,8 +286,8 @@ Mostar indicaciones funcionales Mostar indicaciones si pulsar una tecla prolongadamente activa funcionalidad adicional Invertir dirección cuando un subtipo de teclado Derecha-a-Izquierda está seleccionado - %s (Estudiante) - %s (Extendido) + %s (Estudiante) + %s (Extendido) Definido por el usuario Rosa Arena @@ -310,9 +310,9 @@ Ocultar barra de herramientas cuando hay sugerencias disponibles Cortar Texto de la tira de sugerencias - %s (Bengalí) - %s (Sebeolsik 390) - %s (Sebeolsik Final) + %s (Bengalí) + %s (Sebeolsik 390) + %s (Sebeolsik Final) Azúl grisáceo Chocolate Nuboso @@ -384,7 +384,7 @@ Papelera ¿Realmente restablecer todos los íconos personalizados? Vibrar en el modo No molestar - %s (Fonético) + %s (Fonético) Sustituir versión de Emoji Dargwa (Urakhi) Si se activa, los accesos directos pueden expandirse con la autocorrección @@ -402,7 +402,7 @@ Los campos de edición web (que se encuentran sobre todo en los navegadores) son una causa muy común de problemas con la configuración de mostrar siempre sugerencias No mostrar siempre las sugerencias para los campos de edición web Fila de números (básica) - %s (Baishakhi) + %s (Baishakhi) Nombre inválido Distancia de dividido (paisaje) Habilitar teclado dividido (paisaje) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 3d23d63e6..28b7d303b 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -16,7 +16,7 @@ Kasuta kaheks jaotatud klahvistikku "Vaheta sisestusmeetodit" "Keelevahetuse nupp" - "%s ms" + "%s ms" Süsteemi väärtus "Kasuta soovitusteks ja parandusteks nimesid kontaktiloendist" "Isikupärast. soovitused" @@ -49,8 +49,8 @@ Hispaania (USA) "Hindi-inglise" "Serbia (ladina)" - "%s (traditsiooniline)" - "%s (kompaktne)" + "%s (traditsiooniline)" + "%s (kompaktne)" "Keel puudub" "Emotikon" "Lisa" @@ -64,18 +64,18 @@ Füüsilise klahvistiku emoji "Füüsiline klahv Alt kuvab emotikonide paleti" "Vaikeväärtus" - "Tere tulemast rakendusse %s" + "Tere tulemast rakendusse %s" "joonistusega sisestamisega" Alusta siit - "Rakenduse %s seadistamine" - Võta %s kasutusele - Palun märgi nutiseadme keele- ja sisendiseadetes „%s“ lubatuks. See võimaldab rakenduse kasutamist sinu nutiseadmes. + "Rakenduse %s seadistamine" + Võta %s kasutusele + Palun märgi nutiseadme keele- ja sisendiseadetes „%s“ lubatuks. See võimaldab rakenduse kasutamist sinu nutiseadmes. "Luba seadetes" - Võta %s kõikjal kasutusele - Järgmisena vali aktiivseks tekstisisestusmeetodiks rakendus „%s“. + Võta %s kõikjal kasutusele + Järgmisena vali aktiivseks tekstisisestusmeetodiks rakendus „%s“. "Vaheta sisestusmeetodeid" "Õnnitleme. Kõik on valmis!" - Nüüd saad rakendusega %s sisestada kõikides oma lemmikrakendustes. + Nüüd saad rakendusega %s sisestada kõikides oma lemmikrakendustes. "Lõpetatud" "Kuva rakenduse ikoon" "Rakenduse ikooni kuvamine käivitajas" @@ -84,7 +84,7 @@ "Viimati värskendatud" "Seaded" "Kustuta" - "Versioon %1$s" + "Versioon %1$s" "Sõnaraamatusse lisamine" "Otsetee:" "Keel:" @@ -128,7 +128,7 @@ Viipe kestus Lokaliseeri numbririda Emoji klahv - %s min + %s min Keelevahetuse nupu käitumine Lisa sõnad isiklikku sõnastikku Kasuta selles seadmes isiklikku sõnastikku meeldejäetud sõnade salvestamiseks @@ -220,7 +220,7 @@ Mansi Sinu tekst tühikuklahvil Vali lõikelaua nupud tööriistariba jaoks - %s (laiendatud) + %s (laiendatud) Laadi Lisa kohandatud paigutus Vali õiges vormingus fail. Teavet vormingute kohta leiad: %s. @@ -273,9 +273,9 @@ Ikooni stiil Numbririda Sisu on kopeeritud - %s (Õpilaste) + %s (Õpilaste) Funktsiooniklahvid - %s (Sebeolsiku lõppvariant) + %s (Sebeolsiku lõppvariant) Peidetud funktsionaalsuse kirjeldus seadme turvatud andmekogu Funktsiooniklahvid (sümbolid) @@ -320,7 +320,7 @@ Püstise tühikuklahvi viipežest Rõhtse tühikuklahvi viipežest Liiguta kursorit - %s (Akkhor) + %s (Akkhor) Näita tööriistariba niipea, kui hakkad andmeid sisestama või valid teksti Peida tööriistariba automaatselt Peida tööriistariba niipea, kui soovitused on olemas @@ -406,13 +406,13 @@ GNU Üldine Avalik Litsents - versioon 3.0 Välimus Funktsiooniklahvid (täiendavad sümbolid) - %s (Probhat) - %s (Sebeolsik 390) + %s (Probhat) + %s (Sebeolsik 390) Tööriistariba Prügikast Kas kindlasti soovid lähtestada kõik sinu seadistatud ikoonid? Vibreeri rahulikus režiimis - %s (Phonetic) + %s (Phonetic) Ära arvesta emojide versiooni Androidis Dargi (Urahhi) Paranda lühendid automaatselt @@ -441,7 +441,7 @@ kogukonna vestlustes Uusi värve võid leida ja jagada %s. Sinu loodud alamtüüp - %s (Baishakhi) + %s (Baishakhi) Näita tippdomeenide hüpikklahve Võrgu- ja e-posti aadresside kirjutamisel asenda punktuatsiooni hüpikaknad tipptaseme domeenide omadega Vajutades numbriklahvistikus peale muud sisestust tühiku- või sisestusklahvi diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 2874c69b2..b7fda8f1a 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -16,7 +16,7 @@ "Gaitu teklatu banatua" "Aldatu idazketa-metodoa" "Hizkuntza aldatzeko tekla" - "%s ms" + "%s ms" Sistemak lehenetsitakoa Erabili kontaktuen izenak iradokizunak eta zuzenketak egiteko "Iradokizun pertsonalizatuak" @@ -49,8 +49,8 @@ "Gaztelania (AEB)" "Hinglisha" "Serbiarra (latindarra)" - %s (Tradizionala) - %s (Trinkoa) + %s (Tradizionala) + %s (Trinkoa) "Ez dago hizkuntzarik" "Emojiak" "Gehitu" @@ -64,18 +64,18 @@ "Teklatu fisikorako emojiak" "Teklatu fisikoko Alt tekla sakatuta emojiak agertzen dira" "Lehenetsia" - Ongi etorri %s aplikaziora + Ongi etorri %s aplikaziora Keinu-idazketarekin "Hasi erabiltzen" - %s konfiguratzen - %s gaitu - Hautatu \"%s\" Hizkuntza eta idazketa ataleko ezarpenetan &. Horrek gailuan exekutatzea baimenduko dio. + %s konfiguratzen + %s gaitu + Hautatu \"%s\" Hizkuntza eta idazketa ataleko ezarpenetan &. Horrek gailuan exekutatzea baimenduko dio. Gaitu Ezarpenetan - Aldatu %s aplikaziora - Ondoren, hautatu \"%s\" idazketa-metodo aktibo gisa. + Aldatu %s aplikaziora + Ondoren, hautatu \"%s\" idazketa-metodo aktibo gisa. "Aldatu idazketa-metodoak" "Dena prest duzu!" - Gogokoen dituzun aplikazioetan idatz dezakezu dagoeneko %s erabilita. + Gogokoen dituzun aplikazioetan idatz dezakezu dagoeneko %s erabilita. "Amaituta" "Erakutsi aplikazioaren ikonoa" Bistaratu aplikazioaren ikonoa panelean @@ -84,7 +84,7 @@ "Azken eguneratzea" "Ezarpenak" "Ezabatu" - %1$s bertsioa + %1$s bertsioa "Gehitu hiztegian" "Lasterbidea:" "Hizkuntza:" @@ -100,7 +100,7 @@ Esperimentala Denetarikoa Mugarik ez - %sminutu + %sminutu Erakutsi beti zenbakien errenkada Erakutsi teklen iradokizunak Erakutsi sakatze luzeen iradokizunak @@ -114,7 +114,7 @@ HeliBoard ortografia zuzentzailea Zuriunea puntuazioen ondoren Behartu ezkutuko modua - %s (Akkhor hizkuntza) + %s (Akkhor hizkuntza) Sarrera Teklen ertzak Egun/gau modu automatikoa @@ -224,8 +224,8 @@ Moztu Garbitu arbela Hautatu hitza - %s (Sebeolsik 390) - %s (Sebeolsik Final) + %s (Sebeolsik 390) + %s (Sebeolsik Final) Gehitu diseinu pertsonalizatua Hautatu fitxategi bat formatu bateragarri batean. Formatuei buruzko informazioa eskuragarri dago %s. Kargatu fitxategia @@ -294,12 +294,12 @@ gailuak babestutako biltegiratzea Tresna-barraren norabide aldakorra ► Arbeleko tekla luze sakatuz (iradokizunen zerrendako aukerakoa) sistemako arbeleko edukia itsatsi egiten da. <br> <br> Iradokizun-zerrendako tresna-barrako teklak luze sakatuz gero, iradokizun-zerrendan finkatzen dira. <br> <br> Luze sakatu koma tekla arbelaren ikuspegia, emoji ikuspegia, esku bakarreko modua, ezarpenak edo hizkuntza aldatzeko atzitzeko: <br> • Emoji ikuspegia eta hizkuntza aldatzea desagertuko dira dagokion tekla baduzu. gaituta; <br> • Diseinu batzuetan ez da koma-tekla, posizio berean dagoen tekla baizik (adibidez, \'q\' da Dvorak diseinurako). <br> <br> Ezkutuko modua gaituta dagoenean, ez da hitzik ikasiko eta ez da emojirik gehituko azken berrietan. <br> <br> Sakatu ezkutuko ikonoa tresna-barrara sartzeko. <br> <br> Irristatu teklaren sarrera: Irristatu shift batetik beste tekla batera maiuskulazko tekla bakarra idazteko: <br> • Honek \'?123\' teklak ere balio du sinboloen teklatuan ikur bakarra idazteko eta erlazionatutako gakoak. <br> <br> Luze sakatu iradokizunen zerrendako iradokizun bat iradokizun gehiago erakusteko, eta ezabatzeko botoia iradokizun hau kentzeko. <br> <br> Irristatu gorantz iradokizun batetik iradokizun gehiago irekitzeko, eta askatu iradokizuna hautatzeko. <br> <br> Luze sakatu arbeleko historiako sarrera bat ainguratzeko (jar ezazu arbelean aingura kendu arte). <br> <br> Hiztegiak gehi ditzakezu fitxategi-esploratzaile batean irekita: <br> • Honek <i>content-uris</i>-ekin bakarrik funtzionatzen du eta ez <i>file-uris</i>-ekin , hau da, baliteke fitxategi-esploratzaile batzuekin ez funtzionatzea. <br> <br> <i>Arazte modua / APK arazketa</i> <br> <br> • Luze sakatu iradokizun bat iturburu-hiztegia erakusteko.<br> <br> • Arazketa APK erabiltzean, dezakezu bilatu Arazte-ezarpenak Hobespen aurreratuen barruan, nahiz eta erabilgarritasuna mugatua den hiztegiak erregistroan isurtzea izan ezik. <br> <br> • Aplikazioaren hutsegite bat gertatuz gero, Ezarpenak irekitzean hutsegiteen erregistroak nahi dituzun galdetuko zaizu. <br> <br> • Idazketa eleanitza erabiltzean, zuriune-barrak unean erabiltzen den hizkuntza zehazteko erabiltzen den konfiantza-balioa erakutsiko du. <br> <br> • Iradokizunek goian zenbaki txiki batzuk izango dituzte barne puntuazio eta iturburu-hiztegiren bat erakutsiz (desgaitu daiteke). <br> <br> Root sarbidearekin eskuzko babeskopiak egiten dituzten erabiltzaileentzat: Android 7-tik aurrera, partekatutako hobespen-fitxategia ez dago lehenetsitako kokapenean, aplikazioa %s erabiltzen ari delako. <br> Hau beharrezkoa da ezarpenak irakurri ahal izateko gailua desblokeatu aurretik, adibidez. abioan. <br> Fitxategia /data/user_de/0/package_id/shared_prefs/ helbidean dago, baina gailuaren eta Android bertsioaren araberakoa izan daiteke. - %s (Probhat) + %s (Probhat) Diseinu errorea: %s Beltza Kolore dinamikoak Alderantzikatu norabidea eskuinetik ezkerrera teklatu mota hautatzen denean - %s (Ikasle) + %s (Ikasle) Hiztegiak Barneko hiztegi nagusia Gehitu hiztegia fitxategitik @@ -332,7 +332,7 @@ Ezkutatu tresna-barra iradokizunak erabilgarri daudenean Hasi beti berehala Idazketa azkarraren itxaron denbora - %s (Extended) + %s (Extended) Emojia Mansi Aurrebista flotagarria @@ -405,11 +405,11 @@ Azpimota pertsonalizatua URLak eta helbide elektronikoak idaztean, periodoen teklen popupak lehen mailako domeinuekin ordeztu Zenbakien errenkada (oinarrizkoa) - %s (Baishakhi) + %s (Baishakhi) %s-n koloreak aurki eta parteka ditzakezu. Override Emoji bertsioa Emojien azalaren tonu lehenetsia - %s (Phonetic) + %s (Phonetic) Sartu edo zuriunea sakatuta, numpad-eko beste teklen ondoren Seguru %s ezabatu nahi duzula? Ezarri letra-tipo pertsonalizatua fitxategitik diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index ad3a58a09..ebbd536e9 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -16,7 +16,7 @@ "فعال کردن دونیم‌کردن صفحه‌کلید" "تغییر به دیگر روش‌های ورودی" "کلید تغییر زبان" - "%s میلی‌ثانیه" + "%s میلی‌ثانیه" "پیش‌فرض سیستم" برای پیشنهاد و تصحیح از نام مخاطبین استفاده شود "پیشنهادات شخصی شده" @@ -49,8 +49,8 @@ "اسپانیایی (امریکا)" "هندی انگلیسی" "صربی (لاتین)" - %s (سنتی) - %s (فشرده) + %s (سنتی) + %s (فشرده) "بدون زبان" "اموجی" "افزودن" @@ -64,18 +64,18 @@ "اموجی برای صفحه‌کلید فیزیکی" "‏کلید Alt صفحه‌کلید فیزیکی، پالت اموجی را نشان می‌دهد" "پیش‌فرض" - به %s خوش آمدید + به %s خوش آمدید "با ورودی اشاره‌ای" "شروع به کار" - راه‌اندازی %s - فعال‌سازی %s - لطفاً «%s» را در تنظیمات «زبان‌ها و ورودی» علامت بزنید. این کار مجوز اجرا در دستگاه است. + راه‌اندازی %s + فعال‌سازی %s + لطفاً «%s» را در تنظیمات «زبان‌ها و ورودی» علامت بزنید. این کار مجوز اجرا در دستگاه است. "فعال‌سازی در تنظیمات" - به %s تعویض کنید - در مرحله بعد، «%s» را به عنوان روش ورودی نوشتار فعال خود انتخاب کنید. + به %s تعویض کنید + در مرحله بعد، «%s» را به عنوان روش ورودی نوشتار فعال خود انتخاب کنید. "تغییر روش‌های ورودی" "تبریک می‌گوییم، اکنون کاملاً آماده هستید!" - اکنون می‌توانید در همه برنامه‌های دلخواه خود با %s تایپ کنید. + اکنون می‌توانید در همه برنامه‌های دلخواه خود با %s تایپ کنید. "تمام شد" "نمایش نماد برنامه" "نمایش نماد برنامه در راه‌انداز" @@ -84,7 +84,7 @@ "آخرین به‌روزرسانی" "تنظیمات" "حذف" - نسخه %1$s + نسخه %1$s "افزودن به واژه‌نامه" "میان‌بر:" "زبان:" @@ -114,7 +114,7 @@ با فشار طولانی کلید فاصله، منوی انتخاب روش ورودی را باز می کند ظاهر از تنظیمات سیستم پیروی می‌کند اگر غیرفعال باشد، کلید کلیپ بورد، محتوای خود را در صورت وجود جایگذاری می‌کند - %sدقیقه. + %sدقیقه. ردیف اعداد همیشه ردیف اعداد نشان داده شود روش ورودی را با کلید فاصله تغییر دهید @@ -127,7 +127,7 @@ مقیاس ارتفاع صفحه کلید نمایش اشاره کلید‌ها نمایش اشاره لمس طولانی - %s (حروف) + %s (حروف) حاشیه کلید حالت روز/شب خودکار "لغو" diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 364534bca..be3ca8137 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -16,7 +16,7 @@ "Ota jaettu näppäimistö käyttöön" "Käytä toista syöttötapaa" "Kielenvaihtonäppäin" - "%s ms" + "%s ms" "Järjestelmän oletusarvo" Käytä yhteystietojen nimiä ehdotuksissa ja korjauksissa "Personoidut ehdotukset" @@ -49,8 +49,8 @@ "espanja (Yhdysvallat)" "Hindienglanti" "serbialainen (latinal.)" - "%s (perinteinen)" - "%s (tiivis)" + "%s (perinteinen)" + "%s (tiivis)" "Ei kieltä" "Emoji" "Lisää" @@ -64,18 +64,18 @@ "Hymiö fyysisellä näppäimistöllä" Fyysinen Alt-näppäin näyttää emoji-paletin "Oletusarvot" - "Tervetuloa käyttämään sovellusta %s" + "Tervetuloa käyttämään sovellusta %s" "ja piirtokirjoitus" "Aloita" - "Sovelluksen %s asetukset" - "Ota %s käyttöön" - Valitse%s Kielet ja syöttötapa ‑asetuksissa. Se antaa sovellukselle luvan toimia laitteellasi.\" + "Sovelluksen %s asetukset" + "Ota %s käyttöön" + Valitse%s Kielet ja syöttötapa ‑asetuksissa. Se antaa sovellukselle luvan toimia laitteellasi.\" "Ota käyttöön asetuksissa" - "Siirry sovellukseen %s" - Valitse%s käytössä olevaksi tekstinsyöttötavaksi.\" + "Siirry sovellukseen %s" + Valitse%s käytössä olevaksi tekstinsyöttötavaksi.\" "Vaihda syöttötapaa" "Onneksi olkoon, valmista tuli!" - Nyt voit kirjoittaa kaikki suosikkisovelluksesi %s. + Nyt voit kirjoittaa kaikki suosikkisovelluksesi %s. "Valmis" "Näytä sovelluskuvake" Näytä sovelluskuvake käynnistysohjelmassa @@ -84,7 +84,7 @@ "Päivitetty viimeksi" "Asetukset" "Poista" - "Versio %1$s" + "Versio %1$s" "Lisää sanakirjaan" "Pikanäppäin:" "Kieli:" @@ -140,7 +140,7 @@ Näppäinreunat Automaattinen päivä-/yötila Kielen vaihtonäppäimen toiminta - %s min + %s min Lisää sanat henkilökohtaiseen sanakirjaan Näytä ehdotukset aina Enemmän autom. korjausta diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index 0e1020576..26585ae54 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -22,7 +22,7 @@ Ilipat ang pareho Key sa paglipat ng wika Key ng emoji - %s min + %s min Default ng sistema Walang limitasyon Babala: Ang pag-disable ng setting na ito ay iki-clear ang mga natutong data @@ -50,7 +50,7 @@ Mga Setting ng Spell Checker ng Heliboard Hanapin ang mga pangalan ng contact Mga mungkahi - %s ms + %s ms Gamitin ang pangalan mula sa Mga Contact para sa mungkahi at pagtatama Idagdag ang mga salita sa personal na diksyunaryo Naglalagay ng tuldok na may puwang ang pag-double tap sa spacebar diff --git a/app/src/main/res/values-fr-rCA/strings.xml b/app/src/main/res/values-fr-rCA/strings.xml index 4dd53601d..adc25ab40 100644 --- a/app/src/main/res/values-fr-rCA/strings.xml +++ b/app/src/main/res/values-fr-rCA/strings.xml @@ -16,7 +16,7 @@ "Activer le clavier en deux parties" "Autres modes de saisie" "Touche de sélection de langue" - "%s ms" + "%s ms" "Paramètres par défaut" "Utiliser des noms de contacts pour les suggestions et corrections" "Suggestions personnalisées" @@ -49,8 +49,8 @@ "Espagnol (États-Unis)" "Hinglish" "Serbe (latin)" - "%s (traditionnel)" - "%s (compact)" + "%s (traditionnel)" + "%s (compact)" "Aucune langue" "Emoji" "Ajouter" @@ -64,18 +64,18 @@ "Emoji pour clavier physique" "La touche Alt affiche la palette d\'emoji" "Par défaut" - "Bienvenue dans %s" + "Bienvenue dans %s" "avec la saisie gestuelle" "Commencer" - "Configurer %s" - "Activer %s" - Cochez «%s » dans le menu Langues et méthodes d\'entrée. Cela permettra à l\'application de fonctionner sur votre appareil.\" + "Configurer %s" + "Activer %s" + Cochez «%s » dans le menu Langues et méthodes d\'entrée. Cela permettra à l\'application de fonctionner sur votre appareil.\" "Activer le clavier dans les paramètres" - "Basculer vers %s" - "Sélectionnez ensuite \"%s\" comme mode de saisie actif." + "Basculer vers %s" + "Sélectionnez ensuite \"%s\" comme mode de saisie actif." "Changer de mode de saisie" "Félicitations, l\'opération est terminée" - "Avec %s, vous pouvez saisir du texte dans toutes vos applications préférées." + "Avec %s, vous pouvez saisir du texte dans toutes vos applications préférées." "OK" "Afficher icône application" "Afficher l\'icône de l\'application dans le lanceur" @@ -84,7 +84,7 @@ "Dernière mise à jour" "Paramètres" "Supprimer" - "Version %1$s" + "Version %1$s" "Ajouter au dictionnaire" "Raccourci :" "Langue :" diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 402365bae..c18804969 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -19,7 +19,7 @@ Changer de langue Changer les deux "Touche de sélection de langue" - "%s ms" + "%s ms" "Paramètres par défaut" Utilise les noms de contacts pour les suggestions et les corrections "Suggestions personnalisées" @@ -59,8 +59,8 @@ "Espagnol (États-Unis)" "Hindi/Anglais" "Serbe (latin)" - %s (Traditionnel) - %s (Compact) + %s (Traditionnel) + %s (Compact) "Aucune langue" Émoji "Ajouter" @@ -86,18 +86,18 @@ Émojis pour clavier physique "La touche Alt physique permet d\'afficher la palette d\'emoji" "Par défaut" - Bienvenue sur %s + Bienvenue sur %s "avec la saisie gestuelle" "Commencer" - Configurer %s - Activer %s - Veuillez vérifier que %s est activé dans vos paramètres de langue et de saisie. Cela autorisera son fonctionnement sur votre appareil. + Configurer %s + Activer %s + Veuillez vérifier que %s est activé dans vos paramètres de langue et de saisie. Cela autorisera son fonctionnement sur votre appareil. "Activer le clavier dans les paramètres" - Basculer vers %s - Sélectionnez ensuite « %s » comme méthode de saisie active. + Basculer vers %s + Sélectionnez ensuite « %s » comme méthode de saisie active. "Changer de mode de saisie" Félicitations, l\'opération est terminée ! - Avec %s, vous pouvez saisir du texte dans toutes vos applications préférées. + Avec %s, vous pouvez saisir du texte dans toutes vos applications préférées. Configurer le clavier "OK" "Afficher l\'icône de l\'application" @@ -127,7 +127,7 @@ Nouveau dictionnaire: "Dictionnaire disponible" "Dernière mise à jour" "Supprimer" - Version %1$s + Version %1$s "Ajouter au dictionnaire" "Raccourci :" Poids : @@ -254,8 +254,8 @@ Nouveau dictionnaire: Temps de rétention de l\'historique Si désactivé, l\'appui sur la touche presse-papier collera l’éventuel contenu du presse-papier Activer l\'historique - %smin. - %s (Akkhor) + %smin. + %s (Akkhor) Espace automatique après la ponctuation Insertion automatique d\'un espace après la ponctuation lors de la saisie d\'un nouveau mot Afficher plus de signes diacritiques dans les pop-ups @@ -286,8 +286,8 @@ Nouveau dictionnaire: %s (expérimental) Version Impossible de lire le fichier - %s (Sebeolsik 390) - %s (Sebeolsik Final) + %s (Sebeolsik 390) + %s (Sebeolsik Final) Sens variable de la barre d\'outils Appui long sur la touche des symboles pour afficher le pavé numérique Pavé téléphonique @@ -305,13 +305,13 @@ Nouveau dictionnaire: Balayage vertical de la barre espace Inverser le sens de la barre d\'outils lorsqu\'un clavier droite-gauche est sélectionné Symboles - %s (Étudiant) - %s (Probhat) + %s (Étudiant) + %s (Probhat) Toujours utiliser la suggestion du milieu En appuyant sur espace ou sur un signe de ponctuation, la suggestion du milieu sera saisie Fermer le presse-papiers Sélectionner les touches de la barre d\'outils du presse-papiers - %s (Étendu) + %s (Étendu) Mansi Afficher plus de couleurs Ce paramètre expose toutes les couleurs utilisées en interne. La liste des couleurs peut être modifiée à tout moment. La couleur par défaut est aléatoire et les noms ne seront pas traduits. @@ -382,7 +382,7 @@ Nouveau dictionnaire: Voulez-vous vraiment réinitialiser toutes les icônes personnalisées ? Corbeille Vibrer en mode Ne pas déranger - %s (Phonétique) + %s (Phonétique) Remplacer la version des émojis Dargwa (Urakhi) Correction automatique des raccourcis @@ -404,7 +404,7 @@ Nouveau dictionnaire: Voulez-vous vraiment supprimer %s ? Nom invalide Sous-type personnalisé - %s (Baishakhi) + %s (Baishakhi) Dispositions secondaires Touches fonctionnelles (grand écran) Langues avec dictionnaires diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index b34acf1b1..197b7db35 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -16,7 +16,7 @@ "Activar teclado dividido" "Outros métodos de entrada" "Tecla de cambio de idioma" - "%s ms" + "%s ms" "Predeterminado do sistema" "Utiliza nomes de contactos para as suxestións e correccións" "Suxestións personalizadas" @@ -49,8 +49,8 @@ "Español (EUA)" "Hinglish" "Serbio (alfabeto latino)" - "%s (tradicional)" - "%s (compacto)" + "%s (tradicional)" + "%s (compacto)" "Ningún idioma" "Emoji" "Engadir" @@ -64,18 +64,18 @@ "Emojis para o teclado físico" "A tecla Alt física mostra a paleta de emoji" "Predeterminado" - Ben vida a %s + Ben vida a %s "con escritura por xestos" "Comezar" - "Configurando %s" - "Activar %s" - Comproba a aplicación%s\" na configuración Idioma e introdución de texto para que se poida executar no teu dispositivo.\" + "Configurando %s" + "Activar %s" + Comproba a aplicación%s\" na configuración Idioma e introdución de texto para que se poida executar no teu dispositivo.\" "Activar en Configuración" - "Cambiar a %s" - "A continuación, selecciona \"%s\" como o método de introdución de texto activo." + "Cambiar a %s" + "A continuación, selecciona \"%s\" como o método de introdución de texto activo." "Cambiar métodos de entrada" "Parabéns, está todo listo!" - "Agora podes escribir en todas as túas aplicacións favoritas con %s." + "Agora podes escribir en todas as túas aplicacións favoritas con %s." "Finalizado" "Mostrar icona da aplicación" "Mostra a icona da aplicación no Launcher" @@ -84,7 +84,7 @@ "Última actualización" "Configuración" "Eliminar" - "Versión %1$s" + "Versión %1$s" "Engadir ao dicionario" "Atallo:" "Idioma:" @@ -107,9 +107,9 @@ "Buscar" "Pausa" "Espera" - %s min - %s (Akkhor) - %s (Sebeolsik 390) + %s min + %s (Akkhor) + %s (Sebeolsik 390) %s (experimental) Tamaño: Engadir unha palabra @@ -237,7 +237,7 @@ Espazo reducido entre teclas Escala de altura do teclado Escala do espazo inferior do teclado - %s (Sebeolsik Final) + %s (Sebeolsik Final) Engadir disposición persoal Elixe un ficheiro cun formato compatible. Tes información sobre os formatos en %s. Cargar ficheiro @@ -306,15 +306,15 @@ Mover Cursor Dirección variable barra ferramentas Dirección inversa cando está seleccionado o tipo de teclado de dereita a esquerda - %s (Probhat) - %s (Estudante) + %s (Probhat) + %s (Estudante) Tecla con pulsación longa para teclado numérico Cortar Usar sempre a suxestión do medio Ao premer no espazo ou puntuación, escríbese a suxestión do medio Escoller teclas da barra de ferramentas do portapapeis Pechar historial do portapapeis - %s (Extendido) + %s (Extendido) Mansi Mostrar máis cores Este axuste expón todas as cores que se usan internamente. A lista de cores pode cambiar en calquera momento. A cor por defecto é aleatoria, e os nomes non serán traduciddos. @@ -384,7 +384,7 @@ Papeleira Restablecer todas as iconas personalizadas? Vibrar no modo non molestar - %s (Fonético) + %s (Fonético) Sobrescribir versión Emoji Dargwa (Urakhi) Atallos para autocorrector @@ -408,7 +408,7 @@ Idiomas con dicionarios zona de conversa Podes atopar e compartir disposicións na %s. - %s (Baishakhi) + %s (Baishakhi) Subtipo personalizado Non mostrar sempre suxestións para os campos texto nas webs Os campos de texto nas webs (principalmente no navegador) son causa frecuente de problemas coas suxestións automáticas diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml index 88fd4a48e..c33613888 100644 --- a/app/src/main/res/values-gu/strings.xml +++ b/app/src/main/res/values-gu/strings.xml @@ -16,7 +16,7 @@ "વિભાજિત કીબોર્ડ સક્ષમ કરો" "અન્ય ઇનપુટ પદ્ધતિઓ પર સ્વિચ કરો" "ભાષા સ્વિચ કી" - "%sms" + "%sms" "સિસ્ટમ ડિફોલ્ટ" "સૂચનો અને સુધારાઓ માટે સંપર્કોમાંથી નામોનો ઉપયોગ કરો" "વ્યક્તિગત સૂચનો" @@ -49,8 +49,8 @@ "સ્પેનિશ (US)" "હિંગ્લિશ" "સર્બિયન (લેટિન)" - "%s (પરંપરાગત)" - "%s (કોમ્પેક્ટ)" + "%s (પરંપરાગત)" + "%s (કોમ્પેક્ટ)" "ભાષા નથી" "ઇમોજી" "ઉમેરો" @@ -64,18 +64,18 @@ "ભૌતિક કીબોર્ડ માટે ઇમોજી" "ભૌતિક Alt કી ઇમોજી પેલેટ દર્શાવે છે" "ડિફોલ્ટ" - %s પર સ્વાગત છે\" + %s પર સ્વાગત છે\" "સાંકેતિક ટાઇપિંગ દ્વારા" "પ્રારંભ કરો" - %s સેટ કરી રહ્યું છે\" - %s સક્ષમ કરો\" - "કૃપા કરીને \"%s\" ને તમારી ભાષાઓ અને ઇનપુટ સેટિંગ્સમાં તપાસો. આ તેને તમારા ઉપકરણ પર ચાલવા માટે અધિકૃત કરશે." + %s સેટ કરી રહ્યું છે\" + %s સક્ષમ કરો\" + "કૃપા કરીને \"%s\" ને તમારી ભાષાઓ અને ઇનપુટ સેટિંગ્સમાં તપાસો. આ તેને તમારા ઉપકરણ પર ચાલવા માટે અધિકૃત કરશે." "સેટિંગ્સમાં સક્ષમ કરો" - %s પર સ્વિચ કરો\" - "આગલું, \"%s\" ને તમારા સક્રિય ટેક્સ્ટ-ઇનપુટ પદ્ધતિ તરીકે પસંદ કરો." + %s પર સ્વિચ કરો\" + "આગલું, \"%s\" ને તમારા સક્રિય ટેક્સ્ટ-ઇનપુટ પદ્ધતિ તરીકે પસંદ કરો." "ઇનપુટ પદ્ધતિઓ પર સ્વિચ કરો" "અભિનંદન, તમે બધું સેટ કર્યું છે!" - "હવે તમે તમારી મનપસંદ એપ્લિકેશન્સમાં %s થી ટાઇપ કરી શકો છો." + "હવે તમે તમારી મનપસંદ એપ્લિકેશન્સમાં %s થી ટાઇપ કરી શકો છો." "સમાપ્ત થયું" "ઍપ્લિકેશન આયકન બતાવો" "લોંચરમાં ઍપ્લિકેશન આયકન પ્રદર્શિત કરો" @@ -84,7 +84,7 @@ "છેલ્લે અપડેટ કર્યું" "સેટિંગ્સ" "કાઢી નાખો" - "સંસ્કરણ %1$s" + "સંસ્કરણ %1$s" "શબ્દકોષમાં ઉમેરો" "શોર્ટકટ:" "ભાષા:" diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 4c48fddf7..e6d7ace04 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -16,7 +16,7 @@ "स्प्लिट कीबोर्ड चालू करें" "अन्‍य इनपुट पद्धतियों पर जाएं" "भाषा स्विच कुंजी" - "%s मिलीसेकंड" + "%s मिलीसेकंड" "सिस्टम डिफ़ॉल्ट" "सुझाव और सुधार के लिए संपर्क से नामों का उपयोग करें" "मनमुताबिक सुझाव" @@ -49,8 +49,8 @@ "स्पेनिश (यूएस)" "हिंग्लिश" "सर्बियाई (लैटिन)" - "%s (पारंपरिक)" - "%s (संक्षिप्त)" + "%s (पारंपरिक)" + "%s (संक्षिप्त)" "भाषा उपलब्ध नहीं है" "Emoji" "जोड़ें" @@ -64,18 +64,18 @@ "कीबोर्ड के लिए स्माइलीज़" "भौतिक Alt कुंजी इमोजी पैलेट दिखाती है" "सामान्य" - %s में आपका स्वागत है\" + %s में आपका स्वागत है\" "जेस्चर टाइपिंग के साथ" "आरंभ करें" - %s सेट करना\" - %s को चालू करें\" - "कृपया अपनी भाषा और इनपुट सेटिंग में \"%s\" को सही का निशान लगाकर चुनें. इससे उसे आपके डिवाइस पर चलने की अनुमति मिल जाएगी." + %s सेट करना\" + %s को चालू करें\" + "कृपया अपनी भाषा और इनपुट सेटिंग में \"%s\" को सही का निशान लगाकर चुनें. इससे उसे आपके डिवाइस पर चलने की अनुमति मिल जाएगी." "सेटिंग में चालू करें" - %s पर स्विच करें\" - "इसके बाद, \"%s\" को अपने सक्रिय पाठ-इनपुट के तरीके के तौर पर चुनें." + %s पर स्विच करें\" + "इसके बाद, \"%s\" को अपने सक्रिय पाठ-इनपुट के तरीके के तौर पर चुनें." "इनपुट पद्धतियां स्विच करें" "बधाई हो, आप बिल्कुल तैयार हैं!" - "अब आप %s के साथ अपने सभी पसंदीदा ऐप्स में लिख सकते हैं." + "अब आप %s के साथ अपने सभी पसंदीदा ऐप्स में लिख सकते हैं." "खत्म" "ऐप्लिकेशन का आइकॉन दिखाएं" "लॉन्चर में ऐप आइकॉन दिखाएं" @@ -84,7 +84,7 @@ "आख़री बार अपडेट किया गया" "सेटिंग" "मिटाएं" - "वर्शन %1$s" + "वर्शन %1$s" "शब्दकोश में जोड़ें" "शॉर्टकट:" "भाषा:" diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 5817279a9..2c40c47d5 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -16,7 +16,7 @@ "Omogući razdvojenu tipkovnicu" "Prebaci na druge unose" "Tipka za izmjenjivanje jezika" - "%s ms" + "%s ms" "Zadano sustavom" "Koristi imena iz Kontakata za prijedloge i ispravke" "Prilagođeni prijedlozi" @@ -49,8 +49,8 @@ Španjolski (SAD) "Hinglish" "Srpski (latinica)" - %s (traditionalno) - %s (kompaktno) + %s (traditionalno) + %s (kompaktno) Neodređen jezik "Emoji" "Dodaj" @@ -64,18 +64,18 @@ "Emoji za fizičku tipkovnicu" "Fizička tipka Alt prikazuje paletu emojija" "Zadano" - Dobro došli u %s + Dobro došli u %s "s Pisanjem kretnjama" "Počnite s radom" - Postavljanje aplikacije %s - Aktiviraj %s - Označi „%s” u postavkama jezika i unosa. Time se omogućuje izvođenje aplikacije na uređaju. + Postavljanje aplikacije %s + Aktiviraj %s + Označi „%s” u postavkama jezika i unosa. Time se omogućuje izvođenje aplikacije na uređaju. Aktiviraj u postavkama - Prijeđi na %s - Zatim odaberi „%s” kao aktivan način unosa teksta. + Prijeđi na %s + Zatim odaberi „%s” kao aktivan način unosa teksta. Prijeđi na drugi način unosa Čestitamo, sve je spremno! - Sada možeš pisati u svim svojim omiljenim aplikacijama pomoću aplikacije %s. + Sada možeš pisati u svim svojim omiljenim aplikacijama pomoću aplikacije %s. "Završeno" "Prikaži ikonu aplikacije" "Prikazivanje ikone aplikacije u pokretaču" @@ -84,7 +84,7 @@ "Zadnje ažuriranje" "Postavke" "Izbriši" - Verzija %1$s + Verzija %1$s "Dodaj u rječnik" "Prečac:" "Jezik:" @@ -96,14 +96,14 @@ " ABCČĆDDŽĐEFGHIJKLLJMNNJOPRSŠTUVZŽ" HeliBoard provjera pravopisa Postavke HeliBoard provjere pravopisa - %s (Akkhor) + %s (Akkhor) Prijedlozi Povijest međuspremnika Razno Ispravci Eksperimentalno Tipka za emojije - %s min + %s min Bez ograničenja HeliBoard postavke Unos diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 02e61eb3d..71e01e9c8 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -16,7 +16,7 @@ Kétoldali billentyűzet bekapcsolása "Váltás más beviteli módra" Nyelvkapcsoló gomb - "%s ms" + "%s ms" Rendszer alapértelmezett Névjegyek használata javaslatokhoz és javításokhoz "Testreszabott javaslatok" @@ -49,8 +49,8 @@ Spanyol (amerikai) "Hinglish (hindi-angol)" "Szerb (latin)" - %s (Hagyományos) - %s (Kompakt) + %s (Hagyományos) + %s (Kompakt) "Nincs nyelv" "Hangulatjel" "Hozzáadás" @@ -64,18 +64,18 @@ Hangulatjelek a fizikai billentyűhöz Fizikai Alt gomb megjeleníti a hangulatjel palettát "Alapértelmezett" - Üdvözöljük a %s + Üdvözöljük a %s gesztusokkal történő bevitellel "Első lépések" - Beállítani a %s-t - %s engedélyezése - Ellenőrizze a \"%s\" saját nyelvén a beviteli beállításokban. Ezzel engedélyezheti, hogy fusson a készülékén. + Beállítani a %s-t + %s engedélyezése + Ellenőrizze a \"%s\" saját nyelvén a beviteli beállításokban. Ezzel engedélyezheti, hogy fusson a készülékén. Engedélyezés a Beállításokban - Váltás a %s - Válassza ki a \"%s\" mint aktív szövegbeviteli eszközét. + Váltás a %s + Válassza ki a \"%s\" mint aktív szövegbeviteli eszközét. "Váltás a beviteli módok között" Gratulálunk, minden beállításra került! - Immáron a kedvenc applikációjában gépelhet a %s. + Immáron a kedvenc applikációjában gépelhet a %s. "Befejeződött" "Alkalmazásikon megjelenítése" "Alkalmazásikon megjelenítése az indítóban" @@ -84,7 +84,7 @@ "Legutóbb frissítve" "Beállítások" "Törlés" - Verzió %1$s + Verzió %1$s "Hozzáadás a szótárhoz" "Gyorsparancs:" "Nyelv:" @@ -144,7 +144,7 @@ Bizalom az automata javításban Más appok javaslat tiltó kérelmét figyelmen kívül hagyja (hibákhoz vezethet) Nyelv váltás - %s perc + %s perc Vigyázat: Ezen beállítás kikapcsolása törli az eddigi tanult adatokat Használja az eszköz saját szótárát a megtanult szavak tárolására Mentés vagy visszatöltés fájlból. Figyelem: a visszaállítás felülírja a jelenlegi adatot @@ -225,9 +225,9 @@ Visszavon Helyrehoz Funkcionális gombok mutatása - %s (Akkhor) - %s (Sebeolsik 390) - %s (Sebeolsik Végleges) + %s (Akkhor) + %s (Sebeolsik 390) + %s (Sebeolsik Végleges) Válasszon ki egy kompatibilis formájú fájlt. A formátumokról a következő helyen érhető el információ: %s. Fájl betöltése Fájl nem olvasható diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml index 777d54d84..c18fcff9a 100644 --- a/app/src/main/res/values-hy/strings.xml +++ b/app/src/main/res/values-hy/strings.xml @@ -16,7 +16,7 @@ "Միացնել բաժանված ստեղնաշարը" "Անցնել մուտքագրման այլ եղանակների" "Լեզվի փոխարկման ստեղն" - "%sմվ" + "%sմվ" "Համակարգի լռելյայնները" "Օգտագործել կոնտակտների անունները՝ առաջարկների և ուղղումների համար" "Անհատականացված հուշումներ" @@ -49,8 +49,8 @@ "Իսպաներեն (ԱՄՆ)" "Հինգլիշ" "Սերբերեն (Լատինական)" - "%s (ավանդական)" - "%s (սեղմ)" + "%s (ավանդական)" + "%s (սեղմ)" "Ոչ մի լեզվով" "Զմայլիկներ" "Ավելացնել" @@ -64,18 +64,18 @@ "Ֆիզիկական ստեղնաշարի զմայլիկ" "Alt ստեղնը ցուցադրում է զմայլիկների պնակը" "Լռելյայնը" - "Բարի գալուստ %s" + "Բարի գալուստ %s" "Ժեստային մուտքագրմամբ" "Սկսել" - "Տեղադրվում է %s-ը" - "Միացնել %s-ը" - Նշեք %s» հավելվածը Լեզուների և մուտքագրման կարգավորումներում՝ ձեր սարքում դրա աշխատանքը թույլ տալու համար:\" + "Տեղադրվում է %s-ը" + "Միացնել %s-ը" + Նշեք %s» հավելվածը Լեզուների և մուտքագրման կարգավորումներում՝ ձեր սարքում դրա աշխատանքը թույլ տալու համար:\" "Միացնել կարգավորումներից" - "Փոխարկել %s-ին" - Հաջորդիվ, ընտրեք %s»-ը որպես ձեր ակտիվ տեքստային մուտքագրման եղանակ:\" + "Փոխարկել %s-ին" + Հաջորդիվ, ընտրեք %s»-ը որպես ձեր ակտիվ տեքստային մուտքագրման եղանակ:\" "Փոխարկել մուտքագրման եղանակները" "Շնորհավորում ենք, դուք տեղադրեցիք բոլորը:" - "Այժմ դուք կարող եք մուտքագրել ձեր բոլոր սիրելի հավելվածներում %s-ով:" + "Այժմ դուք կարող եք մուտքագրել ձեր բոլոր սիրելի հավելվածներում %s-ով:" "Ավարտված" "Ցույց տալ հավելվածի պատկերակը" "Ցուցադրել հավելվածի պատկերակը գործարկիչում" @@ -84,7 +84,7 @@ "Վերջին անգամ թարմացվել է" "Կարգավորումներ" "Ջնջել" - "Տարբերակ %1$s" + "Տարբերակ %1$s" "Ավելացնել բառարանում" "Դյուրանցումը՝" "Lեզուն՝" diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 3517f4071..0007f9950 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -16,7 +16,7 @@ "Aktifkan keyboard terpisah" "Beralih ke metode masukan lain" "Tombol pengalih bahasa" - %s md + %s md Sistem bawaan "Menggunakan nama dari Kontak untuk saran dan koreksi" "Saran hasil personalisasi" @@ -49,8 +49,8 @@ "Spanyol (AS)" "Hinglish" "Serbia (Latin)" - %s (Tradisional) - %s (Ringkas) + %s (Tradisional) + %s (Ringkas) "Tidak ada bahasa" "Emoji" "Tambahkan" @@ -64,18 +64,18 @@ "Emoji untuk keyboard fisik" "Tombol Alt fisik menampilkan palet emoji" "Default" - Selamat datang di %s + Selamat datang di %s "dengan Ketikan Gestur" "Memulai" - Menyiapkan %s - Aktifkan %s - Harap periksa \"%s\" di setelan Bahasa masukan Anda. Ini akan mengizinkannya untuk berjalan di perangkat Anda. + Menyiapkan %s + Aktifkan %s + Harap periksa \"%s\" di setelan Bahasa masukan Anda. Ini akan mengizinkannya untuk berjalan di perangkat Anda. "Aktifkan dalam Setelan" - Beralih ke %s - Selanjutnya, pilih \"%s\" sebagai metode input teks aktif Anda. + Beralih ke %s + Selanjutnya, pilih \"%s\" sebagai metode input teks aktif Anda. "Alihkan metode masukan" "Selamat, Anda sudah siap!" - Sekarang Anda bisa mengetik di semua aplikasi favorit Anda dengan %s. + Sekarang Anda bisa mengetik di semua aplikasi favorit Anda dengan %s. "Selesai" "Tampilkan ikon aplikasi" "Menampillkan ikon aplikasi di peluncur" @@ -84,7 +84,7 @@ "Terakhir diperbarui" "Setelan" "Hapus" - Versi %1$s + Versi %1$s "Tambahkan ke kamus" "Pintasan:" "Bahasa:" @@ -103,7 +103,7 @@ Waktu simpan riwayat Tampilkan petunjuk tombol Selalu tampilkan baris angka - %s mnt + %s mnt Pemeriksa Ejaan HeliBoard Pengaturan Pemeriksa Ejaan HeliBoard Baris angka @@ -125,7 +125,7 @@ Mode siang/malam otomatis Tampilan mengikuti pengaturan sistem Jika dinonaktifkan, menekan tombol ikon papan klip akan menempelkan konten yang disalin (jika ada) - %s (Akkhor) + %s (Akkhor) Spasi otomatis setelah tanda baca Otomatis sisipkan spasi setelah tanda baca saat mengetik kata baru Tingkat ketepercayaan koreksi otomatis @@ -186,7 +186,7 @@ Tampilkan petunjuk jika menekan suatu tombol dengan lama memicu fungsi tambahan Sempitkan jarak antara tombol Skala bantalan bawah - %s (Sebeolsik Final) + %s (Sebeolsik Final) Muat file File tidak terbaca Salin tata letak saat ini @@ -197,7 +197,7 @@ Selalu tampilkan saran Pencadangan dan pemulihan Mode satu tangan - %s (Sebeolsik 390) + %s (Sebeolsik 390) Tambahkan tata letak kustom Jarak pisah Abaikan permintaan aplikasi lain untuk menonaktifkan saran (dapat menimbulkan masalah) @@ -305,7 +305,7 @@ Tutup riwayat papan klip Emoji Potong - %s (Probhat) + %s (Probhat) Mansi Tampilkan lebih banyak warna Pendinginan pengetikan cepat @@ -319,7 +319,7 @@ Sesuaikan mata uang Konten disalin Bilah alat pertunjukan otomatis - %s (Student) + %s (Student) Tombol fungsi (Lebih banyak simbol) Selalu gunakan saran pertengahan Saat menekan spasi atau tanda baca, saran tengah akan dimasukkan @@ -327,7 +327,7 @@ Baris bawah papan klip Tetapkan simbol mata uang utama dan hingga 6 simbol mata uang sekunder, dipisahkan dengan spasi Arah bilah alat variabel - %s (Diperluas) + %s (Diperluas) Memuat Simpan ke file Tampilkan bilah alat jika input dimulai atau teks dipilih @@ -339,7 +339,7 @@ Sematkan tombol bilah alat saat ditekan lama Ini akan menonaktifkan tindakan tekan lama lainnya untuk tombol bilah alat yang tidak disematkan Tekan lama tombol simbol untuk papan nomor - %s (Fonetik) + %s (Fonetik) Ganti versi Emoji Kode tekan lama Dargwa (Urakhi) @@ -398,7 +398,7 @@ Bagian Diskusi PERINGATAN: Tata letak sedang digunakan saat ini Kunci fungsional (layar besar) - %s (Baishakhi) + %s (Baishakhi) Anda dapat menemukan dan berbagi tata letak di %s. Aktifkan keyboard terpisah (lanskap) Jarak pisah (lanskap) diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 920d25dec..cf987ff2a 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -16,7 +16,7 @@ "Virkja skipt lyklaborð" "Skipta um innsláttaraðferð" "Lykill til að breyta tungumáli" - %s msek + %s msek Sjálfgefið í kerfi "Nota nöfn úr tengiliðum fyrir tillögur og leiðréttingar" "Persónulegar tillögur" @@ -49,8 +49,8 @@ "Spænskt (US)" "Hinglish" "Serbneskt (latneskt)" - "%s (hefðbundið)" - "%s (lítið)" + "%s (hefðbundið)" + "%s (lítið)" "Ekkert tungumál" Tjáningartákn "Bæta við" @@ -64,18 +64,18 @@ Tjáningartákn fyrir vélbúnaðarlyklaborð Alt-lykillinn á lyklaborðinu birtir töflu yfir tjáningartákn "Sjálfgefið" - "Velkomin(n) í %s" + "Velkomin(n) í %s" "með bendingainnslætti" "Hefjast handa" - "Uppsetning %s" - "Virkjaðu %s" - Merktu við %s“ í stillingum tungumálsins þíns og innsláttar. Þetta veitir því heimild til að keyra í tækinu.\" + "Uppsetning %s" + "Virkjaðu %s" + Merktu við %s“ í stillingum tungumálsins þíns og innsláttar. Þetta veitir því heimild til að keyra í tækinu.\" "Virkja í stillingum" - "Skiptu yfir í %s" - Næst skaltu velja %s“ sem virka innsláttaraðferð fyrir texta.\" + "Skiptu yfir í %s" + Næst skaltu velja %s“ sem virka innsláttaraðferð fyrir texta.\" "Skipta um innsláttaraðferð" "Til hamingju, allt er klárt!" - Nú geturðu notað%s til að skrifa í öllum uppáhaldsforritunum þínum. + Nú geturðu notað%s til að skrifa í öllum uppáhaldsforritunum þínum. "Lokið" "Sýna forritstákn" "Sýna forritstákn í ræsiforritinu" @@ -84,7 +84,7 @@ "Síðast uppfært" "Stillingar" "Eyða" - "Útgáfa %1$s" + "Útgáfa %1$s" Bæta við orðasafni Stytting: "Tungumál:" @@ -157,10 +157,10 @@ Síða upp Síða niður Loka klippispjaldsferli - %s (viðaukið) - %s (Akkhor) + %s (viðaukið) + %s (Akkhor) Nótt - %s (hljóðfræðitákn) + %s (hljóðfræðitákn) Hlaða Vista í skrá Afrita á klippispjald @@ -180,9 +180,9 @@ Get ekki lesið skrá Hlaða inn skrá Kaitag - %s (Sebeolsik 390) - %s (Probhat) - %s (Sebeolsik Final) + %s (Sebeolsik 390) + %s (Probhat) + %s (Sebeolsik Final) Setja bakgrunnsmynd (lárétt) Stilla lyklaborðið %s (á tilraunastigi) @@ -210,7 +210,7 @@ Sérsniðinn texti á bilslá Birta verkfærastiku sjálfvirkt Jaðrar lykla - %s mín + %s mín Hegðun lykils til að breyta tungumáli Engin takmörk Dekkra @@ -304,7 +304,7 @@ Sérsníða lyklakóða verkfærastiku Fela verkfærastiku sjálfvirkt Tími sem á að geyma breytingaferil - %s (námsmanna) + %s (námsmanna) Sjálfvirkt bil á eftir greinamerkjum Velja sérsniðið letur úr skrá Veldu uppruna ábendinga diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 696d6438c..146931a9e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -16,7 +16,7 @@ Tastiera divisa Cambia tastiera Tasto \'Cambia lingua\' - "%s ms" + "%s ms" "Predefinito" Utilizza i nomi dei contatti per suggerimenti e correzioni "Suggerimenti personalizzati" @@ -49,8 +49,8 @@ Spagnolo (Stati Uniti) "Hinglish" Serbo (Latino) - %s (tradizionale) - %s (compatto) + %s (tradizionale) + %s (compatto) "Nessuna lingua" "Emoji" "Aggiungi" @@ -64,18 +64,18 @@ Tasto fisico per passare alle emoji Il tasto ALT di una tastiera collegata apre il pannello emoji "Predefinito" - Benvenuto in %s + Benvenuto in %s con digitazione gestuale "Inizia" - Configura %s - Attiva %s - Scegli %s nelle impostazioni \'Lingua e immissione\' per autorizzare l\'app. + Configura %s + Attiva %s + Scegli %s nelle impostazioni \'Lingua e immissione\' per autorizzare l\'app. Attiva nelle impostazioni - Passa a %s - Infine, attiva %s come metodo di immissione di testo. + Passa a %s + Infine, attiva %s come metodo di immissione di testo. "Cambia metodo di immissione" Tutto pronto! - Puoi usare %s per digitare in qualsiasi app. + Puoi usare %s per digitare in qualsiasi app. Fine Mostra l\'icona dell\'app Mostra HeliBoard tra le app di Android @@ -84,7 +84,7 @@ "Ultimo aggiornamento" "Impostazioni" "Elimina" - Versione %1$s + Versione %1$s "Aggiungi al dizionario" "Scorciatoia:" "Lingua:" @@ -99,7 +99,7 @@ Altri tasti Aggiunge automaticamente uno spazio dopo ogni parola seguita da punteggiatura Cronologia appunti - %s min + %s min Nessun limite Attiva la cronologia appunti Se disattivata, il tasto \'Appunti\' incolla direttamente l\'ultimo contenuto @@ -116,7 +116,7 @@ Suggerisce in piccolo sul tasto il carattere ottenibile con la pressione lunga Cambia metodo di immissione con la barra spaziatrice Premendo a lungo la barra spaziatrice si attiva il menu di selezione del metodo di immissione - %s (Akkhor) + %s (Akkhor) Il tema seguirà le impostazioni di sistema Tasti aggiuntivi Correzioni @@ -206,8 +206,8 @@ Layout Correzione automatica anche quando non è esplicitamente richiesta dal campo di input Cambia entrambi - %s (tipo tastiera Sebeolsik 390) - %s (Tipo tastiera Sebeolsik Final) + %s (tipo tastiera Sebeolsik 390) + %s (Tipo tastiera Sebeolsik Final) Chiaro Imposta un\'immagine di sfondo Altri simboli @@ -296,13 +296,13 @@ Tastierino numerico (orizzontale) Tastierino numerico Simboli telefono - %s (studenti) + %s (studenti) Kaitag Scorrimento verticale sulla barra spaziatrice Nessuno Scorrimento orizzontale sulla barra spaziatrice Sposta il cursore - %s (Probhat) + %s (Probhat) Pressione lunga sul tasto simboli per aprire il tastierino numerico Taglia Inverte la direzione quando la tastiera è di tipo destra-sinistra @@ -317,7 +317,7 @@ Nasconde la barra degli strumenti quando è possibile mostrare le parole suggerite Mostra automaticamente la barra degli strumenti Le azioni alternative su pressione lunga saranno disponibili solo sui tasti già fissati - %s (Extended) + %s (Extended) Tasti funzione (Simboli) Tasti funzione (Altri simboli) Barra degli strumenti @@ -384,7 +384,7 @@ Vuoi davvero resettare tutte le icone personalizzate? Elimina parola dal dizionario utente Vibrazione attiva in modalità \'Non disturbare\' - %s (Fonetico) + %s (Fonetico) Forza la versione delle emoji Dargwa (Urakhi) Tastiera divisa (orizzontale) @@ -408,7 +408,7 @@ Nome non valido Distanza del trascinamento per il cambio lingua Sotto-tipo personalizzato - %s (Baishakhi) + %s (Baishakhi) Attenzione: il layout è in uso Lingue con dizionari discussione dedicata diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 6173e61ef..3c88a1498 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -16,7 +16,7 @@ הפעלת מקלדת מפוצלת "עבור לשיטות קלט אחרות" "מתג החלפת שפה" - "%s אלפ\' שניה" + "%s אלפ\' שניה" "ברירת מחדל של המערכת" השתמש בשמות מרשימת אנשי הקשר עבור הצעות ותיקונים "הצעות מותאמות אישית" @@ -49,8 +49,8 @@ "ספרדית (ארצות הברית)" "אנגלית הודית" "סרבית (באותיות לטיניות)" - "%s (מסורתית)" - "%s (קומפקטית)" + "%s (מסורתית)" + "%s (קומפקטית)" "ללא שפה" "אמוג\'י" "הוסף" @@ -64,18 +64,18 @@ "אמוג\'י בשביל מקלדת פיזית" "‏מקש Alt הפיזי מציג את לוח סמלי האמוג\'י" "ברירת מחדל" - "ברוכים הבאים אל %s" + "ברוכים הבאים אל %s" "עם הקלדה רציפה" "תחילת העבודה" - "הגדרת %s" - "הפעל את %s" - "סמן את \"%s\" בהגדרות השפה והקלט שלך. פעולה זו תאפשר לה לפעול במכשיר." + "הגדרת %s" + "הפעל את %s" + "סמן את \"%s\" בהגדרות השפה והקלט שלך. פעולה זו תאפשר לה לפעול במכשיר." "הפעל בהגדרות" - "עבור אל %s" - בשלב הבא, יש לבחור ב-\"%s\" כשיטת ההזנה הפעילה להזנת מלל. + "עבור אל %s" + בשלב הבא, יש לבחור ב-\"%s\" כשיטת ההזנה הפעילה להזנת מלל. החלפת שיטת הזנה "ברכותינו, הכל מוכן!" - "כעת תוכל להקליד בכל האפליקציות המועדפות עליך באמצעות %s." + "כעת תוכל להקליד בכל האפליקציות המועדפות עליך באמצעות %s." "סיום" "הצג את סמל האפליקציה" "הצג את סמל האפליקציה במפעיל" @@ -84,7 +84,7 @@ "עודכן לאחרונה" "הגדרות" "מחק" - "גרסה %1$s" + "גרסה %1$s" הוספה למילון "קיצור דרך:" "שפה:" @@ -95,7 +95,7 @@ "עוד שפות…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" ללא גבול - %smin + %smin הפעל את היסטוריית הלוח אם מושבת, לוח מקשים ידביק את תוכן הלוח אם קיים שמירת זמן היסטוריה @@ -110,7 +110,7 @@ הגדרות בודק האיות של HeliBoard שינוי שיטת ההזנה על-ידי מקש רווח מקש אמוג\'י - %s (תווים) + %s (תווים) בודק האיות של HeliBoard היסטוריית הלוח רווח אוטומטי לאחר סימני פיסוק @@ -351,12 +351,12 @@ הצגת המילה המוצעת תוך כדי מחווה משך הצגת עקבת נתיב המחווה תזוזת התצוגה המקדימה תוך כדי מחווה - %s (Extended) - %s (Sebeolsik Final) + %s (Extended) + %s (Sebeolsik Final) ◄ לחיצה ממושכת על כפתורי סרגל הכלים מאפשרת פונקציונליות נוספת: <br> \n\t• לוח &#65515; הדבקה <br> \n\t• תזוזה שמאלה/ימינה &#65515; מילה שמאלה/ימינה <br> \n\t• תזוזה למעלה/למטה &#65515; דף למעלה/למטה <br> \n\t• מילה שמאלה/ימינה &#65515; תחילת שורה/סוף שורה <br> \n\t• דף למעלה/למטה &#65515; תחילת דף/סוף דף <br> \n\t• העתקה &#65515; גזירה <br> \n\t• בחירת מילה &#8596; בחירת הכל <br> \n\t• ביטול &#8596; ביצוע בשנית <br> <br> \n◄ לחיצה ממושכת על כפתורים בסרגל ההצעות של סרגל הכלים נועצת אותם בסרגל ההצעות. <br> <br> \n◄ לחיצה ממושכת על מקש פסיק לגישה לתצוגת הלוח, תצוגת אימוג\'ים, מצב עבודה ביד אחת, הגדרות, או מעבר שפה: <br> \n\t• תצוגת אימוג\'ים ומעבר שפה לא יוצגו אם הכפתורים המתאימים כבר מוצגים; <br> \n\t• בחלק מהפריסות האפשרות איננה במקש הפסיק, אלא במקש המוצג באותו מקום (לדוגמה, בפריסת Dvorak התו \'q\'). <br> <br> \n◄ כאשר מצב פרטיות מופעל, לא יילמדו כלל מילים, ולא יתווספו אימוג\'ים ל\'בשימוש לאחרונה\'. <br> <br> \n◄ ליחצו על סמל הפרטיות לגישה לסרגל הכלים. <br> <br> \n◄ הקלדה בהחלקה: החליקו מ-shift למקש אחר כדי להקיש אות גדולה יחידה: <br> \n\t• זה עובד באופן דומה גם למקש \'?123\' להקלדת סימן יחיד מלוח הסמלים, ולמקשים קשורים. <br> <br> \n◄ ליחצו על shift או על מקש הסמלים, ליחצו על מקש אחד או יותר, ואז הרפו מ-shift או ממקש הסמלים לחזרה למקלדת הקודמת. <br> <br> \n◄ לחיצה ממושכת על הצעה בסרגל ההצעות להצגת הצעות נוספות, ומקש מחיקה להסרת הצעה זו. <br> <br> \n◄ החליקו למעלה מהצעה לפתיחת הצעות נוספות, והרפו על ההצעה הרצויה לבחירתה. <br> <br> \n◄ לחיצה ממושכת על רשומה בהיסטוריית הלוח לנעיצתה (שמירתה בלוח עד לביטול הנעיצה). <br> <br> \n◄ החלקה שמאלה על רשומה בתצוגת הלוח להסרתה מהלוח (אם היא לא נעוצה) <br> <br> \n◄ בחירת מלל ולחיצה על shift למעבר בין אותיות גדולות, אותיות קטנות ורישיות מילים גדולות. <br> <br> \n◄ ניתן להוסיף מילונים ע\"י פתיחתם באמצעות יישום סייר קבצים: <br> \n\t• פועל רק עם <i>content-uris</i> ולא עם <i>file-uris</i>, ז\"א שזה עלול שלא לעבוד בחלק מיישומי סייר קבצים. <br> <br> \n◄ משתמשים המבצעים גיבויים ידניים עם הרשאת גישה root: <br> \n\t• החל באנדרואיד 7, קובץ ההעדפות המשותף איננו בנתיב ברירת המחדל, כיוון שהיישום עושה שימוש ב %s. הדבר נחוץ כדי שההגדרות יהיו קריאות לפני שהמכשיר נפתח, לדוגמה: בהפעלה; <br> \n\t• הקובץ ממוקם בנתיב /data/user_de/0/package_id/shared_prefs/ אך זה עשוי להשתנות בתלות בגירסאות המכשיר ומערכת אנדרואיד. <br> <br> \n<i><b>Debug mode / debug APK</b></i> <br> <br> \n◄ לחיצה ממושכת על הצעה להצגת מילון המקור. <br> <br> \n◄ בשימוש ב-debug APK, באפשרותך למצוא את הגדרות ה-Debug Settings בהעדפות המתקדמות,אך השימושיות מוגבלת למעט dumping של מילונים ליומן (log). <br> \n\t• עבור APK רשמי, עליך ללחוץ על הגירסה <i>About</i> מספר פעמים, ואז ניתן למצוא אתהגדרות ה-debug ב-<i>העדפות מתקדמות</i>. <br> \n\t• כאשר מופעלת <i>הצגת מידע על הצעות</i>, יוצגו מספרים זעירים בסמוך להצעות המייצגים דירוג פנימי ומילון מקור. <br> <br> \n◄ במקרה של קריסת יישום, תוצג לך שאלה האם ברצונך ביומני הקריסה בפתיחת ההגדרות. <br> <br> \n◄ בעת שימוש בהקלדה מרובת שפות, מקש הרווח יציג מדד אמון המשמש לברירת השפה שבשימוש כעת. <br> <br> \n◄ בסמוך להצעות יוצגו מספרים זעירים המייצגים דירוג פנימי ומילון מקור (התצוגה ניתנת להשבתה). - %s (Probhat) - %s (Sebeolsik 390) - %s (Student) + %s (Probhat) + %s (Sebeolsik 390) + %s (Student) סגנון הסמלים שורת המספרים מלל מותאם על מקש הרווח @@ -383,7 +383,7 @@ תו בלתי-מחבר ברוחב אפס האם באמת ברצונך למחוק את כל הסמלים המותאמים? רטט במצב נא לא להפריע - %s (פונטי) + %s (פונטי) עקיפת גירסת אמוג\'י האם למחוק את כל קודי המקשים המותאמים? קיצורי דרך של תיקון שגיאות אוטומטי @@ -403,7 +403,7 @@ מקלדת מפוצלת השם אינו תקף תת-סוג מותאם - %s (באישאקי) + %s (באישאקי) התרעה: הפריסה בשימוש כעת מקשים פונקציונליים (מסך גדול) דרגווה (אוראקי) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index c9e0618a6..84560bdce 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -16,7 +16,7 @@ "スプリットキーボードを有効にする" "他の入力方法に切り替え" "言語切り替えキー" - "%sミリ秒" + "%sミリ秒" "システムのデフォルト" "連絡先の名前を使用して候補表示や自動修正を行う" "入力候補のカスタマイズ" @@ -49,8 +49,8 @@ "スペイン語 (米国)" "ヒングリッシュ" "セルビア語(ラテン文字)" - "%s(伝統言語)" - "%s(コンパクト)" + "%s(伝統言語)" + "%s(コンパクト)" "言語なし(アルファベット)" "絵文字" "追加" @@ -64,18 +64,18 @@ "物理キーボードの絵文字" "物理Altキーによって絵文字パレットが表示されます" "デフォルト" - %sへようこそ\" + %sへようこそ\" "新しいジェスチャー入力をお試しください" "開始" - %sの設定\" - %sの有効化\" - [言語と入力] 設定で%s」のチェックボックスをオンにしてください。これで、このデバイスで利用できるようになります。\" + %sの設定\" + %sの有効化\" + [言語と入力] 設定で%s」のチェックボックスをオンにしてください。これで、このデバイスで利用できるようになります。\" "設定での有効化" - %sへの切り替え\" - 次に、有効なテキスト入力方法として%s」を選択します。\" + %sへの切り替え\" + 次に、有効なテキスト入力方法として%s」を選択します。\" "入力方法を切り替える" "設定完了" - "これで、お気に入りのすべてのアプリで%sを使用して入力できます。" + "これで、お気に入りのすべてのアプリで%sを使用して入力できます。" "完了" "アプリアイコンを表示" "ランチャーにアプリアイコンを表示します" @@ -84,7 +84,7 @@ "最終更新" "設定" "削除" - "バージョン%1$s" + "バージョン%1$s" "辞書に追加" "ショートカット:" "言語:" diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 88212abef..b4f2ccdb4 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -16,7 +16,7 @@ "გაყოფილი კლავიატურის გააქტიურება" "შეყვანის სხვა მეთოდებზე გადართვა" "ენის გადართვის კლავიში" - "%sმწმ" + "%sმწმ" "სისტემის ნაგულისხმევი" "კონტაქტებიდან სახელების გამოყენება შეთავაზებებისთვის და კორექციისთვის" "პერსონალიზებული შეთავაზებები" @@ -49,8 +49,8 @@ "ესპანური (აშშ)" "ჰინგლისური" "სერბული (ლათინური)" - %s (ტრადიციული) - %s (კომპაქტური) + %s (ტრადიციული) + %s (კომპაქტური) "ენის გარეშე" "სიცილაკები" "დამატება" @@ -64,18 +64,18 @@ "სიცილაკები ფიზიკური კლავიატურისთვის" "ფიზიკური ღილაკი Alt აჩვენებს სიცილაკების პალიტრას" "ნაგულისხმევი" - მოგესალმებათ %s + მოგესალმებათ %s "ჟესტებით წერით" "დაწყება" - %s-ის მორგება - %s-ის ჩართვა - შეყვანის პარამეტრებში გადაამოწმეთ %s&. ეს თქვენს მოწყობილობაზე გაშვების ავტორიზაციას მოგცემთ. + %s-ის მორგება + %s-ის ჩართვა + შეყვანის პარამეტრებში გადაამოწმეთ %s&. ეს თქვენს მოწყობილობაზე გაშვების ავტორიზაციას მოგცემთ. "პარამეტრებში გააქტიურება" - გადაერთეთ %s-ზე - შემდეგ, აირჩიეთ „%s“ თქვენს აქტიურ შეყვანის მეთოდად. + გადაერთეთ %s-ზე + შემდეგ, აირჩიეთ „%s“ თქვენს აქტიურ შეყვანის მეთოდად. "შეყვანის მეთოდების გადართვა" "გილოცავთ, პროცესი დასრულდა!" - ახლა თქვენს საყვარელ აპებში შეგიძლიათ %s-ით აკრიფოთ. + ახლა თქვენს საყვარელ აპებში შეგიძლიათ %s-ით აკრიფოთ. "დასრულებული" "აპის ხატულის ჩვენება" "აპის ხატულის ჩვენება გამშვებში" @@ -84,7 +84,7 @@ "ბოლო განახლება" "პარამეტრები" "წაშლა" - ვერსია %1$s + ვერსია %1$s "ლექსიკონში დამატება" "მალსახმობი:" "ენა:" @@ -103,7 +103,7 @@ პუნქტუაციის შემდეგ ადგილის ავტომტური გამოტოვება ახალი სიტყვის დაწყებისას პუნქტუაციის შემდეგ გამოტოვების ავტომატური ჩასმა ციფრებანი მწკრივი - %s (აკხორი) + %s (აკხორი) გარეგნობა სისტემურ პარამეტრებს დაეყრდნობა ბუფერის ისტორია შესწორებები @@ -126,7 +126,7 @@ მინიშნებები ექსპერიმენტალური რიცხვებიანი მწკრივის ყოველთვის ჩვენება - %sწთ. + %sწთ. ისტორიის შენახვის დრო მეტი ღილაკი კლავიატურის სიმაღლის მასშტაბი diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index f9d088583..f95060178 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -53,7 +53,7 @@ Agemmay alatini (AZERTY) Agemmay alatini (Colemak) Fren tarrayt n usekcem - %s ms + %s ms Ulac tilisa Amawal udmawan Aseɣti awurman diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index 9af388696..11250f354 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -16,7 +16,7 @@ "Бөлінген пернетақтаны қосу" "Басқа енгізу әдістеріне ауыстырыңыз" "Тілді ауыстыру пернесі" - "%sмс" + "%sмс" "Жүйенің әдепкі мәні" "Ұсыныстар мен түзетулер үшін контакт аттарын пайдалану" "Жекелендірілген ұсыныстар" @@ -49,8 +49,8 @@ "Испан (АҚШ)" "Хинглиш" "Серб (латын жазуы)" - "%s (дәстүрлі)" - "%s (шағын)" + "%s (дәстүрлі)" + "%s (шағын)" "Тіл жоқ" "Эмодзи" "Қосу" @@ -64,18 +64,18 @@ "Қатты пернетақтадан енгізілетін эмодзи" "Alt пернесі арқылы эмодзилерді ашуға болады" "Әдепкі" - %s қолданбасына қош келдіңіз\" + %s қолданбасына қош келдіңіз\" "Қимылмен теру арқылы" "Іске қосылды" - %s орнату\" - %s қосу\" - "\"Тілдер және енгізу\" параметрлерінде %s қолданбасына құсбелгі қойыңыз. Сонда оны құрылғыңызда қолдануға рұқсат беріледі." + %s орнату\" + %s қосу\" + "\"Тілдер және енгізу\" параметрлерінде %s қолданбасына құсбелгі қойыңыз. Сонда оны құрылғыңызда қолдануға рұқсат беріледі." "Параметрлер ішінде қосу" - %s қолданбасына ауыстыру\" - "Одан кейін \"%s\" қолданбасын белсенді мәтінді енгізу әдісі ретінде таңдаңыз." + %s қолданбасына ауыстыру\" + "Одан кейін \"%s\" қолданбасын белсенді мәтінді енгізу әдісі ретінде таңдаңыз." "Енгізу әдістерін ауыстыру" "Құттықтаймыз, барлығы дайын!" - "Қазір барлық таңдаулы қолданбаларда %s арқылы теруге болады." + "Қазір барлық таңдаулы қолданбаларда %s арқылы теруге болады." "Аяқталған" "Қолданба белгішесін көрсету" "Іске қосу құралында қолданба белгішесін көрсету" @@ -84,7 +84,7 @@ "Соңғы жаңартылған" "Параметрлер" "Жою" - "%1$s нұсқасы" + "%1$s нұсқасы" "Сөздікке қосу" "Пернелер тіркесімі:" "Тіл:" diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml index e312c3c62..f7458e425 100644 --- a/app/src/main/res/values-km/strings.xml +++ b/app/src/main/res/values-km/strings.xml @@ -17,7 +17,7 @@ "បើក​ការ​បំបែក​ក្ដារចុច" "ប្ដូរ​ទៅ​​​វិធីសាស្ត្រ​បញ្ចូល​​​ផ្សេង​ទៀត" "គ្រាប់​ចុច​ប្ដូរ​​ភាសា" - "%s មិល្លី​វិនាទី" + "%s មិល្លី​វិនាទី" "លំនាំ​ដើម​​​ប្រព័ន្ធ" "ប្រើ​ឈ្មោះ​ពី​ទំនាក់ទំនង​សម្រាប់​ការ​​ស្នើ និង​​​កែ" "ការ​ស្នើ​ផ្ទាល់​ខ្លួន" @@ -50,8 +50,8 @@ "អេស្ប៉ាញ (សហរដ្ឋ​អាមេរិក​)" "Hinglish" "សើប (ឡាតាំង​)" - "%s (អក្សរ​ពេញ)" - "%s (បង្រួម)" + "%s (អក្សរ​ពេញ)" + "%s (បង្រួម)" "គ្មាន​ភាសា" "សញ្ញា​អារម្មណ៍" "បន្ថែម" @@ -65,18 +65,18 @@ "សញ្ញាអារម្មណ៍សម្រាប់ក្តារចុចពិតប្រាកដ" "គ្រាប់ចុច Alt បង្ហាញផ្ទាំងសញ្ញាអារម្មណ៍" "លំនាំដើម" - "សូម​ស្វាគមន៍​មក​កាន់ %s" + "សូម​ស្វាគមន៍​មក​កាន់ %s" "ជាមួយ​​​ការ​វាយ​បញ្ចូល​ដោយ​ប្រើ​​​កាយវិការ" "បាន​ចាប់ផ្ដើម" - "រៀបចំ %s" - "បើក %s" - "សូមពិនិត្យ \"%s\" ក្នុងការកំណត់ភាសា និងបញ្ចូលរបស់អ្នក។ វានឹងផ្តល់សិទ្ធិឲ្យកម្មវិធីនេះដំណើរការនៅលើឧបករណ៍របស់អ្នក។" + "រៀបចំ %s" + "បើក %s" + "សូមពិនិត្យ \"%s\" ក្នុងការកំណត់ភាសា និងបញ្ចូលរបស់អ្នក។ វានឹងផ្តល់សិទ្ធិឲ្យកម្មវិធីនេះដំណើរការនៅលើឧបករណ៍របស់អ្នក។" "បើក​នៅ​ក្នុង​ការ​កំណត់" - "ប្ដូរ​ទៅ %s" - "បន្ទាប់ ជ្រើស \"%s\" ជា​វិធី​សាស្ត្រ​បញ្ចូល​អត្ថបទ​សកម្ម​របស់​អ្នក។" + "ប្ដូរ​ទៅ %s" + "បន្ទាប់ ជ្រើស \"%s\" ជា​វិធី​សាស្ត្រ​បញ្ចូល​អត្ថបទ​សកម្ម​របស់​អ្នក។" "ប្ដូរ​វិធីសាស្ត្រ​បញ្ចូល" "សូម​អបអរ​សាទរ,​ អ្នក​​បាន​កំណត់​​រួចរាល់​ហើយ!" - "ឥឡូវ​​អ្នក​អាច​​វាយ​បញ្ចូល​នៅ​ក្នុង​​កម្មវិធី​​ពេញ​ចិត្ត​របស់​អ្នក​ទាំងអស់​ជាមួយ %s ។" + "ឥឡូវ​​អ្នក​អាច​​វាយ​បញ្ចូល​នៅ​ក្នុង​​កម្មវិធី​​ពេញ​ចិត្ត​របស់​អ្នក​ទាំងអស់​ជាមួយ %s ។" "បាន​បញ្ចប់" "បង្ហាញ​រូប​កម្មវិធី" "បង្ហាញ​រូប​កម្មវិធី​នៅ​ក្នុង​កម្ម​​វិធី​ចាប់ផ្ដើម" @@ -85,7 +85,7 @@ "បាន​ធ្វើ​បច្ចុប្បន្នភាព​ចុងក្រោយ" "ការ​កំណត់" "លុប" - "កំណែ %1$s" + "កំណែ %1$s" "បន្ថែម​ទៅ​វចនានុក្រម" "ផ្លូវកាត់​៖" "ភាសា៖" diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml index 3db3e406b..da525a771 100644 --- a/app/src/main/res/values-kn/strings.xml +++ b/app/src/main/res/values-kn/strings.xml @@ -16,7 +16,7 @@ "ಬೇರ್ಪಡೆ ಕೀಬೋರ್ಡ್ ಸಕ್ರಿಯಗೊಳಿಸಿ" "ಇತರೆ ಇನ್‌ಪುಟ್ ವಿಧಾನಗಳಿಗೆ ಬದಲಾಯಿಸು" "ಭಾಷೆ ಬದಲಾವಣೆ ಕೀ" - "%sಮಿ.ಸೆ." + "%sಮಿ.ಸೆ." "ಸಿಸ್ಟಂ ಡಿಫಾಲ್ಟ್" "ಸಲಹೆಗಳು ಮತ್ತು ತಿದ್ದುಪಡಿಗಳಿಗಾಗಿ ಸಂಪರ್ಕಗಳಲ್ಲಿನ ಹೆಸರುಗಳನ್ನು ಬಳಸಿ" "ವೈಯುಕ್ತೀಕರಿಸಿದ ಸಲಹೆಗಳು" @@ -49,9 +49,9 @@ "ಸ್ಪ್ಯಾನಿಷ್ (US)" "ಹಿಂಗ್ಲಿಷ್" "ಸರ್ಬಿಯನ್ (ಲ್ಯಾಟಿನ್)" - "%s (ವಿಸ್ತರಿಸಲಾಗಿದೆ)" - "%s (ಸಾಂಪ್ರದಾಯಿಕ)" - "%s (ಕಾಂಪ್ಯಾಕ್ಟ್‌‌)" + "%s (ವಿಸ್ತರಿಸಲಾಗಿದೆ)" + "%s (ಸಾಂಪ್ರದಾಯಿಕ)" + "%s (ಕಾಂಪ್ಯಾಕ್ಟ್‌‌)" "ಯಾವುದೇ ಭಾಷೆಯಿಲ್ಲ" "ಎಮೋಜಿ" "ಸೇರಿಸು" @@ -65,18 +65,18 @@ "ಭೌತಿಕ ಕೀಬೋರ್ಡ್‌ಗೆ ಎಮೋಜಿ" "ಭೌತಿಕ Alt ಕೀ ಎಮೋಜಿ ಪ್ಯಾಲೆಟ್ ತೋರಿಸುತ್ತದೆ" "ಡಿಫಾಲ್ಟ್" - %s ಗೆ ಸುಸ್ವಾಗತ\" + %s ಗೆ ಸುಸ್ವಾಗತ\" "ಗೆಶ್ಚರ್ ಟೈಪಿಂಗ್‌ನೊಂದಿಗೆ" "ಪ್ರಾರಂಭ" - %s ಅನ್ನು ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ\" - %s ಸಕ್ರಿಯಗೊಳಿಸಿ\" - "ನಿಮ್ಮ ಭಾಷೆಗಳು & ಇನ್‌ಪುಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ದಯವಿಟ್ಟು \"%s\" ಅನ್ನು ಪರಿಶೀಲಿಸಿ. ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಅದನ್ನು ರನ್ ಮಾಡಲು ಅದು ಅನುಮತಿ ನೀಡುತ್ತದೆ." + %s ಅನ್ನು ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ\" + %s ಸಕ್ರಿಯಗೊಳಿಸಿ\" + "ನಿಮ್ಮ ಭಾಷೆಗಳು & ಇನ್‌ಪುಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ದಯವಿಟ್ಟು \"%s\" ಅನ್ನು ಪರಿಶೀಲಿಸಿ. ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಅದನ್ನು ರನ್ ಮಾಡಲು ಅದು ಅನುಮತಿ ನೀಡುತ್ತದೆ." "ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸು" - %s ಗೆ ಬದಲಾಯಿಸಿ\" - "ಮುಂದೆ, ನಿಮ್ಮ ಸಕ್ರಿಯ ಪಠ್ಯ-ಇನ್‌ಪುಟ್ ವಿಧಾನವಾಗಿ \"%s\" ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ." + %s ಗೆ ಬದಲಾಯಿಸಿ\" + "ಮುಂದೆ, ನಿಮ್ಮ ಸಕ್ರಿಯ ಪಠ್ಯ-ಇನ್‌ಪುಟ್ ವಿಧಾನವಾಗಿ \"%s\" ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ." "ಇನ್‌ಪುಟ್ ವಿಧಾನಗಳನ್ನು ಬದಲಾಯಿಸು" "ಅಭಿನಂದನೆಗಳು, ನೀವೀಗ ಎಲ್ಲವನ್ನೂ ಹೊಂದಿಸಿರುವಿರಿ!" - "ಈಗ ನೀವು %s ನೊಂದಿಗೆ ನಿಮ್ಮ ಎಲ್ಲ ಮೆಚ್ಚಿನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಲ್ಲಿ ಟೈಪ್ ಮಾಡಬಹುದು." + "ಈಗ ನೀವು %s ನೊಂದಿಗೆ ನಿಮ್ಮ ಎಲ್ಲ ಮೆಚ್ಚಿನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಲ್ಲಿ ಟೈಪ್ ಮಾಡಬಹುದು." "ಮುಕ್ತಾಯಗೊಂಡಿದೆ" "ಅಪ್ಲಿಕೇಶನ್ ಐಕಾನ್ ತೋರಿಸು" "ಲಾಂಚರ್‌ನಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಐಕಾನ್ ಪ್ರದರ್ಶಿಸು" @@ -85,7 +85,7 @@ "ಕೊನೆಯದಾಗಿ ನವೀಕರಿಸಿರುವುದು" "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ಅಳಿಸಿ" - "ಆವೃತ್ತಿ %1$s" + "ಆವೃತ್ತಿ %1$s" "ನಿಘಂಟಿಗೆ ಸೇರಿಸಿ" "ಶಾರ್ಟ್‌ಕಟ್:" "ಭಾಷೆ:" diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index a9a8b904d..a95063e0d 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -16,7 +16,7 @@ "분할 키보드 사용" "다른 입력 방법으로 전환" "언어 전환 키" - "%sms" + "%sms" "시스템 기본값" "추천 및 수정에 주소록의 이름 사용" "맞춤 추천 검색어" @@ -49,8 +49,8 @@ "스페인어(미국)" "인도 영어" "세르비아어(라틴 문자)" - %s (번체) - %s (소형) + %s (번체) + %s (소형) "언어 없음" "이모티콘" "추가" @@ -64,18 +64,18 @@ "물리적 키보드용 그림 이모티콘" "물리적 Alt 키로 그림 이모티콘 팔레트 표시" "기본값" - %s에 오신 것을 환영합니다 + %s에 오신 것을 환영합니다 "제스처 타이핑 사용" "시작하기" - %s 설정 - %s 사용 설정 - & 입력 설정에서 \"%s\" 를 확인해주세요. 이것은 이 기기에서 작동하기 위해 인증합니다. + %s 설정 + %s 사용 설정 + & 입력 설정에서 \"%s\" 를 확인해주세요. 이것은 이 기기에서 작동하기 위해 인증합니다. "\'설정\'에서 사용 설정" - %s(으)로 전환 - 그리고, 텍스트 입력 방법으로 \'%s\'을(를) 선택합니다. + %s(으)로 전환 + 그리고, 텍스트 입력 방법으로 \'%s\'을(를) 선택합니다. "입력 방법 전환" 모든 설정이 완료되었습니다! - 이제 즐겨찾는 앱을 %s과 함께 입력할 수 있습니다. + 이제 즐겨찾는 앱을 %s과 함께 입력할 수 있습니다. "완료됨" "앱 아이콘 표시" "런처에 애플리케이션 아이콘 표시" @@ -84,7 +84,7 @@ "최종 업데이트" "설정" "삭제" - 버전 %1$s + 버전 %1$s "사전에 추가" "단축키:" "언어:" @@ -105,7 +105,7 @@ 자동 교정 정확도 추천 실험적 기능 - %s분. + %s분. 클립보드 기록 활성화 스와이프 삭제 이모지 키 @@ -130,7 +130,7 @@ 시스템 설정에 따른 모양 한번에 많은 글자들을 선택하고 제거하기 위해서는 삭제 키를 스와이프하기 키의 경계 - %s (벵골어) + %s (벵골어) "실행취소" "다시 실행" "사용자의 대화 내용과 입력한 데이터를 통해 단어 추천의 정확도를 개선합니다." diff --git a/app/src/main/res/values-ky/strings.xml b/app/src/main/res/values-ky/strings.xml index a90de6a4f..ae9b26f06 100644 --- a/app/src/main/res/values-ky/strings.xml +++ b/app/src/main/res/values-ky/strings.xml @@ -16,7 +16,7 @@ "Баскычтопту бөлүүнү иштетүү" "Башка киргзүү ыкмалрна которуу" "Тил которуштуруу баскычы" - "%sмсек." + "%sмсек." "Демейки тутум" "Сунуштар жана оңдоолор үчүн Байланыштардагы ысымдарды пайдалануу" "Жекечелештирилгн сунуштр" @@ -49,8 +49,8 @@ "Испанча (US)" "Хинглиш" "Сербче (Латын)" - "%s (Салттык)" - "%s (Чакан)" + "%s (Салттык)" + "%s (Чакан)" "Тил жок" "Эмодзи" "Кошуу" @@ -64,18 +64,18 @@ "Тышкы тергич үчүн быйтыкчалар" "Alt баскычы басылганда быйтыкчалар тактасы көрүнөт" "Демейки" - %s кош келиңиз\" + %s кош келиңиз\" "Жаңсап терүү менен" "Баштоо" - %s орнотулууда\" - %s иштетүү\" - "Тилдер жана киргизүү жөндөөлөрүнөн \"%s\" колдонмосун караңыз. Ушуну менен аны түзмөгүңүздө иштете аласыз." + %s орнотулууда\" + %s иштетүү\" + "Тилдер жана киргизүү жөндөөлөрүнөн \"%s\" колдонмосун караңыз. Ушуну менен аны түзмөгүңүздө иштете аласыз." "Жөндөөлөрдөн иштетүү" - %s которулуу\" - "Андан соң, \"%s\" жигердүү текст киргизүү ыкмасы катары коюңуз." + %s которулуу\" + "Андан соң, \"%s\" жигердүү текст киргизүү ыкмасы катары коюңуз." "Киргизүү ыкмаларын которуштуруу" "Куттуктайбыз, бардыгы коюлду!" - "Эми бардык сүйүктүү колдонмолоруңузда %s менен тере аласыз." + "Эми бардык сүйүктүү колдонмолоруңузда %s менен тере аласыз." "Аяктады" "Колдонмонун сүрөтчөсүн көрсөтүү" "Колдонмонун сүрөтчөсү иштетүү тактасында көрүнөт" @@ -84,7 +84,7 @@ "Акыркы жолу жаңыртылган" "Жөндөөлөр" "Жок кылуу" - "Версиясы %1$s" + "Версиясы %1$s" "Сөздүккө кошуу" "Кыска жол:" "Тил:" diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 6e48c6476..f6938b8c1 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -17,7 +17,7 @@ "ເປີດ​ນຳ​ໃຊ້​ແປ້ນ​ພິມ​ແຍກ​ຕົວ" "ປ່ຽນໄປໃຊ້ການປ້ອນຂໍ້ມູນແບບອື່ນ" "ປຸ່ມປ່ຽນພາສາ" - "%sms" + "%sms" "ຄ່າເລີ່ມຕົ້ນຂອງລະບົບ" "ໃຊ້ຊື່ຈາກລາຍຊື່ຜູ່ຕິດຕໍ່ສຳລັບການແນະນຳ ແລະ ການຊ່ວຍແກ້ຄຳ" "ຄຳແນະນຳຕາມການນຳໃຊ້ຂອງທ່ານ" @@ -50,8 +50,8 @@ "ສະເປນ (ອາເມລິກາ)" "ຮິງ​ລິສ" "ເຊີ​ບຽນ (​ລາ​ຕິນ)" - "%s (ດັ້ງ​ເດີມ)" - "%s (ກະ​ທັດ​ຮັດ)" + "%s (ດັ້ງ​ເດີມ)" + "%s (ກະ​ທັດ​ຮັດ)" "ບໍ່ມີພາສາ" "ອີໂມຈິ" "ເພີ່ມ" @@ -65,18 +65,18 @@ "Emoji ສຳ​ລັບ​ແປ້ນ​ພິມ​ແທ້" "ປຸ່ມ Alt ແທ້​ສະ​ແດງ​ແຜ່ນ​ຮອງ emoji" "ຄ່າເລີ່ມຕົ້ນ" - "ຍິນ​ດີ​ຕ້ອນ​ຮັບສູ່ %s" + "ຍິນ​ດີ​ຕ້ອນ​ຮັບສູ່ %s" "ດ້ວຍການພິມແບບ Gesture" "ເລີ່ມຕົ້ນ" - "ຕັ້ງຄ່າ %s" - "ເປີດນຳໃຊ້ %s" - "ກະລຸນາກວດເບິ່ງ \"%s\" ໃນການຕັ້ງຄ່າພາສາ ແລະ ການປ້ອນຂໍ້ມູນຂອງທ່ານ. ນີ້ຈະເປັນການອະນຸຍາດໃຫ້ມັນເຮັດວຽກໃນອຸປະກອນຂອງທ່ານ." + "ຕັ້ງຄ່າ %s" + "ເປີດນຳໃຊ້ %s" + "ກະລຸນາກວດເບິ່ງ \"%s\" ໃນການຕັ້ງຄ່າພາສາ ແລະ ການປ້ອນຂໍ້ມູນຂອງທ່ານ. ນີ້ຈະເປັນການອະນຸຍາດໃຫ້ມັນເຮັດວຽກໃນອຸປະກອນຂອງທ່ານ." "ເປີດນຳໃຊ້ໃນການຕັ້ງຄ່າ" - "ປ່ຽນເປັນ %s" - "ຕໍ່ໄປ, ເລືອກເອົາ \"%s\" ເປັນຮູບແບບການປ້ອນຂໍ້ມູນຂອງທ່ານ." + "ປ່ຽນເປັນ %s" + "ຕໍ່ໄປ, ເລືອກເອົາ \"%s\" ເປັນຮູບແບບການປ້ອນຂໍ້ມູນຂອງທ່ານ." "ປ່ຽນຮູບແບບການປ້ອນຂໍ້ມູນ" "ຍິນດີດ້ວຍ, ທ່ານເຮັດແລ້ວໆ!" - "ຕອນນີ້ທ່ານສາມາດພິມໃນແອັບຯທີ່ທ່ານມັກໄດ້ທຸກແອັບຯດ້ວຍ %s." + "ຕອນນີ້ທ່ານສາມາດພິມໃນແອັບຯທີ່ທ່ານມັກໄດ້ທຸກແອັບຯດ້ວຍ %s." "ສຳເລັດແລ້ວ" "ສະແດງໄອຄອນຂອງແອັບ" "ສະແດງໄອຄອນຂອງແອັບໃນ Launcher" @@ -85,7 +85,7 @@ "ອັບເດດຫຼ້າສຸດ" "ການຕັ້ງຄ່າ" "ລຶບ" - "ເວີຊັນ %1$s" + "ເວີຊັນ %1$s" "ເພີ່ມໄປທີ່ວັດຈະນານຸກົມ" "ທາງລັດ:" "ພາສາ:" diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index ddc193c0c..8b9b803a8 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -16,7 +16,7 @@ "Įgalinti suskaidytą klaviatūrą" "Perj. į kt. įvesties būd." "Kalbos keitimo klavišas" - "%s ms" + "%s ms" "Sist. numat. nustat." "Siūlant ir taisant naudoti vardus iš „Kontaktų“" "Suasmeninti pasiūlymai" @@ -49,8 +49,8 @@ "Ispanų k. (JAV)" "Hindi ir anglų k. derinys" "Serbų k. (lot. rašmenys)" - "%s (tradicinė)" - "%s (kompaktiška)" + "%s (tradicinė)" + "%s (kompaktiška)" "Kalbos nėra" "Jaustukai" "Pridėti" @@ -64,18 +64,18 @@ "Fizinės klaviatūros jaustukai" "Paspaudus fizinį klavišą „Alt“ rodoma jaustukų paletė" "Numatytieji" - "Sveiki! Tai „%s“" + "Sveiki! Tai „%s“" "naudojant įvestį gestais" "Pradėti" - "„%s“ sąranka" - "Įgalinkite „%s“" - Skiltyje „Kalbos ir įvesties nustatymai“ žr. %s“. Programa bus įgalinta veikti įrenginyje.\" + "„%s“ sąranka" + "Įgalinkite „%s“" + Skiltyje „Kalbos ir įvesties nustatymai“ žr. %s“. Programa bus įgalinta veikti įrenginyje.\" "Įgalinti nustatymuose" - "Perjungimas į „%s“" - Toliau pasirinkite %s“ kaip aktyvų teksto įvesties metodą.\" + "Perjungimas į „%s“" + Toliau pasirinkite %s“ kaip aktyvų teksto įvesties metodą.\" "Perjungti įvesties metodus" "Sveikiname, viską nustatėte!" - "Dabar galite įvesti visas mėgstamas programas naudodami „%s“." + "Dabar galite įvesti visas mėgstamas programas naudodami „%s“." "Baigta" "Rodyti programos piktogramą" "Pateikti programos piktogramą paleidimo priemonėje" @@ -84,9 +84,9 @@ "Paskutinį kartą atnaujinta" "Nustatymai" "Ištrinti" - - "%1$s versija" + "%1$s versija" "Pridėti prie žodyno" "Spartusis klavišas:" "Kalba:" diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index c6e7d4bdd..075eb6792 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -16,7 +16,7 @@ "Iespējot dalīto tastatūru" "Pārsl. uz citām iev. met." "Valodas pārslēgšanas taustiņš" - "%s ms" + "%s ms" "Sistēmas noklusējums" "Izmantot kontaktpersonu vārdus kā ieteikumus un labojumus" "Personalizēti ieteikumi" @@ -49,8 +49,8 @@ "Spāņu (ASV)" "Hindi–angļu valoda" "Serbu (latīņu)" - "%s (tradicionālā)" - "%s (kompaktā)" + "%s (tradicionālā)" + "%s (kompaktā)" "Nav valodas" "Japāņu emocijzīmes" "Pievienot" @@ -64,18 +64,18 @@ "Emocijzīmes fiziskajai tastatūrai" "Nospiežot taustiņu Alt, tiek parādīta emocijzīmju palete." "Noklusējums" - "Laipni lūdzam pakalpojumā %s," + "Laipni lūdzam pakalpojumā %s," "kurā varat izmantot ievadi ar žestiem" "Sākt darbu" - "Lietojumprogrammas %s iestatīšana" - "Lietojumprogrammas %s iespējošana" - Valodu un ievades iestatījumos atzīmējiet lietotni %s”, autorizējot tās palaišanu savā ierīcē.\" + "Lietojumprogrammas %s iestatīšana" + "Lietojumprogrammas %s iespējošana" + Valodu un ievades iestatījumos atzīmējiet lietotni %s”, autorizējot tās palaišanu savā ierīcē.\" "Iespējot iestatījumos" - "Pārslēgšanās uz lietojumprogrammu %s" - Pēc tam atlasiet %s” kā aktīvo ievades metodi.\" + "Pārslēgšanās uz lietojumprogrammu %s" + Pēc tam atlasiet %s” kā aktīvo ievades metodi.\" "Pārslēgt ievades metodes" "Gatavs!" - "Izmantojot lietojumprogrammu %s, varat rakstīt visās iecienītākajās lietotnēs." + "Izmantojot lietojumprogrammu %s, varat rakstīt visās iecienītākajās lietotnēs." "Pabeigts" "Rādīt lietotnes ikonu" "Rādīt palaidēja ekrānā lietojumprogrammas ikonu" @@ -84,7 +84,7 @@ "Pēdējo reizi atjaunināts" "Iestatījumi" "Dzēst" - "Versija %1$s" + "Versija %1$s" "Pievienot vārdnīcai" "Saīsne:" "Valoda:" diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index dcd780b6b..4c8bf334e 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -16,7 +16,7 @@ "Овозможи поделена тастатура" "Префрли на други влезни методи" "Копче за промена на јазик" - "%s ms" + "%s ms" "Стандардно за системот" "Употреби имиња од Контакти за предлози и корекции" "Персонализирани предлози" @@ -49,8 +49,8 @@ "шпански (САД)" "Хинглиш" "Српски (латиница)" - "%s (традиционален)" - "%s (Компактна)" + "%s (традиционален)" + "%s (Компактна)" "Нема јазик" "Емотикони" "Додај" @@ -64,18 +64,18 @@ "Емотикони за физичка тастатура" "Физичкото копче Alt ја прикажува палетата емотикони" "Стандардно" - "Добре дојдовте во %s" + "Добре дојдовте во %s" "со Пишување со движење" "Започнете" - "Се поставува %s" - "Овозможи %s" - Означете ја апликацијата %s“ во поставките за Јазици и внесување. Со тоа ќе авторизирате да се активира на уредот.\" + "Се поставува %s" + "Овозможи %s" + Означете ја апликацијата %s“ во поставките за Јазици и внесување. Со тоа ќе авторизирате да се активира на уредот.\" "Овозможи во Поставки" - "Префрлете се на %s" - Следно, изберете %s“ како активен метод за внесување текст.\" + "Префрлете се на %s" + Следно, изберете %s“ како активен метод за внесување текст.\" "Префрли се помеѓу методи на влез" "Честитки, завршивте!" - "Сега може да ги впишете сите омилени апликации со %s." + "Сега може да ги впишете сите омилени апликации со %s." "Завршено" "Покажи икона на апликација" "Прикажи икона на апликација во стартувачот" @@ -84,7 +84,7 @@ "Последен пат ажурирано" "Поставки" "Избриши" - "Верзија %1$s" + "Верзија %1$s" "Додај во речник" "Кратенка:" "Јазик:" diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 904526ec7..6b1716477 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -16,7 +16,7 @@ "സ്‌പ്‌ലിറ്റ് കീബോർഡ് പ്രവർത്തനക്ഷമമാക്കുക" "മറ്റു ടൈപ്പുചെയ്യൽ രീതികളിലേക്ക് മാറുക" "ഭാഷ മാറൽ കീ" - "%sമി.സെ" + "%sമി.സെ" "സ്ഥിരമായ സിസ്റ്റം" നിർദ്ദേശങ്ങൾക്കും തിരുത്തലുകൾക്കുമായി കോൺടാക്‌റ്റുകളിൽ നിന്നുള്ള പേരുകൾ ഉപയോഗിക്കുക "വ്യക്തിഗത നിർദ്ദേശങ്ങൾ" @@ -49,8 +49,8 @@ "സ്‌പാനിഷ് (യുഎസ്)" "ഹിംഗ്ലീഷ്" "സെർബിയൻ (ലാറ്റിൻ)" - %s (പരമ്പരാഗതം) - %s (കോം‌പാക്‌ട്) + %s (പരമ്പരാഗതം) + %s (കോം‌പാക്‌ട്) "ഭാഷയില്ല" "ഇമോജി" "ചേര്‍ക്കുക" @@ -64,18 +64,18 @@ "പ്രത്യക്ഷ കീബോഡിനുള്ള ഇമോജി" "പ്രത്യക്ഷ Alt കീ ഇമോജി പാലറ്റിനെ കാണിക്കുന്നു" "സ്ഥിരമായത്" - %s എന്നതിലേക്ക് സ്വാഗതം + %s എന്നതിലേക്ക് സ്വാഗതം "വിരൽചലിത ടൈപ്പിംഗിനൊപ്പം" "ആരംഭിക്കുക" - %s സജ്ജമാക്കുന്നു - %s പ്രവർത്തനക്ഷമമാക്കുക - ഭാഷയും ഇൻപുട്ടും ക്രമീകരണത്തിൽ \"%s\" ചെക്കുചെയ്യുക. ചെക്കുചെയ്യുന്നത് ഉപകരണത്തിൽ പ്രവർത്തിക്കാൻ ഇതിന് അംഗീകാരം നൽകും. + %s സജ്ജമാക്കുന്നു + %s പ്രവർത്തനക്ഷമമാക്കുക + ഭാഷയും ഇൻപുട്ടും ക്രമീകരണത്തിൽ \"%s\" ചെക്കുചെയ്യുക. ചെക്കുചെയ്യുന്നത് ഉപകരണത്തിൽ പ്രവർത്തിക്കാൻ ഇതിന് അംഗീകാരം നൽകും. "ക്രമീകരണങ്ങളിൽ പ്രവർത്തനക്ഷമമാകുക" - %s എന്നതിലേക്ക് മാറുക - അടുത്തത്, \"%s\" എന്നതിനെ നിങ്ങളുടെ സജീവ വാചക-ടൈപ്പുചെയ്യൽ രീതിയായി തിരഞ്ഞെടുക്കുക. + %s എന്നതിലേക്ക് മാറുക + അടുത്തത്, \"%s\" എന്നതിനെ നിങ്ങളുടെ സജീവ വാചക-ടൈപ്പുചെയ്യൽ രീതിയായി തിരഞ്ഞെടുക്കുക. "ടൈപ്പുചെയ്യൽ രീതികൾ മാറുക" "അഭിനന്ദനങ്ങൾ, നിങ്ങൾ എല്ലാം പൂർത്തിയാക്കി!" - %s ഉപയോഗിച്ച് നിങ്ങളുടെ പ്രിയപ്പെട്ട എല്ലാ അപ്ലിക്കേഷനുകളിലും ഇപ്പോൾ ടൈപ്പുചെയ്യാനാകും. + %s ഉപയോഗിച്ച് നിങ്ങളുടെ പ്രിയപ്പെട്ട എല്ലാ അപ്ലിക്കേഷനുകളിലും ഇപ്പോൾ ടൈപ്പുചെയ്യാനാകും. "പൂർത്തിയായി" "അപ്ലിക്കേഷൻ ഐക്കൺ കാണിക്കുക" "ലോഞ്ചറിൽ അപ്ലിക്കേഷൻ ഐക്കൺ പ്രദർശിപ്പിക്കുക" @@ -84,7 +84,7 @@ "അവസാനം അപ്ഡേറ്റുചെയ്തത്" "ക്രമീകരണം" "ഇല്ലാതാക്കുക" - വേർഷൻ %1$s + വേർഷൻ %1$s "നിഘണ്ടുവിൽ ചേർക്കുക" "കുറുക്കുവഴി:" "ഭാഷ:" @@ -118,12 +118,12 @@ രൂപഭാവം സിസ്റ്റം ക്രമീകരണങ്ങൾ പിന്തുടരും കീ അതിരുകൾ ഓട്ടോ പകൽ/രാത്രി മോഡ് - %sമിനിറ്റ് . + %sമിനിറ്റ് . വിരാമചിഹ്നത്തിന് ശേഷം ഒരു പുതിയ വാക്ക് ടൈപ്പുചെയ്യുമ്പോൾ സ്വയം സ്പേസ് ചേർക്കുക സ്പേസ് കീ ദീർഘനേരം അമർത്തുന്നത് ഇൻപുട്ട് രീതി തിരഞ്ഞെടുക്കൽ മെനു പ്രദർശിപ്പിക്കും കീബോർഡ് ഉയരം സ്കെയിൽ വിരാമചിഹ്നത്തിനു ശേഷമുള്ള ഓട്ടോസ്പേസ് - %s (അഖോർ ) + %s (അഖോർ ) പരീക്ഷണാത്മകം ഇൻപുട്ട് അധിക കീകൾ diff --git a/app/src/main/res/values-mn/strings.xml b/app/src/main/res/values-mn/strings.xml index 14cebb5b6..091866816 100644 --- a/app/src/main/res/values-mn/strings.xml +++ b/app/src/main/res/values-mn/strings.xml @@ -16,7 +16,7 @@ "Хуваагдмал гарыг идэвхжүүлэх" "Оруулах өөр арга руу шилжүүлэх" "Хэл солих товч" - "%sмс" + "%sмс" "Системийн өгөгдмөл" "Санал болгох, залруулахда Харилцагчдын нэрсээс ашиглах" "Хувийн тохиргоотой зөвлөмжүүд" @@ -49,8 +49,8 @@ "Испани (АНУ)" "Хинглиш" "Серьби хэл (латин)" - "%s (уламжлалт)" - "%s (Компакт)" + "%s (уламжлалт)" + "%s (Компакт)" "Хэл байхгүй" "Инээмсэглэл" "Нэмэх" @@ -64,18 +64,18 @@ "Бодит гарт зориулсан эможи" "Бодит Alt товчлуур нь эможи палитрыг харуулдаг" "Үндсэн" - "Та %s-д тавтай морилно уу" + "Та %s-д тавтай морилно уу" "Зангаагаар бичихээр" "Эхлэх" - %s-г тохируулж байна\" - %s-г идэвхжүүлэх\" - "Хэл, оролтын тохиргоо хэсгээс \"%s\"-г сонгоно уу. Ингэснээр үүнийг таны төхөөрөмжид ажиллах зөвшөөрлийг өгөх болно." + %s-г тохируулж байна\" + %s-г идэвхжүүлэх\" + "Хэл, оролтын тохиргоо хэсгээс \"%s\"-г сонгоно уу. Ингэснээр үүнийг таны төхөөрөмжид ажиллах зөвшөөрлийг өгөх болно." "Тохиргоо дотроос идэвхжүүлэх" - %s рүү шилжих\" - "Дараа нь \"%s\"-г өөрийн идэвхтэй текст-оруулах аргаар сонгоно уу." + %s рүү шилжих\" + "Дараа нь \"%s\"-г өөрийн идэвхтэй текст-оруулах аргаар сонгоно уу." "Оруулах аргыг солих" "Баяр хүргэе, та бүгдийг нь тохируулчихлаа!" - "Та одоо өөрийн дуртай апп-ууд дотроо %s ашиглан бичих болохоор боллоо." + "Та одоо өөрийн дуртай апп-ууд дотроо %s ашиглан бичих болохоор боллоо." "Дууссан" "Апп дүрсийг харуулах" "Эхлүүлэгч дээр аппликейшний дүрсийг харуулах" @@ -84,7 +84,7 @@ "Сүүлд шинэчлэгдсэн" "Тохиргоо" "Устгах" - "Хувилбар %1$s" + "Хувилбар %1$s" "Толь бичигт нэмэх" "Товчилбор:" "Хэл:" diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml index c79b900af..475179769 100644 --- a/app/src/main/res/values-mr/strings.xml +++ b/app/src/main/res/values-mr/strings.xml @@ -16,7 +16,7 @@ "विभाजित कीबोर्ड सुरू करा" "अन्य इनपुट पद्धतींवर स्विच करा" "भाषा स्विच की" - "%sमिसे" + "%sमिसे" "सिस्टम डीफॉल्ट" "सूचनांसाठी आणि सुधारणांसाठी संपर्कांमधील नावे वापरा" "पर्सनलाइझ केलेल्या सूचना" @@ -49,8 +49,8 @@ "स्पॅनिश (यूएस)" "हिंग्लिश" "सर्बियन (लॅटिन)" - "%s (पारंपारिक)" - "%s (संक्षिप्त)" + "%s (पारंपारिक)" + "%s (संक्षिप्त)" "भाषा नाही" "इमोजी" "जोडा" @@ -64,18 +64,18 @@ "वास्तविक कीबोर्डसाठी इमोजी" "वास्तविक Alt की इमोजी पॅलेट दर्शविते" "डीफॉल्ट" - %s वर स्वागत आहे\" + %s वर स्वागत आहे\" "जेश्चर टायपिंग करून" "सुरू करा" - %s सेट अप करत आहे\" - %s सुरू करा\" - "कृपया आपल्या भाषांमध्ये आणि इनपुट सेटिंग्जमध्ये \"%s\" तपासा. आपल्या डिव्हाइसवर चालण्यासाठी त्यास हे अधिकृत करेल." + %s सेट अप करत आहे\" + %s सुरू करा\" + "कृपया आपल्या भाषांमध्ये आणि इनपुट सेटिंग्जमध्ये \"%s\" तपासा. आपल्या डिव्हाइसवर चालण्यासाठी त्यास हे अधिकृत करेल." "सेटिंग्जमध्ये सुरू करा" - %s वर स्विच करा\" - "पुढे, तुमची सक्रिय मजकूर-इनपुट पद्धत म्हणून \"%s\" निवडा." + %s वर स्विच करा\" + "पुढे, तुमची सक्रिय मजकूर-इनपुट पद्धत म्हणून \"%s\" निवडा." "इनपुट पद्धती स्विच करा" "अभिनंदन, आता तुम्ही तयार आहात!" - "आता तुम्ही %s सह आपल्या सर्व आवडत्या अॅप्समध्ये टाइप करू शकता." + "आता तुम्ही %s सह आपल्या सर्व आवडत्या अॅप्समध्ये टाइप करू शकता." "समाप्त" "अ‍ॅप आयकन दर्शवा" "लाँचर मध्ये ॲप्लिकेशन आयकन दाखवा" @@ -84,7 +84,7 @@ "अंतिम अपडेट" "सेटिंग्ज" "हटवा" - "आवृत्ती %1$s" + "आवृत्ती %1$s" "डिक्शनरीत जोडा" "शॉर्टकट:" "भाषा:" diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 32ddc3f80..152ce36dc 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -17,7 +17,7 @@ "Dayakan papan kekunci terpisah" "Tukar ke kaedah input lain" "Kekunci tukar bahasa" - "%sms" + "%sms" "Tetapan asal sistem" "Menggunakan nama daripada Kenalan untuk cadangan dan pembetulan" "Cadangan diperibadikan" @@ -50,8 +50,8 @@ "Bahasa Sepanyol (AS)" "Hinglish" "Bahasa Serbia (Latin)" - "%s (Tradisional)" - "%s (Sarat)" + "%s (Tradisional)" + "%s (Sarat)" "Tiada bahasa" "Emoji" "Tambah" @@ -65,18 +65,18 @@ "Emoji untuk papan kekunci fizikal" "Kekunci Alt fizikal menunjukkan palet emoji" "Lalai" - "Selamat datang ke %s" + "Selamat datang ke %s" "dengan Taipan Gerak Isyarat" "Bermula" - "Menyediakan %s" - "Dayakan %s" - "Sila tandai \"%s\" dalam tetapan Bahasa & input anda. Tindakan ini akan membenarkan apl itu dijalankan pada peranti anda." + "Menyediakan %s" + "Dayakan %s" + "Sila tandai \"%s\" dalam tetapan Bahasa & input anda. Tindakan ini akan membenarkan apl itu dijalankan pada peranti anda." "Dayakan dalam Tetapan" - "Beralih ke %s" - "Seterusnya, pilih \"%s\" sebagai kaedah input teks aktif anda." + "Beralih ke %s" + "Seterusnya, pilih \"%s\" sebagai kaedah input teks aktif anda." "Tukar kaedah input" "Tahniah, anda sudah sedia!" - "Kini anda boleh menaip dalam semua apl kegemaran anda dengan %s." + "Kini anda boleh menaip dalam semua apl kegemaran anda dengan %s." "Selesai" "Tunjukkan ikon apl" "Paparkan ikon apl dalam pelancar" @@ -85,7 +85,7 @@ "Kali terakhir dikemas kini" "Tetapan" "Padam" - "Versi %1$s" + "Versi %1$s" "Tambah ke kamus" "Pintasan:" "Bahasa:" diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index 7a1985db0..c12da3e83 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -16,7 +16,7 @@ "ကီးဘုတ် ခွဲခြမ်းမှု ဖွင့်ထားရန်" "အခြားထည့်သွင်းမည့် နည်းလမ်းများသို့ ပြောင်းရန်" "ဘာသာစကား ပြောင်းခလုတ်" - "%sms" + "%sms" "စနစ်ပုံသေ" "အကြံပြုချက်များနှင့် အမှားပြင်ခြင်းများအတွက် အဆက်သွယ်မှ အမည်များ အသုံးပြုမည်" "ကိုယ်ရေးကိုယ်တာ အကြံပြုချက်များ" @@ -49,8 +49,8 @@ "စပိန် (ယူအက်စ်)" "ဟင်ဂလိပ်" "ဆားဘီယား (လက်တင်)" - "%s (ရိုးရာ)" - "%s (ကျစ်လစ်သော)" + "%s (ရိုးရာ)" + "%s (ကျစ်လစ်သော)" "ဘာသာစကားမရှိ" "အီမိုဂျီ" "ထည့်ရန်" @@ -64,18 +64,18 @@ "ခလုတ်ရှိ ကီးဘုတ်အတွက် အီမိုဂျိ" "အီမိုဂျီ ဘုတ်ပြားပြသော Alt ခလုတ်" "ပုံသေ" - %s မှကြိုဆိုပါသည်\" + %s မှကြိုဆိုပါသည်\" "အမူယာ ရိုက်ခြင်းဖြင့်" "စတင်ပါတော့" - %s တပ်ဆင်ရန်\" - %s ဖွင့်ရန်\" - "\"%s\" ကို ဘာသာစကားနှင့် စာရိုက်စနစ်တွင် စစ်ပါ။ ဤသို့ဖြင့် သင့်စက်ပစ္စည်းပေါ်တွင် ၎င်းကိုဖွင့်ရန်အတည်ပြုပေးပါလိမ့်မည်။" + %s တပ်ဆင်ရန်\" + %s ဖွင့်ရန်\" + "\"%s\" ကို ဘာသာစကားနှင့် စာရိုက်စနစ်တွင် စစ်ပါ။ ဤသို့ဖြင့် သင့်စက်ပစ္စည်းပေါ်တွင် ၎င်းကိုဖွင့်ရန်အတည်ပြုပေးပါလိမ့်မည်။" "ဆက်တင်များတွင် ဖွင့်ရန်" - %s သို့ပြောင်းမည်\" - "ရှေ့၊ \"%s\" အားသင်၏ ပွင့်နေသည့်ထည့်သွင်းမှု နည်းလမ်းအဖြစ်ရွေးပါ။" + %s သို့ပြောင်းမည်\" + "ရှေ့၊ \"%s\" အားသင်၏ ပွင့်နေသည့်ထည့်သွင်းမှု နည်းလမ်းအဖြစ်ရွေးပါ။" "စာရိုက်သွင်းမှုနည်းလမ်း ပြောင်းရန်" "ဝမ်းသာပါသည်၊ သင်အားလုံးသတ်မှတ်ပြီးပါပြီ!" - "%s ဖြင့်သင့် ကြိုက်နှစ်သက်ရာ အပလီကေးရှင်းများအားလုံးအား ရိုက်ထည့်နိုင်ပါပြီ။" + "%s ဖြင့်သင့် ကြိုက်နှစ်သက်ရာ အပလီကေးရှင်းများအားလုံးအား ရိုက်ထည့်နိုင်ပါပြီ။" "ပြီးဆုံးသွားပြီ" "အက်ပ်သင်္ကေတပြခြင်း" "launcher တွင် အပလီကေးရှင်း သင်္ကေတကိုပြရန်" @@ -84,7 +84,7 @@ "နောက်ဆုံး အသစ်မွမ်းမံမှု" "ဆက်တင်များ" "ဖျက်ရန်" - "ဗားရှင်း %1$s" + "ဗားရှင်း %1$s" "အဘိဓာန်ထဲ ထည့်ပါ" "အတိုကောက်:" "ဘာသာစကား:" diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 207439c12..50aaba246 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -16,7 +16,7 @@ "Aktivér delt tastatur" "Bytt inndatametode" Knapp for språkskifte - "%s ms" + "%s ms" "Systemstandard" "Bruk navn fra Kontakter til forslag og korrigeringer" "Spesialtilpassede forslag" @@ -49,8 +49,8 @@ "spansk (USA)" "Hinglish" "Serbisk (latin)" - "%s (tradisjonelt)" - "%s (kompakt)" + "%s (tradisjonelt)" + "%s (kompakt)" "Ingen språk" "Emoji" "Legg til" @@ -64,18 +64,18 @@ "Emoji for fysisk tastatur" "Fysisk Alt-tast som viser emojiutvalget" "Standard" - "Velkommen til %s" + "Velkommen til %s" "med Ordføring" "Startveiledning" - Sett opp %s - Skru på %s - Sjekk «%s» i Språk og inndata-innstillingene dine. Dette tillater programmet å kjøre på enheten. + Sett opp %s + Skru på %s + Sjekk «%s» i Språk og inndata-innstillingene dine. Dette tillater programmet å kjøre på enheten. Skru på i programinnstillingene - "Bytt til %s" - Deretter velger du «%s» som aktiv inndatametode for tekst. + "Bytt til %s" + Deretter velger du «%s» som aktiv inndatametode for tekst. "Bytt inndatametode" "Gratulerer, du er klar!" - "Nå kan du skrive inn alle favorittappene dine med %s." + "Nå kan du skrive inn alle favorittappene dine med %s." "Ferdig" "Vis app-ikonet" "Vis app-ikonet i appoversikten" @@ -84,7 +84,7 @@ "Sist oppdatert" "Innstillinger" "Slett" - "Versjon %1$s" + "Versjon %1$s" "Legg til i ordlisten" "Snarvei:" "Språk:" @@ -229,9 +229,9 @@ Smal tastemellomrom Kaitag Velg verktøylinjetaster - %s (Akkhor) + %s (Akkhor) Se på GitHub - %s (Sebeolsik Final) + %s (Sebeolsik Final) Last inn fil Kopier eksisterende oppsett Oppsettsfeil: %s @@ -292,18 +292,18 @@ Virkelig slette tilpasset oppsett %s? Trykk for å redigere råoppsett Vis flere bokstaver med diakritiske tegn i sprettoppvinduet - %s min + %s min Legg til tilpasset oppsett Legg til fil med kompatibelt format. Informasjon om kompatible format %s. Mørkere Lagre logg - %s (Sebeolsik 390) + %s (Sebeolsik 390) Uten ordbok vil du kun få forslag til tekst som du tidligere har skrevet.<br> \n........Du kan laste ned ordbøker %1$s, eller sjekke om ordbok for \"%2$s\" kan lastes ned direkte %3$s. Dette ordet finnes allerede i %s brukerordbok. Vennligst skriv et annet. Nederste polstringsskala - %s (Probhat) + %s (Probhat) Fargepreg ► Et langt trykk på utklippstavlen (den valgfrie i forslagsstripen) limer inn innholdet i systemets utklippstavle. <br> <br> ► Et langt trykk på tastene på verktøylinjen for forslagsstripen fester dem til forslagsstripen. <br> <br> ► Trykk lenge på komma-tasten for å få tilgang til utklippstavlevisning, emojivisning, enhåndsmodus, innstillinger eller språkbytte: <br> \t• Emoji View og språkbytteknappen forsvinner hvis du har den tilsvarende nøkkelen aktivert; <br> \t• For noen oppsett er det ikke kommatasten, men tasten i samme posisjon (f.eks. er det \"q\" for Dvorak-oppsettet). <br> <br> ► Når inkognitomodus er aktivert, vil ingen ord læres, og ingen emojier blir lagt til i \"nylige\". <br> <br> ► Trykk på inkognitoikonet for å få tilgang til verktøylinjen. <br> <br> ► Skyvetastinntasting: Sveip fra skift til en annen tast for å skrive inn en enkelt stor bokstav: <br> \t• Dette fungerer også for \'?123\'-tasten for å skrive inn et enkelt symbol fra symboltastaturet, og for relaterte taster. <br> <br> ► Trykk lenge på et forslag i forslagsstripen for å vise flere forslag, og sletteknappen for å fjerne dette forslaget. <br> <br> ► Sveip opp fra et forslag for å åpne flere forslag, og slipp forslaget for å velge det. <br> <br> ► Trykk lenge på en oppføring i utklippstavleloggen for å feste den (behold den i utklippstavlen til du løsner den). <br> <br> ► Du kan legge til ordbøker ved å åpne dem i en filutforsker: <br> \t• Dette fungerer bare med <i>content-uris</i> og ikke med <i>file-uris</i>, noe som betyr at det kanskje ikke fungerer med enkelte filutforskere. <br> <br> <i>Feilsøkingsmodus / feilsøk APK</i> <br> <br> \t• Trykk lenge på et forslag for å vise kildeordboken.<br> <br> \t• Når du bruker debug APK, kan du finne feilsøkingsinnstillinger i de avanserte innstillingene, selv om nytten er begrenset bortsett fra å dumpe ordbøker i loggen. <br> <br> \t• Ved et programkrasj vil du bli spurt om du vil ha krasjloggene når du åpner Innstillinger. <br> <br> \t• Når du bruker flerspråklig skriving, vil mellomromstasten vise en konfidensverdi som brukes til å bestemme språket som brukes for øyeblikket. <br> <br> \t• \"Forslag\" vil ha noen små tall på toppen som viser noe internt partitur og kildeordbok (kan deaktiveres). <br> <br> ► For brukere som tar manuelle sikkerhetskopier med rottilgang: Fra og med Android 7 er ikke den delte preferansefilen på standardplasseringen, fordi appen bruker %s. <br> Dette er nødvendig for at innstillingene kan leses før enheten låses opp, f.eks. ved oppstart. <br> Filen ligger i /data/user_de/0/package_id/shared_prefs/, men dette kan avhenge av enheten og Android-versjonen. - %s (Student) + %s (Student) diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index d69667ecf..5d97a53f7 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -16,7 +16,7 @@ "विभाजित कुञ्जीपाटी सक्षम गर्नुहोस्" "अन्य इनपुट विधिमा स्विच गर्नुहोस्" "भाषा स्विच कुञ्जी" - "%s मिलिसेकेन्ड" + "%s मिलिसेकेन्ड" "पूर्वनिर्धारित प्रणाली" "सुझाव र सुधारका लागि सम्पर्कबाट नामहरू प्रयोग गर्नुहोस्" "निजीकृत सुझावहरू" @@ -49,8 +49,8 @@ "स्पेनिस (युएस्)" "हिङ्लिस" "सर्बियाई (ल्याटिन)" - "%s (परम्परागत)" - "%s (संकुचित)" + "%s (परम्परागत)" + "%s (संकुचित)" "कुनै भाषा होइन" "इमोजी" "थप्नुहोस्" @@ -64,18 +64,18 @@ "भौतिक किबोर्डको लागि इमोजी" "भौतिक Alt कुञ्जीले इमोजी प्यालेट देखाउँछ" "पूर्वनिर्धारित" - "तपाईँलाई स्वागत छ%s" + "तपाईँलाई स्वागत छ%s" "इशारा टाइप गर्नेसँग" "सुरु गरौं" - "स्थापना गर्दै %s" - "सक्षम पार्नुहोस् %s" - "कृपया आफ्नो भाषा र इनपुट सम्बन्धी सेटिङहरूमा \"%s\" अनुप्रयोगलाई जाँच गर्नुहोस्। यस कारबाहीले अनुप्रयोगलाई तपाईँको यन्त्रमा सञ्चालन हुन आधिकार प्रदान गर्ने छ।" + "स्थापना गर्दै %s" + "सक्षम पार्नुहोस् %s" + "कृपया आफ्नो भाषा र इनपुट सम्बन्धी सेटिङहरूमा \"%s\" अनुप्रयोगलाई जाँच गर्नुहोस्। यस कारबाहीले अनुप्रयोगलाई तपाईँको यन्त्रमा सञ्चालन हुन आधिकार प्रदान गर्ने छ।" "सेटिङहरूमा सक्षम पार्नुहोस्" - %sमा स्विच गर्नुहोस्\" - "त्यसपछि, \"%s\" लाई तपाईँको सक्रिय पाठ इनपुट विधिका रूपमा चयन गर्नुहोस्।" + %sमा स्विच गर्नुहोस्\" + "त्यसपछि, \"%s\" लाई तपाईँको सक्रिय पाठ इनपुट विधिका रूपमा चयन गर्नुहोस्।" "इनपुट विधि स्विच गर्नुहोस्" "बधाई छ, तपाईँले सेट पुरा गर्नुभयो!" - "अब तपाईं %sका साथ तपाईंका सम्पूर्ण मन पर्ने अनुप्रयोगहरू टाइप गर्न सक्नुहुन्छ।" + "अब तपाईं %sका साथ तपाईंका सम्पूर्ण मन पर्ने अनुप्रयोगहरू टाइप गर्न सक्नुहुन्छ।" "समाप्त भयो" "अनुप्रयोग आइकन देखाउनुहोस्" "लन्चरमा अनुप्रयोग आइकन देखाउनुहोस्" @@ -84,7 +84,7 @@ "पछिल्लो अद्यावधिक" "सेटिङहरू" "मेट्नुहोस्" - "संस्करण %1$s" + "संस्करण %1$s" "शब्दकोशमा थप्नुहोस्" "सर्टकट:" "भाषा:" diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 0138c6d7e..455e33805 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -16,7 +16,7 @@ Gesplitst toetsenbord Andere invoermethode Taalkeuzetoets - %s ms + %s ms "Systeemstandaard" Gebruik namen uit Contacten voor suggesties en correcties "Gepersonaliseerde suggesties" @@ -49,8 +49,8 @@ "Spaans (VS)" "Hindi-Engels" "Servisch (Latijns)" - %s (Traditional) - %s (Compact) + %s (Traditional) + %s (Compact) "Geen taal" "Emoji" "Toevoegen" @@ -64,18 +64,18 @@ "Emoji voor fysiek toetsenbord" Emoji-palet weergeven bij fysieke Alt-toets "Standaard" - Welkom bij %s + Welkom bij %s met Typen met gebaren "Aan de slag" - %s instellen - %s inschakelen - Selecteer %s in de instellingen bij \'Talen & invoer\'. De app kan dan worden uitgevoerd op dit apparaat. + %s instellen + %s inschakelen + Selecteer %s in de instellingen bij \'Talen & invoer\'. De app kan dan worden uitgevoerd op dit apparaat. "Inschakelen in \'Instellingen\'" - Overschakelen naar %s - Selecteer vervolgens %s als actieve methode voor tekstinvoer. + Overschakelen naar %s + Selecteer vervolgens %s als actieve methode voor tekstinvoer. "Schakelen tussen invoermethoden" Gefeliciteerd, je kunt nu aan de slag! - Je kunt nu in al je favoriete apps typen met %s. + Je kunt nu in al je favoriete apps typen met %s. "Voltooid" "App-pictogram weergeven" "App-pictogram weergeven in het opstartprogramma" @@ -84,7 +84,7 @@ "Laatst bijgewerkt" "Instellingen" "Verwijderen" - Versie %1$s + Versie %1$s "Toevoegen aan woordenboek" "Sneltoets:" "Taal:" @@ -116,7 +116,7 @@ Emojitoets Correcties Suggesties - %s min + %s min Druk lang op de spatietoets voor het selectiemenu van de invoermethode Betrouwbaarheid autocorrectie Indien uitgeschakeld, plakt de klembord-toets de inhoud van het klembord @@ -124,7 +124,7 @@ Het leren van nieuwe woorden uitschakelen Hints bij lang indrukken weergeven Toetsenbordhoogte schaal - %s (Akkhor) + %s (Akkhor) Invoermethode schakelen met spatietoets Toetsranden Automatisch spatie invoegen na interpunctie en het typen van een nieuw woord @@ -208,7 +208,7 @@ Fout: script niet compatibel met dit toetsenbord Gewicht: Bewolkt - %s (Extended) + %s (Extended) Taal kiezen Dit woord is al aanwezig in het gebruikerswoordenboek van %s. Typ er nog een. Woord toevoegen @@ -237,7 +237,7 @@ Numpad Numpad (liggend) Knippen - %s (Probhat) + %s (Probhat) Intern hoofdwoordenboek Over Versie @@ -248,9 +248,9 @@ Fout: Geselecteerd bestand is geen geldig woordenboekbestand Telefoonsymbolen Mansi - %s (Sebeolsik 390) - %s (Sebeolsik Final) - %s (Student) + %s (Sebeolsik 390) + %s (Sebeolsik Final) + %s (Student) Aangepaste lay-out toevoegen Selecteer een bestand in een compatibel formaat. Informatie over de formaten is beschikbaar %s. Bestaande lay-out kopiëren @@ -422,7 +422,7 @@ Alle aangepaste pictogrammen herstellen? Trillen in de niet storen-modus Emoji-versie overschrijven - %s (Phonetic) + %s (Phonetic) Dargwa (Urakhi) Sneltoetsen autom. corrigeren Indien ingeschakeld, kunnen sneltoetsen worden uitgebreid met autocorrectie @@ -450,7 +450,7 @@ Aangepast subtype Je kunt lay-outs zoeken en delen in de %s. discussiesectie - %s (Baishakhi) + %s (Baishakhi) TLD-opties weergeven Vervang pop-ups met interpunctie door topleveldomeinen bij het typen van URL\'s en e-mailadressen Druk op enter of spatie na andere toetsen in het numpad diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index fa2d03fb0..4f0c49294 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -16,7 +16,7 @@ "ਸਪਲਿਟ ਕੀ-ਬੋਰਡ ਨੂੰ ਚਾਲੂ ਕਰੋ" "ਹੋਰਾਂ ਇਨਪੁੱਟ ਵਿਧੀਆਂ ਤੇ ਸਵਿੱਚ ਕਰੋ" "ਭਾਸ਼ਾ ਸਵਿੱਚ ਕੁੰਜੀ" - "%sms" + "%sms" "ਸਿਸਟਮ ਪੂਰਵ-ਨਿਰਧਾਰਤ" "ਸੁਝਾਵਾਂ ਅਤੇ ਸੋਧਾਂ ਲਈ ਸੰਪਰਕਾਂ ਵਿੱਚੋਂ ਨਾਮ ਵਰਤੋ" "ਨਿੱਜੀ ਬਣਾਏ ਸੁਝਾਅ" @@ -49,8 +49,8 @@ "ਸਪੇਨੀ (ਅਮਰੀਕਾ)" "ਹਿੰਗਲਿੰਸ਼" "ਸਰਬੀਅਨ (ਲਾਤੀਨੀ)" - "%s (ਪਰੰਪਰਿਕ)" - "%s (ਸੰਖਿਪਤ)" + "%s (ਪਰੰਪਰਿਕ)" + "%s (ਸੰਖਿਪਤ)" "ਕੋਈ ਭਾਸ਼ਾ ਨਹੀਂ" "ਇਮੋਜੀ" "ਸ਼ਾਮਲ ਕਰੋ" @@ -64,18 +64,18 @@ "ਭੌਤਿਕ ਕੀ-ਬੋਰਡ ਲਈ ਇਮੋਜੀ" "ਭੌਤਿਕ Alt ਕੁੰਜੀ ਇਮੋਜੀ ਪੈਲੇਟ ਦਿਖਾਉਂਦੀ ਹੈ" "ਪੂਰਵ-ਨਿਰਧਾਰਤ" - %s ਤੇ ਸੁਆਗਤ ਹੈ\" + %s ਤੇ ਸੁਆਗਤ ਹੈ\" "ਸੰਕੇਤ ਟਾਈਪਿੰਗ ਨਾਲ" "ਸ਼ੁਰੂਆਤ ਕਰੋ" - %s ਸੈਟ ਅਪ ਕਰ ਰਿਹਾ ਹੈ\" - %s ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ\" - "ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੀਆਂ ਭਾਸ਼ਾਵਾਂ ਅਤੇ ਇਨਪੁੱਟ ਸੈਟਿੰਗਾਂ ਵਿੱਚ \"%s\" \'ਤੇ ਸਹੀ ਦਾ ਨਿਸ਼ਾਨ ਲਗਾਓ। ਇਹ ਉਸ ਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਚੱਲਣ ਲਈ ਅਧਿਕਾਰਿਤ ਕਰੇਗਾ।" + %s ਸੈਟ ਅਪ ਕਰ ਰਿਹਾ ਹੈ\" + %s ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ\" + "ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੀਆਂ ਭਾਸ਼ਾਵਾਂ ਅਤੇ ਇਨਪੁੱਟ ਸੈਟਿੰਗਾਂ ਵਿੱਚ \"%s\" \'ਤੇ ਸਹੀ ਦਾ ਨਿਸ਼ਾਨ ਲਗਾਓ। ਇਹ ਉਸ ਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਚੱਲਣ ਲਈ ਅਧਿਕਾਰਿਤ ਕਰੇਗਾ।" "ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਚਾਲੂ ਕਰੋ" - %s \'ਤੇ ਸਵਿੱਚ ਕਰੋ\" - "ਫਿਰ, \"%s\" ਨੂੰ ਆਪਣੀ ਕਿਰਿਆਸ਼ੀਲ ਲਿਖਤ-ਇਨਪੁੱਟ ਵਿਧੀ ਦੇ ਤੌਰ ਤੇ ਚੁਣੋ।" + %s \'ਤੇ ਸਵਿੱਚ ਕਰੋ\" + "ਫਿਰ, \"%s\" ਨੂੰ ਆਪਣੀ ਕਿਰਿਆਸ਼ੀਲ ਲਿਖਤ-ਇਨਪੁੱਟ ਵਿਧੀ ਦੇ ਤੌਰ ਤੇ ਚੁਣੋ।" "ਇਨਪੁੱਟ ਵਿਧੀਆਂ ਸਵਿੱਚ ਕਰੋ" "ਵਧਾਈ ਹੋਵੇ, ਤੁਸੀਂ ਸਾਰਾ ਸੈਟ ਕਰ ਲਿਆ ਹੈ!" - "ਹੁਣ ਤੁਸੀਂ %s ਨਾਲ ਆਪਣੇ ਸਾਰੇ ਮਨਪਸੰਦ ਐਪਸ ਨੂੰ ਟਾਈਪ ਕਰ ਸਕਦੇ ਹੋ।" + "ਹੁਣ ਤੁਸੀਂ %s ਨਾਲ ਆਪਣੇ ਸਾਰੇ ਮਨਪਸੰਦ ਐਪਸ ਨੂੰ ਟਾਈਪ ਕਰ ਸਕਦੇ ਹੋ।" "ਪੂਰਾ ਹੋਇਆ" "ਐਪ ਪ੍ਰਤੀਕ ਦਿਖਾਓ" "ਲਾਂਚਰ ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨ ਪ੍ਰਤੀਕ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ" @@ -84,7 +84,7 @@ "ਆਖਰੀ ਵਾਰ ਅੱਪਡੇਟ ਕੀਤਾ" "ਸੈਟਿੰਗਾਂ" "ਮਿਟਾਓ" - "ਰੂਪ %1$s" + "ਰੂਪ %1$s" "ਸ਼ਬਦਕੋਸ਼ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" "ਸ਼ਾਰਟਕੱਟ:" "ਭਾਸ਼ਾ:" diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 289c82a0d..2268056a0 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -17,7 +17,7 @@ "Włącz podzieloną klawiaturę" "Inne metody wprowadzania" "Klawisz zmiany języka" - "%s ms" + "%s ms" "Ustawienie domyślne" "W podpowiedziach i poprawkach używaj nazwisk z kontaktów" "Dostosowane sugestie" @@ -50,8 +50,8 @@ "Hiszpański (USA)" hinglish serbski (alfabet łaciński) - %s (tradycyjny) - %s (kompaktowy) + %s (tradycyjny) + %s (kompaktowy) standardowy "Emotikony" "Dodaj" @@ -65,18 +65,18 @@ "Emotikony z klawiatury fizycznej" "Naciśnięcie klawisza Alt przywołuje okienko wyboru emotikonów" "Domyślne" - Witamy w aplikacji %s + Witamy w aplikacji %s "z pisaniem gestami" "Rozpocznij" - Konfigurowanie aplikacji %s - Włącz aplikację %s - Zaznacz aplikację %s w ustawieniach Język i wprowadzanie tekstu. Umożliwi to jej uruchamianie na urządzeniu. + Konfigurowanie aplikacji %s + Włącz aplikację %s + Zaznacz aplikację %s w ustawieniach Język i wprowadzanie tekstu. Umożliwi to jej uruchamianie na urządzeniu. "Włącz w Ustawieniach" - Przełącz się na aplikację %s - Następnie wybierz %s jako aktywną metodę wprowadzania tekstu. + Przełącz się na aplikację %s + Następnie wybierz %s jako aktywną metodę wprowadzania tekstu. "Przełącz metody wprowadzania" Gratulacje, wszystko gotowe! - Teraz możesz pisać we wszystkich swoich ulubionych aplikacjach, używając aplikacji %s. + Teraz możesz pisać we wszystkich swoich ulubionych aplikacjach, używając aplikacji %s. Zakończ "Pokaż ikonę aplikacji" "Wyświetlaj ikonę aplikacji w programie uruchamiającym" @@ -85,7 +85,7 @@ "Ostatnia aktualizacja" "Ustawienia" "Usuń" - Wersja %1$s + Wersja %1$s "Dodaj do słownika" "Skrót:" "Język:" @@ -97,7 +97,7 @@ " ABCDEFGHIJKLMNOPQRSTUVWXYZ" Korekty Różne - %s min. + %s min. Bez limitu Wyłącz naukę nowych słów Więcej klawiszy @@ -118,7 +118,7 @@ Długie naciśnięcie klawisza spacji spowoduje wyświetlenie menu wyboru metody wprowadzania tekstu Pokazuj wskazówki klawiszy Skala wysokości klawiatury - %s (Akkhor) + %s (Akkhor) Ustawienia HeliBoard Dodatkowe klawisze Wprowadzanie @@ -156,13 +156,13 @@ Błąd podczas przywracania kopii zapasowej: %s Kolory Tło klawiszy funkcyjnych - %s (Sebeolsik 390) + %s (Sebeolsik 390) Używaj słownika osobistego do przechowywania nauczonych słów To słowo znajduje się już w słowniku: %s. Wpisz inne. Zaokrąglony Kopia Czarne - %s (Sebeolsik Final) + %s (Sebeolsik Final) Czekoladowe Na pewno usunąć słownik \"%s\" dodany przez użytkownika? Pochmurne @@ -341,15 +341,15 @@ Brak Odwróć kierunek po wybraniu układu klawiatury od prawej do lewej Zmienny kierunek paska narzędzi - %s (Probhat) - %s (Uczeń) + %s (Probhat) + %s (Uczeń) Przytrzymaj klawisz symboli, aby wyświetlić klawiaturę numeryczną Wytnij Zawsze używaj środkowej sugestii Po naciśnięciu spacji lub znaku interpunkcyjnego zostanie wpisana środkowa sugestia Zamknij schowek Wybierz klawisze paska narzędzi w schowku - %s (rozszerzony) + %s (rozszerzony) mansyjski Pokaż więcej kolorów To ustawienie wyświetla wszystkie kolory używane wewnętrznie. Lista kolorów może w każdej chwili ulec zmianie. Domyślny kolor jest losowy, a nazwy nie zostaną przetłumaczone. @@ -421,7 +421,7 @@ Usuń Na pewno zresetować wszystkie dostosowane ikony? Wibracje w trybie nie przeszkadzać - %s (fonetyczny) + %s (fonetyczny) Dargwa (Urakhi) Zastąp wersję emoji Autokorekta skrótów @@ -450,7 +450,7 @@ Układy możesz znaleźć i udostępnić w %s. sekcji dyskusji Własny układ - %s (Baishakhi) + %s (Baishakhi) Pokaż wyskakujące okienka TLD Zastąp wyskakujące okienka klawisza kropki domenami najwyższego poziomu podczas wpisywania adresów URL i adresów e-mail Naciśnięciu enter lub spacji po innych klawiszach w klawiaturze numerycznej diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index c6d371975..6ebeddd7b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -52,8 +52,8 @@ Espanhol (Estados Unidos) Hinglês Sérvio (Latino) - Nepali (Nepal) %s (Tradicional) - Bengali (Bangladesh) %s (Akkhor) + Nepali (Nepal) %s (Tradicional) + Bengali (Bangladesh) %s (Akkhor) Emojis Adicionar Remover @@ -67,7 +67,7 @@ Padrão com Digitação por Gestos Começar - Ative %s + Ative %s Ativar nas Configurações Alterar os métodos de entrada Parabéns, está tudo pronto! @@ -90,8 +90,8 @@ Preferências Histórico da área de transferência Sugestões - %s ms - %s min + %s ms + %s min Sem limite Padrão do sistema Dicionário pessoal @@ -105,18 +105,18 @@ Tempo de retenção do histórico Linha de números Nenhum idioma - Bem-vindo ao %s + Bem-vindo ao %s Mostrar a paleta de emojis ao tocar na tecla Alt física - Configurando %s - Por favor, ative o \"%s\" em \'Idiomas e Entrada\' nas configurações. Isso permitirá que ele seja usado no seu dispositivo. + Configurando %s + Por favor, ative o \"%s\" em \'Idiomas e Entrada\' nas configurações. Isso permitirá que ele seja usado no seu dispositivo. Concluído Mostrar o ícone do app na launcher Dicionário disponível - Alternar para %s - Em seguida, selecione \"%s\" como o seu método de entrada ativo. - Agora, você pode usar o %s para digitar nos seus apps favoritos. + Alternar para %s + Em seguida, selecione \"%s\" como o seu método de entrada ativo. + Agora, você pode usar o %s para digitar nos seus apps favoritos. Adicionar ao dicionário - Versão %1$s + Versão %1$s Escreva uma palavra Atalho opcional Modo de dia/noite automático @@ -124,7 +124,7 @@ Alterar para outros métodos de entrada Tecla de alteração de idioma Tecla de emoji - Hindi %s (Compacto) + Hindi %s (Compacto) Se desativado, a tecla da área de transferência somente colará o conteúdo na área de transferência Espaço automático após pontuação Inserir um espaço automaticamente após a pontuação ao digitar uma nova palavra @@ -196,7 +196,7 @@ Adicionar dicionário por um arquivo Fundo do teclado Espera - %s (Probhat) + %s (Probhat) "Sem um dicionário, você receberá apenas sugestões para o texto digitado antes.<br>\n Você pode baixar dicionários %1$s, ou verifique se um dicionário para \"%2$s\" pode ser baixado diretamente %3$s." Essa palavra já está presente no dicionário do usuário %s. Digite outra. Definido pelo usuário (noite) @@ -217,8 +217,8 @@ Destaque Gesto de deslizar horizontal na barra de espaço Mover cursor - %s (Sebeolsik 390) - %s (Sebeolsik Final) + %s (Sebeolsik 390) + %s (Sebeolsik Final) Adicionar layout customizado Selecionar um arquivo num formato compatível. Infomações sobre os formatos estão disponíveis em %s. Copiar layout existente @@ -306,13 +306,13 @@ Inverter a direção quando um teclado do subtipo direita-para-esquerda é selecionado Pressione longamente a tecla de símbolos para abrir o teclado numérico Cortar - %s (Estudante) + %s (Estudante) Licença Pública Geral GNU v3.0 Sempre usar a sugestão do meio Ao pressionar espaço ou pontuação, a sugestão do meio será inserida Fechar histórico da área de transferência Selecionar teclas da barra de ferramentas de área de transferência - %s (Extendido) + %s (Extendido) Essa configuração expõe todas as cores que são usadas internamente. A lista de cores pode mudar a qualquer momento. A cor padrão é aleatória, e os nomes não são traduzidos. Selecionar teclas fixadas da barra de ferramentas Começar instantaneamente sempre @@ -384,7 +384,7 @@ Você deseja realmente redefinir todos os ícones customizados? Lixeira Vibrar no modo Não Perturbe - %s (Fonético) + %s (Fonético) Sobrescrever versão de Emoji Realmente limpar todos os códigos de tecla customizados? Auto-corrrigir atalhos @@ -413,7 +413,7 @@ Você pode encontrar e compartilhar layouts em %s. seção de discussão Subtipo customizado - %s (Baishakhi) + %s (Baishakhi) Mostrar teclas de TLD Substituir os pop-ups da tecla de ponto com domínios de topo ao digitar URLs e endereços de e-mail Pressionando enter ou espaço após outras teclas no teclado de números diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 4a29f316d..c5af1493e 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -17,7 +17,7 @@ "Ativar teclado dividido" "Mudar p/ outros mét. ent." "Tecla alterar idioma" - "%s ms" + "%s ms" "Predef. do sistema" "Utilizar nomes dos Contactos para sugestões e correções" "Sugestões personalizadas" @@ -50,8 +50,8 @@ "Espanhol (EUA)" Hindi-Inglês Sérvio (Latino) - %s (Tradicional) - %s (Compacto) + %s (Tradicional) + %s (Compacto) Nenhum idioma Emojis "Adicionar" @@ -65,18 +65,18 @@ "Emoji para teclado físico" "A tecla Alt física mostra a paleta de emoji" "Predefinido" - Bem-vindo ao%s + Bem-vindo ao%s "com a Escrita com Gestos" "Começar" - A configurar%s - Ative o%s - Assinale %s na área \"Idioma e introdução\" das definições. Assim, já poderá executar a aplicação no dispositivo. + A configurar%s + Ative o%s + Assinale %s na área \"Idioma e introdução\" das definições. Assim, já poderá executar a aplicação no dispositivo. Ativar nas definições - Alternar para%s - De seguida, selecione %s\" como método de introdução ativo.\" + Alternar para%s + De seguida, selecione %s\" como método de introdução ativo.\" Alternar métodos de introdução Parabéns, configuração terminada! - Agora, já pode utilizar o %s para escrever nas suas aplicações. + Agora, já pode utilizar o %s para escrever nas suas aplicações. "Concluído" "Mostrar ícone da aplicação" "Mostrar ícone da aplicação no iniciador" @@ -85,7 +85,7 @@ "Última atualização" "Definições" "Eliminar" - Versão %1$s + Versão %1$s "Adicionar ao dicionário" "Atalho:" Língua: @@ -126,10 +126,10 @@ "Escolher o método de entrada" Tempo de retenção de histórico Espaço automático depois de pontuação - %s (Akkhor) + %s (Akkhor) Sem limite Ativar Histórico da Área de Transferência - %smin. + %smin. Inserir espaço automaticamente após pontuação ao digitar uma nova palavra Histórico da área de transferência "Anular" @@ -180,7 +180,7 @@ Tempo de vida do rasto do gesto Ficheiro de biblioteca desconhecido. Tem a certeza de que o obteve de uma fonte fiável e que é para \'%s\'? Vibrar no modo Não Incomodar - %s (Fonético) + %s (Fonético) Substituir a versão de Emoji Dargínico (Urakhi) Atalhos de correção automática diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index c6373b323..984db73b1 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -16,7 +16,7 @@ "Ativar teclado dividido" "Outros métodos de entrada" "Tecla de seleção de idioma" - "%s ms" + "%s ms" "Padrão do sistema" "Usa nomes dos Contatos para sugestões e correções" "Sugestões personalizadas" @@ -49,8 +49,8 @@ Espanhol (EUA) Hindi-Inglês "Sérvio (Latino)" - %s (Tradicional) - %s (Compacto) + %s (Tradicional) + %s (Compacto) "Nenhum idioma" "Emojis" "Adicionar" @@ -64,18 +64,18 @@ "Emojis para teclado físico" "Exibe o teclado de emojis ao pressionar a tecla Alt" "Padrão" - Bem-vindo ao %s + Bem-vindo ao %s "com entrada por gestos" "Começar" - A configurar %s - Ative o %s - Assinale %s na área \"Idioma e introdução\" das definições. Assim, já poderá executar a aplicação no dispositivo. + A configurar %s + Ative o %s + Assinale %s na área \"Idioma e introdução\" das definições. Assim, já poderá executar a aplicação no dispositivo. Ativar nas definições - Alternar para %s - De seguida, selecione \"%s\" como método de introdução. + Alternar para %s + De seguida, selecione \"%s\" como método de introdução. Alternar métodos de introdução Parabéns, configuração terminada! - Agora, já pode utilizar o %s para escrever nas suas aplicações. + Agora, já pode utilizar o %s para escrever nas suas aplicações. "Concluído" "Mostrar ícone do app" "Mostrar ícone do app no iniciador" @@ -84,7 +84,7 @@ "Última atualização" "Configurações" "Excluir" - Versão %1$s + Versão %1$s "Adicionar ao dicionário" "Atalho:" "Idioma:" @@ -127,11 +127,11 @@ Espaço automático após pontuação Inserir automaticamente espaço após a pontuação ao digitar uma nova palavra Histórico da área de transferência - %smin. + %smin. Sem Limite Ativar histórico da área de transferência Tempo de retenção do histórico - %s (Akkhor) + %s (Akkhor) "Desfazer" "Refazer" "Aprender com mensagens e dados digitados para melhorar sugestões" diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 5d7a2a61c..996417e47 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -16,7 +16,7 @@ Activează tastatura divizată "Comut. alte metode de introd." "Tastă comutare limbi" - "%s msec." + "%s msec." "Valoare prestabilită" Utilizează numele din Agendă pentru sugestii și corecții "Sugestii personalizate" @@ -49,8 +49,8 @@ "spaniolă (S.U.A.)" "Hinglish" "Sârbă (caractere latine)" - "%s (tradițională)" - "%s (Compact)" + "%s (tradițională)" + "%s (Compact)" "Nicio limbă" "Emoji" Adaugă @@ -64,18 +64,18 @@ "Emoji pentru tastatura fizică" "Tasta fizică Alt afișează panoul de emoji" "Prestabilit" - "Bun venit la %s" + "Bun venit la %s" "cu Tastarea gestuală" Începe - Se configurează %s - Activează %s - Bifează %s în „Limbi și introducerea textului”. Astfel, o vei autoriza să ruleze pe dispozitiv. + Se configurează %s + Activează %s + Bifează %s în „Limbi și introducerea textului”. Astfel, o vei autoriza să ruleze pe dispozitiv. Activează în Setări - Comută la %s - Apoi, selectează \"%s\" ca metodă de introducere a textului. + Comută la %s + Apoi, selectează \"%s\" ca metodă de introducere a textului. Comută între metodele de introducere a textului Felicitări, ai finalizat! - Acum, poți introduce text în toate aplicațiile preferate, utilizând %s. + Acum, poți introduce text în toate aplicațiile preferate, utilizând %s. "Finalizat" Afișează pictograma aplicației Afișează pictograma aplicației în lansator @@ -84,7 +84,7 @@ "Data ultimei modificări" "Setări" Șterge - Versiunea %1$s + Versiunea %1$s Adaugă în dicționar "Comandă rapidă:" "Limbă:" @@ -117,7 +117,7 @@ Distanță divizare Comută ambele Tasta Emoji - %s min + %s min Fără limită Adaugă cuvinte în dicționarul personal Utilizează dicționarul personal al dispozitivului pentru a stoca cuvintele învățate @@ -275,12 +275,12 @@ Scala de umplere inferioară Stânga integral Dreapta integral - %s (Akkhor) + %s (Akkhor) Selectează un dicționar de adăugat. Dicționarele în format .dict pot fi descărcate %s. Întunecată - %s (Probhat) - %s (Sebeolsik 390) - %s (Sebeolsik Final) + %s (Probhat) + %s (Sebeolsik 390) + %s (Sebeolsik Final) Setează imaginea de fundal Setezi imaginea pentru modul zi sau noapte? Zi @@ -300,7 +300,7 @@ Gest de glisare pe bara de spațiu verticală Fără Mută cursorul - %s (Student) + %s (Student) Începe întotdeauna instantaneu Text personalizat pe bara de spațiu Afișare automată bară de instrumente @@ -314,7 +314,7 @@ Rândul Clipboard de jos Ascundere automată a barei de instrumente Ascunde bara de instrumente când sugestiile devin disponibile - %s (Extins) + %s (Extins) Copiază în clipboard Încarcă Salvează în fișier @@ -328,7 +328,7 @@ Durata de viață a traseului gesturilor Selectează tastele fixate din bara de instrumente Rând de numere - %s (Fonetic) + %s (Fonetic) Dargwa (Urakhi) Cod tastă Cod apăsare lungă @@ -376,7 +376,7 @@ Resetezi cu adevărat toate pictogramele personalizate? Subtip personalizat Nume greșit - %s (Baishakhi) + %s (Baishakhi) Limbi cu dicționare Tastatură împărțită AVERTIZARE: Aspectul este utilizat în prezent diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 96f881bef..933865178 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -17,7 +17,7 @@ Включить разделение клавиатуры Смена методов ввода "Клавиша смены языка" - %s мс. + %s мс. "По умолчанию" Использовать имена из Контактов для предложений и исправлений "Пользовательские словари" @@ -52,8 +52,8 @@ Мансийский Кайтагский Сербский (латиница) - %s (Традиционная) - %s (Компактная) + %s (Традиционная) + %s (Компактная) Стандартная Эмодзи Добавить @@ -67,18 +67,18 @@ Эмодзи для физической клавиатуры Физическая клавиша Alt показывает все доступные эмодзи По умолчанию - Добро пожаловать в %s + Добро пожаловать в %s с непрерывным вводом Начать работу - Настроить %s - Включить %s - Убедитесь, что приложение \"%s\" включено в настройках языка и ввода. Это позволит ему работать на вашем устройстве. + Настроить %s + Включить %s + Убедитесь, что приложение \"%s\" включено в настройках языка и ввода. Это позволит ему работать на вашем устройстве. Включить в настройках - Переключитесь на %s - Теперь выберите \"%s\" в качестве активного метода ввода текста. + Переключитесь на %s + Теперь выберите \"%s\" в качестве активного метода ввода текста. Другой способ ввода Поздравляем, всё готово! - Теперь вы можете использовать приложение %s для набора текста. + Теперь вы можете использовать приложение %s для набора текста. Готово Показывать значок приложения Отображать значок приложения на панели запуска @@ -87,7 +87,7 @@ Последнее обновление Настройки Удалить - Версия %1$s + Версия %1$s Добавление в словарь "Быстрые клавиши:" "Язык:" @@ -124,11 +124,11 @@ Включить журнал буфера обмена Проверка правописания HeliBoard Настройки проверки правописания - %s мин. + %s мин. Настройки HeliBoard Без ограничения Время хранения журнала буфера обмена - %s (Акхор) + %s (Акхор) Даргинский (Урахи) Контуры клавиш Использовать тему системы @@ -195,9 +195,9 @@ Динамические цвета Показать функциональные подсказки Выберите файл в совместимом формате. Информация о форматах доступна %s. - %s (Себольсик 390) + %s (Себольсик 390) Использовать личный словарь устройства для хранения выученных слов - %s (Себольсик Финальная) + %s (Себольсик Финальная) Шоколад Облачная День @@ -295,13 +295,13 @@ ► Долгое нажатие на закреплённые клавиши панели инструментов открывает дополнительные функции:<br> \n\t• буфер обмена &#65515; вставить <br> \n\t• сдвинуть курсор влево/вправо &#65515; перейти на слово влево/вправо <br> \n\t• сдвинуть курсор вверх/вниз &#65515; перейти на страницу вверх/вниз <br> \n\t• слово левее/правее &#65515; перейти к началу/концу строки <br> \n\t• страница вверх/вниз &#65515; перейти к началу/концу страниц<br> \n\t• копировать &#65515; вырезать <br> \n\t• выделить слово &#8596; выделить всё <br> \n\t• отменить &#8596; повторить <br> <br> \n► Долгое нажатие на клавиши в панели инструментов полосы предложений - закрепляет их в полосе предложений. <br> <br> \n► Долгое нажатие на клавишу запятой - открывает Вид буфера обмена, Вид эмодзи, Режим одной руки, Настройки или Сменить язык: <br> \n\t• Вид эмодзи и Смена языка будут недоступны, если соответствующая клавиша уже включена; <br> \n\t• Для некоторых раскладок клавиатуры это не клавиша запятой, а клавиша, находящаяся в том же положении (например, это клавиша \"q\" для раскладки Dvorak). <br> <br> \n► Когда включен режим инкогнито, никакие слова не будут сохранены, и эмодзи не будут добавлены в список использованных. <br> <br> \n► Нажмите на иконку Инкогнито, чтобы получить доступ к панели инструментов.<br> <br> \n► Скользящий ввод клавиш: Проведите пальцем от клавиши Shift к другой клавише, чтобы ввести одну заглавную букву: <br> \n\t• Также это работает для клавиши \\\'?123\\\', чтобы ввести один символ из клавиатуры символов и для связанных с ней клавиш. <br> <br> \n► Удерживайте клавишу Shift или клавишу символа, нажмите одну или несколько клавиш и затем отпустите клавишу Shift или клавишу символа, чтобы переключиться обратно на предыдущую клавиатуру. <br> <br> \n► Долгое нажатие на предложение в полосе предложений показывает ещё больше предложений и клавишу удаления для удаления этого предложения. <br> <br> \n► Проведите пальцем вверх от предложения, чтобы показать больше предложений и отпустите на нужном, чтобы выбрать его. <br> <br> \n► Долгое нажатие на запись в истории буфера обмена закрепляет её (сохраняет в буфере обмена до тех пор, пока вы не отмените закрепление). <br> <br> \n► Проведите пальцем влево в просмотре буфера обмена, чтобы удалить запись (кроме случаев, когда она закреплена). <br> <br> \n► Выделите текст и нажмите клавишу Shift, чтобы переключаться между прописными, строчными буквами и капитализацией слов. <br> <br> \n► Вы можете добавить словари, открыв их в файловом менеджере: <br> \n\t• Это работает только с <i>content-uris</i> и не работает с <i>file-uris</i>, поэтому это может не работать с некоторыми файловыми менеджерами. <br> <br> \n► Для пользователей, создающих резервные копии вручную с правами суперпользователя (root): <br> \n\t• Начиная с Android 7, файл общих настроек находится в другом месте, поскольку приложение использует %s. Это необходимо, чтобы настройки можно было прочитать до разблокировки устройства, например, при запуске; <br> \n\t• Файл находится в /data/user_de/0/package_id/shared_prefs/, хотя это может зависеть от устройства и версии Android. <br> <br> \n<i><b>Режим отладки / отладочная версия APK</b></i> <br> <br> \n► Долгое нажатие на подсказку показывает исходный словарь. <br> <br> \n► Когда используется отладочная версия APK, можно найти в Настройки отладки в разделе Расширенные настройки, хотя их полезность ограничена, за исключением выгрузки словарей в журнал. <br> \n\t• Для релизной версии APK необходимо несколько раз нажать на версию в разделе <i>О программе</i>, затем можно найти настройки отладки в разделе <i>Расширенные настройки</i>. <br> \n\t• Когда включена опция <i>Показать информацию о подсказках</i>, подсказки будут иметь небольшие цифры вверху, которые показывают некоторые внутренние баллы и исходный словарь. <br> <br> \n► В случае аварийного завершения работы приложения, вам будет предложено, получить журналы ошибок, когда вы откроете раздел Настройки. <br> <br> \n► Когда используется многоязычный ввод, клавиша пробела будет показывать значение достоверности, которое используется для определения текущего используемого языка. <br> <br> \n► Предложения будут иметь небольшие цифры вверху, которые показывают некоторые внутренние баллы и исходный словарь (это можно отключить). Обратное направление, если выбран подтип клавиатуры с письмом справа налево Переменное направление панели инструментов - %s (Пробхат) + %s (Пробхат) Горизонтальный свайп по пробелу Вертикальный свайп по пробелу Бездействие Перемещение курсора Долгое нажатие клавиши символов для цифровой клавиатуры - %s (Студенческая) + %s (Студенческая) Вырезать Действие клавиши смены языка Эмодзи @@ -315,7 +315,7 @@ При нажатии пробела или знака препинания будет использовано среднее предложение Закрыть буфер обмена Выбрать клавиши панели буфера обмена - %s (Расширенная) + %s (Расширенная) Скрывать панель инструментов при появлении предложений Панель инструментов Показывать панель инструментов при вводе или при выборе текста @@ -377,7 +377,7 @@ Действительно сбросить все настроенные иконки? Корзина Вибрация в режиме Не беспокоить - %s (Фонетика) + %s (Фонетика) Автоисправление сокращений Установить пользовательский шрифт из файла Масштаб нижнего отступа (ландшафт) @@ -396,7 +396,7 @@ Включить разделение клавиатуры (ландшафт) Разделение клавиатуры Пользовательский подтип - %s (Байсахи) + %s (Байсахи) Предупреждение: раскладка в данный момент используется Действительно удалить %s? Дополнительные раскладки diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 06c000c09..98a90b5b6 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -16,7 +16,7 @@ "බෙදු යතුරු පුවරුව සබල කරන්න" "වෙනත් ආදාන ක්‍රම වෙත මාරුවන්න" "භාෂා මාරු යතුර" - "%sms" + "%sms" "පද්ධති සුපුරුදු" "යෝජනා සහ නිවැරදි කිරීම් සඳහා සබඳතා වෙතින් නම් භාවිතා කරන්න" "පෞද්ගලීකරණය කළ යෝජනා" @@ -49,8 +49,8 @@ "ස්පාඤ්ඤ (US)" "හින්ග්ලිෂ්" "සර්බියානු (ලතින්)" - "%s (සාම්ප්‍රදායික)" - "%s (සංයුක්ත)" + "%s (සාම්ප්‍රදායික)" + "%s (සංයුක්ත)" "භාෂාවක් නැත" "ඉමොජි" "එක් කරන්න" @@ -64,18 +64,18 @@ "භෞතික යතුරුපුවරුව සඳහා ඉමොජි" "භෞතික Alt යතුර ඉමොජි පෙන්වයි" "සුපුරුදු" - %s වෙත සාදරයෙන් පිළිගනිමු\" + %s වෙත සාදරයෙන් පිළිගනිමු\" "ඉංගිත ටයිප් කිරීම් සමග" "අරඹන්න" - %s සැකසෙමින් පවතී\" - %s සබල කරන්න\" - "කරණාකර ඔබගේ භාෂාව සහ ආදාන සැකසීම් තුළ \"%s\" පරීක්ෂා කරන්න. මෙය ඔබගේ උපාංගය මත එයට ධාවනය වීමට අනුමැතිය දෙනු ඇත." + %s සැකසෙමින් පවතී\" + %s සබල කරන්න\" + "කරණාකර ඔබගේ භාෂාව සහ ආදාන සැකසීම් තුළ \"%s\" පරීක්ෂා කරන්න. මෙය ඔබගේ උපාංගය මත එයට ධාවනය වීමට අනුමැතිය දෙනු ඇත." "සැකසීම් තුළ සබල කරන්න" - %s වෙත මාරුවන්න\" - "ඊළඟට, ඔබගේ සක්‍රිය පෙළ-ආදාන ක්‍රමය ලෙස \"%s\" තෝරන්න." + %s වෙත මාරුවන්න\" + "ඊළඟට, ඔබගේ සක්‍රිය පෙළ-ආදාන ක්‍රමය ලෙස \"%s\" තෝරන්න." "ආදාන ක්‍රම මාරු කරන්න" "සුබපැතුම්, ඔබ සියල්ල පිහිටුවා ඇත!" - "දැන් ඔබට %s සමගින් ඔබගේ සියළුම ප්‍රියතම යෙදුම් වලින් ටයිප් කළ හැක." + "දැන් ඔබට %s සමගින් ඔබගේ සියළුම ප්‍රියතම යෙදුම් වලින් ටයිප් කළ හැක." "අවසන්" "යෙදුම් නිරූපකය පෙන්වන්න" "දියත්කරනය තුළ යෙදුම් නිරූපකය දර්ශනය කරන්න" @@ -84,7 +84,7 @@ "අවසන් වරට යාවත්කාලීන කළේ" "සැකසීම්" "මකන්න" - "%1$s අනුවාදය" + "%1$s අනුවාදය" "ශබ්ද කෝෂය වෙත එක් කරන්න" "කෙටිමග:" "භාෂාව:" diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index a8571e85b..be6961034 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -16,7 +16,7 @@ "Povoliť rozdelenie klávesnice" "Prepnúť na iné metódy vstupu" "Kľúč na prepínanie jazyka" - "%s ms" + "%s ms" "Predvolené" "Používať mená z kontaktov na návrhy a opravy" "Prispôsobené návrhy" @@ -49,8 +49,8 @@ "španielčina (USA)" Indická angličtina "srbčina (latinka)" - "%s (tradičná)" - "%s (kompaktná)" + "%s (tradičná)" + "%s (kompaktná)" "Žiadny jazyk" "Emoji" "Pridať" @@ -64,18 +64,18 @@ "Emodži pre fyzickú klávesnicu" "Paletu emodži zobrazíte stlačením fyzického klávesa Alt." "Predvolené" - "Vitajte v aplikácii %s" + "Vitajte v aplikácii %s" "s funkciou Písanie gestami" "Začať" - "Nastavenie aplikácie %s" - "Povoľte aplikáciu %s" - V nastaveniach Jazyky a vstup začiarknite políčko%s. Týmto aplikácii povolíte spustenie v zariadení.\" + "Nastavenie aplikácie %s" + "Povoľte aplikáciu %s" + V nastaveniach Jazyky a vstup začiarknite políčko%s. Týmto aplikácii povolíte spustenie v zariadení.\" "Povoliť v Nastaveniach" - "Prepnite na aplikáciu %s." - Potom vyberte aplikáciu%s ako aktívnu metódu textového vstupu.\" + "Prepnite na aplikáciu %s." + Potom vyberte aplikáciu%s ako aktívnu metódu textového vstupu.\" "Prepnúť metódu vstupu" "Blahoželáme, všetko je nastavené!" - "Pomocou aplikácie %s teraz môžete zadávať text vo všetkých obľúbených aplikáciách." + "Pomocou aplikácie %s teraz môžete zadávať text vo všetkých obľúbených aplikáciách." "Hotovo" "Zobraziť ikonu aplikácie" "Zobrazenie ikony aplikácie v spúšťači" @@ -84,7 +84,7 @@ "Posledná aktualizácia" "Nastavenia" "Odstrániť" - "Verzia %1$s" + "Verzia %1$s" "Pridať do slovníka" "Klávesová skratka" "Jazyk:" diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index fe2246b2c..2cb2eee4a 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -16,7 +16,7 @@ "Omogoči razdeljeno tipkovnico" "Prekl. na drug nač. vnosa" "Tipka za preklop med jeziki" - "%s ms" + "%s ms" "Sistemsko privzeto" "Uporaba imen iz stikov za predloge in popravke" "Prilagojeni predlogi" @@ -49,8 +49,8 @@ "španščina (ZDA)" "Hindujska angleščina" "Srbščina (latinica)" - "%s (tradicionalna)" - "%s (kompaktna)" + "%s (tradicionalna)" + "%s (kompaktna)" "Brez jezika" "Emodžiji" "Dodaj" @@ -64,18 +64,18 @@ "Emodžiji za fizično tipkovnico" "Fizična tipka Alt prikaže nabor emodžijev" "Privzeto" - "Pozdravljeni v aplikaciji %s" + "Pozdravljeni v aplikaciji %s" "s pisanjem s kretnjami" "Začnite" - "Nastavitev aplikacije %s" - "Omogočanje aplikacije %s" - V nastavitvah »Jeziki in vnos« izberite aplikacijo %s«. S tem ji omogočite izvajanje v napravi.\" + "Nastavitev aplikacije %s" + "Omogočanje aplikacije %s" + V nastavitvah »Jeziki in vnos« izberite aplikacijo %s«. S tem ji omogočite izvajanje v napravi.\" "Omogoči v nastavitvah" - "Preklop na aplikacijo %s" - Nato izberite aplikacijo %s« kot aktivni način vnosa besedila.\" + "Preklop na aplikacijo %s" + Nato izberite aplikacijo %s« kot aktivni način vnosa besedila.\" "Preklopi način vnosa" "Čestitamo, pripravljeni ste." - "Zdaj lahko z aplikacijo %s tipkate v vseh svojih priljubljenih aplikacijah." + "Zdaj lahko z aplikacijo %s tipkate v vseh svojih priljubljenih aplikacijah." "Končano" "Pokaži ikono aplikacije" "Prikaz ikone aplikacije v zaganjalniku" @@ -84,7 +84,7 @@ "Nazadnje posodobljeno" "Nastavitve" "Izbriši" - "Različica %1$s" + "Različica %1$s" "Dodaj v slovar" "Bližnjica:" "Jezik:" @@ -108,7 +108,7 @@ Predlogi Razno Brez omejitve - %smin. + %smin. Omogoči tipko odložišča Čas shranjevanja zgodovine Onemogočite, da boste s tipko odložišča lahko prilepili vsebino diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index b193f107b..e897dc659 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -17,7 +17,7 @@ "Aktivizo tastierën e ndarë" "Kalo në metoda të tjera hyrjeje" "Tasti i ndryshimit të gjuhës" - "%s milisek." + "%s milisek." "Parazgjedhja e sistemit" "Përdor emra nga \"Kontaktet\" për sugjerime dhe korrigjime" "Sugjerime të personalizuara" @@ -50,8 +50,8 @@ "spanjisht (SHBA)" "hinglisht" "serbisht (latin)" - "%s (tradicionale)" - "%s (kompakte)" + "%s (tradicionale)" + "%s (kompakte)" "nuk ka gjuhë" "\"Emoji\"" "Shto" @@ -65,18 +65,18 @@ "Emoji për tastierën fizike" "Tasti fizik Alt shfaq paletën me emoji" "I parazgjedhur" - "Mirë se erdhe në %s" + "Mirë se erdhe në %s" "me \"Shkrimin me gjeste\"" "Fillo" - "Po konfiguron %s" - "Aktivizo %s" - "Kontrollo \"%s\" te \"Cilësimet e gjuhës dhe hyrjes\". Kjo do ta autorizojë atë që të ekzekutohet në pajisjen tënde." + "Po konfiguron %s" + "Aktivizo %s" + "Kontrollo \"%s\" te \"Cilësimet e gjuhës dhe hyrjes\". Kjo do ta autorizojë atë që të ekzekutohet në pajisjen tënde." "Aktivizo te \"Cilësimet\"" - "Kalo në %s" - "Më pas, përzgjidh \"%s\" si metodën tënde aktive të hyrjes së tekstit." + "Kalo në %s" + "Më pas, përzgjidh \"%s\" si metodën tënde aktive të hyrjes së tekstit." "Ndrysho metodat e hyrjes" "Urime, tani je gati!" - "Tani mund të shkruash të gjitha aplikacionet e tua të preferuara me %s." + "Tani mund të shkruash të gjitha aplikacionet e tua të preferuara me %s." "U përfundua" "Shfaq ikonën e aplikacionit" "Shfaq ikonën e aplikacionit në mekanizimin e nisjes" @@ -85,7 +85,7 @@ "Përditësimi i fundit" "Cilësimet" "Fshi" - "Versioni %1$s" + "Versioni %1$s" "Shto në fjalor" "Shkurtorja:" "Gjuha:" diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index f18427034..c5c75d43a 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -16,7 +16,7 @@ "Омогући подељену тастатуру" "Пребаци на друге методе уноса" "Тастер за пребацивање језика" - %s мс + %s мс "Подразумевано" "Користи имена из Контаката за предлоге и исправке" "Персонализовани предлози" @@ -49,8 +49,8 @@ "шпански (САД)" "хенглески" "српски (латиница)" - %s (традиционални) - %s (компактна) + %s (традиционални) + %s (компактна) "Нема језика" "Емотикони" "Додај" @@ -64,18 +64,18 @@ "Емоџи за физичку тастатуру" "Физички тастер Alt показује палету емоџија" "Подразумевано" - Добро дошли у %s + Добро дошли у %s "помоћу Куцања покретима" "Започнимо" - Подешавање апликације %s - Омогућите апликацију %s - Потврдите апликацију %s“ у Подешавањима језика и уноса. Тако јој одобравате покретање на уређају.\" + Подешавање апликације %s + Омогућите апликацију %s + Потврдите апликацију %s“ у Подешавањима језика и уноса. Тако јој одобравате покретање на уређају.\" "Омогући у Подешавањима" - "Пребаците на %s" - Затим изаберите %s“ као активни метод уноса текста.\" + "Пребаците на %s" + Затим изаберите %s“ као активни метод уноса текста.\" "Пребаци методе уноса" "Честитамо, све је спремно!" - "Сада можете да куцате у свим омиљеним апликацијама помоћу %s." + "Сада можете да куцате у свим омиљеним апликацијама помоћу %s." "Завршено" "Прикажи икону апликације" "Икона апликације се приказује у покретачу" @@ -84,7 +84,7 @@ "Последње ажурирање" "Подешавања" "Избриши" - "Верзија %1$s" + "Верзија %1$s" "Додавање у речник" "Пречица:" "Језик:" @@ -116,12 +116,12 @@ Дуг притисак на тастер за размак ће приказати мени за избор метода уноса Аутоматски режим дан/ноћ Изглед ће пратити подешавања система - %s (Акхор) + %s (Акхор) Без лимита Омогући историју међуспремника Време задржавања историје Висина тастатуре - %sмин + %sмин Прикажи савете за дуги притисак Уклањање превлачењем Емоји кључ diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 268c042d2..ef33bb2d8 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -16,7 +16,7 @@ "Aktivera delat tangentbord" Byt till andra inmatningssätt Språkbytestangent - %sms + %sms "Standardinställning" "Använd namn från Kontakter för förslag och korrigeringar" "Anpassade förslag" @@ -49,8 +49,8 @@ Spanska (USA) Hingelska "Serbiska (latinsk)" - %s (traditionell) - %s (kompakt) + %s (traditionell) + %s (kompakt) "Inget språk" Emoji "Lägg till" @@ -64,18 +64,18 @@ "Emoji för fysiskt tangentbord" "Den fysiska Alt-tangenten visar emoji-paletten" "Standard" - Välkommen till %s + Välkommen till %s "med svepskrivning" "Kom igång" - Konfigurerar %s - Aktivera %s - Markera \"%s\" i dina Språk & inmatning-inställningar. Detta kommer att tillåta att den körs på din enhet. + Konfigurerar %s + Aktivera %s + Markera \"%s\" i dina Språk & inmatning-inställningar. Detta kommer att tillåta att den körs på din enhet. Aktivera i Inställningar - Byt till %s - Välj sedan \"%s\" som din aktiva textinmatningsmetod. + Byt till %s + Välj sedan \"%s\" som din aktiva textinmatningsmetod. "Byt inmatningsmetod" Grattis, nu är allt klart! - Nu kan du skriva i alla dina favoritappar med %s. + Nu kan du skriva i alla dina favoritappar med %s. Slutförd "Visa appikon" "Visa appikonen i startprogrammet" @@ -84,7 +84,7 @@ "Informationen uppdaterades senast" "Inställningar" "Ta bort" - Version %1$s + Version %1$s "Lägg till i ordlista" "Genväg:" "Språk:" @@ -98,7 +98,7 @@ Förslag Experimentella Diverse - %s min + %s min Ingen gräns Långtryckning på mellanslagstangenten öppnar menyn för val av inmatningsmetod Ändra inmatningsmetod med mellanslagstangenten @@ -124,7 +124,7 @@ Automatiskt mellanslag efter skiljetecken Fler tangenter Skala för tangentbordets höjd - %s (akkhor) + %s (akkhor) Kantlinjer runt tangenter Automatiskt dag-/nattläge Utseendet kommer att följa systeminställningarna diff --git a/app/src/main/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml index 1fc88bc10..917a2fe2d 100644 --- a/app/src/main/res/values-sw/strings.xml +++ b/app/src/main/res/values-sw/strings.xml @@ -17,7 +17,7 @@ "Washa muundo wa kibodi inayogawanyika" "Badilisha hadi kwa mbinu zingine za ingizo" "Kitufe cha kubadilisha lugha" - "Milisekunde %s" + "Milisekunde %s" "Chaguomsingi la mfumo" "Tumia majina kutoka kwa Anwani kama mapendekezo na marekebisho" "Mapendekezo yaliyobadilishwa kukufaa" @@ -50,8 +50,8 @@ "Kihispania (Marekani)" "Hinglish" "Kiserbia (Kilatino)" - "%s (cha Jadi)" - "%s (Thabiti)" + "%s (cha Jadi)" + "%s (Thabiti)" "Hakuna lugha" "Emoji" "Ongeza" @@ -65,18 +65,18 @@ "Emoji za kibodi halisi" "Kitufe halisi cha Alt huonyesha kibao cha emoji" "Chaguomsingi" - "Karibu kwenye %s" + "Karibu kwenye %s" "kwa Kuandika kwa ishara" "Anza kutumia" - "Inasanidi %s" - "Washa %s" - "Tafadhali angalia \"%s\" katika mipangilio yako ya Lugha na mbinu ya kuingiza data. Hatua hii itairuhusu kutumika kwenye kifaa chako." + "Inasanidi %s" + "Washa %s" + "Tafadhali angalia \"%s\" katika mipangilio yako ya Lugha na mbinu ya kuingiza data. Hatua hii itairuhusu kutumika kwenye kifaa chako." "Washa katika Mipangilio" - "Badilisha kwenda %s" - "Kisha, chagua \"%s\" kama mbinu yako inayotumika ya kuingiza data ya maandishi." + "Badilisha kwenda %s" + "Kisha, chagua \"%s\" kama mbinu yako inayotumika ya kuingiza data ya maandishi." "Badilisha mbinu za kuingiza data" "Hongera, uko tayari!" - "Sasa unaweza kuchapa programu zako zote uzipendazo ukitumia %s." + "Sasa unaweza kuchapa programu zako zote uzipendazo ukitumia %s." "Imemaliza" "Onyesha aikoni ya programu" "Onyesha aikoni ya programu kwenye kifungua programu" @@ -85,7 +85,7 @@ "Ilibadilishwa mwisho" "Mipangilio" "Futa" - "Toleo la %1$s" + "Toleo la %1$s" "Ongeza kwenye kamusi" "Njia ya mkato:" "Lugha:" diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index f085d1bc1..d9270daa0 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -16,7 +16,7 @@ "பிரிக்கப்பட்ட விசைப்பலகையை இயக்கு" "பிற உள்ளீட்டு முறைகளுக்கு மாறு" "மொழி மாற்ற விசை" - "%sமி.வி." + "%sமி.வி." "அமைப்பின் இயல்புநிலை" "பரிந்துரைகள், திருத்தங்கள் ஆகியவற்றிற்கு தொடர்புகளிலிருந்து பெயர்களை பயன்படுத்து" "தனிப்பட்ட பரிந்துரைகள்" @@ -49,8 +49,8 @@ "ஸ்பானிஷ் (யூஎஸ்)" "ஹிங்கிலிஷ்" "செர்பியன் (லத்தீன்)" - "%s (பாரம்பரியமானது)" - "%s (வசதியான)" + "%s (பாரம்பரியமானது)" + "%s (வசதியான)" "மொழியில்லை" "எமோஜி" "சேர்" @@ -64,18 +64,18 @@ "கைமுறை விசைப்பலகைக்கான ஈமோஜி" "ஈமோஜி பலகத்தைக் காட்டும் கைமுறை Alt விசை" "இயல்புநிலை" - %s பயன்பாட்டிற்கு வரவேற்கிறோம்\" + %s பயன்பாட்டிற்கு வரவேற்கிறோம்\" "ஸ்வைப் உள்ளீடு மூலம்" "தொடங்குக" - %s ஆப்ஸை அமைக்கிறது\" - %s ஆப்ஸை இயக்கவும்\" - "மொழி & உள்ளீட்டு அமைப்புகளில் \"%s\" ஆப்ஸைத் தேர்வு செய்யவும். இதனால், சாதனத்தில் ஆப்ஸை இயக்கலாம்." + %s ஆப்ஸை அமைக்கிறது\" + %s ஆப்ஸை இயக்கவும்\" + "மொழி & உள்ளீட்டு அமைப்புகளில் \"%s\" ஆப்ஸைத் தேர்வு செய்யவும். இதனால், சாதனத்தில் ஆப்ஸை இயக்கலாம்." "அமைப்புகளில் இயக்கு" - %s க்கு மாறவும்\" - "அடுத்து, உங்கள் செயலில் உள்ள உரை உள்ளீட்டு முறையாக \"%s\" பயன்பாட்டைத் தேர்ந்தெடுக்கவும்." + %s க்கு மாறவும்\" + "அடுத்து, உங்கள் செயலில் உள்ள உரை உள்ளீட்டு முறையாக \"%s\" பயன்பாட்டைத் தேர்ந்தெடுக்கவும்." "உள்ளீட்டு முறைகளை மாற்றவும்" "வாழ்த்துகள், தயாராகிவிட்டீர்கள்!" - "%s ஆப்ஸ் மூலம் உங்களுக்கு விருப்பமான எல்லா ஆப்ஸ்களிலும் நீங்கள் உள்ளிடலாம்." + "%s ஆப்ஸ் மூலம் உங்களுக்கு விருப்பமான எல்லா ஆப்ஸ்களிலும் நீங்கள் உள்ளிடலாம்." "முடிந்தது" "ஆப்ஸ் ஐகானைக் காட்டு" "துவக்கியில் ஆப்ஸ் ஐகானைக் காட்டும்" @@ -84,7 +84,7 @@ "இறுதியாகப் புதுப்பித்தது" "அமைப்பு" "நீக்கு" - "%1$s பதிப்பு" + "%1$s பதிப்பு" "அகராதியில் சேர்" "ஷார்ட்கட்:" "மொழி:" diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 223983aa3..15d418a2d 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -16,7 +16,7 @@ "విభజన కీబోర్డ్‌ను ప్రారంభించు" "ఇతర ఇన్‌పుట్ పద్ధతులకు మారండి" "భాష మార్పు కీ" - "%sమిసె" + "%sమిసె" "సిస్టమ్ డిఫాల్ట్" "సూచనలు మరియు సవరణల కోసం పరిచయాల నుండి పేర్లను ఉపయోగించు" "వ్యక్తిగతీకరించబడిన సూచనలు" @@ -49,8 +49,8 @@ "స్పానిష్ (యుఎస్)" "హింగ్లీష్" "సెర్బియన్ (లాటిన్)" - "%s (సాంప్రదాయకం)" - "%s (కాంపాక్ట్)" + "%s (సాంప్రదాయకం)" + "%s (కాంపాక్ట్)" "భాష లేదు" "ఎమోజి" "జోడించండి" @@ -64,18 +64,18 @@ "భౌతిక కీబోర్డ్ కోసం ఎమోజి" "భౌతిక Alt కీ ఎమోజి ఫలకాన్ని చూపుతుంది" "డిఫాల్ట్" - %sకు స్వాగతం\" + %sకు స్వాగతం\" "సంజ్ఞ టైపింగ్‌తో" "ప్రారంభించండి" - %sని సెటప్ చేయడం\" - %sని ప్రారంభించండి\" - "దయచేసి మీ భాషలు & ఇన్‌పుట్ సెట్టింగ్‌ల్లో \"%s\" తనిఖీ చేయండి. ఇది మీ పరికరంలో అమలు కావడానికి దీన్ని ప్రామాణీకరిస్తుంది." + %sని సెటప్ చేయడం\" + %sని ప్రారంభించండి\" + "దయచేసి మీ భాషలు & ఇన్‌పుట్ సెట్టింగ్‌ల్లో \"%s\" తనిఖీ చేయండి. ఇది మీ పరికరంలో అమలు కావడానికి దీన్ని ప్రామాణీకరిస్తుంది." "సెట్టింగ్‌ల్లో ప్రారంభించండి" - %sకు మారండి\" - "తర్వాత, \"%s\"ని మీ సక్రియ వచన-ఇన్‌పుట్ పద్ధతిగా ఎంచుకోండి." + %sకు మారండి\" + "తర్వాత, \"%s\"ని మీ సక్రియ వచన-ఇన్‌పుట్ పద్ధతిగా ఎంచుకోండి." "ఇన్‌పుట్ పద్ధతులను మార్చు" "అభినందనలు, మీరు అంతా పూర్తి చేసారు!" - "ఇప్పుడు మీరు %sతో మీకు ఇష్టమైన అన్ని అనువర్తనాల్లో టైప్ చేయవచ్చు." + "ఇప్పుడు మీరు %sతో మీకు ఇష్టమైన అన్ని అనువర్తనాల్లో టైప్ చేయవచ్చు." "పూర్తయింది" "యాప్‌ చిహ్నాన్ని చూపు" "లాంచర్‌లో యాప్‌ చిహ్నాన్ని ప్రదర్శించు" @@ -84,7 +84,7 @@ "చివరిగా నవీకరించబడినది" "సెట్టింగ్‌లు" "తొలగించు" - "వెర్షన్ %1$s" + "వెర్షన్ %1$s" "నిఘంటువుకి జోడించు" "షార్ట్‌కట్:" "భాష:" diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index e62599477..4ef357d02 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -17,7 +17,7 @@ "เปิดใช้แป้นพิมพ์แยก" "ใช้วิธีการป้อนข้อมูลอื่น" "แป้นสลับภาษา" - "%s มิลลิวิ" + "%s มิลลิวิ" "ค่าเริ่มต้นของระบบ" "ใช้ชื่อจากรายชื่อติดต่อสำหรับคำแนะนำและการแก้ไข" "คำแนะนำในแบบของคุณ" @@ -50,8 +50,8 @@ "สเปน (สหรัฐอเมริกา)" "ภาษาอังกฤษผสมกับฮินดู" "เซอร์เบีย (ละติน)" - "%s (ดั้งเดิม)" - "%s (แบบกะทัดรัด)" + "%s (ดั้งเดิม)" + "%s (แบบกะทัดรัด)" "ไม่มีภาษา" "อีโมจิ" "เพิ่ม" @@ -65,18 +65,18 @@ "อีโมจิสำหรับแป้นพิมพ์บนเครื่อง" "แป้น Alt บนเครื่องแสดงชุดอีโมจิ" "ค่าเริ่มต้น" - "ยินดีต้อนรับสู่ %s" + "ยินดีต้อนรับสู่ %s" "พร้อมการป้อนข้อมูลด้วยท่าทาง" "เริ่มต้นใช้งาน" - "การตั้งค่า %s" - "เปิดใช้งาน %s" - "โปรดตรวจสอบ \"%s\" ในการตั้งค่าภาษาและการป้อนข้อมูลของคุณ ซึ่งจะอนุญาตให้แอปทำงานบนอุปกรณ์ของคุณ" + "การตั้งค่า %s" + "เปิดใช้งาน %s" + "โปรดตรวจสอบ \"%s\" ในการตั้งค่าภาษาและการป้อนข้อมูลของคุณ ซึ่งจะอนุญาตให้แอปทำงานบนอุปกรณ์ของคุณ" "เปิดใช้งานในการตั้งค่า" - "สลับไปใช้ %s" - "ถัดไป เลือก \"%s\" เป็นวิธีการป้อนข้อความที่ใช้งานของคุณ" + "สลับไปใช้ %s" + "ถัดไป เลือก \"%s\" เป็นวิธีการป้อนข้อความที่ใช้งานของคุณ" "สลับวิธีการป้อนข้อมูล" "ยินดีด้วย คุณพร้อมใช้งานแล้ว!" - "ตอนนี้คุณสามารถพิมพ์ข้อมูลลงในแอปที่ชื่นชอบทั้งหมดด้วย %s" + "ตอนนี้คุณสามารถพิมพ์ข้อมูลลงในแอปที่ชื่นชอบทั้งหมดด้วย %s" "เสร็จสิ้น" "แสดงไอคอนแอป" "แสดงไอคอนแอปพลิเคชันในตัวเรียกใช้งาน" @@ -85,7 +85,7 @@ "ปรับปรุงแก้ไขครั้งล่าสุด" "การตั้งค่า" "ลบ" - "เวอร์ชัน %1$s" + "เวอร์ชัน %1$s" "เพิ่มในพจนานุกรม" "ทางลัด:" "ภาษา:" diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml index 87cc604f3..f36b6fb24 100644 --- a/app/src/main/res/values-tl/strings.xml +++ b/app/src/main/res/values-tl/strings.xml @@ -17,7 +17,7 @@ "I-enable ang split keyboard" "Lipat iba paraan ng input" "Key ng panlipat ng wika" - "%sms" + "%sms" "Default ng system" "Gamitin ang pangalan mula sa Contact para sa mungkahi/pagtatama." "Personalized na mungkahi" @@ -50,8 +50,8 @@ "Spanish (US)" "Hinglish" "Serbian (Latin)" - "%s (Traditional)" - "%s (Compact)" + "%s (Traditional)" + "%s (Compact)" "Walang wika" "Emoji" "Idagdag" @@ -65,18 +65,18 @@ "Emoji para sa pisikal na keyboard" "Ipinapakita ng pisikal na Alt key ang emoji palette" "Default" - "Maligayang pagdating sa %s" + "Maligayang pagdating sa %s" "gamit ang Gesture na Pagta-type" "Magsimula" - "Sine-set up ang %s" - "Paganahin ang %s" - "Pakitingnan ang \"%s\" sa iyong Mga setting ng wika at input. Papahintulutan nitong gumana ito sa iyong device." + "Sine-set up ang %s" + "Paganahin ang %s" + "Pakitingnan ang \"%s\" sa iyong Mga setting ng wika at input. Papahintulutan nitong gumana ito sa iyong device." "I-enable sa Mga Setting" - "Lumipat sa %s" - "Susunod, piliin ang \"%s\" bilang iyong aktibong pamamaraan ng pag-input ng teksto." + "Lumipat sa %s" + "Susunod, piliin ang \"%s\" bilang iyong aktibong pamamaraan ng pag-input ng teksto." "Magpalit ng pamamaraan ng pag-input" "Binabati kita, handa ka na!" - "Ngayon, mata-type mo na ang lahat ng paborito mong apps gamit ang %s." + "Ngayon, mata-type mo na ang lahat ng paborito mong apps gamit ang %s." "Tapos na" "Ipakita ang icon ng app" "Ipakita ang icon ng application sa launcher" @@ -85,7 +85,7 @@ "Huling na-update" "Mga Setting" "I-delete" - "Bersyon %1$s" + "Bersyon %1$s" "Idagdag sa diksyunaryo" "Shortcut:" "Wika:" diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 377635bb2..447eb28d8 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -16,7 +16,7 @@ "Bölünmüş klavyeyi etkinleştir" "Diğer giriş yöntemine geç" "Dil değiştirme tuşu" - "%s ms" + "%s ms" "Sistem varsayılanı" "Öneri ve düzeltmeler için Kişiler\'deki adları kullan" "Kişisel öneriler" @@ -49,8 +49,8 @@ "İspanyolca (ABD)" "Hingilizce" "Sırpça (Latin alfabesi)" - %s (Geleneksel) - %s (Kompakt) + %s (Geleneksel) + %s (Kompakt) "Dil yok" "Emoji" "Ekle" @@ -64,18 +64,18 @@ "Fiziksel klavye için emoji" "Fiziksel Alt tuşu, emoji paletini gösterir" "Varsayılan" - %s uygulamasına hoş geldiniz + %s uygulamasına hoş geldiniz "Hareketle Yazmayı içerir" "Başlayın" - %s uygulamasını kurma - %s uygulamasını etkinleştirin - Lütfen \"%s\" uygulamasını Dil ve giriş ayarlarınızda işaretleyin. Bu, uygulamaya cihazınızda çalışma yetkisi verecektir. + %s uygulamasını kurma + %s uygulamasını etkinleştirin + Lütfen \"%s\" uygulamasını Dil ve giriş ayarlarınızda işaretleyin. Bu, uygulamaya cihazınızda çalışma yetkisi verecektir. "Ayarlarda etkinleştir" - %s uygulamasına geçin - Sonra, \"%s\" uygulamasını etkin metin giriş yönteminiz olarak seçin. + %s uygulamasına geçin + Sonra, \"%s\" uygulamasını etkin metin giriş yönteminiz olarak seçin. "Giriş yöntemini değiştir" Tebrikler, artık hazırsın! - Artık %s ile tüm favori uygulamalarınızda yazabilirsiniz. + Artık %s ile tüm favori uygulamalarınızda yazabilirsiniz. "Tamamlandı" "Uygulama simgesini göster" "Uygulama simgesini başlatıcıda gösterir" @@ -84,7 +84,7 @@ "Son güncelleme tarihi" "Ayarlar" "Sil" - Sürüm %1$s + Sürüm %1$s "Sözlüğe ekle" "Kısayol:" "Dil:" @@ -109,7 +109,7 @@ Tuş kenarlıkları Otomatik gündüz/gece modu HeliBoard yazım denetleyicisi - %sdak. + %sdak. Öneriler Emoji tuşu Pano geçmişini etkinleştir @@ -120,7 +120,7 @@ Tuş ipuçlarını göster Uzun basma ipuçlarını göster Boşluk tuşuyla giriş yöntemini değiştir - %s (Akkhor) + %s (Akkhor) Bir kerede metnin daha büyük bölümlerini seçmek ve silmek için silme tuşundan hızlıca kaydırın Görünüm sistem ayarlarını takip edecektir HeliBoard ayarları @@ -241,7 +241,7 @@ Özel düzen ekle Semboller Dil seç - %s (Genişletilmiş) + %s (Genişletilmiş) Uyumlu formatta bir dosya seç. Formatlarla ilgili bilgi %s mevcuttur. Dosyayı yükle Panoya kopyala @@ -309,7 +309,7 @@ Dosya okunamıyor Açık Yuvarlatılmış - %s (Probhat) + %s (Probhat) Sol Sayfa yukarı Kelime sola @@ -323,8 +323,8 @@ İşlevsel ipuçlarını göster Sabitlenmiş araç çubuğu tuşlarını seç Uzun basıldığında araç çubuğu tuşunu sabitle - %s (Sebeolsik 390) - %s (Sebeolsik Final) + %s (Sebeolsik 390) + %s (Sebeolsik Final) Stil Koyu Okyanus @@ -338,7 +338,7 @@ Araç çubuğu Gereksiz açılır pencereleri kaldır Sayısal tuş takımını aç kapa - %s (Öğrenci) + %s (Öğrenci) Mevcut düzeni kopyala Eklemek için bir sözlük seç .dict biçimindeki sözlükler %s indirilebilir. Hata: Seçilen dosya geçerli bir sözlük dosyası değil diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 9207ff909..1b1f33881 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -17,7 +17,7 @@ "Увімкнути розділену клавіатуру" Зміна методів введення "Клавіша зміни мови" - %s мс. + %s мс. Типово "Показувати виправлення на основі імен зі списку контактів" "Персональні пропозиції" @@ -50,8 +50,8 @@ "Іспанська (США)" Гінґліш Сербська (латиниця) - %s (Традиційна) - %s (Компактна) + %s (Традиційна) + %s (Компактна) Стандартна Емоджі Додати @@ -65,18 +65,18 @@ Смайли для фізичної клавіатури Фізична клавіша Alt показує усі доступні емоджі Типово - Вітаємо в%s + Вітаємо в%s з функцією «Ввід жестами» Розпочати - Налаштування%s - Увімкнути%s - Перевірте застосунок \\%s у налаштуваннях «Мова та введення». Це дозволить йому працювати на вашому пристрої. + Налаштування%s + Увімкнути%s + Перевірте застосунок \\%s у налаштуваннях «Мова та введення». Це дозволить йому працювати на вашому пристрої. Увімкнути в налаштуваннях - Перемкнути на%s - Виберіть \\%s поточним методом введення. + Перемкнути на%s + Виберіть \\%s поточним методом введення. Змінити метод введення Вітаємо, налаштування завершено! - Тепер ви можете писати в усіх улюблених застосунках за допомогою %s. + Тепер ви можете писати в усіх улюблених застосунках за допомогою %s. Завершено Показувати піктограму програми Відображати піктограму програми нв лаунчері @@ -85,7 +85,7 @@ Останнє оновлення Налаштування Видалити - Версія %1$s + Версія %1$s Додати в словник "Ярлик:" "Мова:" @@ -104,7 +104,7 @@ Кольори теми (темна тема) Використати тему системи Введення - %s (Аккгор) + %s (Аккгор) Автопробіл після знаків пунктуації Налаштування перевірки правопису HeliBoard Виправлення @@ -114,7 +114,7 @@ Різне Клавіша емоджі Без обмежень - %s хв. + %s хв. Увімкнути історію буфера обміну Якщо вимкнено, клавіша буфера обміну вставляє вміст, якщо він є Час зберігання історії @@ -262,10 +262,10 @@ Копіювати поточну розкладку Справді видалити власну розкладку %s? Помилка розкладки: %s - %s (Пробгат) - %s (Себольсік 390) - %s (Себольсік Фінальна) - %s (Студентська) + %s (Пробгат) + %s (Себольсік 390) + %s (Себольсік Фінальна) + %s (Студентська) Виберіть файл у сумісному форматі. Інформація про формати доступна %s. Додати власну розкладку Встановити зображення для денного чи нічного режиму? @@ -340,7 +340,7 @@ Додати найпоширеніші варіанти (типово) Видалити спливні клавіші, які є в базовій розкладці Мансійська - %s (Розширена) + %s (Розширена) Ця установка показує всі кольори, які використовуються всередині програми. Список кольорів може змінюватись. Стандартний колір є випадковим, і імена не будуть переведені. Показати більше кольорів Видалити зайві спливні вікна @@ -382,7 +382,7 @@ Даргинська (Урахі) Розділена клавіатура Увімкнути розділену клавіатуру (альбомну) - %s (Фонетика) + %s (Фонетика) Автовиправлення комбінації клавіш Якщо увімкнено, комбінації клавіш можуть бути розгорнуті за допомогою автокорекції Встановити фонове зображення (альбомна) diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 3b2b4a7df..a7180b748 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -16,7 +16,7 @@ "الگ ہونے والا کی بورڈ فعال کریں" "دیگر اندراج طریقوں پر سوئچ کریں" "زبان سوئچ کرنے کی کلید" - "%sملی سیکنڈ" + "%sملی سیکنڈ" "سسٹم ڈیفالٹ" "تجاویز اور اصلاحات کیلئے رابطوں سے ناموں کی تجویز کریں" "ذاتی نوعیت کی تجاویز" @@ -49,8 +49,8 @@ "ہسپانوی (امریکہ)" "ہنگلش" "سربیائی (لاطینی)" - "%s (روایتی)" - "%s (کمپیکٹ)" + "%s (روایتی)" + "%s (کمپیکٹ)" "کوئی زبان نہیں" "Emoji" "شامل کریں" @@ -64,18 +64,18 @@ "‏فزیکل کی بورڈ کیلئے Emoji" "‏فزیکل Alt کی کے ذریعے emoji پیلٹ نظر آتا ہے" "ڈیفالٹ" - %s میں خوش آمدید\" + %s میں خوش آمدید\" "اشارہ ٹائپنگ کے ساتھ" "شروع کریں" - %s ترتیب دینا\" - %s کو فعال کریں\" - "براہ کرم \"%s\" کو اپنی زبانوں اور ان پٹ ترتیبات میں چیک کریں۔ اس سے اس کو آپ کے آلہ پر چلنے کی اجازت مل جائے گی۔" + %s ترتیب دینا\" + %s کو فعال کریں\" + "براہ کرم \"%s\" کو اپنی زبانوں اور ان پٹ ترتیبات میں چیک کریں۔ اس سے اس کو آپ کے آلہ پر چلنے کی اجازت مل جائے گی۔" "ترتیبات میں فعال کریں" - %s پر سوئچ کریں\" - "آگے، \"%s\" کو اپنے فعال متنی اندراج کے طریقہ کے بطور منتخب کریں۔" + %s پر سوئچ کریں\" + "آگے، \"%s\" کو اپنے فعال متنی اندراج کے طریقہ کے بطور منتخب کریں۔" "اندراج کے طریقے سوئچ کریں" "مبارک ہو، آپ بالکل تیار ہیں!" - "اب آپ %s کے ساتھ اپنی سبھی پسندیدہ ایپس میں ٹائپ کر سکتے ہیں۔" + "اب آپ %s کے ساتھ اپنی سبھی پسندیدہ ایپس میں ٹائپ کر سکتے ہیں۔" "مکمل ہو گیا" "ایپ آئیکن دکھائیں" "لانچر میں ایپلیکیشن آئیکن کو ڈسپلے کریں" @@ -84,7 +84,7 @@ "آخری بار اپ ڈیٹ کردہ" "ترتیبات" "حذف کریں" - "ورژن %1$s" + "ورژن %1$s" "لغت میں شامل کریں" "شارٹ کٹ:" "زبان:" diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index 907a94c95..030f47c59 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -16,7 +16,7 @@ "Ikkiga ajratiladigan klaviaturani yoqish" "Boshqa usullarga o‘tish" "Tilni almashtirish tugmasi" - "%s ms" + "%s ms" "Tizim standarti" "Kontaktlar ro‘yxatidagi ismlar asosida tuzatmalarni taklif qilish" "Takliflarni moslashtirish" @@ -49,8 +49,8 @@ "Ispan (AQSH)" "Hinglish" "Serb (Lotin)" - %s (An’anaviy) - %s(Ixcham) + %s (An’anaviy) + %s(Ixcham) "Til aniqlanmadi" "Kulgichlar" "Qo‘shish" @@ -64,18 +64,18 @@ "Tashqi klaviatura uchun kulgichlar" "Jismoniy klaviaturadagi Alt tugmasi emojilarni ochadi" "Standart" - %s ilovasiga xush kelibsiz! + %s ilovasiga xush kelibsiz! "qo‘l uzmasdan yozish" "Boshladik" - %s sozlanmoqda - Yoqish %s - Matn kiritishda foydalanish uchun “Tillar va matn kiritish” sozlamalarida “%s” bandiga belgi qo‘ying. + %s sozlanmoqda + Yoqish %s + Matn kiritishda foydalanish uchun “Tillar va matn kiritish” sozlamalarida “%s” bandiga belgi qo‘ying. "Sozlamalardan yoqish" - %s ga o‘zgartirish - Endi, joriy matn kiritish usuli sifatida “%s” ilovasini tanlang. + %s ga o‘zgartirish + Endi, joriy matn kiritish usuli sifatida “%s” ilovasini tanlang. "Matn kiritish usulini o‘zgartirish" "Tabriklaymiz, hammasi tayyor!" - Endi, matn kiritish uchun %s ilovasidan foydalanishingiz mumkin. + Endi, matn kiritish uchun %s ilovasidan foydalanishingiz mumkin. "Tugallandi" "Ilova ikonkasini chiqarish" "Launcherga ilova ikonkasini chiqarish" @@ -84,7 +84,7 @@ "So‘nggi marta yangilandi" "Sozlamalar" "O‘chirish" - %1$s versiya + %1$s versiya "Lug‘atga kiritish" "Qisqartma:" "Til:" @@ -98,7 +98,7 @@ Emoji kaliti "Tizimdagi mavjud tillar" "Matn kiritish usulini tanlang" - %smin. + %smin. Cheklanmagan Bufer tarixini yoqish Agar o\'chirilgan bo\'lsa, vaqtinchalik bufer tugmasi mavjud bo\'lsa, almashish buferidagi kontentni joylashtiradi @@ -122,7 +122,7 @@ Yangi so\'zni kiritishda tinish belgilaridan keyin avtomatik ravishda bo\'sh joy qo\'yish Majburiy inkognito rejimi Tinish belgilaridan keyin avtomatik bo\'shliq qo‘yish - %s (Akkhor) + %s (Akkhor) Kiritish Qo\'shimcha kalitlar HeliBoard Sozlamalari diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index da5fde0c8..96fc958fa 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -17,7 +17,7 @@ "Bật chia bàn phím" "Phương thức nhập khác" "Phím chuyển đổi ngôn ngữ" - "%s mili giây" + "%s mili giây" "Theo mặc định của hệ thống" "Sử dụng tên từ Danh bạ cho các đề xuất và chỉnh sửa" "Đề xuất được cá nhân hóa" @@ -50,8 +50,8 @@ "Tiếng Tây Ban Nha (Mỹ)" "Tiếng Anh-Hindi" "Tiếng Serbia (La tinh)" - "%s (Truyền thống)" - "%s (Viết tắt)" + "%s (Truyền thống)" + "%s (Viết tắt)" "Không ngôn ngữ nào" "Biểu tượng cảm xúc" "Thêm" @@ -65,18 +65,18 @@ "Biểu tượng cảm xúc cho bàn phím vật lý" "Phím Alt thực hiển thị bảng biểu tượng cảm xúc" "Mặc định" - "Chào mừng bạn đến với %s" + "Chào mừng bạn đến với %s" "với Nhập bằng cử chỉ" "Bắt đầu" - "Thiết lập %s" - "Bật %s" - "Hãy chọn \"%s\" trong cài đặt Ngôn ngữ và phương thức nhập. Thao tác này sẽ cho phép ứng dụng chạy trên thiết bị của bạn." + "Thiết lập %s" + "Bật %s" + "Hãy chọn \"%s\" trong cài đặt Ngôn ngữ và phương thức nhập. Thao tác này sẽ cho phép ứng dụng chạy trên thiết bị của bạn." "Bật trong Cài đặt" - "Chuyển sang %s" - "Tiếp theo, chọn \"%s\" làm phương thức nhập văn bản hoạt động của bạn." + "Chuyển sang %s" + "Tiếp theo, chọn \"%s\" làm phương thức nhập văn bản hoạt động của bạn." "Chuyển phương thức nhập" "Xin chúc mừng, bạn đã cài đặt xong!" - "Bây giờ bạn có thể nhập vào tất cả ứng dụng yêu thích của mình với %s." + "Bây giờ bạn có thể nhập vào tất cả ứng dụng yêu thích của mình với %s." "Đã xong" "Hiển thị biểu tượng ứng dụng" "Hiển thị biểu tượng ứng dụng trong trình chạy" @@ -85,7 +85,7 @@ "Cập nhật lần cuối" "Cài đặt" "Xóa" - "Phiên bản %1$s" + "Phiên bản %1$s" "Thêm vào từ điển" "Phím tắt:" "Ngôn ngữ:" diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d877a9d61..c51c2c94e 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -16,7 +16,7 @@ 启用分离式键盘 "切换到其他输入法" "语言切换键" - %s 毫秒 + %s 毫秒 "系统默认值" 使用联系人中的姓名提供建议和更正 "个性化建议" @@ -49,8 +49,8 @@ "西班牙语(美国)" "印地英语" "塞尔维亚语(拉丁语布局)" - %s(传统) - %s (紧凑型) + %s(传统) + %s (紧凑型) 无语言(字母表) "表情符号" "添加" @@ -64,18 +64,18 @@ 用于物理键盘的表情符号 物理 Alt 键显示表情符号调色板 "默认" - 欢迎使用 %s + 欢迎使用 %s 带有滑行输入 "开始" - 设置 %s - 启用 %s - 请在“语言和输入法”设置中选中“%s”,授权该应用在您的设备上运行。 + 设置 %s + 启用 %s + 请在“语言和输入法”设置中选中“%s”,授权该应用在您的设备上运行。 "在设置中启用" - 切换到 %s - 接下来,请选择“%s”作为您要使用的文本输入法。 + 切换到 %s + 接下来,请选择“%s”作为您要使用的文本输入法。 "切换输入法" "恭喜,您已完成了设置!" - 现在,您可以在您喜欢的所有应用中使用 %s 输入内容了。 + 现在,您可以在您喜欢的所有应用中使用 %s 输入内容了。 完成了 "显示应用图标" "在启动器中显示应用图标" @@ -84,7 +84,7 @@ 最后更新时间 "设置" "删除" - 版本 %1$s + 版本 %1$s 添加到词典 "快捷键:" "语言:" @@ -107,7 +107,7 @@ 显示长按提示 始终显示数字行 显示按键提示 - %s 分钟 + %s 分钟 滑动删除 表情符号键 如果禁用,剪贴板键将粘贴剪贴板内容(如果有的话) @@ -115,7 +115,7 @@ 单词输入时自动在标点符号后插入空格 拼写检查 拼写检查设置 - %s (Akkhor) + %s (Akkhor) 禁用新单词学习 更多键 数字行 @@ -146,7 +146,7 @@ 滑行输入时看到建议的单词 始终立即开始 滑行输入轨迹寿命 - %s (Sebeolsik Final) + %s (Sebeolsik Final) 错误:所选文件不是有效的词典文件 风格 彩色导航栏 @@ -216,8 +216,8 @@ 配色 配色(夜间) 关闭剪贴板历史 - %s (Sebeolsik 390) - %s(扩展) + %s (Sebeolsik 390) + %s(扩展) 词典 是否确定要替换用户添加的词典“%1$s”?\n \n当前词典: \n%2$s \n \n新词典: \n%3$s 替换词典 @@ -288,7 +288,7 @@ 森林 靛蓝 功能键背景 - %s (Probhat) + %s (Probhat) 凯塔格语 保存到文件 确定要删除自定义布局 %s? @@ -310,7 +310,7 @@ 添加一个单词 移除基础布局上已存在的弹出键 移除多余弹出 - %s (Student) + %s (Student) 曼西语 符号 为文本和背景选择颜色 @@ -378,7 +378,7 @@ 删除 确定重置所有自定义图标? 在勿扰模式时振动 - %s(注音) + %s(注音) 覆盖表情符号版本 达尔格瓦语 (Urakhi) 自动更正快捷方式 @@ -407,7 +407,7 @@ 您可以在 %s 中查找和分享布局。 您可以在 %s 中查找和分享颜色。 自定义子类型 - %s (Baishakhi) + %s (Baishakhi) 输入 URL 和电子邮件地址时,用顶级域替换句点键弹出 显示顶级域弹出键 在数字键盘输入内容后按回车键或空格键 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index f5718fc15..0624097d5 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -17,7 +17,7 @@ "啟用分離式鍵盤" "切換至其他輸入法" "語言切換鍵" - "%s 毫秒" + "%s 毫秒" "系統預設" "使用「聯絡人」的名稱提供建議與修正" "個人化建議" @@ -50,8 +50,8 @@ "西班牙文 (美國)" "印度英文" "塞爾維亞文 (拉丁文)" - "%s (傳統)" - "%s (精簡版)" + "%s (傳統)" + "%s (精簡版)" "無語言" "Emoji" "新增" @@ -65,18 +65,18 @@ "實體鍵盤上使用表情圖案" "以實體 Alt 鍵顯示表情圖案選項" "預設" - "歡迎使用「%s」" + "歡迎使用「%s」" "配備手勢輸入功能" "開始" - "設定「%s」" - "啟用「%s」" - "請在「語言和輸入」設定中勾選「%s」。這將允許裝置執行此應用程式。" + "設定「%s」" + "啟用「%s」" + "請在「語言和輸入」設定中勾選「%s」。這將允許裝置執行此應用程式。" "在設定中啟用" - "切換至「%s」" - "接著,請選取「%s」作為目前使用的文字輸入方法。" + "切換至「%s」" + "接著,請選取「%s」作為目前使用的文字輸入方法。" "切換輸入方法" "恭喜,一切就緒!" - "現在,您可以在所有最愛的應用程式中使用「%s」輸入文字。" + "現在,您可以在所有最愛的應用程式中使用「%s」輸入文字。" "完成" "顯示應用程式圖示" "在啟動器中顯示圖示" @@ -85,7 +85,7 @@ "上次更新日期" "設定" "刪除" - "版本 %1$s" + "版本 %1$s" "加入字典" "快速鍵:" "語言:" @@ -96,7 +96,7 @@ "更多語言…" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" 實驗功能 - %s分鐘 + %s分鐘 拼字檢查 拼字檢查設定 Emoji diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d34d24ad8..fbf818d83 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -16,7 +16,7 @@ "啟用分離式鍵盤" "切換到其他輸入法" "語言切換鍵" - "%s 毫秒" + "%s 毫秒" "系統預設" "根據「聯絡人」名稱提供建議與修正" "個人化建議" @@ -49,8 +49,8 @@ "西班牙文 (美國)" "印度英文" "塞爾維亞文 (拉丁文)" - "%s (傳統)" - "%s (精簡)" + "%s (傳統)" + "%s (精簡)" "無語言" "表情符號" "新增" @@ -64,18 +64,18 @@ "透過實體鍵盤啟用表情符號" "按下實體 Alt 鍵即顯示表情符號面板" "預設" - "歡迎使用 %s" + "歡迎使用 %s" "含滑行輸入功能" "開始設定" - "正在設定「%s」" - "啟用「%s」" - "請在 [語言與輸入設定] 中勾選 [%s],授權該應用程式在你的裝置上執行。" + "正在設定「%s」" + "啟用「%s」" + "請在 [語言與輸入設定] 中勾選 [%s],授權該應用程式在你的裝置上執行。" "在設定中啟用" - "切換至「%s」" - "接著,請選取「%s」做為目前使用的文字輸入法。" + "切換至「%s」" + "接著,請選取「%s」做為目前使用的文字輸入法。" "切換輸入法" "恭喜,你已完成設定!" - 現在您可以在所有您喜歡的應用程式中使用 %s 輸入。 + 現在您可以在所有您喜歡的應用程式中使用 %s 輸入。 "完成" "顯示應用程式圖示" "在啟動器中顯示應用程式圖示" @@ -84,7 +84,7 @@ "上次更新時間:" "設定" "刪除" - "版本 %1$s" + "版本 %1$s" "加入字典" "快速鍵:" "語言:" diff --git a/app/src/main/res/values-zu/strings.xml b/app/src/main/res/values-zu/strings.xml index 03604b7b3..61d3a2739 100644 --- a/app/src/main/res/values-zu/strings.xml +++ b/app/src/main/res/values-zu/strings.xml @@ -17,7 +17,7 @@ "Nika amandla ikhibhodi yokuhlukanisa" "Shintshela kwezinye izindlela zokungena" "Ukhiye wokushintsha ullimi" - "%sms" + "%sms" "Okuzenzakalelayo kwesistimu" "Amagama abasebenzisi kusuka Kothintana nabo bokusikisela nokulungisa" "Iziphakamiso ezenziwe okomuntu siqu" @@ -50,8 +50,8 @@ "I-Spanish (US)" "I-Hinglish" "Isi-Serbian (Latin)" - "Isi-%s (Tradition)" - "%s (Okuqoqene ndawonye)" + "Isi-%s (Tradition)" + "%s (Okuqoqene ndawonye)" "Alikho ulimi" "I-Emoji" "Engeza" @@ -65,18 +65,18 @@ "I-Emoji wekhibhodi yangempela" "Ukhiye we-Alt woqobo ubonisa i-emoji palette" "Okuzenzakalelayo" - "Siyakwamukela ku-%s" + "Siyakwamukela ku-%s" "nokuthayipha ngokuthinta" "Qalisa" - "Kusethwa i-%s" - "Nika amandla i-%s" - "Sicela uhlole i-\"%s\" kulimi lwakho nezilungiselelo zokokufaka. Lokhu kuzoyigunyaza ukuthi isebenze kudivayisi yakho." + "Kusethwa i-%s" + "Nika amandla i-%s" + "Sicela uhlole i-\"%s\" kulimi lwakho nezilungiselelo zokokufaka. Lokhu kuzoyigunyaza ukuthi isebenze kudivayisi yakho." "Nika amandla kuzilungiselelo" - "Shintshela ku-%s." - "Okulandelayo, khetha i-\"%s\" njengendlela yakho yokufaka umbhalo osebenzayo." + "Shintshela ku-%s." + "Okulandelayo, khetha i-\"%s\" njengendlela yakho yokufaka umbhalo osebenzayo." "Shintsha izindlela zokufaka" "Siyakuhalalisela, usumi ngomumo!" - "Manje usungathayipha ngokufaka zonke izinhlelo zokusebenza eziyizintandokazi zakho nge-%s." + "Manje usungathayipha ngokufaka zonke izinhlelo zokusebenza eziyizintandokazi zakho nge-%s." "Iqedile" "Bonisa isithonjana sohlelo lokusebenza" "Bonisa isithonjana sohlelo lokusebenza kusiqalisi" @@ -85,7 +85,7 @@ "Igcine ukulungiswa" "Izilungiselelo" "Susa" - "Inguqulo engu-%1$s" + "Inguqulo engu-%1$s" "Faka kusichazamazwi" "Isinqamulelo:" "Ulimi:" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4e500f6df..9bb4ee027 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,9 +66,9 @@ Emoji key - %s ms + %s ms - %s min + %s min System default @@ -385,28 +385,28 @@ Sesotho Dargwa (Urakhi) - - %s (Extended) %1$s (%2$s) + + %s (Extended) - %s (Traditional) - - %s (Akkhor) - - %s (Probhat) - - %s (Baishakhi) - - %s (Compact) - - %s (Phonetic) - - %s (Sebeolsik 390) - - %s (Sebeolsik Final) - - %s (Student) + %s (Traditional) + + %s (Akkhor) + + %s (Probhat) + + %s (Baishakhi) + + %s (Compact) + + %s (Phonetic) + + %s (Sebeolsik 390) + + %s (Sebeolsik Final) + + %s (Student) @@ -521,30 +521,30 @@ language, hence "No language". --> Physical Alt key shows the emoji palette Default - - "Welcome to %s" + + "Welcome to %s" with Gesture Typing Get started - - "Setting up %s" - - "Enable %s" - - "Please check \"%s\" in your Languages & input settings. This will authorize it to run on your device." + + "Setting up %s" + + "Enable %s" + + "Please check \"%s\" in your Languages & input settings. This will authorize it to run on your device." Enable in Settings - - "Switch to %s" - - "Next, select \"%s\" as your active text-input method." + + "Switch to %s" + + "Next, select \"%s\" as your active text-input method." Switch input methods "Congratulations, you're all set!" - - Now you can type in all your favorite apps with %s. + + Now you can type in all your favorite apps with %s. Configure the keyboard @@ -602,8 +602,8 @@ New dictionary: Last updated Delete - - Version %1$s + + Version %s Add to dictionary diff --git a/app/src/main/res/xml/method.xml b/app/src/main/res/xml/method.xml index bd62d77e5..eca4e9c02 100644 --- a/app/src/main/res/xml/method.xml +++ b/app/src/main/res/xml/method.xml @@ -276,7 +276,7 @@ android:isAsciiCapable="false" /> Date: Sat, 24 May 2025 16:46:18 +0200 Subject: [PATCH 158/175] don't create unnecessary additional subtypes when manually selecting qwerty --- .../helium314/keyboard/settings/screens/SubtypeScreen.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt index 336a192eb..7387974fb 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/SubtypeScreen.kt @@ -393,8 +393,12 @@ private fun MainLayoutRow( DropDownField( items = appLayouts + customLayouts, selectedItem = currentSubtype.mainLayoutName() ?: SubtypeLocaleUtils.QWERTY, - onSelected = { - setCurrentSubtype(currentSubtype.withLayout(LayoutType.MAIN, it)) + onSelected = { layout -> + // if the locale defaults to qwerty, use it as implicit default to avoid creating unnecessary additional subtypes + if (layout == SubtypeLocaleUtils.QWERTY + && SubtypeSettings.getResourceSubtypesForLocale(currentSubtype.locale).any { it.mainLayoutName() == null }) + setCurrentSubtype(currentSubtype.withoutLayout(LayoutType.MAIN)) + else setCurrentSubtype(currentSubtype.withLayout(LayoutType.MAIN, layout)) }, extraButton = { IconButton({ showAddLayoutDialog = true }) From e21c135b90d6e6889eee91ac49dd5bac8ce8139e Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 24 May 2025 16:50:51 +0200 Subject: [PATCH 159/175] don't include default latin non-qwerty layout in subtype display name so now we're back at "French" and not "French (AZERTY)" --- .../helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt index 9ef0f1b03..0861bf952 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.kt @@ -124,7 +124,10 @@ object SubtypeLocaleUtils { return subtype.locale().toString() + "/" + subtype.mainLayoutNameOrQwerty() } - /** Subtype display name is (), defaults to system locale */ + /** + * Subtype display name is when using the default layout, or () otherwise + * [displayLocale] defaults to system locale + */ fun InputMethodSubtype.displayName(displayLocale: Locale? = null): String { if (displayLocale == null) resourceSubtypeDisplayNameCache[hashCode()]?.let { return it } @@ -136,7 +139,9 @@ object SubtypeLocaleUtils { LayoutUtilsCustom.getDisplayName(layoutName) ) } - if (keyboardLayoutToDisplayName.containsKey(layoutName)) { + // if it's a default layout, we want to use the nameResId instead of explicitly showing the layout name + if (keyboardLayoutToDisplayName.containsKey(layoutName) + && SubtypeSettings.getResourceSubtypesForLocale(locale()).none { it.mainLayoutName() == layoutName }) { return resources.getString( R.string.subtype_with_layout_generic, locale().localizedDisplayName(resources, displayLocale), From deec4d1f9860df6188902e817d0cc0feceab5933 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 24 May 2025 18:23:29 +0200 Subject: [PATCH 160/175] upgrade version, add changelog, fix lint issues with strings --- app/build.gradle.kts | 4 ++-- app/src/main/res/values-jpr/strings.xml | 1 - app/src/main/res/values-kab/strings.xml | 5 ----- app/src/main/res/values/strings.xml | 20 +++++++++---------- .../android/en-US/changelogs/3100.txt | 10 ++++++++++ 5 files changed, 22 insertions(+), 18 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/3100.txt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b8fdcc561..b07e3c713 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -12,8 +12,8 @@ android { applicationId = "helium314.keyboard" minSdk = 21 targetSdk = 35 - versionCode = 3008 - versionName = "3.0" + versionCode = 3100 + versionName = "3.1-beta1" ndk { abiFilters.clear() abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) diff --git a/app/src/main/res/values-jpr/strings.xml b/app/src/main/res/values-jpr/strings.xml index f21caecba..463fe85c5 100644 --- a/app/src/main/res/values-jpr/strings.xml +++ b/app/src/main/res/values-jpr/strings.xml @@ -2,7 +2,6 @@ מנטׄימאת ברגזידה חדֿףֿ - חרוףֿ אלפֿבא (QWERTZ) בזרגכרדן כֿודכאר חרוףֿ תצחיח כֿודכאר מנטׄימאת HeliBoard‬‏ diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index f95060178..463cd8515 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -50,8 +50,6 @@ Immed Uṭṭunen Taglizit (Tagelda Yedduklen) - Agemmay alatini (AZERTY) - Agemmay alatini (Colemak) Fren tarrayt n usekcem %s ms Ulac tilisa @@ -64,7 +62,6 @@ Aseɣti n uḍris Iseɣtiyen Taqeffalt n ubeddel n tutlayin - Agemmay alatini (aselkim) Assuter i wawal i d-iteddun Ass Ssken-d tignit n usnas @@ -86,7 +83,6 @@ Taspenyulit (Iwunak Yeddukklen) Taglizit (Iwunak Yeddukklen) War tutlayt - Agemmay alatini (DVORAK) Rnu ɣer umawal Sken ugar n yiniten Seqdec tutlayin n unagraw @@ -103,7 +99,6 @@ Fren awal Zelmaḍ Yeffus - Agemmay alatini (QWERTZ) Adda Lqem aneggaru Sali diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9bb4ee027..90f8972ff 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -437,8 +437,8 @@ language, hence "No language". --> Copy to Clipboard Cannot read file - - + + Copy existing layout Really delete custom layout %s? @@ -588,12 +588,12 @@ New dictionary: "%s (experimental)" "Error: Selected file is not a valid dictionary file" - - + + "The selected file is for %1$s, but %2$s was expected. Still use it for %2$s?" "Error: script not compatible with this keyboard" - - + + "Still use" "Error loading dictionary file" @@ -693,8 +693,8 @@ New dictionary: Show all colors This setting exposes all colors that are used internally. The list of colors may change at any time. The default color is random, and the names will not be translated. - - + + Select colors for text and backgrounds Keyboard background @@ -735,8 +735,8 @@ New dictionary: GNU General Public License v3.0 Close - - + + "Use system languages" Tap the language to open settings diff --git a/fastlane/metadata/android/en-US/changelogs/3100.txt b/fastlane/metadata/android/en-US/changelogs/3100.txt new file mode 100644 index 000000000..f4d90dce4 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/3100.txt @@ -0,0 +1,10 @@ +* optionally suggest names of installed apps +* swipe to switch emoji categories +* display toast after restoring backup +* larger toolbar button and icon +* make comma accessible in popups when showing TLD popups +* add setting for default emoji skin tone +* add keycodes for left and right alt and ctrl keys +* add key label "timestamp" for more accessible timestamp key +* understand special key labels for popups in simple layouts +* minor fixes and improvements From 7da068145f9478b44a8612974b154dd11a91f5fe Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 25 May 2025 16:52:56 +0200 Subject: [PATCH 161/175] fix internal dictionaty file names resulted in assets dicts being extracted on every app start --- app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt | 2 +- .../java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt index 17f1ca893..545511808 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt @@ -32,7 +32,7 @@ object DictionaryFactory { checkAndAddDictionaryToListNewType(it, dictList, locale) } nonExtracted.forEach { filename -> - val type = filename.substringBefore(".") + val type = filename.substringBefore("_") if (dictList.any { it.mDictType == type }) return@forEach val extractedFile = DictionaryInfoUtils.extractAssetsDictionary(filename, locale, context) checkAndAddDictionaryToListNewType(extractedFile, dictList, locale) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt index eac4b7c02..e98079c91 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt @@ -136,7 +136,7 @@ object DictionaryInfoUtils { } fun extractAssetsDictionary(dictionaryFileName: String, locale: Locale, context: Context): File { - val targetFile = File(getCacheDirectoryForLocale(locale, context), "$dictionaryFileName.dict") + val targetFile = File(getCacheDirectoryForLocale(locale, context), "${dictionaryFileName.substringBefore("_")}.dict") FileUtils.copyStreamToNewFile( context.assets.open(ASSETS_DICTIONARY_FOLDER + File.separator + dictionaryFileName), targetFile From b44dd29b0c722457e803bf4459b32f6a9a0f7a7c Mon Sep 17 00:00:00 2001 From: Helium314 Date: Tue, 27 May 2025 18:14:05 +0200 Subject: [PATCH 162/175] consider implicitly enabled subtypes when switching with language switch button fixes GH-1608 --- app/src/main/java/helium314/keyboard/latin/LatinIME.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/latin/LatinIME.java b/app/src/main/java/helium314/keyboard/latin/LatinIME.java index 83dbf9f58..d58c7609d 100644 --- a/app/src/main/java/helium314/keyboard/latin/LatinIME.java +++ b/app/src/main/java/helium314/keyboard/latin/LatinIME.java @@ -1461,7 +1461,7 @@ public class LatinIME extends InputMethodService implements // switch IME if wanted and possible if (switchIme && !switchSubtype && switchInputMethod()) return; - final boolean hasMoreThanOneSubtype = mRichImm.getMyEnabledInputMethodSubtypeList(false).size() > 1; + final boolean hasMoreThanOneSubtype = mRichImm.getMyEnabledInputMethodSubtypeList(true).size() > 1; // switch subtype if wanted, do nothing if no other subtype is available if (switchSubtype && !switchIme) { if (hasMoreThanOneSubtype) From 0d5159c2d7bd0bacdf23c18a204a8406a8e128a9 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Tue, 27 May 2025 20:25:05 +0200 Subject: [PATCH 163/175] comment currently unsupported keycodes to avoid confusion --- .../keyboard_parser/floris/KeyCode.kt | 74 +++++++++---------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt index 73d69e3ac..4e2ccebe2 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/KeyCode.kt @@ -24,15 +24,15 @@ object KeyCode { const val UNSPECIFIED = 0 const val CTRL = -1 - const val CTRL_LOCK = -2 + //const val CTRL_LOCK = -2 const val ALT = -3 - const val ALT_LOCK = -4 + //const val ALT_LOCK = -4 const val FN = -5 - const val FN_LOCK = -6 + //const val FN_LOCK = -6 const val DELETE = -7 - const val DELETE_WORD = -8 - const val FORWARD_DELETE = -9 - const val FORWARD_DELETE_WORD = -10 + //const val DELETE_WORD = -8 + //const val FORWARD_DELETE = -9 + //const val FORWARD_DELETE_WORD = -10 const val SHIFT = -11 const val CAPS_LOCK = -13 @@ -51,21 +51,21 @@ object KeyCode { const val CLIPBOARD_SELECT_WORD = -34 // CLIPBOARD_SELECT const val CLIPBOARD_SELECT_ALL = -35 const val CLIPBOARD_CLEAR_HISTORY = -36 - const val CLIPBOARD_CLEAR_FULL_HISTORY = -37 - const val CLIPBOARD_CLEAR_PRIMARY_CLIP = -38 + //const val CLIPBOARD_CLEAR_FULL_HISTORY = -37 + //const val CLIPBOARD_CLEAR_PRIMARY_CLIP = -38 - const val COMPACT_LAYOUT_TO_LEFT = -111 - const val COMPACT_LAYOUT_TO_RIGHT = -112 + //const val COMPACT_LAYOUT_TO_LEFT = -111 + //const val COMPACT_LAYOUT_TO_RIGHT = -112 const val SPLIT_LAYOUT = -113 - const val MERGE_LAYOUT = -114 + //const val MERGE_LAYOUT = -114 const val UNDO = -131 const val REDO = -132 const val ALPHA = -201 // VIEW_CHARACTERS const val SYMBOL = -202 // VIEW_SYMBOLS - const val VIEW_SYMBOLS2 = -203 - const val VIEW_NUMERIC = -204 + //const val VIEW_SYMBOLS2 = -203 + //const val VIEW_NUMERIC = -204 const val NUMPAD = -205 // VIEW_NUMERIC_ADVANCED const val VIEW_PHONE = -206 const val VIEW_PHONE2 = -207 @@ -74,21 +74,21 @@ object KeyCode { const val EMOJI = -212 // IME_UI_MODE_MEDIA const val CLIPBOARD = -213 // IME_UI_MODE_CLIPBOARD - const val SYSTEM_INPUT_METHOD_PICKER = -221 - const val SYSTEM_PREV_INPUT_METHOD = -222 - const val SYSTEM_NEXT_INPUT_METHOD = -223 - const val IME_SUBTYPE_PICKER = -224 - const val IME_PREV_SUBTYPE = -225 - const val IME_NEXT_SUBTYPE = -226 + //const val SYSTEM_INPUT_METHOD_PICKER = -221 + //const val SYSTEM_PREV_INPUT_METHOD = -222 + //const val SYSTEM_NEXT_INPUT_METHOD = -223 + //const val IME_SUBTYPE_PICKER = -224 + //const val IME_PREV_SUBTYPE = -225 + //const val IME_NEXT_SUBTYPE = -226 const val LANGUAGE_SWITCH = -227 - const val IME_SHOW_UI = -231 - const val IME_HIDE_UI = -232 + //const val IME_SHOW_UI = -231 + //const val IME_HIDE_UI = -232 const val VOICE_INPUT = -233 - const val TOGGLE_SMARTBAR_VISIBILITY = -241 - const val TOGGLE_ACTIONS_OVERFLOW = -242 - const val TOGGLE_ACTIONS_EDITOR = -243 + //const val TOGGLE_SMARTBAR_VISIBILITY = -241 + //const val TOGGLE_ACTIONS_OVERFLOW = -242 + //const val TOGGLE_ACTIONS_EDITOR = -243 const val TOGGLE_INCOGNITO_MODE = -244 const val TOGGLE_AUTOCORRECT = -245 @@ -104,18 +104,18 @@ object KeyCode { const val CURRENCY_SLOT_6 = -806 const val MULTIPLE_CODE_POINTS = -902 - const val DRAG_MARKER = -991 - const val NOOP = -999 + //const val DRAG_MARKER = -991 + //const val NOOP = -999 - const val CHAR_WIDTH_SWITCHER = -9701 - const val CHAR_WIDTH_FULL = -9702 - const val CHAR_WIDTH_HALF = -9703 + //const val CHAR_WIDTH_SWITCHER = -9701 + //const val CHAR_WIDTH_FULL = -9702 + //const val CHAR_WIDTH_HALF = -9703 - const val KANA_SMALL = 12307 - const val KANA_SWITCHER = -9710 - const val KANA_HIRA = -9711 - const val KANA_KATA = -9712 - const val KANA_HALF_KATA = -9713 + //const val KANA_SMALL = 12307 + //const val KANA_SWITCHER = -9710 + //const val KANA_HIRA = -9711 + //const val KANA_KATA = -9712 + //const val KANA_HALF_KATA = -9713 const val KESHIDA = 1600 const val ZWNJ = 8204 // 0x200C, named HALF_SPACE in FlorisBoard @@ -137,7 +137,7 @@ object KeyCode { const val PAGE_UP = -10010 const val PAGE_DOWN = -10011 const val META = -10012 - const val META_LOCK = -10013 // to be consistent with the CTRL/ALT/FN LOCK codes, not sure whether this will be used + //const val META_LOCK = -10013 // to be consistent with the CTRL/ALT/FN LOCK codes, not sure whether this will be used const val TAB = -10014 const val WORD_LEFT = -10015 const val WORD_RIGHT = -10016 @@ -165,8 +165,8 @@ object KeyCode { const val F11 = -10038 const val F12 = -10039 const val BACK = -10040 - const val SELECT_LEFT = -10041 - const val SELECT_RIGHT = -10042 + //const val SELECT_LEFT = -10041 + //const val SELECT_RIGHT = -10042 const val TIMESTAMP = -10043 const val CTRL_LEFT = -10044 const val CTRL_RIGHT = -10045 From 120734ff41380cfedf87b2f1c68549db6ead7cc2 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Wed, 28 May 2025 22:31:18 +0200 Subject: [PATCH 164/175] avoid issues when resetting DictionaryFacilitatorImpl see GH-801 (probably does not fix the OnePlus issue) --- .../latin/DictionaryFacilitatorImpl.kt | 9 ++++--- .../keyboard/latin/DictionaryFactory.kt | 2 +- .../latin/utils/DictionaryInfoUtils.kt | 24 ++++++++++++------- .../settings/screens/DictionaryScreen.kt | 4 ++-- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt index 13800aa7c..1174f850d 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt @@ -716,9 +716,12 @@ private class DictionaryGroup( private val scope = CoroutineScope(Dispatchers.IO) // words cannot be (permanently) removed from some dictionaries, so we use a blacklist for "removing" words - private val blacklistFile = context?.let { - File(it.filesDir.absolutePath + File.separator + "blacklists" + File.separator + locale.toLanguageTag() + ".txt") - .also { it.parentFile?.mkdirs() } + private val blacklistFile = if (context?.filesDir == null) null + else { + val file = File(context.filesDir.absolutePath + File.separator + "blacklists" + File.separator + locale.toLanguageTag() + ".txt") + if (file.isDirectory) file.delete() // this apparently was an issue in some versions + if (file.mkdirs()) file + else null } private val blacklist = hashSetOf().apply { diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt index 545511808..bd86960b3 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFactory.kt @@ -34,7 +34,7 @@ object DictionaryFactory { nonExtracted.forEach { filename -> val type = filename.substringBefore("_") if (dictList.any { it.mDictType == type }) return@forEach - val extractedFile = DictionaryInfoUtils.extractAssetsDictionary(filename, locale, context) + val extractedFile = DictionaryInfoUtils.extractAssetsDictionary(filename, locale, context) ?: return@forEach checkAndAddDictionaryToListNewType(extractedFile, dictList, locale) } return DictionaryCollection(Dictionary.TYPE_MAIN, locale, dictList, FloatArray(dictList.size) { 1f }) diff --git a/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt b/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt index e98079c91..8715d2d4c 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt +++ b/app/src/main/java/helium314/keyboard/latin/utils/DictionaryInfoUtils.kt @@ -90,18 +90,19 @@ object DictionaryInfoUtils { fun getCacheDirectories(context: Context) = File(getWordListCacheDirectory(context)).listFiles().orEmpty() /** Find out the cache directory associated with a specific locale. */ - fun getCacheDirectoryForLocale(locale: Locale, context: Context): String { + fun getCacheDirectoryForLocale(locale: Locale, context: Context): String? { val relativeDirectoryName = replaceFileNameDangerousCharacters(locale.toLanguageTag()) val absoluteDirectoryName = getWordListCacheDirectory(context) + File.separator + relativeDirectoryName val directory = File(absoluteDirectoryName) if (!directory.exists() && !directory.mkdirs()) { Log.e(TAG, "Could not create the directory for locale $locale") + return null } return absoluteDirectoryName } fun getCachedDictsForLocale(locale: Locale, context: Context) = - File(getCacheDirectoryForLocale(locale, context)).listFiles().orEmpty() + getCacheDirectoryForLocale(locale, context)?.let { File(it).listFiles() }.orEmpty() fun getDictionaryFileHeaderOrNull(file: File, offset: Long, length: Long): DictionaryHeader? { return try { @@ -135,12 +136,19 @@ object DictionaryInfoUtils { return dictionaryFileName.substringAfter("_").substringBefore(".").constructLocale() } - fun extractAssetsDictionary(dictionaryFileName: String, locale: Locale, context: Context): File { - val targetFile = File(getCacheDirectoryForLocale(locale, context), "${dictionaryFileName.substringBefore("_")}.dict") - FileUtils.copyStreamToNewFile( - context.assets.open(ASSETS_DICTIONARY_FOLDER + File.separator + dictionaryFileName), - targetFile - ) + // actually we could extract assets dicts to unprotected storage + fun extractAssetsDictionary(dictionaryFileName: String, locale: Locale, context: Context): File? { + val cacheDir = getCacheDirectoryForLocale(locale, context) ?: return null + val targetFile = File(cacheDir, "${dictionaryFileName.substringBefore("_")}.dict") + try { + FileUtils.copyStreamToNewFile( + context.assets.open(ASSETS_DICTIONARY_FOLDER + File.separator + dictionaryFileName), + targetFile + ) + } catch (e: IOException) { + Log.e(TAG, "Could not extract assets dictionary $dictionaryFileName") + return null + } return targetFile } diff --git a/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt index d7359533d..dc64cadd8 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/DictionaryScreen.kt @@ -142,8 +142,8 @@ fun DictionaryScreen( fun getUserAndInternalDictionaries(context: Context, locale: Locale): Pair, Boolean> { val userDicts = mutableListOf() var hasInternalDict = false - val userLocaleDir = File(DictionaryInfoUtils.getCacheDirectoryForLocale(locale, context)) - if (userLocaleDir.exists() && userLocaleDir.isDirectory) { + val userLocaleDir = DictionaryInfoUtils.getCacheDirectoryForLocale(locale, context)?.let { File(it) } + if (userLocaleDir?.exists() == true && userLocaleDir.isDirectory) { userLocaleDir.listFiles()?.forEach { if (it.name.endsWith(DictionaryInfoUtils.USER_DICTIONARY_SUFFIX)) userDicts.add(it) From 31a8761bfa16c7f8c26df3bd20509e5a64a05a54 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Thu, 29 May 2025 09:32:12 +0200 Subject: [PATCH 165/175] don't always use the same coordinate when creating fake ComposedData for a word avoids some sort of cache returning previous suggestions, see GH-1542 --- .../main/java/helium314/keyboard/latin/common/ComposedData.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/latin/common/ComposedData.kt b/app/src/main/java/helium314/keyboard/latin/common/ComposedData.kt index 159d1b1c7..091c41920 100644 --- a/app/src/main/java/helium314/keyboard/latin/common/ComposedData.kt +++ b/app/src/main/java/helium314/keyboard/latin/common/ComposedData.kt @@ -6,6 +6,7 @@ package helium314.keyboard.latin.common import helium314.keyboard.latin.WordComposer +import kotlin.random.Random /** An immutable class that encapsulates a snapshot of word composition data. */ class ComposedData( @@ -47,7 +48,7 @@ class ComposedData( val codePoints = StringUtils.toCodePointArray(word) val coordinates = CoordinateUtils.newCoordinateArray(codePoints.size) for (i in codePoints.indices) { - CoordinateUtils.setXYInArray(coordinates, i, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE) + CoordinateUtils.setXYInArray(coordinates, i, Random.nextBits(2), Random.nextBits(2)) } return WordComposer().apply { setComposingWord(codePoints, coordinates) }.composedDataSnapshot } From dbeddcd658a551cf6de36a88e8c049f4539bc319 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Fri, 30 May 2025 20:19:26 +0200 Subject: [PATCH 166/175] don't show tld hint label in numpad see #1640 --- .../keyboard/internal/keyboard_parser/floris/TextKeyData.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt index fbf1f7921..d98f3b956 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt +++ b/app/src/main/java/helium314/keyboard/keyboard/internal/keyboard_parser/floris/TextKeyData.kt @@ -542,7 +542,9 @@ sealed interface KeyData : AbstractKeyData { // essentially the first term only changes the appearance of the armenian period key in holo theme KeyLabel.PERIOD -> (Key.LABEL_FLAGS_HAS_POPUP_HINT and if (params.mId.isAlphabetKeyboard) params.mLocaleKeyboardInfos.labelFlags else 0) or - Key.LABEL_FLAGS_PRESERVE_CASE + Key.LABEL_FLAGS_PRESERVE_CASE or + // in functional_keys.json the label flag is already defined, let's not override it in case it's removed by the user + if (!params.mId.isAlphaOrSymbolKeyboard && shouldShowTldPopups(params)) Key.LABEL_FLAGS_DISABLE_HINT_LABEL else 0 KeyLabel.ACTION -> { Key.LABEL_FLAGS_PRESERVE_CASE or Key.LABEL_FLAGS_AUTO_X_SCALE or Key.LABEL_FLAGS_FOLLOW_KEY_LABEL_RATIO or Key.LABEL_FLAGS_HAS_POPUP_HINT or KeyboardTheme.getThemeActionAndEmojiKeyLabelFlags(params.mThemeId) From 37821ff8ade4803f6253fa84c915c846fa94b6ba Mon Sep 17 00:00:00 2001 From: Helium314 Date: Fri, 30 May 2025 20:35:32 +0200 Subject: [PATCH 167/175] use old way of getting main dictionary suggestions on facilitator thread apparently this fixes GH-1614 (spurious crash in the native google library on Android 7) though maybe the reason is a difference between ExecutorUtils and coroutines? --- .../latin/DictionaryFacilitatorImpl.kt | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt index 1174f850d..5c98d19b4 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt @@ -469,18 +469,24 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { val proximityInfoHandle = keyboard.proximityInfo.nativeProximityInfo val weightOfLangModelVsSpatialModel = floatArrayOf(Dictionary.NOT_A_WEIGHT_OF_LANG_MODEL_VS_SPATIAL_MODEL) - val deferredSuggestions = dictionaryGroups.map { - scope.async { - // todo: if the order does not matter, we could add the suggestions right away without awaitAll first - getSuggestions(composedData, ngramContext, settingsValuesForSuggestion, sessionId, - proximityInfoHandle, weightOfLangModelVsSpatialModel, it) + val waitForOtherDicts = if (dictionaryGroups.size == 1) null else CountDownLatch(dictionaryGroups.size - 1) + val suggestionsArray = Array?>(dictionaryGroups.size) { null } + for (i in 1..dictionaryGroups.lastIndex) { + scope.launch { + suggestionsArray[i] = getSuggestions(composedData, ngramContext, settingsValuesForSuggestion, sessionId, + proximityInfoHandle, weightOfLangModelVsSpatialModel, dictionaryGroups[i]) + waitForOtherDicts?.countDown() } } + suggestionsArray[0] = getSuggestions(composedData, ngramContext, settingsValuesForSuggestion, sessionId, + proximityInfoHandle, weightOfLangModelVsSpatialModel, dictionaryGroups[0]) val suggestionResults = SuggestionResults( - SuggestedWords.MAX_SUGGESTIONS, ngramContext.isBeginningOfSentenceContext, - false + SuggestedWords.MAX_SUGGESTIONS, ngramContext.isBeginningOfSentenceContext, false ) - runBlocking { deferredSuggestions.awaitAll() }.forEach { + waitForOtherDicts?.await() + + suggestionsArray.forEach { + if (it == null) return@forEach suggestionResults.addAll(it) suggestionResults.mRawSuggestions?.addAll(it) } From 92b1907c61e21e3808180377bafdfca3fc472345 Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Fri, 30 May 2025 23:40:52 +0300 Subject: [PATCH 168/175] Drop non-emoji single character suggestions from emoji dictionary (#1643) --- .../helium314/keyboard/latin/DictionaryFacilitatorImpl.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt index 5c98d19b4..3de4df001 100644 --- a/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt +++ b/app/src/main/java/helium314/keyboard/latin/DictionaryFacilitatorImpl.kt @@ -41,7 +41,6 @@ import java.util.Locale import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit -import kotlin.concurrent.Volatile /** * Facilitates interaction with different kinds of dictionaries. Provides APIs @@ -527,6 +526,10 @@ class DictionaryFacilitatorImpl : DictionaryFacilitator { && !dictionary.isInDictionary(word) ) continue + + if (word.length == 1 && info.mSourceDict.mDictType == "emoji" && !StringUtils.mightBeEmoji(word[0].code)) + continue + suggestions.add(info) } } From 4d441e5bdf9cf042cbd639b2341a3188dbee42d5 Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Fri, 30 May 2025 23:49:37 +0300 Subject: [PATCH 169/175] Fix partial emoji swiping (#1645) --- .../keyboard/emoji/EmojiPalettesView.java | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java index 359176714..1999ef8f8 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java +++ b/app/src/main/java/helium314/keyboard/keyboard/emoji/EmojiPalettesView.java @@ -6,6 +6,9 @@ package helium314.keyboard.keyboard.emoji; +import java.util.HashMap; +import java.util.Map; + import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; @@ -68,9 +71,21 @@ public final class EmojiPalettesView extends LinearLayout private final class PagerAdapter extends RecyclerView.Adapter { private boolean mInitialized; + private Map mViews = new HashMap<>(mEmojiCategory.getShownCategories().size()); - private PagerAdapter() { + private PagerAdapter(ViewPager2 pager) { setHasStableIds(true); + pager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { + @Override + public void onPageSelected(int position) { + var categoryId = (int) getItemId(position); + setCurrentCategoryId(categoryId, false); + var recyclerView = mViews.get(position); + if (recyclerView != null) { + updateState(recyclerView, categoryId); + } + } + }); } @Override @@ -94,7 +109,7 @@ public final class EmojiPalettesView extends LinearLayout @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { - updateState(recyclerView, viewHolder); + updateState(recyclerView, viewHolder.mCategoryId); } }); @@ -106,6 +121,7 @@ public final class EmojiPalettesView extends LinearLayout public void onBindViewHolder(PagerViewHolder holder, int position) { holder.mCategoryId = getItemId(position); var recyclerView = getRecyclerView(holder.itemView); + mViews.put(position, recyclerView); recyclerView.setAdapter(new EmojiPalettesAdapter(mEmojiCategory, (int) holder.mCategoryId, EmojiPalettesView.this)); @@ -120,16 +136,6 @@ public final class EmojiPalettesView extends LinearLayout return mEmojiCategory.getShownCategories().size(); } - @Override - public void onViewAttachedToWindow(PagerViewHolder holder) { - if (mPager.getScrollState() == ViewPager2.SCROLL_STATE_DRAGGING // swipe - || holder.getBindingAdapterPosition() == mPager.getCurrentItem() // tab - ) { - setCurrentCategoryId((int) getItemId(holder.getBindingAdapterPosition()), false); - updateState(getRecyclerView(holder.itemView), holder); - } - } - @Override public void onViewDetachedFromWindow(PagerViewHolder holder) { if (holder.mCategoryId == EmojiCategory.ID_RECENTS) { @@ -150,8 +156,8 @@ public final class EmojiPalettesView extends LinearLayout return view.findViewById(R.id.emoji_keyboard_list); } - private void updateState(@NonNull RecyclerView recyclerView, PagerViewHolder viewHolder) { - if (viewHolder.mCategoryId != mEmojiCategory.getCurrentCategoryId()) { + private void updateState(@NonNull RecyclerView recyclerView, long categoryId) { + if (categoryId != mEmojiCategory.getCurrentCategoryId()) { return; } @@ -242,7 +248,7 @@ public final class EmojiPalettesView extends LinearLayout } mPager = findViewById(R.id.emoji_pager); - mPager.setAdapter(new PagerAdapter()); + mPager.setAdapter(new PagerAdapter(mPager)); mEmojiLayoutParams.setEmojiListProperties(mPager); mEmojiCategoryPageIndicatorView = findViewById(R.id.emoji_category_page_id_view); mEmojiLayoutParams.setCategoryPageIdViewProperties(mEmojiCategoryPageIndicatorView); From 82bea7facfb3bd79f16a9ff29520cbb5720f96ff Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Sat, 31 May 2025 09:00:00 +0300 Subject: [PATCH 170/175] Don't show dictionary debug info on toolbar (#1644) --- .../latin/suggestions/SuggestionStripLayoutHelper.java | 5 ++--- .../keyboard/latin/suggestions/SuggestionStripView.java | 9 ++++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripLayoutHelper.java b/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripLayoutHelper.java index 07535c641..e7cf2ed56 100644 --- a/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripLayoutHelper.java +++ b/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripLayoutHelper.java @@ -373,7 +373,7 @@ final class SuggestionStripLayoutHelper { x += wordView.getMeasuredWidth(); if (SuggestionStripView.DEBUG_SUGGESTIONS) { - layoutDebugInfo(positionInStrip, placerView, x); + layoutDebugInfo(positionInStrip, placerView, (int) stripView.getX() + x); } } return startIndexOfMoreSuggestions; @@ -436,8 +436,7 @@ final class SuggestionStripLayoutHelper { placerView.addView(debugInfoView); debugInfoView.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); final int infoWidth = debugInfoView.getMeasuredWidth(); - final int y = debugInfoView.getMeasuredHeight(); - ViewLayoutUtils.placeViewAt(debugInfoView, x - infoWidth, y, infoWidth, debugInfoView.getMeasuredHeight()); + ViewLayoutUtils.placeViewAt(debugInfoView, x - infoWidth, 0, infoWidth, debugInfoView.getMeasuredHeight()); } private int getSuggestionWidth(final int positionInStrip, final int maxWidth) { diff --git a/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java b/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java index 58dacf660..17a6eca71 100644 --- a/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java +++ b/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java @@ -486,7 +486,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick mSuggestedWords.mIsObsoleteSuggestions, mSuggestedWords.mInputStyle, mSuggestedWords.mSequenceNumber); mStartIndexOfMoreSuggestions = mLayoutHelper.layoutAndReturnStartIndexOfMoreSuggestions( - getContext(), mSuggestedWords, mSuggestionsStrip, SuggestionStripView.this); + getContext(), mSuggestedWords, mSuggestionsStrip, this); mStripVisibilityGroup.showSuggestionsStrip(); // Show the toolbar if no suggestions are left and the "Auto show toolbar" setting is enabled if (mSuggestedWords.isEmpty() && Settings.getValues().mAutoShowToolbar){ @@ -705,6 +705,13 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick mSuggestionsStrip.setVisibility(VISIBLE); mPinnedKeys.setVisibility(VISIBLE); } + + if (DEBUG_SUGGESTIONS) { + for (var view : mDebugInfoViews) { + view.setVisibility(mSuggestionsStrip.getVisibility()); + } + } + mToolbarExpandKey.setScaleX((visible && !locked ? -1f : 1f) * mRtl); } From 0e86978df3ae2a4378a2fb384038803e264ffa67 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 31 May 2025 09:35:33 +0200 Subject: [PATCH 171/175] different way of implementing larger toolbar key see GH-1556, fixes GH-1621 --- .../latin/suggestions/SuggestionStripView.java | 6 +----- .../res/drawable/toolbar_expand_key_background.xml | 14 ++++++++++++++ app/src/main/res/layout/suggestions_strip.xml | 5 ++--- 3 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 app/src/main/res/drawable/toolbar_expand_key_background.xml diff --git a/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java b/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java index 17a6eca71..9a8e49f36 100644 --- a/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java +++ b/app/src/main/java/helium314/keyboard/latin/suggestions/SuggestionStripView.java @@ -14,12 +14,9 @@ import android.content.Context; import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.Color; -import android.graphics.PorterDuff; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; -import android.graphics.drawable.ShapeDrawable; -import android.graphics.drawable.shapes.OvalShape; import android.os.Build; import android.text.TextUtils; import android.util.AttributeSet; @@ -214,8 +211,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick mToolbarExpandKey.setOnClickListener(this); mToolbarExpandKey.setImageDrawable(Settings.getValues().mIncognitoModeEnabled ? mIncognitoIcon : mToolbarArrowIcon); colors.setColor(mToolbarExpandKey, ColorType.TOOL_BAR_EXPAND_KEY); - mToolbarExpandKey.setBackground(new ShapeDrawable(new OvalShape())); // ShapeDrawable color is black, need src_atop filter - mToolbarExpandKey.getBackground().setColorFilter(colors.get(ColorType.TOOL_BAR_EXPAND_KEY_BACKGROUND), PorterDuff.Mode.SRC_ATOP); + colors.setColor(mToolbarExpandKey.getBackground(), ColorType.TOOL_BAR_EXPAND_KEY_BACKGROUND); for (final ToolbarKey pinnedKey : ToolbarUtilsKt.getPinnedToolbarKeys(prefs)) { final ImageButton button = createToolbarKey(context, iconsSet, pinnedKey); diff --git a/app/src/main/res/drawable/toolbar_expand_key_background.xml b/app/src/main/res/drawable/toolbar_expand_key_background.xml new file mode 100644 index 000000000..105d1a42a --- /dev/null +++ b/app/src/main/res/drawable/toolbar_expand_key_background.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/layout/suggestions_strip.xml b/app/src/main/res/layout/suggestions_strip.xml index 0995072aa..123b211e9 100644 --- a/app/src/main/res/layout/suggestions_strip.xml +++ b/app/src/main/res/layout/suggestions_strip.xml @@ -23,9 +23,8 @@ android:layout_height="@dimen/config_suggestions_strip_edge_key_width" android:layout_gravity="center_vertical" android:layout_weight="0" - android:layout_marginStart="4dp" - android:scaleType="centerCrop" - android:padding="2dp" + android:layout_marginStart="1dp" + android:background="@drawable/toolbar_expand_key_background" style="?attr/suggestionWordStyle" android:contentDescription="@string/more_keys_strip_description" /> Date: Sat, 31 May 2025 09:58:29 +0200 Subject: [PATCH 172/175] update reading dictionaries available for download --- tools/release.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/tools/release.py b/tools/release.py index 783dfbeea..daadc0aa5 100755 --- a/tools/release.py +++ b/tools/release.py @@ -65,25 +65,21 @@ def update_dict_list(): for line in lines: line = line.strip() if line.startswith("#"): - if line == "# Dictionaries": - mode = 1 - elif line == "# Experimental dictionaries": - mode = 2 - else: - mode = 0 - if mode == 0 or not line.startswith("*"): + mode = 0 + if line.startswith("# Dictionaries"): + mode = 1 + if mode == 0 or not line.startswith("|") or line.startswith("| Language |") or line.startswith("| --- |"): continue - dict_name = line.split("]")[1].split("(")[1].split(")")[0].split("/")[-1].split(".dict")[0] + split = line.split("|") + dict_name = split[2].split("]")[1].split("(")[1].split(")")[0].split("/")[-1].split(".dict")[0] (dict_type, locale) = dict_name.split("_", 1) if "_" in locale: sp = locale.split("_") locale = sp[0] for s in sp[1:]: locale = locale + "_" + s.upper() - if mode == 2: - dicts.append(f"{dict_type},{locale},exp\n") - else: - dicts.append(f"{dict_type},{locale},\n") + exp = "exp" if split[3].strip() == "yes" else "" + dicts.append(f"{dict_type},{locale},{exp}\n") target_file = "app/src/main/assets/dictionaries_in_dict_repo.csv" with open(target_file, 'w') as f: f.writelines(dicts) From 7b912213393034e3aa9608dc676c6e0ddc4122d7 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 31 May 2025 10:06:03 +0200 Subject: [PATCH 173/175] update translations, fix broken string references escaping the @ in @string/ --- app/src/main/res/values-ar/strings.xml | 3 ++- app/src/main/res/values-bg/strings.xml | 5 +++-- app/src/main/res/values-bn/strings.xml | 7 ++++--- app/src/main/res/values-ca/strings.xml | 5 +++-- app/src/main/res/values-cs/strings.xml | 5 +++-- app/src/main/res/values-et/strings.xml | 5 +++-- app/src/main/res/values-fr/strings.xml | 7 ++++--- app/src/main/res/values-it/strings.xml | 16 +++++++++----- app/src/main/res/values-iw/strings.xml | 13 ++++++------ app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 7 ++++--- app/src/main/res/values-ota/strings.xml | 2 +- app/src/main/res/values-pa-rPK/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 5 +++-- app/src/main/res/values-pt-rBR/strings.xml | 5 +++-- app/src/main/res/values-pt-rPT/strings.xml | 2 +- app/src/main/res/values-ro/strings.xml | 21 ++++++++++++++++++- app/src/main/res/values-ru/strings.xml | 19 +++++++++-------- app/src/main/res/values-zh-rCN/strings.xml | 5 +++-- .../metadata/android/ca/changelogs/3100.txt | 10 +++++++++ .../android/cs-CZ/changelogs/3100.txt | 10 +++++++++ .../metadata/android/et/changelogs/3100.txt | 10 +++++++++ .../android/iw-IL/changelogs/3100.txt | 10 +++++++++ .../android/nl-NL/changelogs/3100.txt | 10 +++++++++ .../android/ru-RU/changelogs/2300.txt | 18 ++++++++-------- .../android/ru-RU/changelogs/2301.txt | 18 ++++++++-------- .../android/ru-RU/changelogs/3004.txt | 11 ++++++++++ .../android/ru-RU/changelogs/3005.txt | 11 ++++++++++ .../android/ru-RU/changelogs/3006.txt | 11 ++++++++++ .../android/ru-RU/changelogs/3007.txt | 11 ++++++++++ .../android/ru-RU/changelogs/3008.txt | 11 ++++++++++ .../android/ru-RU/changelogs/3100.txt | 10 +++++++++ 32 files changed, 220 insertions(+), 67 deletions(-) create mode 100644 fastlane/metadata/android/ca/changelogs/3100.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/3100.txt create mode 100644 fastlane/metadata/android/et/changelogs/3100.txt create mode 100644 fastlane/metadata/android/iw-IL/changelogs/3100.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/3100.txt create mode 100644 fastlane/metadata/android/ru-RU/changelogs/3004.txt create mode 100644 fastlane/metadata/android/ru-RU/changelogs/3005.txt create mode 100644 fastlane/metadata/android/ru-RU/changelogs/3006.txt create mode 100644 fastlane/metadata/android/ru-RU/changelogs/3007.txt create mode 100644 fastlane/metadata/android/ru-RU/changelogs/3008.txt create mode 100644 fastlane/metadata/android/ru-RU/changelogs/3100.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 0163df4c4..0774c6472 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -145,7 +145,7 @@ الألوان صف الأرقام %s (تجريبي) - اللغة + @string/subtype_locale استخدمه على أي حال النمط دائري @@ -436,4 +436,5 @@ استخدام أسماء التطبيقات المثبتة للاقتراحات والتصحيحات لون بشرة الرموز التعبيرية الافتراضي طبيعي + %1$s (%2$s) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 46e25e82f..aa14f79d2 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -84,7 +84,7 @@ Последна актуализация "Настройки" "Изтриване" - "Версия %1$s" + Версия %s "Добавяне в речника" "Пряк път:" "Език:" @@ -137,7 +137,7 @@ Игнорирайте искането на други приложения за деактивиране на предложенията (може да причини проблеми) Повече автоматична корекция Изтриване на библиотека - Език + @string/subtype_locale Поведение на клавиша за превключване на език Автоматично коригиране, дори когато не е изрично поискано от полето за въвеждане Доверие за автоматично коригиране @@ -464,4 +464,5 @@ Използване на имената на инсталираните приложения за предложения и корекции Тон на кожата на емотиконите по подразбиране Неутрален + %1$s (%2$s) diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index b30b48fcc..b73d177c3 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -139,7 +139,7 @@ অভ্যন্তরীণ মূল অভিধান "ফাইল থেকে অভিধান সংযুক্তি" ভাষা নির্বাচন - ব্যবহারকারী-যোগকৃত অভিধান \"%1$s\" প্রতিস্থাপন করতে নিশ্চিত?\n বর্তমান অভিধান: %2$s\n নতুন অভিধান: %3$s + ব্যবহারকারী-যোগকৃত অভিধান \"%1$s\" প্রতিস্থাপন করতে নিশ্চিত?\nবর্তমান অভিধান: %2$s\nনতুন অভিধান: %3$s "অভিধান প্রতিস্থাপন" ব্যবহারকারী-সংযুক্ত অভিধান \"%s\" অপসারণ করতে নিশ্চিত? অভিধান ব্যতীত কেবল পূর্বে সন্নিবেশিত শব্দের জন্য পরামর্শ পাওয়া যাবে।<br> আপনি %1$s অভিধান ডাউনলোড করতে পারেন, অথবা \"%2$s\" এর জন্য অভিধান সরাসরি ডাউনলোড করা যায় কি না %3$s যাচাই করতে পারেন। @@ -155,7 +155,7 @@ সর্বশেষ আপডেট সেটিংস বিলোপ করুন - সংস্করণ %1$s + সংস্করণ %s অভিধানে যোগ শর্টকাট: ভাষা: @@ -231,7 +231,7 @@ বোতামের ইঙ্গিতের উৎস পপআপ বোতামের ক্রমিক নির্ধারণ নম্বর সারি - ভাষা + @string/subtype_locale ভাষা (অগ্রাধিকার) লেআউট প্রতীক @@ -428,4 +428,5 @@ পরামর্শ ও সংশোধনের জন্য ইন্সটলকৃত অ্যাপের নাম ব্যবহার ডিফল্ট ইমোজির ত্বকের রং নিরপেক্ষ + %1$s (%2$s) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 639d04b00..1749c605e 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -84,7 +84,7 @@ "Última actualització" "Configuració" "Suprimeix" - Versió %1$s + Versió %s "Afegeix al diccionari" "Drecera:" "Idioma:" @@ -179,7 +179,7 @@ Prefereix els localitzats als nombres llatins Fixa la tecla de la barra d\'eines en prémer llargament Fila de nombres - Idioma + @string/subtype_locale Idioma (prioritat) Selecciona l\'origen del consell Disposició @@ -427,4 +427,5 @@ Cercar noms d\'aplicacions Utilitzar els noms de les aplicacions instal·lades per a suggeriments i correccions Neutre + %1$s (%2$s) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 7ef8486cc..dbb74c6b4 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -85,7 +85,7 @@ "Poslední aktualizace" "Nastavení" "Smazat" - "Verze %1$s" + Verze %s "Přidat do slovníku" "Zkratka:" "Jazyk:" @@ -147,7 +147,7 @@ Použít osobní slovník zařízení k ukládání naučených slovíček Další automatické opravy Automatické opravy, i když to není výslovně požadováno ve vstupním poli - Jazyk + @string/subtype_locale Denní Vždy používat prostřední návrh Po stisknutí mezery nebo interpunkčního znaménka se zadá prostřední návrh @@ -430,4 +430,5 @@ Používat názvy aplikací Neutrální Výchozí barva pokožky emodži + %1$s (%2$s) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 28b7d303b..c42959fd6 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -84,7 +84,7 @@ "Viimati värskendatud" "Seaded" "Kustuta" - "Versioon %1$s" + Versioon %s "Sõnaraamatusse lisamine" "Otsetee:" "Keel:" @@ -203,7 +203,7 @@ Lehekülg alla Keel (prioriteetne) Numbrite rida - Keel + @string/subtype_locale Paigutus Sümbolid Üles @@ -464,4 +464,5 @@ Otsi soovituste ja paranduste jaoks välja paigaldatud rakenduste nimed Emoji vaikimisi taustavärv Neutraalne + %1$s (%2$s) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c18804969..821a4d993 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -127,7 +127,7 @@ Nouveau dictionnaire: "Dictionnaire disponible" "Dernière mise à jour" "Supprimer" - Version %1$s + Version %s "Ajouter au dictionnaire" "Raccourci :" Poids : @@ -178,7 +178,7 @@ Nouveau dictionnaire: Sélectionner la source des indices Sélectionner l\'ordre des touches pop-up Nombre - Langue + @string/subtype_locale Langue (prioritaire) Disposition Symboles @@ -254,7 +254,7 @@ Nouveau dictionnaire: Temps de rétention de l\'historique Si désactivé, l\'appui sur la touche presse-papier collera l’éventuel contenu du presse-papier Activer l\'historique - %smin. + %s min. %s (Akkhor) Espace automatique après la ponctuation Insertion automatique d\'un espace après la ponctuation lors de la saisie d\'un nouveau mot @@ -434,4 +434,5 @@ Nouveau dictionnaire: Utiliser les noms des applications installées pour les suggestions et les corrections Neutre Teint de peau par défaut des emojis + %1$s (%2$s) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 146931a9e..5fc514a1a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -84,7 +84,7 @@ "Ultimo aggiornamento" "Impostazioni" "Elimina" - Versione %1$s + Versione %s "Aggiungi al dizionario" "Scorciatoia:" "Lingua:" @@ -159,7 +159,7 @@ \n \nAttenzione: il caricamento di codice esterno può essere un rischio per la sicurezza. Utilizzare solo librerie di provenienza affidabile. Elimina libreria - Lingua + @string/subtype_locale Cursore a destra Mostra i numeri in uso nella lingua attiva anziché quelli latini File di libreria sconosciuto. Verifica di averlo ottenuto da una fonte affidabile e che sia per \'%s\'. @@ -168,7 +168,7 @@ Appunti Riga dei numeri Ripristino - Ordine / priorità dei tasti popup + Ordine e priorità dei tasti popup Fonti degli indicatori Carica il file della libreria nativa per la digitazione gestuale Cerca di rilevare URL e simili come una singola parola @@ -317,7 +317,7 @@ Nasconde la barra degli strumenti quando è possibile mostrare le parole suggerite Mostra automaticamente la barra degli strumenti Le azioni alternative su pressione lunga saranno disponibili solo sui tasti già fissati - %s (Extended) + %s (Estesa) Tasti funzione (Simboli) Tasti funzione (Altri simboli) Barra degli strumenti @@ -353,7 +353,7 @@ Pagina giù Passa al tastierino numerico Rimuovi i tasti popup ripetuti - Rimuovi i tasti popup già presenti nel layout base + Rimuove i tasti popup già presenti nel layout base Mostra dinamicamente le parole suggerite durante l\'inserimento Durata della traccia del gesto Anteprima mobile dinamica @@ -431,4 +431,10 @@ Dagbani Sesotho Scala la dimensione dei tasti con la dimensione dei caratteri + %1$s (%2$s) + Backup ripristinato + Suggerisci nomi delle app installate + Aggiunge i nomi delle app installate alla lista di suggerimenti e correzioni + Tonalità di pelle predefinita per le emoji + Neutro (giallo) diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 3c88a1498..a2e8898e1 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -53,9 +53,9 @@ "%s (קומפקטית)" "ללא שפה" "אמוג\'י" - "הוסף" - "הסר" - "שמור" + הוספה + הסרה + שמירה "שפה" "פריסה" משך הרטט של לחיצת מקש @@ -191,7 +191,7 @@ מרווחי קלידים צרים תרגום number row שורת מספרים - שפה + @string/subtype_locale שפה (עדיפות) פריסה סימנים @@ -351,8 +351,8 @@ הצגת המילה המוצעת תוך כדי מחווה משך הצגת עקבת נתיב המחווה תזוזת התצוגה המקדימה תוך כדי מחווה - %s (Extended) - %s (Sebeolsik Final) + %s (מורחבת) + %s (Sebeolsik סופי) ◄ לחיצה ממושכת על כפתורי סרגל הכלים מאפשרת פונקציונליות נוספת: <br> \n\t• לוח &#65515; הדבקה <br> \n\t• תזוזה שמאלה/ימינה &#65515; מילה שמאלה/ימינה <br> \n\t• תזוזה למעלה/למטה &#65515; דף למעלה/למטה <br> \n\t• מילה שמאלה/ימינה &#65515; תחילת שורה/סוף שורה <br> \n\t• דף למעלה/למטה &#65515; תחילת דף/סוף דף <br> \n\t• העתקה &#65515; גזירה <br> \n\t• בחירת מילה &#8596; בחירת הכל <br> \n\t• ביטול &#8596; ביצוע בשנית <br> <br> \n◄ לחיצה ממושכת על כפתורים בסרגל ההצעות של סרגל הכלים נועצת אותם בסרגל ההצעות. <br> <br> \n◄ לחיצה ממושכת על מקש פסיק לגישה לתצוגת הלוח, תצוגת אימוג\'ים, מצב עבודה ביד אחת, הגדרות, או מעבר שפה: <br> \n\t• תצוגת אימוג\'ים ומעבר שפה לא יוצגו אם הכפתורים המתאימים כבר מוצגים; <br> \n\t• בחלק מהפריסות האפשרות איננה במקש הפסיק, אלא במקש המוצג באותו מקום (לדוגמה, בפריסת Dvorak התו \'q\'). <br> <br> \n◄ כאשר מצב פרטיות מופעל, לא יילמדו כלל מילים, ולא יתווספו אימוג\'ים ל\'בשימוש לאחרונה\'. <br> <br> \n◄ ליחצו על סמל הפרטיות לגישה לסרגל הכלים. <br> <br> \n◄ הקלדה בהחלקה: החליקו מ-shift למקש אחר כדי להקיש אות גדולה יחידה: <br> \n\t• זה עובד באופן דומה גם למקש \'?123\' להקלדת סימן יחיד מלוח הסמלים, ולמקשים קשורים. <br> <br> \n◄ ליחצו על shift או על מקש הסמלים, ליחצו על מקש אחד או יותר, ואז הרפו מ-shift או ממקש הסמלים לחזרה למקלדת הקודמת. <br> <br> \n◄ לחיצה ממושכת על הצעה בסרגל ההצעות להצגת הצעות נוספות, ומקש מחיקה להסרת הצעה זו. <br> <br> \n◄ החליקו למעלה מהצעה לפתיחת הצעות נוספות, והרפו על ההצעה הרצויה לבחירתה. <br> <br> \n◄ לחיצה ממושכת על רשומה בהיסטוריית הלוח לנעיצתה (שמירתה בלוח עד לביטול הנעיצה). <br> <br> \n◄ החלקה שמאלה על רשומה בתצוגת הלוח להסרתה מהלוח (אם היא לא נעוצה) <br> <br> \n◄ בחירת מלל ולחיצה על shift למעבר בין אותיות גדולות, אותיות קטנות ורישיות מילים גדולות. <br> <br> \n◄ ניתן להוסיף מילונים ע\"י פתיחתם באמצעות יישום סייר קבצים: <br> \n\t• פועל רק עם <i>content-uris</i> ולא עם <i>file-uris</i>, ז\"א שזה עלול שלא לעבוד בחלק מיישומי סייר קבצים. <br> <br> \n◄ משתמשים המבצעים גיבויים ידניים עם הרשאת גישה root: <br> \n\t• החל באנדרואיד 7, קובץ ההעדפות המשותף איננו בנתיב ברירת המחדל, כיוון שהיישום עושה שימוש ב %s. הדבר נחוץ כדי שההגדרות יהיו קריאות לפני שהמכשיר נפתח, לדוגמה: בהפעלה; <br> \n\t• הקובץ ממוקם בנתיב /data/user_de/0/package_id/shared_prefs/ אך זה עשוי להשתנות בתלות בגירסאות המכשיר ומערכת אנדרואיד. <br> <br> \n<i><b>Debug mode / debug APK</b></i> <br> <br> \n◄ לחיצה ממושכת על הצעה להצגת מילון המקור. <br> <br> \n◄ בשימוש ב-debug APK, באפשרותך למצוא את הגדרות ה-Debug Settings בהעדפות המתקדמות,אך השימושיות מוגבלת למעט dumping של מילונים ליומן (log). <br> \n\t• עבור APK רשמי, עליך ללחוץ על הגירסה <i>About</i> מספר פעמים, ואז ניתן למצוא אתהגדרות ה-debug ב-<i>העדפות מתקדמות</i>. <br> \n\t• כאשר מופעלת <i>הצגת מידע על הצעות</i>, יוצגו מספרים זעירים בסמוך להצעות המייצגים דירוג פנימי ומילון מקור. <br> <br> \n◄ במקרה של קריסת יישום, תוצג לך שאלה האם ברצונך ביומני הקריסה בפתיחת ההגדרות. <br> <br> \n◄ בעת שימוש בהקלדה מרובת שפות, מקש הרווח יציג מדד אמון המשמש לברירת השפה שבשימוש כעת. <br> <br> \n◄ בסמוך להצעות יוצגו מספרים זעירים המייצגים דירוג פנימי ומילון מקור (התצוגה ניתנת להשבתה). %s (Probhat) %s (Sebeolsik 390) @@ -435,4 +435,5 @@ גוון עור ברירת-מחדל לאמוג\'י נייטרלי שימוש בשמות יישומים מותקנים להצעות ולתיקונים + %1$s (%2$s) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 84560bdce..5b63425f5 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -51,7 +51,7 @@ "セルビア語(ラテン文字)" "%s(伝統言語)" "%s(コンパクト)" - "言語なし(アルファベット)" + 言語なし(アルファベット) "絵文字" "追加" "削除" diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 455e33805..e9302ddc1 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -84,7 +84,7 @@ "Laatst bijgewerkt" "Instellingen" "Verwijderen" - Versie %1$s + Versie %s "Toevoegen aan woordenboek" "Sneltoets:" "Taal:" @@ -221,7 +221,7 @@ Klembord wissen Woord selecteren Werkbalktoetsen kiezen - Taal + @string/subtype_locale Geheel links Geheel rechts Links @@ -415,7 +415,7 @@ Werkbalktoetscodes aanpassen Code voor lang drukken Pictogrammen aanpassen - \@string/show_language_switch_key + @string/show_language_switch_key Shift (ingedrukt) Bediening met één hand wisselen Vuilnisbak @@ -473,4 +473,5 @@ Gebruik de namen van geïnstalleerde apps voor suggesties en correcties Neutraal Standaard emoji-huidskleur + %1$s (%2$s) diff --git a/app/src/main/res/values-ota/strings.xml b/app/src/main/res/values-ota/strings.xml index b25c0f9ed..501d69a50 100644 --- a/app/src/main/res/values-ota/strings.xml +++ b/app/src/main/res/values-ota/strings.xml @@ -88,4 +88,4 @@ قیصەیول: تماملاندی بورادە - \ No newline at end of file + diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index 13b37aed5..610409b33 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -104,4 +104,4 @@ دپھاڑ دا فاصلا ‫HeliBoard‬ لفظ جوڑن والا بولی بدلو - \ No newline at end of file + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 2268056a0..9f9d1d445 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -188,7 +188,7 @@ \nUwaga: dodawanie zewnętrznego kodu może stanowić zagrożenie bezpieczeństwa. Korzystaj z biblioteki pochodzącej tylko z zaufanego źródła. Wybierz słownik do dodania. Słowniki w formacie .dict można pobrać %s. Usuń bibliotekę - Język (główny) + @string/subtype_locale W prawo Błąd podczas dodawania słownika Preferuj liczby lokalne zamiast łacińskich @@ -410,7 +410,7 @@ Usuwanie Wprowadzanie głosowe wyłączone Pokaż/ukryj pasek narzędzi - \@string/show_language_switch_key + @string/show_language_switch_key Dostosuj kody klawiszy paska narzędzi Kod klawisza Kod długiego naciśnięcia @@ -473,4 +473,5 @@ Przeszukaj nazwy aplikacji Domyślny odcień skóry emoji Neutralny + %1$s (%2$s) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6ebeddd7b..0beff1f46 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -113,7 +113,7 @@ Mostrar o ícone do app na launcher Dicionário disponível Alternar para %s - Em seguida, selecione \"%s\" como o seu método de entrada ativo. + Em seguida, selecione o \"%s\" como o seu método de entrada ativo. Agora, você pode usar o %s para digitar nos seus apps favoritos. Adicionar ao dicionário Versão %1$s @@ -157,7 +157,7 @@ Selecionar fonte de dicas Selecionar ordem do pop-up de teclas Linha de números - Idioma + @string/subtype_locale Idioma (prioridade) Layout Símbolos @@ -436,4 +436,5 @@ Usar nomes de apps instalados para sugestões e correções Cor de pele padrão para os emojis Neutra + %1$s (%2$s) diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index c5af1493e..d3b59e818 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -407,7 +407,7 @@ Escala do espaço lateral Escala do espaço lateral (paisagem) Reciclagem - Idiomas e Layouts + Idiomas & Layouts Localizar linha de números Preferir localizados em vez de números latinos Guardar em ficheiro diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 996417e47..d7adfaa7f 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -162,7 +162,7 @@ Mai multe taste Limbi și aspecte Rând de numere - Limbă + @string/subtype_locale Limbă (prioritate) Aspect Simboluri @@ -405,4 +405,23 @@ Distanța de deplasare pentru comutarea limbii Poți găsi și împărtăși culori în %s. secțiunea de discuții + Nu afișa întotdeauna sugestii pentru câmpurile de editare web + Câmpurile de editare web (mai ales în browser-e) sunt o cauză foarte frecventă pentru problemele cu setarea de afișare a sugestiilor întotdeauna + Format pentru tasta Timestamp + Afișează tastele pop-up TLD + Apăsarea Backspace anulează corectarea automată + Spațiu automat după tastarea unui cuvânt prin gesturi + Fără spațiu automat la apăsarea tastei Shift + Shift elimină în spațiul automat în așteptare + Folosește numele aplicațiilor + Spațiu automat după ce s-a ales o sugestie + Spațiu + Spațiu automat înainte de tastarea unui cuvânt prin gesturi + Rândul cu numere (de bază) + Scalarea dimensiunii tastelor emoji împreună cu dimensiunea fontului + Copie de rezervă restabilită + Apăsarea Enter sau Spațiu după alte taste în Numpad + Utilizează numele aplicațiilor instalate pentru sugestii și corecții + Ton implicit al pielii emoji + Neutru diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 933865178..45ae03f56 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -51,7 +51,7 @@ Хинглиш Мансийский Кайтагский - Сербский (латиница) + Сербский (Латиница) %s (Традиционная) %s (Компактная) Стандартная @@ -87,7 +87,7 @@ Последнее обновление Настройки Удалить - Версия %1$s + Версия %s Добавление в словарь "Быстрые клавиши:" "Язык:" @@ -172,7 +172,7 @@ Лицензия с открытым исходным кодом GNU General Public License v3.0 Закрыть - Языки системы + Использовать языки системы Нажмите на язык для настроек "Выберите метод ввода" Описание скрытых функций @@ -197,7 +197,7 @@ Выберите файл в совместимом формате. Информация о форматах доступна %s. %s (Себольсик 390) Использовать личный словарь устройства для хранения выученных слов - %s (Себольсик Финальная) + %s (Себольсик финальная) Шоколад Облачная День @@ -211,7 +211,7 @@ Лес Вам понадобится библиотека для \'%s\'. Несовместимые библиотеки могут привести к сбою при использовании набора текста с помощью жестов. \n\nВнимание: загрузка внешнего кода может представлять угрозу безопасности. Используйте библиотеку только из источника, которому вы доверяете. Удалить - Язык + @string/subtype_locale Предпочитать локализованные латинские цифры Неизвестный файл библиотеки. Вы уверены, что получили его из надёжного источника и оно предназначено для \'%s\'? Серо-голубой @@ -276,12 +276,12 @@ Полностью вправо Вес: Загрузить файл - Скопировать текущую раскладку + Копировать текущую раскладку Ошибка раскладки: %s Это слово уже присутствует в пользовательском словаре %s. Пожалуйста, введите другое. Ошибка: скрипт несовместим с этой клавиатурой - Всё ещё используется - Выбранный файл предназначен для %1$s, но ожидался %2$s. Всё ещё используете его для %2$s? + Всё равно использовать + Выбранный файл предназначен для %1$s, но ожидался %2$s. Всё равно использовать его для %2$s? Ошибка: выбранный файл не является корректным словарем "Без словаря вы будете получать предложения только для введенного ранее текста.<br>\n Вы можете загрузить словари %1$s или проверить, можно ли загрузить словарь для «%2$s» напрямую %3$s." %s (экспериментальный) @@ -330,7 +330,7 @@ Укажите основные и до 6 доп. символов валют через пробел Загрузить Сохранить в файл - Скопировать в буфер обмена + Копировать в буфер обмена Начало страницы Конец страницы Слово левее @@ -428,4 +428,5 @@ Использовать названия установленных приложений для предложений и исправлений Тон кожи эмодзи по умолчанию Нейтральный + %1$s (%2$s) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c51c2c94e..abfb208c3 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -51,7 +51,7 @@ "塞尔维亚语(拉丁语布局)" %s(传统) %s (紧凑型) - 无语言(字母表) + 无语言 "表情符号" "添加" 移除 @@ -178,7 +178,7 @@ 数字行 - 语言 + @string/subtype_locale 建议条文本 分离距离 @@ -430,4 +430,5 @@ 使用已安装应用的名称进行建议和更正 中性 默认表情符号肤色 + %1$s(%2$s) diff --git a/fastlane/metadata/android/ca/changelogs/3100.txt b/fastlane/metadata/android/ca/changelogs/3100.txt new file mode 100644 index 000000000..c10c63c18 --- /dev/null +++ b/fastlane/metadata/android/ca/changelogs/3100.txt @@ -0,0 +1,10 @@ +* opcional suggerir noms de les apps instal·lades +* lliscar per canviar les categs. d'emojis +* mostrar toast en restaurar la còpia de seg. +* botó i icona de la barra d'eines més grans +* fer la coma accessible a les finestres emergents de TLD +* afegir config. per a tema predet. dels emojis +* afegir codis de tecla per a les tecles alt i ctrl esq. i dreta +* afegir etiqueta «timestamp» per fer eixa tecla accessible +* etiquetes de tecla especials per a finestres emergents en dissenys senzills +* etc diff --git a/fastlane/metadata/android/cs-CZ/changelogs/3100.txt b/fastlane/metadata/android/cs-CZ/changelogs/3100.txt new file mode 100644 index 000000000..f91fb9dd6 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/3100.txt @@ -0,0 +1,10 @@ +* navrhování názvů nainstalovaných aplikací +* přepnutí kategorie emoji přejetím +* zobr. oznámení po obnovení zálohy +* větší tlačítko a ikona na panelu nástrojů +* zpřístupnění čárky ve vysk. klávesách při zobrazení vysk. kl. TLD +* přidáno nastavení vých. odstínu pleti emodži +* přidány kódy kláves pro levý a pravý Alt a Ctrl +* přidán popisek klávesy „časové razítko“ pro přístupnější klávesu čas. razítka +* oprava spec. popisků kláves pro vysk. kl. v jednoduchých rozl. +* drobné opravy a vylepšení diff --git a/fastlane/metadata/android/et/changelogs/3100.txt b/fastlane/metadata/android/et/changelogs/3100.txt new file mode 100644 index 000000000..d8c5eeab6 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/3100.txt @@ -0,0 +1,10 @@ +* paigaldatud rakenduste nimede soovitamine (kui tahad) +* emojide kategooriate vahetamine viibates +* süsteemne teade peale varukoopiast taastamist +* suurem tööriistariba nupp ja ikoon +* koma on kasutatav ülataseme domeenide hüpikakendes +* emojide taust on nüüd seadistatav +* koodid vasaku ja parema alt ja ctrl klahvi jaoks +* ajatempli klahv on paremini märgitud +* eriklahvide sildid hüpikakende jaoks lihtsate paigutuste puhul +* pisiparandused ja täiendused diff --git a/fastlane/metadata/android/iw-IL/changelogs/3100.txt b/fastlane/metadata/android/iw-IL/changelogs/3100.txt new file mode 100644 index 000000000..0a2d1445d --- /dev/null +++ b/fastlane/metadata/android/iw-IL/changelogs/3100.txt @@ -0,0 +1,10 @@ +* אפשרות להצעת שמות של יישומים מותקנים +* החלקה למעבר בין קטגוריות אמוג'י +* הצגת הודעה לאחר שחזור גיבוי +* כפתור וסמלי toolbar גדולים יותר +* לאפשר גישה לפסיק בחלוניות צצות בעת הצגת חלוניות צצות TLD +* הוספת אפשרות לגוון-עור ברירת-מחדל לאמוג'ים +* הוספת keycodes למקשי alt ימני ושמאלי ולמקש ctrl +* הוספת תווית מפתח "timestamp" למפתח נגיש יותר של חתימת זמן +* הבנת תוויות מקשים מיוחדים לחלוניות צצות בפריסות פשוטות +* תיקונים ושיפורים שוליים diff --git a/fastlane/metadata/android/nl-NL/changelogs/3100.txt b/fastlane/metadata/android/nl-NL/changelogs/3100.txt new file mode 100644 index 000000000..5a93279a1 --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/3100.txt @@ -0,0 +1,10 @@ +* Stel optioneel namen van geïnstalleerde apps voor +* Veeg om van emoji-categorie te wisselen +* Sla op na het herstellen van de back-up +* Grotere werkbalkknop en -pictogram +* komma toegankelijk maken in pop-ups bij het tonen van TLD-pop-ups +* Instelling toevoegen voor standaard emoji-huidskleur +* Voeg keycodes toe voor linker en rechter alt- en ctrl-toetsen +* Voeg sleutellabel "Timestamp" toe voor een meer toegankelijke tijdstempelsleutel +* Begrijp speciale sleutellabels voor pop-ups in eenvoudige lay-outs +* Kleine fixes en verbeteringen diff --git a/fastlane/metadata/android/ru-RU/changelogs/2300.txt b/fastlane/metadata/android/ru-RU/changelogs/2300.txt index 31b2a9c92..753d53fbb 100644 --- a/fastlane/metadata/android/ru-RU/changelogs/2300.txt +++ b/fastlane/metadata/android/ru-RU/changelogs/2300.txt @@ -1,9 +1,9 @@ -* Настройка строки цифр, кодов панели инструментов, иконок, текста панели пробела, нижней строки для эмодзи и виджетов буфера обмена -* Отделение стиля иконок от стиля клавиатуры -* Выключение по умолчанию удаления избыточных всплывающих окон (и добавление небольшого исправления) -* Менее агрессивное добавление слов в личный словарь -* Нет вибрации в режиме Не беспокоить -* Улучшение производительности при копировании большого текста -* Исправление частично сломанных всплывающих окон с пунктуацией -* Исправление некоторых проблем, при которых текст дублируется -* Незначительные улучшения и исправления большего количества ошибок +* настройка строки цифр, кодов панели инструментов, иконок, текста панели пробела, нижней строки для эмодзи и виджетов буфера обмена +* отделение стиля иконок от стиля клавиатуры +* выключение по умолчанию удаления избыточных всплывающих окон (и добавление небольшого исправления) +* менее агрессивное добавление слов в личный словарь +* нет вибрации в режиме Не беспокоить +* улучшение производительности при копировании большого текста +* исправление частично сломанных всплывающих окон с пунктуацией +* исправление некоторых проблем, при которых текст дублируется +* незначительные улучшения и исправления большего количества ошибок diff --git a/fastlane/metadata/android/ru-RU/changelogs/2301.txt b/fastlane/metadata/android/ru-RU/changelogs/2301.txt index 31b2a9c92..a486efe6a 100644 --- a/fastlane/metadata/android/ru-RU/changelogs/2301.txt +++ b/fastlane/metadata/android/ru-RU/changelogs/2301.txt @@ -1,9 +1,9 @@ -* Настройка строки цифр, кодов панели инструментов, иконок, текста панели пробела, нижней строки для эмодзи и виджетов буфера обмена -* Отделение стиля иконок от стиля клавиатуры -* Выключение по умолчанию удаления избыточных всплывающих окон (и добавление небольшого исправления) -* Менее агрессивное добавление слов в личный словарь -* Нет вибрации в режиме Не беспокоить -* Улучшение производительности при копировании большого текста -* Исправление частично сломанных всплывающих окон с пунктуацией -* Исправление некоторых проблем, при которых текст дублируется -* Незначительные улучшения и исправления большего количества ошибок +* настройка строки цифр, кодов панели инструментов, иконок, текста панели пробела, нижней строки для эмодзи и виджетов буфера обмена +* итделение стиля иконок от стиля клавиатуры +* выключение по умолчанию удаления избыточных всплывающих окон (и добавление небольшого исправления) +* менее агрессивное добавление слов в личный словарь +* нет вибрации в режиме Не беспокоить +* улучшение производительности при копировании большого текста +* исправление частично сломанных всплывающих окон с пунктуацией +* исправление некоторых проблем, при которых текст дублируется +* незначительные улучшения и исправления большего количества ошибок diff --git a/fastlane/metadata/android/ru-RU/changelogs/3004.txt b/fastlane/metadata/android/ru-RU/changelogs/3004.txt new file mode 100644 index 000000000..e10bf5b39 --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/3004.txt @@ -0,0 +1,11 @@ +* добавлены раскладки: арабская Хиджаи, иврит 1452-2, хинди (фонетическая), даргинская (Урахи), байшахи, курдская +* обновлены некоторые раскладки +* реализована поддержка объединённых акцентов +* клавиша панели инструментов клавиатуры разделена +* добавлены всплывающие окна .com +* добавлена возможность выбора пользовательского шрифта +* добавлена настройка масштаба шрифта +* улучшено автоматическое переключение языков +* проведена переработка настроек +* добавлены настройки для более тонкой регулировки отступов клавиатуры, авто-пробела, автоисправления, цифрового ряда +* добавлены новые функции и исправления diff --git a/fastlane/metadata/android/ru-RU/changelogs/3005.txt b/fastlane/metadata/android/ru-RU/changelogs/3005.txt new file mode 100644 index 000000000..e10bf5b39 --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/3005.txt @@ -0,0 +1,11 @@ +* добавлены раскладки: арабская Хиджаи, иврит 1452-2, хинди (фонетическая), даргинская (Урахи), байшахи, курдская +* обновлены некоторые раскладки +* реализована поддержка объединённых акцентов +* клавиша панели инструментов клавиатуры разделена +* добавлены всплывающие окна .com +* добавлена возможность выбора пользовательского шрифта +* добавлена настройка масштаба шрифта +* улучшено автоматическое переключение языков +* проведена переработка настроек +* добавлены настройки для более тонкой регулировки отступов клавиатуры, авто-пробела, автоисправления, цифрового ряда +* добавлены новые функции и исправления diff --git a/fastlane/metadata/android/ru-RU/changelogs/3006.txt b/fastlane/metadata/android/ru-RU/changelogs/3006.txt new file mode 100644 index 000000000..e10bf5b39 --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/3006.txt @@ -0,0 +1,11 @@ +* добавлены раскладки: арабская Хиджаи, иврит 1452-2, хинди (фонетическая), даргинская (Урахи), байшахи, курдская +* обновлены некоторые раскладки +* реализована поддержка объединённых акцентов +* клавиша панели инструментов клавиатуры разделена +* добавлены всплывающие окна .com +* добавлена возможность выбора пользовательского шрифта +* добавлена настройка масштаба шрифта +* улучшено автоматическое переключение языков +* проведена переработка настроек +* добавлены настройки для более тонкой регулировки отступов клавиатуры, авто-пробела, автоисправления, цифрового ряда +* добавлены новые функции и исправления diff --git a/fastlane/metadata/android/ru-RU/changelogs/3007.txt b/fastlane/metadata/android/ru-RU/changelogs/3007.txt new file mode 100644 index 000000000..e10bf5b39 --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/3007.txt @@ -0,0 +1,11 @@ +* добавлены раскладки: арабская Хиджаи, иврит 1452-2, хинди (фонетическая), даргинская (Урахи), байшахи, курдская +* обновлены некоторые раскладки +* реализована поддержка объединённых акцентов +* клавиша панели инструментов клавиатуры разделена +* добавлены всплывающие окна .com +* добавлена возможность выбора пользовательского шрифта +* добавлена настройка масштаба шрифта +* улучшено автоматическое переключение языков +* проведена переработка настроек +* добавлены настройки для более тонкой регулировки отступов клавиатуры, авто-пробела, автоисправления, цифрового ряда +* добавлены новые функции и исправления diff --git a/fastlane/metadata/android/ru-RU/changelogs/3008.txt b/fastlane/metadata/android/ru-RU/changelogs/3008.txt new file mode 100644 index 000000000..e10bf5b39 --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/3008.txt @@ -0,0 +1,11 @@ +* добавлены раскладки: арабская Хиджаи, иврит 1452-2, хинди (фонетическая), даргинская (Урахи), байшахи, курдская +* обновлены некоторые раскладки +* реализована поддержка объединённых акцентов +* клавиша панели инструментов клавиатуры разделена +* добавлены всплывающие окна .com +* добавлена возможность выбора пользовательского шрифта +* добавлена настройка масштаба шрифта +* улучшено автоматическое переключение языков +* проведена переработка настроек +* добавлены настройки для более тонкой регулировки отступов клавиатуры, авто-пробела, автоисправления, цифрового ряда +* добавлены новые функции и исправления diff --git a/fastlane/metadata/android/ru-RU/changelogs/3100.txt b/fastlane/metadata/android/ru-RU/changelogs/3100.txt new file mode 100644 index 000000000..b85cca42e --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/3100.txt @@ -0,0 +1,10 @@ +* при необходимости предлагаются названия установленных приложений +* возможность переключения категорий эмодзи с помощью свайпа +* отображение уведомления после восстановления из резервной копии +* увеличены кнопка и значок панели инструментов +* запятая теперь доступна во всплывающих окнах при отображении TLD +* добавлена настройка для выбора стандартного оттенка кожи эмодзи +* добавлены коды клавиш для левого и правого Alt и Ctrl +* добавлена метка клавиши "timestamp" для более удобного доступа к клавише временной метки +* реализовано распознавание специальных меток клавиш для всплывающих окон в простых раскладках +* мелкие исправления и улучшения From e6a412750d9ca28db06fd4f6a0070cdc84418d1d Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sat, 31 May 2025 10:16:54 +0200 Subject: [PATCH 174/175] update version and changelogs --- app/build.gradle.kts | 4 +- .../main/assets/dictionaries_in_dict_repo.csv | 90 +++++++++---------- .../metadata/android/ca/changelogs/3101.txt | 9 ++ .../android/cs-CZ/changelogs/3101.txt | 9 ++ .../android/en-US/changelogs/3101.txt | 9 ++ .../metadata/android/et/changelogs/3101.txt | 9 ++ .../android/iw-IL/changelogs/3101.txt | 9 ++ .../android/nl-NL/changelogs/3101.txt | 9 ++ .../android/ru-RU/changelogs/3101.txt | 9 ++ 9 files changed, 110 insertions(+), 47 deletions(-) create mode 100644 fastlane/metadata/android/ca/changelogs/3101.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/3101.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/3101.txt create mode 100644 fastlane/metadata/android/et/changelogs/3101.txt create mode 100644 fastlane/metadata/android/iw-IL/changelogs/3101.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/3101.txt create mode 100644 fastlane/metadata/android/ru-RU/changelogs/3101.txt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b07e3c713..a2d08146f 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -12,8 +12,8 @@ android { applicationId = "helium314.keyboard" minSdk = 21 targetSdk = 35 - versionCode = 3100 - versionName = "3.1-beta1" + versionCode = 3101 + versionName = "3.1" ndk { abiFilters.clear() abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")) diff --git a/app/src/main/assets/dictionaries_in_dict_repo.csv b/app/src/main/assets/dictionaries_in_dict_repo.csv index 2cc1541fa..5ceab4f16 100644 --- a/app/src/main/assets/dictionaries_in_dict_repo.csv +++ b/app/src/main/assets/dictionaries_in_dict_repo.csv @@ -1,116 +1,116 @@ +main,af,exp main,ar, +main,ar,exp main,hy, main,as, +main,bn_BD,exp main,bn, +main,bn,exp main,eu, main,be, main,bg, +main,bg,exp main,ca, +main,ca,exp main,hr, +main,hr,exp main,cs, +main,cs,exp main,da, +main,da,exp main,nl, +main,nl,exp main,en_AU, +main,en_CA,exp main,en_GB, +main,en_GB,exp main,en_US, +main,en_US,exp +symbols,en,exp emoji,en, main,eo, +main,eo,exp +main,et,exp main,fi, +main,fi,exp emoji,fr, +symbols,fr,exp main,fr, +main,fr,exp main,gl, +main,gl,exp main,ka, +main,de_AT,exp main,de_CH, main,de, +main,de,exp main,gom, main,el, main,gu, main,he, main,iw, +main,he,exp main,hi, main,hi_ZZ, main,hu, +main,hu,exp +main,is,exp +main,id,exp main,it, +main,it,exp +main,kab,exp main,kn, main,ks, +main,kk,exp main,km, main,la, main,lv, +main,lv,exp main,lt, +main,lt,exp main,lb, main,mai, +addon,ml_ZZ,exp main,ml, main,mr, +main,ne,exp main,nb, +main,nb,exp main,or, +main,pms,exp main,pl, +main,pl,exp main,pt_BR, main,pt_PT, +main,pt_PT,exp main,pa, main,ro, +main,ro,exp emoji,ru, main,ru, +main,ru,exp main,sa, main,sat, main,sr_ZZ, main,sr, main,sd, +main,sk,exp main,sl, +main,sl,exp main,es, +main,es,exp main,zgh_ZZ, main,zgh, main,sv, +main,sv,exp main,ta, main,te, main,tok, main,tcy, main,tr, +main,tr,exp emoji,uk, main,uk, -main,ur, -main,af,exp -main,ar,exp -main,bn_BD,exp -main,bn,exp -main,bg,exp -main,ca,exp -main,hr,exp -main,cs,exp -main,da,exp -main,nl,exp -main,en_CA,exp -main,en_GB,exp -main,en_US,exp -symbols,en,exp -main,eo,exp -main,et,exp -main,fi,exp -symbols,fr,exp -main,fr,exp -main,gl,exp -main,de_AT,exp -main,de,exp -main,he,exp -main,hu,exp -main,is,exp -main,id,exp -main,it,exp -main,kab,exp -main,kk,exp -main,lv,exp -main,lt,exp -addon,ml_ZZ,exp -main,ne,exp -main,nb,exp -main,pms,exp -main,pl,exp -main,pt_PT,exp -main,ro,exp -main,ru,exp -main,sk,exp -main,sl,exp -main,es,exp -main,sv,exp -main,tr,exp main,uk,exp +main,ur, main,vi,exp diff --git a/fastlane/metadata/android/ca/changelogs/3101.txt b/fastlane/metadata/android/ca/changelogs/3101.txt new file mode 100644 index 000000000..2219eeda7 --- /dev/null +++ b/fastlane/metadata/android/ca/changelogs/3101.txt @@ -0,0 +1,9 @@ +* opcional suggerir noms de les apps instal·lades +* lliscar per canviar les categs. d'emojis +* mostrar toast en restaurar la còpia de seg. +* fer la coma accessible a les finestres emergents de TLD +* afegir config. per a tema predet. dels emojis +* afegir codis de tecla per a les tecles alt i ctrl esq. i dreta +* afegir etiqueta «timestamp» per fer eixa tecla accessible +* etiquetes de tecla especials per a finestres emergents en dissenys senzills +* etc diff --git a/fastlane/metadata/android/cs-CZ/changelogs/3101.txt b/fastlane/metadata/android/cs-CZ/changelogs/3101.txt new file mode 100644 index 000000000..11ff7b94a --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/3101.txt @@ -0,0 +1,9 @@ +* navrhování názvů nainstalovaných aplikací +* přepnutí kategorie emoji přejetím +* zobr. oznámení po obnovení zálohy +* zpřístupnění čárky ve vysk. klávesách při zobrazení vysk. kl. TLD +* přidáno nastavení vých. odstínu pleti emodži +* přidány kódy kláves pro levý a pravý Alt a Ctrl +* přidán popisek klávesy „časové razítko“ pro přístupnější klávesu čas. razítka +* oprava spec. popisků kláves pro vysk. kl. v jednoduchých rozl. +* drobné opravy a vylepšení diff --git a/fastlane/metadata/android/en-US/changelogs/3101.txt b/fastlane/metadata/android/en-US/changelogs/3101.txt new file mode 100644 index 000000000..758e259b0 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/3101.txt @@ -0,0 +1,9 @@ +* optionally suggest names of installed apps +* swipe to switch emoji categories +* display toast after restoring backup +* make comma accessible in popups when showing TLD popups +* add setting for default emoji skin tone +* add keycodes for left and right alt and ctrl keys +* add key label "timestamp" for more accessible timestamp key +* understand special key labels for popups in simple layouts +* minor fixes and improvements diff --git a/fastlane/metadata/android/et/changelogs/3101.txt b/fastlane/metadata/android/et/changelogs/3101.txt new file mode 100644 index 000000000..96559f7a7 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/3101.txt @@ -0,0 +1,9 @@ +* paigaldatud rakenduste nimede soovitamine (kui tahad) +* emojide kategooriate vahetamine viibates +* süsteemne teade peale varukoopiast taastamist +* koma on kasutatav ülataseme domeenide hüpikakendes +* emojide taust on nüüd seadistatav +* koodid vasaku ja parema alt ja ctrl klahvi jaoks +* ajatempli klahv on paremini märgitud +* eriklahvide sildid hüpikakende jaoks lihtsate paigutuste puhul +* pisiparandused ja täiendused diff --git a/fastlane/metadata/android/iw-IL/changelogs/3101.txt b/fastlane/metadata/android/iw-IL/changelogs/3101.txt new file mode 100644 index 000000000..4e17a2c15 --- /dev/null +++ b/fastlane/metadata/android/iw-IL/changelogs/3101.txt @@ -0,0 +1,9 @@ +* אפשרות להצעת שמות של יישומים מותקנים +* החלקה למעבר בין קטגוריות אמוג'י +* הצגת הודעה לאחר שחזור גיבוי +* לאפשר גישה לפסיק בחלוניות צצות בעת הצגת חלוניות צצות TLD +* הוספת אפשרות לגוון-עור ברירת-מחדל לאמוג'ים +* הוספת keycodes למקשי alt ימני ושמאלי ולמקש ctrl +* הוספת תווית מפתח "timestamp" למפתח נגיש יותר של חתימת זמן +* הבנת תוויות מקשים מיוחדים לחלוניות צצות בפריסות פשוטות +* תיקונים ושיפורים שוליים diff --git a/fastlane/metadata/android/nl-NL/changelogs/3101.txt b/fastlane/metadata/android/nl-NL/changelogs/3101.txt new file mode 100644 index 000000000..401cf5321 --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/3101.txt @@ -0,0 +1,9 @@ +* Stel optioneel namen van geïnstalleerde apps voor +* Veeg om van emoji-categorie te wisselen +* Sla op na het herstellen van de back-up +* komma toegankelijk maken in pop-ups bij het tonen van TLD-pop-ups +* Instelling toevoegen voor standaard emoji-huidskleur +* Voeg keycodes toe voor linker en rechter alt- en ctrl-toetsen +* Voeg sleutellabel "Timestamp" toe voor een meer toegankelijke tijdstempelsleutel +* Begrijp speciale sleutellabels voor pop-ups in eenvoudige lay-outs +* Kleine fixes en verbeteringen diff --git a/fastlane/metadata/android/ru-RU/changelogs/3101.txt b/fastlane/metadata/android/ru-RU/changelogs/3101.txt new file mode 100644 index 000000000..7a9313620 --- /dev/null +++ b/fastlane/metadata/android/ru-RU/changelogs/3101.txt @@ -0,0 +1,9 @@ +* при необходимости предлагаются названия установленных приложений +* возможность переключения категорий эмодзи с помощью свайпа +* отображение уведомления после восстановления из резервной копии +* запятая теперь доступна во всплывающих окнах при отображении TLD +* добавлена настройка для выбора стандартного оттенка кожи эмодзи +* добавлены коды клавиш для левого и правого Alt и Ctrl +* добавлена метка клавиши "timestamp" для более удобного доступа к клавише временной метки +* реализовано распознавание специальных меток клавиш для всплывающих окон в простых раскладках +* мелкие исправления и улучшения From b903e10b126ea72bf70cc537d989ef5f2cb6cf31 Mon Sep 17 00:00:00 2001 From: Eran Leshem <1707552+eranl@users.noreply.github.com> Date: Sat, 31 May 2025 11:44:46 +0300 Subject: [PATCH 175/175] Add some missing emoji variants (#1622) --- app/src/main/assets/emoji/PEOPLE_AND_BODY.txt | 14 +++---- app/src/main/assets/emoji/minApi.txt | 6 +-- .../tools/emoji/model/EmojiData.kt | 41 +++++++++---------- .../tools/emoji/model/EmojiSpec.kt | 6 +-- 4 files changed, 30 insertions(+), 37 deletions(-) diff --git a/app/src/main/assets/emoji/PEOPLE_AND_BODY.txt b/app/src/main/assets/emoji/PEOPLE_AND_BODY.txt index 734c23a8d..d7ceb5bb8 100644 --- a/app/src/main/assets/emoji/PEOPLE_AND_BODY.txt +++ b/app/src/main/assets/emoji/PEOPLE_AND_BODY.txt @@ -336,18 +336,18 @@ 🧘‍♀️ 🧘🏻‍♀️ 🧘🏼‍♀️ 🧘🏽‍♀️ 🧘🏾‍♀️ 🧘🏿‍♀️ 🛀 🛀🏻 🛀🏼 🛀🏽 🛀🏾 🛀🏿 🛌 🛌🏻 🛌🏼 🛌🏽 🛌🏾 🛌🏿 -🧑‍🤝‍🧑 +🧑‍🤝‍🧑 🧑🏻‍🤝‍🧑🏻 🧑🏻‍🤝‍🧑🏼 🧑🏻‍🤝‍🧑🏽 🧑🏻‍🤝‍🧑🏾 🧑🏻‍🤝‍🧑🏿 🧑🏼‍🤝‍🧑🏻 🧑🏼‍🤝‍🧑🏼 🧑🏼‍🤝‍🧑🏽 🧑🏼‍🤝‍🧑🏾 🧑🏼‍🤝‍🧑🏿 🧑🏽‍🤝‍🧑🏻 🧑🏽‍🤝‍🧑🏼 🧑🏽‍🤝‍🧑🏽 🧑🏽‍🤝‍🧑🏾 🧑🏽‍🤝‍🧑🏿 🧑🏾‍🤝‍🧑🏻 🧑🏾‍🤝‍🧑🏼 🧑🏾‍🤝‍🧑🏽 🧑🏾‍🤝‍🧑🏾 🧑🏾‍🤝‍🧑🏿 🧑🏿‍🤝‍🧑🏻 🧑🏿‍🤝‍🧑🏼 🧑🏿‍🤝‍🧑🏽 🧑🏿‍🤝‍🧑🏾 🧑🏿‍🤝‍🧑🏿 👭 👭🏻 👭🏼 👭🏽 👭🏾 👭🏿 👫 👫🏻 👫🏼 👫🏽 👫🏾 👫🏿 👬 👬🏻 👬🏼 👬🏽 👬🏾 👬🏿 💏 💏🏻 💏🏼 💏🏽 💏🏾 💏🏿 -👩‍❤️‍💋‍👨 -👨‍❤️‍💋‍👨 -👩‍❤️‍💋‍👩 +👩‍❤️‍💋‍👨 👩🏻‍❤️‍💋‍👨🏻 👩🏻‍❤️‍💋‍👨🏼 👩🏻‍❤️‍💋‍👨🏽 👩🏻‍❤️‍💋‍👨🏾 👩🏻‍❤️‍💋‍👨🏿 👩🏼‍❤️‍💋‍👨🏻 👩🏼‍❤️‍💋‍👨🏼 👩🏼‍❤️‍💋‍👨🏽 👩🏼‍❤️‍💋‍👨🏾 👩🏼‍❤️‍💋‍👨🏿 👩🏽‍❤️‍💋‍👨🏻 👩🏽‍❤️‍💋‍👨🏼 👩🏽‍❤️‍💋‍👨🏽 👩🏽‍❤️‍💋‍👨🏾 👩🏽‍❤️‍💋‍👨🏿 👩🏾‍❤️‍💋‍👨🏻 👩🏾‍❤️‍💋‍👨🏼 👩🏾‍❤️‍💋‍👨🏽 👩🏾‍❤️‍💋‍👨🏾 👩🏾‍❤️‍💋‍👨🏿 👩🏿‍❤️‍💋‍👨🏻 👩🏿‍❤️‍💋‍👨🏼 👩🏿‍❤️‍💋‍👨🏽 👩🏿‍❤️‍💋‍👨🏾 👩🏿‍❤️‍💋‍👨🏿 +👨‍❤️‍💋‍👨 👨🏻‍❤️‍💋‍👨🏻 👨🏻‍❤️‍💋‍👨🏼 👨🏻‍❤️‍💋‍👨🏽 👨🏻‍❤️‍💋‍👨🏾 👨🏻‍❤️‍💋‍👨🏿 👨🏼‍❤️‍💋‍👨🏻 👨🏼‍❤️‍💋‍👨🏼 👨🏼‍❤️‍💋‍👨🏽 👨🏼‍❤️‍💋‍👨🏾 👨🏼‍❤️‍💋‍👨🏿 👨🏽‍❤️‍💋‍👨🏻 👨🏽‍❤️‍💋‍👨🏼 👨🏽‍❤️‍💋‍👨🏽 👨🏽‍❤️‍💋‍👨🏾 👨🏽‍❤️‍💋‍👨🏿 👨🏾‍❤️‍💋‍👨🏻 👨🏾‍❤️‍💋‍👨🏼 👨🏾‍❤️‍💋‍👨🏽 👨🏾‍❤️‍💋‍👨🏾 👨🏾‍❤️‍💋‍👨🏿 👨🏿‍❤️‍💋‍👨🏻 👨🏿‍❤️‍💋‍👨🏼 👨🏿‍❤️‍💋‍👨🏽 👨🏿‍❤️‍💋‍👨🏾 👨🏿‍❤️‍💋‍👨🏿 +👩‍❤️‍💋‍👩 👩🏻‍❤️‍💋‍👩🏻 👩🏻‍❤️‍💋‍👩🏼 👩🏻‍❤️‍💋‍👩🏽 👩🏻‍❤️‍💋‍👩🏾 👩🏻‍❤️‍💋‍👩🏿 👩🏼‍❤️‍💋‍👩🏻 👩🏼‍❤️‍💋‍👩🏼 👩🏼‍❤️‍💋‍👩🏽 👩🏼‍❤️‍💋‍👩🏾 👩🏼‍❤️‍💋‍👩🏿 👩🏽‍❤️‍💋‍👩🏻 👩🏽‍❤️‍💋‍👩🏼 👩🏽‍❤️‍💋‍👩🏽 👩🏽‍❤️‍💋‍👩🏾 👩🏽‍❤️‍💋‍👩🏿 👩🏾‍❤️‍💋‍👩🏻 👩🏾‍❤️‍💋‍👩🏼 👩🏾‍❤️‍💋‍👩🏽 👩🏾‍❤️‍💋‍👩🏾 👩🏾‍❤️‍💋‍👩🏿 👩🏿‍❤️‍💋‍👩🏻 👩🏿‍❤️‍💋‍👩🏼 👩🏿‍❤️‍💋‍👩🏽 👩🏿‍❤️‍💋‍👩🏾 👩🏿‍❤️‍💋‍👩🏿 💑 💑🏻 💑🏼 💑🏽 💑🏾 💑🏿 -👩‍❤️‍👨 -👨‍❤️‍👨 -👩‍❤️‍👩 +👩‍❤️‍👨 👩🏻‍❤️‍👨🏻 👩🏻‍❤️‍👨🏼 👩🏻‍❤️‍👨🏽 👩🏻‍❤️‍👨🏾 👩🏻‍❤️‍👨🏿 👩🏼‍❤️‍👨🏻 👩🏼‍❤️‍👨🏼 👩🏼‍❤️‍👨🏽 👩🏼‍❤️‍👨🏾 👩🏼‍❤️‍👨🏿 👩🏽‍❤️‍👨🏻 👩🏽‍❤️‍👨🏼 👩🏽‍❤️‍👨🏽 👩🏽‍❤️‍👨🏾 👩🏽‍❤️‍👨🏿 👩🏾‍❤️‍👨🏻 👩🏾‍❤️‍👨🏼 👩🏾‍❤️‍👨🏽 👩🏾‍❤️‍👨🏾 👩🏾‍❤️‍👨🏿 👩🏿‍❤️‍👨🏻 👩🏿‍❤️‍👨🏼 👩🏿‍❤️‍👨🏽 👩🏿‍❤️‍👨🏾 👩🏿‍❤️‍👨🏿 +👨‍❤️‍👨 👨🏻‍❤️‍👨🏻 👨🏻‍❤️‍👨🏼 👨🏻‍❤️‍👨🏽 👨🏻‍❤️‍👨🏾 👨🏻‍❤️‍👨🏿 👨🏼‍❤️‍👨🏻 👨🏼‍❤️‍👨🏼 👨🏼‍❤️‍👨🏽 👨🏼‍❤️‍👨🏾 👨🏼‍❤️‍👨🏿 👨🏽‍❤️‍👨🏻 👨🏽‍❤️‍👨🏼 👨🏽‍❤️‍👨🏽 👨🏽‍❤️‍👨🏾 👨🏽‍❤️‍👨🏿 👨🏾‍❤️‍👨🏻 👨🏾‍❤️‍👨🏼 👨🏾‍❤️‍👨🏽 👨🏾‍❤️‍👨🏾 👨🏾‍❤️‍👨🏿 👨🏿‍❤️‍👨🏻 👨🏿‍❤️‍👨🏼 👨🏿‍❤️‍👨🏽 👨🏿‍❤️‍👨🏾 👨🏿‍❤️‍👨🏿 +👩‍❤️‍👩 👩🏻‍❤️‍👩🏻 👩🏻‍❤️‍👩🏼 👩🏻‍❤️‍👩🏽 👩🏻‍❤️‍👩🏾 👩🏻‍❤️‍👩🏿 👩🏼‍❤️‍👩🏻 👩🏼‍❤️‍👩🏼 👩🏼‍❤️‍👩🏽 👩🏼‍❤️‍👩🏾 👩🏼‍❤️‍👩🏿 👩🏽‍❤️‍👩🏻 👩🏽‍❤️‍👩🏼 👩🏽‍❤️‍👩🏽 👩🏽‍❤️‍👩🏾 👩🏽‍❤️‍👩🏿 👩🏾‍❤️‍👩🏻 👩🏾‍❤️‍👩🏼 👩🏾‍❤️‍👩🏽 👩🏾‍❤️‍👩🏾 👩🏾‍❤️‍👩🏿 👩🏿‍❤️‍👩🏻 👩🏿‍❤️‍👩🏼 👩🏿‍❤️‍👩🏽 👩🏿‍❤️‍👩🏾 👩🏿‍❤️‍👩🏿 👨‍👩‍👦 👨‍👩‍👧 👨‍👩‍👧‍👦 diff --git a/app/src/main/assets/emoji/minApi.txt b/app/src/main/assets/emoji/minApi.txt index c7fec2b86..842da2d6b 100644 --- a/app/src/main/assets/emoji/minApi.txt +++ b/app/src/main/assets/emoji/minApi.txt @@ -3,9 +3,9 @@ 25 🤝🏻 🤝🏼 🤝🏽 🤝🏾 🤝🏿 👱‍♀️ 👱🏻‍♀️ 👱🏼‍♀️ 👱🏽‍♀️ 👱🏾‍♀️ 👱🏿‍♀️ 👱‍♂️ 👱🏻‍♂️ 👱🏼‍♂️ 👱🏽‍♂️ 👱🏾‍♂️ 👱🏿‍♂️ 🙍‍♂️ 🙍🏻‍♂️ 🙍🏼‍♂️ 🙍🏽‍♂️ 🙍🏾‍♂️ 🙍🏿‍♂️ 🙍‍♀️ 🙍🏻‍♀️ 🙍🏼‍♀️ 🙍🏽‍♀️ 🙍🏾‍♀️ 🙍🏿‍♀️ 🙎‍♂️ 🙎🏻‍♂️ 🙎🏼‍♂️ 🙎🏽‍♂️ 🙎🏾‍♂️ 🙎🏿‍♂️ 🙎‍♀️ 🙎🏻‍♀️ 🙎🏼‍♀️ 🙎🏽‍♀️ 🙎🏾‍♀️ 🙎🏿‍♀️ 🙅‍♂️ 🙅🏻‍♂️ 🙅🏼‍♂️ 🙅🏽‍♂️ 🙅🏾‍♂️ 🙅🏿‍♂️ 🙅‍♀️ 🙅🏻‍♀️ 🙅🏼‍♀️ 🙅🏽‍♀️ 🙅🏾‍♀️ 🙅🏿‍♀️ 🙆‍♂️ 🙆🏻‍♂️ 🙆🏼‍♂️ 🙆🏽‍♂️ 🙆🏾‍♂️ 🙆🏿‍♂️ 🙆‍♀️ 🙆🏻‍♀️ 🙆🏼‍♀️ 🙆🏽‍♀️ 🙆🏾‍♀️ 🙆🏿‍♀️ 💁‍♂️ 💁🏻‍♂️ 💁🏼‍♂️ 💁🏽‍♂️ 💁🏾‍♂️ 💁🏿‍♂️ 💁‍♀️ 💁🏻‍♀️ 💁🏼‍♀️ 💁🏽‍♀️ 💁🏾‍♀️ 💁🏿‍♀️ 🙋‍♂️ 🙋🏻‍♂️ 🙋🏼‍♂️ 🙋🏽‍♂️ 🙋🏾‍♂️ 🙋🏿‍♂️ 🙋‍♀️ 🙋🏻‍♀️ 🙋🏼‍♀️ 🙋🏽‍♀️ 🙋🏾‍♀️ 🙋🏿‍♀️ 🙇‍♂️ 🙇🏻‍♂️ 🙇🏼‍♂️ 🙇🏽‍♂️ 🙇🏾‍♂️ 🙇🏿‍♂️ 🙇‍♀️ 🙇🏻‍♀️ 🙇🏼‍♀️ 🙇🏽‍♀️ 🙇🏾‍♀️ 🙇🏿‍♀️ 🤦‍♂️ 🤦🏻‍♂️ 🤦🏼‍♂️ 🤦🏽‍♂️ 🤦🏾‍♂️ 🤦🏿‍♂️ 🤦‍♀️ 🤦🏻‍♀️ 🤦🏼‍♀️ 🤦🏽‍♀️ 🤦🏾‍♀️ 🤦🏿‍♀️ 🤷‍♂️ 🤷🏻‍♂️ 🤷🏼‍♂️ 🤷🏽‍♂️ 🤷🏾‍♂️ 🤷🏿‍♂️ 🤷‍♀️ 🤷🏻‍♀️ 🤷🏼‍♀️ 🤷🏽‍♀️ 🤷🏾‍♀️ 🤷🏿‍♀️ 👨‍⚕️ 👨🏻‍⚕️ 👨🏼‍⚕️ 👨🏽‍⚕️ 👨🏾‍⚕️ 👨🏿‍⚕️ 👩‍⚕️ 👩🏻‍⚕️ 👩🏼‍⚕️ 👩🏽‍⚕️ 👩🏾‍⚕️ 👩🏿‍⚕️ 👨‍🎓 👨🏻‍🎓 👨🏼‍🎓 👨🏽‍🎓 👨🏾‍🎓 👨🏿‍🎓 👩‍🎓 👩🏻‍🎓 👩🏼‍🎓 👩🏽‍🎓 👩🏾‍🎓 👩🏿‍🎓 👨‍🏫 👨🏻‍🏫 👨🏼‍🏫 👨🏽‍🏫 👨🏾‍🏫 👨🏿‍🏫 👩‍🏫 👩🏻‍🏫 👩🏼‍🏫 👩🏽‍🏫 👩🏾‍🏫 👩🏿‍🏫 👨‍⚖️ 👨🏻‍⚖️ 👨🏼‍⚖️ 👨🏽‍⚖️ 👨🏾‍⚖️ 👨🏿‍⚖️ 👩‍⚖️ 👩🏻‍⚖️ 👩🏼‍⚖️ 👩🏽‍⚖️ 👩🏾‍⚖️ 👩🏿‍⚖️ 👨‍🌾 👨🏻‍🌾 👨🏼‍🌾 👨🏽‍🌾 👨🏾‍🌾 👨🏿‍🌾 👩‍🌾 👩🏻‍🌾 👩🏼‍🌾 👩🏽‍🌾 👩🏾‍🌾 👩🏿‍🌾 👨‍🍳 👨🏻‍🍳 👨🏼‍🍳 👨🏽‍🍳 👨🏾‍🍳 👨🏿‍🍳 👩‍🍳 👩🏻‍🍳 👩🏼‍🍳 👩🏽‍🍳 👩🏾‍🍳 👩🏿‍🍳 👨‍🔧 👨🏻‍🔧 👨🏼‍🔧 👨🏽‍🔧 👨🏾‍🔧 👨🏿‍🔧 👩‍🔧 👩🏻‍🔧 👩🏼‍🔧 👩🏽‍🔧 👩🏾‍🔧 👩🏿‍🔧 👨‍🏭 👨🏻‍🏭 👨🏼‍🏭 👨🏽‍🏭 👨🏾‍🏭 👨🏿‍🏭 👩‍🏭 👩🏻‍🏭 👩🏼‍🏭 👩🏽‍🏭 👩🏾‍🏭 👩🏿‍🏭 👨‍💼 👨🏻‍💼 👨🏼‍💼 👨🏽‍💼 👨🏾‍💼 👨🏿‍💼 👩‍💼 👩🏻‍💼 👩🏼‍💼 👩🏽‍💼 👩🏾‍💼 👩🏿‍💼 👨‍🔬 👨🏻‍🔬 👨🏼‍🔬 👨🏽‍🔬 👨🏾‍🔬 👨🏿‍🔬 👩‍🔬 👩🏻‍🔬 👩🏼‍🔬 👩🏽‍🔬 👩🏾‍🔬 👩🏿‍🔬 👨‍💻 👨🏻‍💻 👨🏼‍💻 👨🏽‍💻 👨🏾‍💻 👨🏿‍💻 👩‍💻 👩🏻‍💻 👩🏼‍💻 👩🏽‍💻 👩🏾‍💻 👩🏿‍💻 👨‍🎤 👨🏻‍🎤 👨🏼‍🎤 👨🏽‍🎤 👨🏾‍🎤 👨🏿‍🎤 👩‍🎤 👩🏻‍🎤 👩🏼‍🎤 👩🏽‍🎤 👩🏾‍🎤 👩🏿‍🎤 👨‍🎨 👨🏻‍🎨 👨🏼‍🎨 👨🏽‍🎨 👨🏾‍🎨 👨🏿‍🎨 👩‍🎨 👩🏻‍🎨 👩🏼‍🎨 👩🏽‍🎨 👩🏾‍🎨 👩🏿‍🎨 👨‍✈️ 👨🏻‍✈️ 👨🏼‍✈️ 👨🏽‍✈️ 👨🏾‍✈️ 👨🏿‍✈️ 👩‍✈️ 👩🏻‍✈️ 👩🏼‍✈️ 👩🏽‍✈️ 👩🏾‍✈️ 👩🏿‍✈️ 👨‍🚀 👨🏻‍🚀 👨🏼‍🚀 👨🏽‍🚀 👨🏾‍🚀 👨🏿‍🚀 👩‍🚀 👩🏻‍🚀 👩🏼‍🚀 👩🏽‍🚀 👩🏾‍🚀 👩🏿‍🚀 👨‍🚒 👨🏻‍🚒 👨🏼‍🚒 👨🏽‍🚒 👨🏾‍🚒 👨🏿‍🚒 👩‍🚒 👩🏻‍🚒 👩🏼‍🚒 👩🏽‍🚒 👩🏾‍🚒 👩🏿‍🚒 👮‍♂️ 👮🏻‍♂️ 👮🏼‍♂️ 👮🏽‍♂️ 👮🏾‍♂️ 👮🏿‍♂️ 👮‍♀️ 👮🏻‍♀️ 👮🏼‍♀️ 👮🏽‍♀️ 👮🏾‍♀️ 👮🏿‍♀️ 🕵️‍♂️ 🕵🏻‍♂️ 🕵🏼‍♂️ 🕵🏽‍♂️ 🕵🏾‍♂️ 🕵🏿‍♂️ 🕵️‍♀️ 🕵🏻‍♀️ 🕵🏼‍♀️ 🕵🏽‍♀️ 🕵🏾‍♀️ 🕵🏿‍♀️ 💂‍♂️ 💂🏻‍♂️ 💂🏼‍♂️ 💂🏽‍♂️ 💂🏾‍♂️ 💂🏿‍♂️ 💂‍♀️ 💂🏻‍♀️ 💂🏼‍♀️ 💂🏽‍♀️ 💂🏾‍♀️ 💂🏿‍♀️ 👷‍♂️ 👷🏻‍♂️ 👷🏼‍♂️ 👷🏽‍♂️ 👷🏾‍♂️ 👷🏿‍♂️ 👷‍♀️ 👷🏻‍♀️ 👷🏼‍♀️ 👷🏽‍♀️ 👷🏾‍♀️ 👷🏿‍♀️ 👳‍♂️ 👳🏻‍♂️ 👳🏼‍♂️ 👳🏽‍♂️ 👳🏾‍♂️ 👳🏿‍♂️ 👳‍♀️ 👳🏻‍♀️ 👳🏼‍♀️ 👳🏽‍♀️ 👳🏾‍♀️ 👳🏿‍♀️ 💆‍♂️ 💆🏻‍♂️ 💆🏼‍♂️ 💆🏽‍♂️ 💆🏾‍♂️ 💆🏿‍♂️ 💆‍♀️ 💆🏻‍♀️ 💆🏼‍♀️ 💆🏽‍♀️ 💆🏾‍♀️ 💆🏿‍♀️ 💇‍♂️ 💇🏻‍♂️ 💇🏼‍♂️ 💇🏽‍♂️ 💇🏾‍♂️ 💇🏿‍♂️ 💇‍♀️ 💇🏻‍♀️ 💇🏼‍♀️ 💇🏽‍♀️ 💇🏾‍♀️ 💇🏿‍♀️ 🚶‍♂️ 🚶🏻‍♂️ 🚶🏼‍♂️ 🚶🏽‍♂️ 🚶🏾‍♂️ 🚶🏿‍♂️ 🚶‍♀️ 🚶🏻‍♀️ 🚶🏼‍♀️ 🚶🏽‍♀️ 🚶🏾‍♀️ 🚶🏿‍♀️ 🏃‍♂️ 🏃🏻‍♂️ 🏃🏼‍♂️ 🏃🏽‍♂️ 🏃🏾‍♂️ 🏃🏿‍♂️ 🏃‍♀️ 🏃🏻‍♀️ 🏃🏼‍♀️ 🏃🏽‍♀️ 🏃🏾‍♀️ 🏃🏿‍♀️ 👯‍♂️ 👯‍♀️ 🏌️‍♂️ 🏌️‍♀️ 🏄‍♂️ 🏄🏻‍♂️ 🏄🏼‍♂️ 🏄🏽‍♂️ 🏄🏾‍♂️ 🏄🏿‍♂️ 🏄‍♀️ 🏄🏻‍♀️ 🏄🏼‍♀️ 🏄🏽‍♀️ 🏄🏾‍♀️ 🏄🏿‍♀️ 🚣‍♂️ 🚣🏻‍♂️ 🚣🏼‍♂️ 🚣🏽‍♂️ 🚣🏾‍♂️ 🚣🏿‍♂️ 🚣‍♀️ 🚣🏻‍♀️ 🚣🏼‍♀️ 🚣🏽‍♀️ 🚣🏾‍♀️ 🚣🏿‍♀️ 🏊‍♂️ 🏊🏻‍♂️ 🏊🏼‍♂️ 🏊🏽‍♂️ 🏊🏾‍♂️ 🏊🏿‍♂️ 🏊‍♀️ 🏊🏻‍♀️ 🏊🏼‍♀️ 🏊🏽‍♀️ 🏊🏾‍♀️ 🏊🏿‍♀️ ⛹️‍♂️ ⛹🏻‍♂️ ⛹🏼‍♂️ ⛹🏽‍♂️ ⛹🏾‍♂️ ⛹🏿‍♂️ ⛹️‍♀️ ⛹🏻‍♀️ ⛹🏼‍♀️ ⛹🏽‍♀️ ⛹🏾‍♀️ ⛹🏿‍♀️ 🏋️‍♂️ 🏋🏻‍♂️ 🏋🏼‍♂️ 🏋🏽‍♂️ 🏋🏾‍♂️ 🏋🏿‍♂️ 🏋️‍♀️ 🏋🏻‍♀️ 🏋🏼‍♀️ 🏋🏽‍♀️ 🏋🏾‍♀️ 🏋🏿‍♀️ 🚴‍♂️ 🚴🏻‍♂️ 🚴🏼‍♂️ 🚴🏽‍♂️ 🚴🏾‍♂️ 🚴🏿‍♂️ 🚴‍♀️ 🚴🏻‍♀️ 🚴🏼‍♀️ 🚴🏽‍♀️ 🚴🏾‍♀️ 🚴🏿‍♀️ 🚵‍♂️ 🚵🏻‍♂️ 🚵🏼‍♂️ 🚵🏽‍♂️ 🚵🏾‍♂️ 🚵🏿‍♂️ 🚵‍♀️ 🚵🏻‍♀️ 🚵🏼‍♀️ 🚵🏽‍♀️ 🚵🏾‍♀️ 🚵🏿‍♀️ 🤸‍♂️ 🤸🏻‍♂️ 🤸🏼‍♂️ 🤸🏽‍♂️ 🤸🏾‍♂️ 🤸🏿‍♂️ 🤸‍♀️ 🤸🏻‍♀️ 🤸🏼‍♀️ 🤸🏽‍♀️ 🤸🏾‍♀️ 🤸🏿‍♀️ 🤼‍♂️ 🤼‍♀️ 🤽‍♂️ 🤽🏻‍♂️ 🤽🏼‍♂️ 🤽🏽‍♂️ 🤽🏾‍♂️ 🤽🏿‍♂️ 🤽‍♀️ 🤽🏻‍♀️ 🤽🏼‍♀️ 🤽🏽‍♀️ 🤽🏾‍♀️ 🤽🏿‍♀️ 🤾‍♂️ 🤾🏻‍♂️ 🤾🏼‍♂️ 🤾🏽‍♂️ 🤾🏾‍♂️ 🤾🏿‍♂️ 🤾‍♀️ 🤾🏻‍♀️ 🤾🏼‍♀️ 🤾🏽‍♀️ 🤾🏾‍♀️ 🤾🏿‍♀️ 🤹‍♂️ 🤹🏻‍♂️ 🤹🏼‍♂️ 🤹🏽‍♂️ 🤹🏾‍♂️ 🤹🏿‍♂️ 🤹‍♀️ 🤹🏻‍♀️ 🤹🏼‍♀️ 🤹🏽‍♀️ 🤹🏾‍♀️ 🤹🏿‍♀️ 👨‍👩‍👦 👨‍👦 👨‍👦‍👦 👨‍👧 👨‍👧‍👦 👨‍👧‍👧 👩‍👦 👩‍👦‍👦 👩‍👧 👩‍👧‍👦 👩‍👧‍👧 ♀️ ♂️ ⚕️ 🏳️‍🌈 26 🤩 🤪 🤭 🤫 🤨 🤮 🤯 🧐 🤬 🧡 🤟 🤟🏻 🤟🏼 🤟🏽 🤟🏾 🤟🏿 🤲 🤲🏻 🤲🏼 🤲🏽 🤲🏾 🤲🏿 🧠 🧒 🧒🏻 🧒🏼 🧒🏽 🧒🏾 🧒🏿 🧑 🧑🏻 🧑🏼 🧑🏽 🧑🏾 🧑🏿 🧔 🧔🏻 🧔🏼 🧔🏽 🧔🏾 🧔🏿 🧓 🧓🏻 🧓🏼 🧓🏽 🧓🏾 🧓🏿 🧕 🧕🏻 🧕🏼 🧕🏽 🧕🏾 🧕🏿 🤱 🤱🏻 🤱🏼 🤱🏽 🤱🏾 🤱🏿 🧙 🧙🏻 🧙🏼 🧙🏽 🧙🏾 🧙🏿 🧙‍♂️ 🧙🏻‍♂️ 🧙🏼‍♂️ 🧙🏽‍♂️ 🧙🏾‍♂️ 🧙🏿‍♂️ 🧙‍♀️ 🧙🏻‍♀️ 🧙🏼‍♀️ 🧙🏽‍♀️ 🧙🏾‍♀️ 🧙🏿‍♀️ 🧚 🧚🏻 🧚🏼 🧚🏽 🧚🏾 🧚🏿 🧚‍♂️ 🧚🏻‍♂️ 🧚🏼‍♂️ 🧚🏽‍♂️ 🧚🏾‍♂️ 🧚🏿‍♂️ 🧚‍♀️ 🧚🏻‍♀️ 🧚🏼‍♀️ 🧚🏽‍♀️ 🧚🏾‍♀️ 🧚🏿‍♀️ 🧛 🧛🏻 🧛🏼 🧛🏽 🧛🏾 🧛🏿 🧛‍♂️ 🧛🏻‍♂️ 🧛🏼‍♂️ 🧛🏽‍♂️ 🧛🏾‍♂️ 🧛🏿‍♂️ 🧛‍♀️ 🧛🏻‍♀️ 🧛🏼‍♀️ 🧛🏽‍♀️ 🧛🏾‍♀️ 🧛🏿‍♀️ 🧜 🧜🏻 🧜🏼 🧜🏽 🧜🏾 🧜🏿 🧜‍♂️ 🧜🏻‍♂️ 🧜🏼‍♂️ 🧜🏽‍♂️ 🧜🏾‍♂️ 🧜🏿‍♂️ 🧜‍♀️ 🧜🏻‍♀️ 🧜🏼‍♀️ 🧜🏽‍♀️ 🧜🏾‍♀️ 🧜🏿‍♀️ 🧝 🧝🏻 🧝🏼 🧝🏽 🧝🏾 🧝🏿 🧝‍♂️ 🧝🏻‍♂️ 🧝🏼‍♂️ 🧝🏽‍♂️ 🧝🏾‍♂️ 🧝🏿‍♂️ 🧝‍♀️ 🧝🏻‍♀️ 🧝🏼‍♀️ 🧝🏽‍♀️ 🧝🏾‍♀️ 🧝🏿‍♀️ 🧞 🧞‍♂️ 🧞‍♀️ 🧟 🧟‍♂️ 🧟‍♀️ 🕴🏻 🕴🏼 🕴🏽 🕴🏾 🕴🏿 🧖 🧖🏻 🧖🏼 🧖🏽 🧖🏾 🧖🏿 🧖‍♂️ 🧖🏻‍♂️ 🧖🏼‍♂️ 🧖🏽‍♂️ 🧖🏾‍♂️ 🧖🏿‍♂️ 🧖‍♀️ 🧖🏻‍♀️ 🧖🏼‍♀️ 🧖🏽‍♀️ 🧖🏾‍♀️ 🧖🏿‍♀️ 🧗 🧗🏻 🧗🏼 🧗🏽 🧗🏾 🧗🏿 🧗‍♂️ 🧗🏻‍♂️ 🧗🏼‍♂️ 🧗🏽‍♂️ 🧗🏾‍♂️ 🧗🏿‍♂️ 🧗‍♀️ 🧗🏻‍♀️ 🧗🏼‍♀️ 🧗🏽‍♀️ 🧗🏾‍♀️ 🧗🏿‍♀️ 🏇🏻 🏇🏼 🏇🏽 🏇🏾 🏇🏿 🏂🏻 🏂🏼 🏂🏽 🏂🏾 🏂🏿 🏌🏻 🏌🏼 🏌🏽 🏌🏾 🏌🏿 🏌🏻‍♂️ 🏌🏼‍♂️ 🏌🏽‍♂️ 🏌🏾‍♂️ 🏌🏿‍♂️ 🏌🏻‍♀️ 🏌🏼‍♀️ 🏌🏽‍♀️ 🏌🏾‍♀️ 🏌🏿‍♀️ 🧘 🧘🏻 🧘🏼 🧘🏽 🧘🏾 🧘🏿 🧘‍♂️ 🧘🏻‍♂️ 🧘🏼‍♂️ 🧘🏽‍♂️ 🧘🏾‍♂️ 🧘🏿‍♂️ 🧘‍♀️ 🧘🏻‍♀️ 🧘🏼‍♀️ 🧘🏽‍♀️ 🧘🏾‍♀️ 🧘🏿‍♀️ 🛌🏻 🛌🏼 🛌🏽 🛌🏾 🛌🏿 👩‍❤️‍💋‍👨 👩‍❤️‍👨 🦓 🦒 🦔 🦕 🦖 🦗 🥥 🥦 🥨 🥩 🥪 🥣 🥫 🥟 🥠 🥡 🥧 🥤 🥢 🛸 🛷 🥌 🧣 🧤 🧥 🧦 🧢 🇺🇳 🏴󠁧󠁢󠁥󠁮󠁧󠁿 🏴󠁧󠁢󠁳󠁣󠁴󠁿 🏴󠁧󠁢󠁷󠁬󠁳󠁿 28 🥰 🥵 🥶 🥴 🥳 🥺 🦵 🦵🏻 🦵🏼 🦵🏽 🦵🏾 🦵🏿 🦶 🦶🏻 🦶🏼 🦶🏽 🦶🏾 🦶🏿 🦷 🦴 👨‍🦰 👨🏻‍🦰 👨🏼‍🦰 👨🏽‍🦰 👨🏾‍🦰 👨🏿‍🦰 👨‍🦱 👨🏻‍🦱 👨🏼‍🦱 👨🏽‍🦱 👨🏾‍🦱 👨🏿‍🦱 👨‍🦳 👨🏻‍🦳 👨🏼‍🦳 👨🏽‍🦳 👨🏾‍🦳 👨🏿‍🦳 👨‍🦲 👨🏻‍🦲 👨🏼‍🦲 👨🏽‍🦲 👨🏾‍🦲 👨🏿‍🦲 👩‍🦰 👩🏻‍🦰 👩🏼‍🦰 👩🏽‍🦰 👩🏾‍🦰 👩🏿‍🦰 👩‍🦱 👩🏻‍🦱 👩🏼‍🦱 👩🏽‍🦱 👩🏾‍🦱 👩🏿‍🦱 👩‍🦳 👩🏻‍🦳 👩🏼‍🦳 👩🏽‍🦳 👩🏾‍🦳 👩🏿‍🦳 👩‍🦲 👩🏻‍🦲 👩🏼‍🦲 👩🏽‍🦲 👩🏾‍🦲 👩🏿‍🦲 🦸 🦸🏻 🦸🏼 🦸🏽 🦸🏾 🦸🏿 🦸‍♂️ 🦸🏻‍♂️ 🦸🏼‍♂️ 🦸🏽‍♂️ 🦸🏾‍♂️ 🦸🏿‍♂️ 🦸‍♀️ 🦸🏻‍♀️ 🦸🏼‍♀️ 🦸🏽‍♀️ 🦸🏾‍♀️ 🦸🏿‍♀️ 🦹 🦹🏻 🦹🏼 🦹🏽 🦹🏾 🦹🏿 🦹‍♂️ 🦹🏻‍♂️ 🦹🏼‍♂️ 🦹🏽‍♂️ 🦹🏾‍♂️ 🦹🏿‍♂️ 🦹‍♀️ 🦹🏻‍♀️ 🦹🏼‍♀️ 🦹🏽‍♀️ 🦹🏾‍♀️ 🦹🏿‍♀️ 🦝 🦙 🦛 🦘 🦡 🦢 🦚 🦜 🦞 🦟 🦠 🥭 🥬 🥯 🧂 🥮 🧁 🧭 🧱 🛹 🧳 🧨 🧧 🥎 🥏 🥍 🧩 🧸 ♟️ 🧵 🧶 🥽 🥼 🥾 🥿 🧮 🧾 🧰 🧲 🧪 🧫 🧬 🧴 🧷 🧹 🧺 🧻 🧼 🧽 🧯 🧿 ♾️ 🏴‍☠️ -29 🥱 🤎 🤍 🤏 🤏🏻 🤏🏼 🤏🏽 🤏🏾 🤏🏿 🦾 🦿 🦻 🦻🏻 🦻🏼 🦻🏽 🦻🏾 🦻🏿 🧏 🧏🏻 🧏🏼 🧏🏽 🧏🏾 🧏🏿 🧏‍♂️ 🧏🏻‍♂️ 🧏🏼‍♂️ 🧏🏽‍♂️ 🧏🏾‍♂️ 🧏🏿‍♂️ 🧏‍♀️ 🧏🏻‍♀️ 🧏🏼‍♀️ 🧏🏽‍♀️ 🧏🏾‍♀️ 🧏🏿‍♀️ 🧍 🧍🏻 🧍🏼 🧍🏽 🧍🏾 🧍🏿 🧍‍♂️ 🧍🏻‍♂️ 🧍🏼‍♂️ 🧍🏽‍♂️ 🧍🏾‍♂️ 🧍🏿‍♂️ 🧍‍♀️ 🧍🏻‍♀️ 🧍🏼‍♀️ 🧍🏽‍♀️ 🧍🏾‍♀️ 🧍🏿‍♀️ 🧎 🧎🏻 🧎🏼 🧎🏽 🧎🏾 🧎🏿 🧎‍♂️ 🧎🏻‍♂️ 🧎🏼‍♂️ 🧎🏽‍♂️ 🧎🏾‍♂️ 🧎🏿‍♂️ 🧎‍♀️ 🧎🏻‍♀️ 🧎🏼‍♀️ 🧎🏽‍♀️ 🧎🏾‍♀️ 🧎🏿‍♀️ 👨‍🦯 👨🏻‍🦯 👨🏼‍🦯 👨🏽‍🦯 👨🏾‍🦯 👨🏿‍🦯 👩‍🦯 👩🏻‍🦯 👩🏼‍🦯 👩🏽‍🦯 👩🏾‍🦯 👩🏿‍🦯 👨‍🦼 👨🏻‍🦼 👨🏼‍🦼 👨🏽‍🦼 👨🏾‍🦼 👨🏿‍🦼 👩‍🦼 👩🏻‍🦼 👩🏼‍🦼 👩🏽‍🦼 👩🏾‍🦼 👩🏿‍🦼 👨‍🦽 👨🏻‍🦽 👨🏼‍🦽 👨🏽‍🦽 👨🏾‍🦽 👨🏿‍🦽 👩‍🦽 👩🏻‍🦽 👩🏼‍🦽 👩🏽‍🦽 👩🏾‍🦽 👩🏿‍🦽 🧑‍🤝‍🧑 👭🏻 👭🏼 👭🏽 👭🏾 👭🏿 👫🏻 👫🏼 👫🏽 👫🏾 👫🏿 👬🏻 👬🏼 👬🏽 👬🏾 👬🏿 🦧 🦮 🐕‍🦺 🦥 🦦 🦨 🦩 🦪 🧄 🧅 🧇 🧆 🧈 🧃 🧉 🧊 🛕 🦽 🦼 🛺 🪂 🪐 🤿 🪀 🪁 🦺 🥻 🩱 🩲 🩳 🩰 🪕 🪔 🪓 🦯 🩸 🩹 🩺 🪑 🪒 🟠 🟡 🟢 🟣 🟤 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🇧🇱 🇧🇶 🇲🇶 🇷🇪 🇹🇫 🇽🇰 -30 🥲 🥸 🤌 🤌🏻 🤌🏼 🤌🏽 🤌🏾 🤌🏿 🫀 🫁 🧑‍🦰 🧑🏻‍🦰 🧑🏼‍🦰 🧑🏽‍🦰 🧑🏾‍🦰 🧑🏿‍🦰 🧑‍🦱 🧑🏻‍🦱 🧑🏼‍🦱 🧑🏽‍🦱 🧑🏾‍🦱 🧑🏿‍🦱 🧑‍🦳 🧑🏻‍🦳 🧑🏼‍🦳 🧑🏽‍🦳 🧑🏾‍🦳 🧑🏿‍🦳 🧑‍🦲 🧑🏻‍🦲 🧑🏼‍🦲 🧑🏽‍🦲 🧑🏾‍🦲 🧑🏿‍🦲 🧑‍⚕️ 🧑🏻‍⚕️ 🧑🏼‍⚕️ 🧑🏽‍⚕️ 🧑🏾‍⚕️ 🧑🏿‍⚕️ 🧑‍🎓 🧑🏻‍🎓 🧑🏼‍🎓 🧑🏽‍🎓 🧑🏾‍🎓 🧑🏿‍🎓 🧑‍🏫 🧑🏻‍🏫 🧑🏼‍🏫 🧑🏽‍🏫 🧑🏾‍🏫 🧑🏿‍🏫 🧑‍⚖️ 🧑🏻‍⚖️ 🧑🏼‍⚖️ 🧑🏽‍⚖️ 🧑🏾‍⚖️ 🧑🏿‍⚖️ 🧑‍🌾 🧑🏻‍🌾 🧑🏼‍🌾 🧑🏽‍🌾 🧑🏾‍🌾 🧑🏿‍🌾 🧑‍🍳 🧑🏻‍🍳 🧑🏼‍🍳 🧑🏽‍🍳 🧑🏾‍🍳 🧑🏿‍🍳 🧑‍🔧 🧑🏻‍🔧 🧑🏼‍🔧 🧑🏽‍🔧 🧑🏾‍🔧 🧑🏿‍🔧 🧑‍🏭 🧑🏻‍🏭 🧑🏼‍🏭 🧑🏽‍🏭 🧑🏾‍🏭 🧑🏿‍🏭 🧑‍💼 🧑🏻‍💼 🧑🏼‍💼 🧑🏽‍💼 🧑🏾‍💼 🧑🏿‍💼 🧑‍🔬 🧑🏻‍🔬 🧑🏼‍🔬 🧑🏽‍🔬 🧑🏾‍🔬 🧑🏿‍🔬 🧑‍💻 🧑🏻‍💻 🧑🏼‍💻 🧑🏽‍💻 🧑🏾‍💻 🧑🏿‍💻 🧑‍🎤 🧑🏻‍🎤 🧑🏼‍🎤 🧑🏽‍🎤 🧑🏾‍🎤 🧑🏿‍🎤 🧑‍🎨 🧑🏻‍🎨 🧑🏼‍🎨 🧑🏽‍🎨 🧑🏾‍🎨 🧑🏿‍🎨 🧑‍✈️ 🧑🏻‍✈️ 🧑🏼‍✈️ 🧑🏽‍✈️ 🧑🏾‍✈️ 🧑🏿‍✈️ 🧑‍🚀 🧑🏻‍🚀 🧑🏼‍🚀 🧑🏽‍🚀 🧑🏾‍🚀 🧑🏿‍🚀 🧑‍🚒 🧑🏻‍🚒 🧑🏼‍🚒 🧑🏽‍🚒 🧑🏾‍🚒 🧑🏿‍🚒 🥷 🥷🏻 🥷🏼 🥷🏽 🥷🏾 🥷🏿 🤵‍♂️ 🤵🏻‍♂️ 🤵🏼‍♂️ 🤵🏽‍♂️ 🤵🏾‍♂️ 🤵🏿‍♂️ 🤵‍♀️ 🤵🏻‍♀️ 🤵🏼‍♀️ 🤵🏽‍♀️ 🤵🏾‍♀️ 🤵🏿‍♀️ 👰‍♂️ 👰🏻‍♂️ 👰🏼‍♂️ 👰🏽‍♂️ 👰🏾‍♂️ 👰🏿‍♂️ 👰‍♀️ 👰🏻‍♀️ 👰🏼‍♀️ 👰🏽‍♀️ 👰🏾‍♀️ 👰🏿‍♀️ 👩‍🍼 👩🏻‍🍼 👩🏼‍🍼 👩🏽‍🍼 👩🏾‍🍼 👩🏿‍🍼 👨‍🍼 👨🏻‍🍼 👨🏼‍🍼 👨🏽‍🍼 👨🏾‍🍼 👨🏿‍🍼 🧑‍🍼 🧑🏻‍🍼 🧑🏼‍🍼 🧑🏽‍🍼 🧑🏾‍🍼 🧑🏿‍🍼 🧑‍🎄 🧑🏻‍🎄 🧑🏼‍🎄 🧑🏽‍🎄 🧑🏾‍🎄 🧑🏿‍🎄 🧑‍🦯 🧑🏻‍🦯 🧑🏼‍🦯 🧑🏽‍🦯 🧑🏾‍🦯 🧑🏿‍🦯 🧑‍🦼 🧑🏻‍🦼 🧑🏼‍🦼 🧑🏽‍🦼 🧑🏾‍🦼 🧑🏿‍🦼 🧑‍🦽 🧑🏻‍🦽 🧑🏼‍🦽 🧑🏽‍🦽 🧑🏾‍🦽 🧑🏿‍🦽 🫂 🐈‍⬛ 🦬 🦣 🦫 🐻‍❄️ 🦤 🪶 🦭 🪲 🪳 🪰 🪱 🪴 🫐 🫒 🫑 🫓 🫔 🫕 🫖 🧋 🪨 🪵 🛖 🛻 🛼 🪄 🪅 🪆 🪡 🪢 🩴 🪖 🪗 🪘 🪙 🪃 🪚 🪛 🪝 🪜 🛗 🪞 🪟 🪠 🪤 🪣 🪥 🪦 🪧 ⚧️ 🏳️‍⚧️ 🇩🇬 🇪🇦 🇪🇭 🇫🇰 🇬🇫 🇬🇵 🇬🇸 🇲🇫 🇳🇨 🇵🇲 🇼🇫 🇾🇹 -31 😶‍🌫️ 😮‍💨 😵‍💫 ❤️‍🔥 ❤️‍🩹 🧔‍♂️ 🧔🏻‍♂️ 🧔🏼‍♂️ 🧔🏽‍♂️ 🧔🏾‍♂️ 🧔🏿‍♂️ 🧔‍♀️ 🧔🏻‍♀️ 🧔🏼‍♀️ 🧔🏽‍♀️ 🧔🏾‍♀️ 🧔🏿‍♀️ 💏🏻 💏🏼 💏🏽 💏🏾 💏🏿 💑🏻 💑🏼 💑🏽 💑🏾 💑🏿 +29 🥱 🤎 🤍 🤏 🤏🏻 🤏🏼 🤏🏽 🤏🏾 🤏🏿 🦾 🦿 🦻 🦻🏻 🦻🏼 🦻🏽 🦻🏾 🦻🏿 🧏 🧏🏻 🧏🏼 🧏🏽 🧏🏾 🧏🏿 🧏‍♂️ 🧏🏻‍♂️ 🧏🏼‍♂️ 🧏🏽‍♂️ 🧏🏾‍♂️ 🧏🏿‍♂️ 🧏‍♀️ 🧏🏻‍♀️ 🧏🏼‍♀️ 🧏🏽‍♀️ 🧏🏾‍♀️ 🧏🏿‍♀️ 🧍 🧍🏻 🧍🏼 🧍🏽 🧍🏾 🧍🏿 🧍‍♂️ 🧍🏻‍♂️ 🧍🏼‍♂️ 🧍🏽‍♂️ 🧍🏾‍♂️ 🧍🏿‍♂️ 🧍‍♀️ 🧍🏻‍♀️ 🧍🏼‍♀️ 🧍🏽‍♀️ 🧍🏾‍♀️ 🧍🏿‍♀️ 🧎 🧎🏻 🧎🏼 🧎🏽 🧎🏾 🧎🏿 🧎‍♂️ 🧎🏻‍♂️ 🧎🏼‍♂️ 🧎🏽‍♂️ 🧎🏾‍♂️ 🧎🏿‍♂️ 🧎‍♀️ 🧎🏻‍♀️ 🧎🏼‍♀️ 🧎🏽‍♀️ 🧎🏾‍♀️ 🧎🏿‍♀️ 👨‍🦯 👨🏻‍🦯 👨🏼‍🦯 👨🏽‍🦯 👨🏾‍🦯 👨🏿‍🦯 👩‍🦯 👩🏻‍🦯 👩🏼‍🦯 👩🏽‍🦯 👩🏾‍🦯 👩🏿‍🦯 👨‍🦼 👨🏻‍🦼 👨🏼‍🦼 👨🏽‍🦼 👨🏾‍🦼 👨🏿‍🦼 👩‍🦼 👩🏻‍🦼 👩🏼‍🦼 👩🏽‍🦼 👩🏾‍🦼 👩🏿‍🦼 👨‍🦽 👨🏻‍🦽 👨🏼‍🦽 👨🏽‍🦽 👨🏾‍🦽 👨🏿‍🦽 👩‍🦽 👩🏻‍🦽 👩🏼‍🦽 👩🏽‍🦽 👩🏾‍🦽 👩🏿‍🦽 🧑‍🤝‍🧑 🧑🏻‍🤝‍🧑🏻 🧑🏼‍🤝‍🧑🏻 🧑🏼‍🤝‍🧑🏼 🧑🏽‍🤝‍🧑🏻 🧑🏽‍🤝‍🧑🏼 🧑🏽‍🤝‍🧑🏽 🧑🏾‍🤝‍🧑🏻 🧑🏾‍🤝‍🧑🏼 🧑🏾‍🤝‍🧑🏽 🧑🏾‍🤝‍🧑🏾 🧑🏿‍🤝‍🧑🏻 🧑🏿‍🤝‍🧑🏼 🧑🏿‍🤝‍🧑🏽 🧑🏿‍🤝‍🧑🏾 🧑🏿‍🤝‍🧑🏿 👭🏻 👭🏼 👭🏽 👭🏾 👭🏿 👫🏻 👫🏼 👫🏽 👫🏾 👫🏿 👬🏻 👬🏼 👬🏽 👬🏾 👬🏿 🦧 🦮 🐕‍🦺 🦥 🦦 🦨 🦩 🦪 🧄 🧅 🧇 🧆 🧈 🧃 🧉 🧊 🛕 🦽 🦼 🛺 🪂 🪐 🤿 🪀 🪁 🦺 🥻 🩱 🩲 🩳 🩰 🪕 🪔 🪓 🦯 🩸 🩹 🩺 🪑 🪒 🟠 🟡 🟢 🟣 🟤 🟥 🟧 🟨 🟩 🟦 🟪 🟫 🇧🇱 🇧🇶 🇲🇶 🇷🇪 🇹🇫 🇽🇰 +30 🥲 🥸 🤌 🤌🏻 🤌🏼 🤌🏽 🤌🏾 🤌🏿 🫀 🫁 🧑‍🦰 🧑🏻‍🦰 🧑🏼‍🦰 🧑🏽‍🦰 🧑🏾‍🦰 🧑🏿‍🦰 🧑‍🦱 🧑🏻‍🦱 🧑🏼‍🦱 🧑🏽‍🦱 🧑🏾‍🦱 🧑🏿‍🦱 🧑‍🦳 🧑🏻‍🦳 🧑🏼‍🦳 🧑🏽‍🦳 🧑🏾‍🦳 🧑🏿‍🦳 🧑‍🦲 🧑🏻‍🦲 🧑🏼‍🦲 🧑🏽‍🦲 🧑🏾‍🦲 🧑🏿‍🦲 🧑‍⚕️ 🧑🏻‍⚕️ 🧑🏼‍⚕️ 🧑🏽‍⚕️ 🧑🏾‍⚕️ 🧑🏿‍⚕️ 🧑‍🎓 🧑🏻‍🎓 🧑🏼‍🎓 🧑🏽‍🎓 🧑🏾‍🎓 🧑🏿‍🎓 🧑‍🏫 🧑🏻‍🏫 🧑🏼‍🏫 🧑🏽‍🏫 🧑🏾‍🏫 🧑🏿‍🏫 🧑‍⚖️ 🧑🏻‍⚖️ 🧑🏼‍⚖️ 🧑🏽‍⚖️ 🧑🏾‍⚖️ 🧑🏿‍⚖️ 🧑‍🌾 🧑🏻‍🌾 🧑🏼‍🌾 🧑🏽‍🌾 🧑🏾‍🌾 🧑🏿‍🌾 🧑‍🍳 🧑🏻‍🍳 🧑🏼‍🍳 🧑🏽‍🍳 🧑🏾‍🍳 🧑🏿‍🍳 🧑‍🔧 🧑🏻‍🔧 🧑🏼‍🔧 🧑🏽‍🔧 🧑🏾‍🔧 🧑🏿‍🔧 🧑‍🏭 🧑🏻‍🏭 🧑🏼‍🏭 🧑🏽‍🏭 🧑🏾‍🏭 🧑🏿‍🏭 🧑‍💼 🧑🏻‍💼 🧑🏼‍💼 🧑🏽‍💼 🧑🏾‍💼 🧑🏿‍💼 🧑‍🔬 🧑🏻‍🔬 🧑🏼‍🔬 🧑🏽‍🔬 🧑🏾‍🔬 🧑🏿‍🔬 🧑‍💻 🧑🏻‍💻 🧑🏼‍💻 🧑🏽‍💻 🧑🏾‍💻 🧑🏿‍💻 🧑‍🎤 🧑🏻‍🎤 🧑🏼‍🎤 🧑🏽‍🎤 🧑🏾‍🎤 🧑🏿‍🎤 🧑‍🎨 🧑🏻‍🎨 🧑🏼‍🎨 🧑🏽‍🎨 🧑🏾‍🎨 🧑🏿‍🎨 🧑‍✈️ 🧑🏻‍✈️ 🧑🏼‍✈️ 🧑🏽‍✈️ 🧑🏾‍✈️ 🧑🏿‍✈️ 🧑‍🚀 🧑🏻‍🚀 🧑🏼‍🚀 🧑🏽‍🚀 🧑🏾‍🚀 🧑🏿‍🚀 🧑‍🚒 🧑🏻‍🚒 🧑🏼‍🚒 🧑🏽‍🚒 🧑🏾‍🚒 🧑🏿‍🚒 🥷 🥷🏻 🥷🏼 🥷🏽 🥷🏾 🥷🏿 🤵‍♂️ 🤵🏻‍♂️ 🤵🏼‍♂️ 🤵🏽‍♂️ 🤵🏾‍♂️ 🤵🏿‍♂️ 🤵‍♀️ 🤵🏻‍♀️ 🤵🏼‍♀️ 🤵🏽‍♀️ 🤵🏾‍♀️ 🤵🏿‍♀️ 👰‍♂️ 👰🏻‍♂️ 👰🏼‍♂️ 👰🏽‍♂️ 👰🏾‍♂️ 👰🏿‍♂️ 👰‍♀️ 👰🏻‍♀️ 👰🏼‍♀️ 👰🏽‍♀️ 👰🏾‍♀️ 👰🏿‍♀️ 👩‍🍼 👩🏻‍🍼 👩🏼‍🍼 👩🏽‍🍼 👩🏾‍🍼 👩🏿‍🍼 👨‍🍼 👨🏻‍🍼 👨🏼‍🍼 👨🏽‍🍼 👨🏾‍🍼 👨🏿‍🍼 🧑‍🍼 🧑🏻‍🍼 🧑🏼‍🍼 🧑🏽‍🍼 🧑🏾‍🍼 🧑🏿‍🍼 🧑‍🎄 🧑🏻‍🎄 🧑🏼‍🎄 🧑🏽‍🎄 🧑🏾‍🎄 🧑🏿‍🎄 🧑‍🦯 🧑🏻‍🦯 🧑🏼‍🦯 🧑🏽‍🦯 🧑🏾‍🦯 🧑🏿‍🦯 🧑‍🦼 🧑🏻‍🦼 🧑🏼‍🦼 🧑🏽‍🦼 🧑🏾‍🦼 🧑🏿‍🦼 🧑‍🦽 🧑🏻‍🦽 🧑🏼‍🦽 🧑🏽‍🦽 🧑🏾‍🦽 🧑🏿‍🦽 🧑🏻‍🤝‍🧑🏼 🧑🏻‍🤝‍🧑🏽 🧑🏻‍🤝‍🧑🏾 🧑🏻‍🤝‍🧑🏿 🧑🏼‍🤝‍🧑🏽 🧑🏼‍🤝‍🧑🏾 🧑🏼‍🤝‍🧑🏿 🧑🏽‍🤝‍🧑🏾 🧑🏽‍🤝‍🧑🏿 🧑🏾‍🤝‍🧑🏿 🫂 🐈‍⬛ 🦬 🦣 🦫 🐻‍❄️ 🦤 🪶 🦭 🪲 🪳 🪰 🪱 🪴 🫐 🫒 🫑 🫓 🫔 🫕 🫖 🧋 🪨 🪵 🛖 🛻 🛼 🪄 🪅 🪆 🪡 🪢 🩴 🪖 🪗 🪘 🪙 🪃 🪚 🪛 🪝 🪜 🛗 🪞 🪟 🪠 🪤 🪣 🪥 🪦 🪧 ⚧️ 🏳️‍⚧️ 🇩🇬 🇪🇦 🇪🇭 🇫🇰 🇬🇫 🇬🇵 🇬🇸 🇲🇫 🇳🇨 🇵🇲 🇼🇫 🇾🇹 +31 😶‍🌫️ 😮‍💨 😵‍💫 ❤️‍🔥 ❤️‍🩹 🧔‍♂️ 🧔🏻‍♂️ 🧔🏼‍♂️ 🧔🏽‍♂️ 🧔🏾‍♂️ 🧔🏿‍♂️ 🧔‍♀️ 🧔🏻‍♀️ 🧔🏼‍♀️ 🧔🏽‍♀️ 🧔🏾‍♀️ 🧔🏿‍♀️ 💏🏻 💏🏼 💏🏽 💏🏾 💏🏿 👩🏻‍❤️‍💋‍👨🏻 👩🏻‍❤️‍💋‍👨🏼 👩🏻‍❤️‍💋‍👨🏽 👩🏻‍❤️‍💋‍👨🏾 👩🏻‍❤️‍💋‍👨🏿 👩🏼‍❤️‍💋‍👨🏻 👩🏼‍❤️‍💋‍👨🏼 👩🏼‍❤️‍💋‍👨🏽 👩🏼‍❤️‍💋‍👨🏾 👩🏼‍❤️‍💋‍👨🏿 👩🏽‍❤️‍💋‍👨🏻 👩🏽‍❤️‍💋‍👨🏼 👩🏽‍❤️‍💋‍👨🏽 👩🏽‍❤️‍💋‍👨🏾 👩🏽‍❤️‍💋‍👨🏿 👩🏾‍❤️‍💋‍👨🏻 👩🏾‍❤️‍💋‍👨🏼 👩🏾‍❤️‍💋‍👨🏽 👩🏾‍❤️‍💋‍👨🏾 👩🏾‍❤️‍💋‍👨🏿 👩🏿‍❤️‍💋‍👨🏻 👩🏿‍❤️‍💋‍👨🏼 👩🏿‍❤️‍💋‍👨🏽 👩🏿‍❤️‍💋‍👨🏾 👩🏿‍❤️‍💋‍👨🏿 👨🏻‍❤️‍💋‍👨🏻 👨🏻‍❤️‍💋‍👨🏼 👨🏻‍❤️‍💋‍👨🏽 👨🏻‍❤️‍💋‍👨🏾 👨🏻‍❤️‍💋‍👨🏿 👨🏼‍❤️‍💋‍👨🏻 👨🏼‍❤️‍💋‍👨🏼 👨🏼‍❤️‍💋‍👨🏽 👨🏼‍❤️‍💋‍👨🏾 👨🏼‍❤️‍💋‍👨🏿 👨🏽‍❤️‍💋‍👨🏻 👨🏽‍❤️‍💋‍👨🏼 👨🏽‍❤️‍💋‍👨🏽 👨🏽‍❤️‍💋‍👨🏾 👨🏽‍❤️‍💋‍👨🏿 👨🏾‍❤️‍💋‍👨🏻 👨🏾‍❤️‍💋‍👨🏼 👨🏾‍❤️‍💋‍👨🏽 👨🏾‍❤️‍💋‍👨🏾 👨🏾‍❤️‍💋‍👨🏿 👨🏿‍❤️‍💋‍👨🏻 👨🏿‍❤️‍💋‍👨🏼 👨🏿‍❤️‍💋‍👨🏽 👨🏿‍❤️‍💋‍👨🏾 👨🏿‍❤️‍💋‍👨🏿 👩🏻‍❤️‍💋‍👩🏻 👩🏻‍❤️‍💋‍👩🏼 👩🏻‍❤️‍💋‍👩🏽 👩🏻‍❤️‍💋‍👩🏾 👩🏻‍❤️‍💋‍👩🏿 👩🏼‍❤️‍💋‍👩🏻 👩🏼‍❤️‍💋‍👩🏼 👩🏼‍❤️‍💋‍👩🏽 👩🏼‍❤️‍💋‍👩🏾 👩🏼‍❤️‍💋‍👩🏿 👩🏽‍❤️‍💋‍👩🏻 👩🏽‍❤️‍💋‍👩🏼 👩🏽‍❤️‍💋‍👩🏽 👩🏽‍❤️‍💋‍👩🏾 👩🏽‍❤️‍💋‍👩🏿 👩🏾‍❤️‍💋‍👩🏻 👩🏾‍❤️‍💋‍👩🏼 👩🏾‍❤️‍💋‍👩🏽 👩🏾‍❤️‍💋‍👩🏾 👩🏾‍❤️‍💋‍👩🏿 👩🏿‍❤️‍💋‍👩🏻 👩🏿‍❤️‍💋‍👩🏼 👩🏿‍❤️‍💋‍👩🏽 👩🏿‍❤️‍💋‍👩🏾 👩🏿‍❤️‍💋‍👩🏿 💑🏻 💑🏼 💑🏽 💑🏾 💑🏿 👩🏻‍❤️‍👨🏻 👩🏻‍❤️‍👨🏼 👩🏻‍❤️‍👨🏽 👩🏻‍❤️‍👨🏾 👩🏻‍❤️‍👨🏿 👩🏼‍❤️‍👨🏻 👩🏼‍❤️‍👨🏼 👩🏼‍❤️‍👨🏽 👩🏼‍❤️‍👨🏾 👩🏼‍❤️‍👨🏿 👩🏽‍❤️‍👨🏻 👩🏽‍❤️‍👨🏼 👩🏽‍❤️‍👨🏽 👩🏽‍❤️‍👨🏾 👩🏽‍❤️‍👨🏿 👩🏾‍❤️‍👨🏻 👩🏾‍❤️‍👨🏼 👩🏾‍❤️‍👨🏽 👩🏾‍❤️‍👨🏾 👩🏾‍❤️‍👨🏿 👩🏿‍❤️‍👨🏻 👩🏿‍❤️‍👨🏼 👩🏿‍❤️‍👨🏽 👩🏿‍❤️‍👨🏾 👩🏿‍❤️‍👨🏿 👨🏻‍❤️‍👨🏻 👨🏻‍❤️‍👨🏼 👨🏻‍❤️‍👨🏽 👨🏻‍❤️‍👨🏾 👨🏻‍❤️‍👨🏿 👨🏼‍❤️‍👨🏻 👨🏼‍❤️‍👨🏼 👨🏼‍❤️‍👨🏽 👨🏼‍❤️‍👨🏾 👨🏼‍❤️‍👨🏿 👨🏽‍❤️‍👨🏻 👨🏽‍❤️‍👨🏼 👨🏽‍❤️‍👨🏽 👨🏽‍❤️‍👨🏾 👨🏽‍❤️‍👨🏿 👨🏾‍❤️‍👨🏻 👨🏾‍❤️‍👨🏼 👨🏾‍❤️‍👨🏽 👨🏾‍❤️‍👨🏾 👨🏾‍❤️‍👨🏿 👨🏿‍❤️‍👨🏻 👨🏿‍❤️‍👨🏼 👨🏿‍❤️‍👨🏽 👨🏿‍❤️‍👨🏾 👨🏿‍❤️‍👨🏿 👩🏻‍❤️‍👩🏻 👩🏻‍❤️‍👩🏼 👩🏻‍❤️‍👩🏽 👩🏻‍❤️‍👩🏾 👩🏻‍❤️‍👩🏿 👩🏼‍❤️‍👩🏻 👩🏼‍❤️‍👩🏼 👩🏼‍❤️‍👩🏽 👩🏼‍❤️‍👩🏾 👩🏼‍❤️‍👩🏿 👩🏽‍❤️‍👩🏻 👩🏽‍❤️‍👩🏼 👩🏽‍❤️‍👩🏽 👩🏽‍❤️‍👩🏾 👩🏽‍❤️‍👩🏿 👩🏾‍❤️‍👩🏻 👩🏾‍❤️‍👩🏼 👩🏾‍❤️‍👩🏽 👩🏾‍❤️‍👩🏾 👩🏾‍❤️‍👩🏿 👩🏿‍❤️‍👩🏻 👩🏿‍❤️‍👩🏼 👩🏿‍❤️‍👩🏽 👩🏿‍❤️‍👩🏾 👩🏿‍❤️‍👩🏿 32 🫠 🫢 🫣 🫡 🫥 🫤 🥹 🫱 🫱🏻 🫱🏼 🫱🏽 🫱🏾 🫱🏿 🫲 🫲🏻 🫲🏼 🫲🏽 🫲🏾 🫲🏿 🫳 🫳🏻 🫳🏼 🫳🏽 🫳🏾 🫳🏿 🫴 🫴🏻 🫴🏼 🫴🏽 🫴🏾 🫴🏿 🫰 🫰🏻 🫰🏼 🫰🏽 🫰🏾 🫰🏿 🫵 🫵🏻 🫵🏼 🫵🏽 🫵🏾 🫵🏿 🫶 🫶🏻 🫶🏼 🫶🏽 🫶🏾 🫶🏿 🫦 🫅 🫅🏻 🫅🏼 🫅🏽 🫅🏾 🫅🏿 🫃 🫃🏻 🫃🏼 🫃🏽 🫃🏾 🫃🏿 🫄 🫄🏻 🫄🏼 🫄🏽 🫄🏾 🫄🏿 🧌 🪸 🪷 🪹 🪺 🫘 🫗 🫙 🛝 🛞 🛟 🪩 🪫 🩼 🩻 🫧 🪬 🪪 🟰 33 🫨 🩷 🩵 🩶 🫷 🫷🏻 🫷🏼 🫷🏽 🫷🏾 🫷🏿 🫸 🫸🏻 🫸🏼 🫸🏽 🫸🏾 🫸🏿 🫎 🫏 🪽 🐦‍⬛ 🪿 🪼 🪻 🫚 🫛 🪭 🪮 🪇 🪈 🪯 🛜 34 🙂‍↔️ 🙂‍↕️ 🚶‍➡️ 🚶🏻‍➡️ 🚶🏼‍➡️ 🚶🏽‍➡️ 🚶🏾‍➡️ 🚶🏿‍➡️ 🚶‍♀️‍➡️ 🚶🏻‍♀️‍➡️ 🚶🏼‍♀️‍➡️ 🚶🏽‍♀️‍➡️ 🚶🏾‍♀️‍➡️ 🚶🏿‍♀️‍➡️ 🚶‍♂️‍➡️ 🚶🏻‍♂️‍➡️ 🚶🏼‍♂️‍➡️ 🚶🏽‍♂️‍➡️ 🚶🏾‍♂️‍➡️ 🚶🏿‍♂️‍➡️ 🧎‍➡️ 🧎🏻‍➡️ 🧎🏼‍➡️ 🧎🏽‍➡️ 🧎🏾‍➡️ 🧎🏿‍➡️ 🧎‍♀️‍➡️ 🧎🏻‍♀️‍➡️ 🧎🏼‍♀️‍➡️ 🧎🏽‍♀️‍➡️ 🧎🏾‍♀️‍➡️ 🧎🏿‍♀️‍➡️ 🧎‍♂️‍➡️ 🧎🏻‍♂️‍➡️ 🧎🏼‍♂️‍➡️ 🧎🏽‍♂️‍➡️ 🧎🏾‍♂️‍➡️ 🧎🏿‍♂️‍➡️ 🧑‍🦯‍➡️ 🧑🏻‍🦯‍➡️ 🧑🏼‍🦯‍➡️ 🧑🏽‍🦯‍➡️ 🧑🏾‍🦯‍➡️ 🧑🏿‍🦯‍➡️ 👨‍🦯‍➡️ 👨🏻‍🦯‍➡️ 👨🏼‍🦯‍➡️ 👨🏽‍🦯‍➡️ 👨🏾‍🦯‍➡️ 👨🏿‍🦯‍➡️ 👩‍🦯‍➡️ 👩🏻‍🦯‍➡️ 👩🏼‍🦯‍➡️ 👩🏽‍🦯‍➡️ 👩🏾‍🦯‍➡️ 👩🏿‍🦯‍➡️ 🧑‍🦼‍➡️ 🧑🏻‍🦼‍➡️ 🧑🏼‍🦼‍➡️ 🧑🏽‍🦼‍➡️ 🧑🏾‍🦼‍➡️ 🧑🏿‍🦼‍➡️ 👨‍🦼‍➡️ 👨🏻‍🦼‍➡️ 👨🏼‍🦼‍➡️ 👨🏽‍🦼‍➡️ 👨🏾‍🦼‍➡️ 👨🏿‍🦼‍➡️ 👩‍🦼‍➡️ 👩🏻‍🦼‍➡️ 👩🏼‍🦼‍➡️ 👩🏽‍🦼‍➡️ 👩🏾‍🦼‍➡️ 👩🏿‍🦼‍➡️ 🧑‍🦽‍➡️ 🧑🏻‍🦽‍➡️ 🧑🏼‍🦽‍➡️ 🧑🏽‍🦽‍➡️ 🧑🏾‍🦽‍➡️ 🧑🏿‍🦽‍➡️ 👨‍🦽‍➡️ 👨🏻‍🦽‍➡️ 👨🏼‍🦽‍➡️ 👨🏽‍🦽‍➡️ 👨🏾‍🦽‍➡️ 👨🏿‍🦽‍➡️ 👩‍🦽‍➡️ 👩🏻‍🦽‍➡️ 👩🏼‍🦽‍➡️ 👩🏽‍🦽‍➡️ 👩🏾‍🦽‍➡️ 👩🏿‍🦽‍➡️ 🏃‍➡️ 🏃🏻‍➡️ 🏃🏼‍➡️ 🏃🏽‍➡️ 🏃🏾‍➡️ 🏃🏿‍➡️ 🏃‍♀️‍➡️ 🏃🏻‍♀️‍➡️ 🏃🏼‍♀️‍➡️ 🏃🏽‍♀️‍➡️ 🏃🏾‍♀️‍➡️ 🏃🏿‍♀️‍➡️ 🏃‍♂️‍➡️ 🏃🏻‍♂️‍➡️ 🏃🏼‍♂️‍➡️ 🏃🏽‍♂️‍➡️ 🏃🏾‍♂️‍➡️ 🏃🏿‍♂️‍➡️ 🧑‍🧑‍🧒 🧑‍🧑‍🧒‍🧒 🧑‍🧒 🧑‍🧒‍🧒 🐦‍🔥 🍋‍🟩 🍄‍🟫 ⛓️‍💥 diff --git a/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/model/EmojiData.kt b/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/model/EmojiData.kt index 48636a364..e8fe8f868 100644 --- a/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/model/EmojiData.kt +++ b/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/model/EmojiData.kt @@ -2,6 +2,8 @@ package com.majeur.inputmethod.tools.emoji.model +import kotlin.collections.mutableSetOf + class EmojiData { var unicodeVersion = "" @@ -61,25 +63,21 @@ class EmojiData { insertEmoji(group, intArrayOf(CP_REGIONAL_INDICATOR_SYMBOL_LETTER_Z), 2.0f, "regional indicator symbol letter z") } - if (hasMultipleSkinModifiers(emoji.codes)) { - // For now Openboard implementation is not robust enough to handle such complicated sequences. - // Emoji palettes get polluted with too much emoji variations, so we'll ignore them. - return false - } - - return true + // Some multi-skin-tone variants use a different base code than their non-multi-skin-tone counterparts, + // so they don't get grouped. We drop them here, to prevent each variant from being displayed separately. + return ! hasMultipleSkinModifiers(emoji.codes) } private fun hasMultipleSkinModifiers(codes: IntArray): Boolean { - var count = 0 + val tones = mutableSetOf() codes.forEach { when (it) { CP_LIGHT_SKIN_TONE, CP_MEDIUM_LIGHT_SKIN_TONE, CP_MEDIUM_SKIN_TONE, CP_MEDIUM_DARK_SKIN_TONE, CP_DARK_SKIN_TONE -> - count += 1 + tones.add(it) } } - return count > 1 + return tones.size > 1 } private fun onEmojiVariantInserted(group: EmojiGroup, baseSpec: EmojiSpec, emojiSpec: EmojiSpec): Boolean { @@ -99,25 +97,24 @@ class EmojiData { val baseCodePoints3 = emoji.codes.toMutableList() .apply { set(emoji.codes.indexOf(componentCode), CP_VARIANT_SELECTOR) }.toIntArray() - val base = emojiGroups[group]?.firstOrNull { it.codes contentEquals baseCodePoints } - ?: emojiGroups[group]?.firstOrNull { it.codes contentEquals baseCodePoints2 } - ?: emojiGroups[group]?.firstOrNull { it.codes contentEquals baseCodePoints3 } - - // We keep track the component modifier of this emoji - if (base != null) emoji.component = componentCode - - return base + return emojiGroups[group]?.firstOrNull { it.codes contentEquals baseCodePoints } + ?: emojiGroups[group]?.firstOrNull { it.codes contentEquals baseCodePoints2 } + ?: emojiGroups[group]?.firstOrNull { it.codes contentEquals baseCodePoints3 } } private fun withoutComponentCodes(codes: IntArray) : Pair { + var res = codes + var tone = CP_NUL codes.forEach { code -> when (code) { CP_LIGHT_SKIN_TONE, CP_MEDIUM_LIGHT_SKIN_TONE, CP_MEDIUM_SKIN_TONE, - CP_MEDIUM_DARK_SKIN_TONE, CP_DARK_SKIN_TONE -> - return codes.asList().minus(code).toIntArray() to code + CP_MEDIUM_DARK_SKIN_TONE, CP_DARK_SKIN_TONE -> { + res = res.asList().minus(code).toIntArray() + tone = code + } } } - return codes to CP_NUL + return res to tone } companion object { @@ -169,4 +166,4 @@ class EmojiData { } -} \ No newline at end of file +} diff --git a/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/model/EmojiSpec.kt b/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/model/EmojiSpec.kt index db4d63d8a..f0081b2f5 100644 --- a/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/model/EmojiSpec.kt +++ b/tools/make-emoji-keys/src/main/kotlin/com/majeur/inputmethod/tools/emoji/model/EmojiSpec.kt @@ -2,12 +2,8 @@ package com.majeur.inputmethod.tools.emoji.model -import com.majeur.inputmethod.tools.emoji.model.EmojiData.Companion.CP_NUL - data class EmojiSpec(val codes: IntArray, val unicodeVer: Float, val name: String) { - var component = CP_NUL - val variants by lazy { mutableListOf() } override fun toString() = name @@ -22,4 +18,4 @@ data class EmojiSpec(val codes: IntArray, val unicodeVer: Float, val name: Strin val text get() = codes.joinToString("") { Character.toString(it) } override fun hashCode() = codes.contentHashCode() -} \ No newline at end of file +}
        +
      • Добавяне на речници за предложения и проверка на правописа
      • +
          +
        • създайте си сами или ги вземете тук или в секцията експериментални (качеството може да варира)
        • +
        • допълнителни речници за емотикони или научни символи могат да се използват за предоставяне на предложения (подобно на "търсене на емотикони")
        • +
        • имайте предвид, че за корейските клавиатурни подредби предложенията работят само с този речник – инструментите в хранилището с речници не могат да създават работещи речници
        • +
        +
      • Персонализиране на темите на клавиатурата (стил, цветове и фонова снимка)
      • +
          +
        • може да следва дневната/нощната настройка на системата при Android 10+ (и на някои версии на Android 9)
        • +
        • може да следва динамичните цветове за Android 12+
        • +
        +
      • Персонализиране на клавиатурните подредби (достъпно само при изключена опция използване на системните езици)
      • +
      • Персонализиране на специални подредби, като символни, цифрови или функционални клавиши
      • +
      • Многоезично въвеждане
      • +
      • Плъзгащо се въвеждане (само със затворен код библиотека ☹️)
      • +
          +
        • библиотеката не е включена в приложението, тъй като няма налична съвместима библиотека с отворен код
        • +
        • може да бъде извлечена от пакетите GApps ("swypelibs") или изтеглена оттук (кликнете върху файла и след това „raw“ или малкия бутон за изтегляне)
        • +
        +
      • История на клипборда
      • +
      • Режим с една ръка
      • +
      • Разделена клавиатура (достъпна само при достатъчно голям екран)
      • +
      • Цифрова панел
      • +
      • Архивиране и възстановяване на настройките и научените думи / данни от историята
      • +