Compare commits

...

11 Commits

Author SHA1 Message Date
Patrick Goldinger
ff01120925 Release v0.4.3 2024-10-21 23:20:13 +02:00
Patrick Goldinger
74b5c845aa Merge branch 'main' into release/0.4 2024-10-21 23:19:26 +02:00
florisboard-bot
66340249d4 Update translations from Crowdin 2024-10-21 23:17:01 +02:00
Lars Mühlbauer
14147ca1b9 Fix migration in clipboard database (#2641)
* Fix migration in clipboard database

* Update database version

* Fix migration from version 3 to version 4
2024-10-21 23:15:24 +02:00
Patrick Goldinger
bdc740637b Fix inline autofill single icon style (#2628) (#2649) 2024-10-21 17:02:36 +02:00
Patrick Goldinger
eb20e80295 Fix state issues in TextKeyboardLayout (popups) (#2647)
* Fix state issues in TextKeyboardLayout (popups)

* Fix utility key not updating correctly (#2648)
2024-10-21 15:34:15 +02:00
Patrick Goldinger
ddc4f7f1ba Release v0.4.2 2024-10-17 19:12:13 +02:00
Patrick Goldinger
afea8c721f Merge branch 'main' into release/0.4 2024-10-17 19:10:49 +02:00
Patrick Goldinger
9cffcea246 Release v0.4.1 2024-10-10 20:53:19 +02:00
Patrick Goldinger
5acf80db0f Merge branch 'main' into release/0.4 2024-10-10 16:03:17 +02:00
Patrick Goldinger
80fb20885b Release v0.4.0 2024-09-18 18:26:47 +02:00
10 changed files with 185 additions and 63 deletions

View File

@@ -2,11 +2,11 @@
"formatVersion": 1,
"database": {
"version": 3,
"identityHash": "282a1b421e498fd0e21c055b6a4315e0",
"identityHash": "145ca5bf4bff8e98f71ebc70ab3b495b",
"entities": [
{
"tableName": "clipboard_history",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` INTEGER NOT NULL, `text` TEXT, `uri` TEXT, `creationTimestampMs` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `mimeTypes` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `isRemoteDevice` INTEGER NOT NULL)",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` INTEGER NOT NULL, `text` TEXT, `uri` TEXT, `creationTimestampMs` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `mimeTypes` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL DEFAULT 0, `isRemoteDevice` INTEGER NOT NULL DEFAULT 0)",
"fields": [
{
"fieldPath": "id",
@@ -54,13 +54,15 @@
"fieldPath": "isSensitive",
"columnName": "isSensitive",
"affinity": "INTEGER",
"notNull": true
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "isRemoteDevice",
"columnName": "isRemoteDevice",
"affinity": "INTEGER",
"notNull": true
"notNull": true,
"defaultValue": "0"
}
],
"primaryKey": {
@@ -86,7 +88,7 @@
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '282a1b421e498fd0e21c055b6a4315e0')"
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '145ca5bf4bff8e98f71ebc70ab3b495b')"
]
}
}

View File

@@ -0,0 +1,94 @@
{
"formatVersion": 1,
"database": {
"version": 4,
"identityHash": "1dd181d116dcb4530fb5b33451ea9ab5",
"entities": [
{
"tableName": "clipboard_history",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` INTEGER NOT NULL, `text` TEXT, `uri` TEXT, `creationTimestampMs` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `mimeTypes` TEXT NOT NULL, `is_sensitive` INTEGER NOT NULL DEFAULT 0, `is_remote_device` INTEGER NOT NULL DEFAULT 0)",
"fields": [
{
"fieldPath": "id",
"columnName": "_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "uri",
"columnName": "uri",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "creationTimestampMs",
"columnName": "creationTimestampMs",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "mimeTypes",
"columnName": "mimeTypes",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isSensitive",
"columnName": "is_sensitive",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "isRemoteDevice",
"columnName": "is_remote_device",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"_id"
]
},
"indices": [
{
"name": "index_clipboard_history__id",
"unique": false,
"columnNames": [
"_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_clipboard_history__id` ON `${TABLE_NAME}` (`_id`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1dd181d116dcb4530fb5b33451ea9ab5')"
]
}
}

View File

@@ -30,6 +30,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.core.database.getStringOrNull
import androidx.lifecycle.LiveData
import androidx.room.AutoMigration
import androidx.room.ColumnInfo
import androidx.room.Dao
import androidx.room.Database
@@ -38,11 +39,13 @@ import androidx.room.Entity
import androidx.room.Insert
import androidx.room.PrimaryKey
import androidx.room.Query
import androidx.room.RenameColumn
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverter
import androidx.room.TypeConverters
import androidx.room.Update
import androidx.room.migration.AutoMigrationSpec
import dev.patrickgold.florisboard.R
import kotlinx.serialization.EncodeDefault
import kotlinx.serialization.ExperimentalSerializationApi
@@ -88,8 +91,10 @@ data class ClipboardItem @OptIn(ExperimentalSerializationApi::class) constructor
val isPinned: Boolean,
val mimeTypes: Array<String>,
@EncodeDefault
@ColumnInfo(name = "is_sensitive", defaultValue = "0")
val isSensitive: Boolean = false,
@EncodeDefault
@ColumnInfo(name= "is_remote_device", defaultValue = "0")
val isRemoteDevice: Boolean = false,
) {
companion object {
@@ -332,11 +337,30 @@ interface ClipboardHistoryDao {
fun deleteAllUnpinned()
}
@Database(entities = [ClipboardItem::class], version = 3)
@Database(
entities = [ClipboardItem::class],
version = 4,
autoMigrations = [
AutoMigration(from = 2, to = 4),
AutoMigration(from = 3, to = 4, spec = ClipboardHistoryDatabase.MIGRATE_3_TO_4::class),
],
)
@TypeConverters(Converters::class)
abstract class ClipboardHistoryDatabase : RoomDatabase() {
abstract fun clipboardItemDao(): ClipboardHistoryDao
@RenameColumn(
tableName = CLIPBOARD_HISTORY_TABLE,
fromColumnName = "isSensitive",
toColumnName = "is_sensitive",
)
@RenameColumn(
tableName = CLIPBOARD_HISTORY_TABLE,
fromColumnName = "isRemoteDevice",
toColumnName = "is_remote_device",
)
class MIGRATE_3_TO_4 : AutoMigrationSpec
companion object {
fun new(context: Context): ClipboardHistoryDatabase {
return Room

View File

@@ -48,12 +48,13 @@ import dev.patrickgold.florisboard.lib.toIntOffset
@Composable
fun rememberPopupUiController(
key1: Any?,
key2: Any?,
boundsProvider: (key: Key) -> FlorisRect,
isSuitableForBasicPopup: (key: Key) -> Boolean,
isSuitableForExtendedPopup: (key: Key) -> Boolean,
): PopupUiController {
val context = LocalContext.current
return remember(key1) {
return remember(key1, key2) {
PopupUiController(context, boundsProvider, isSuitableForBasicPopup, isSuitableForExtendedPopup)
}
}

View File

@@ -108,7 +108,6 @@ fun TextKeyboardLayout(
modifier: Modifier = Modifier,
evaluator: ComputingEvaluator,
isPreview: Boolean = false,
isSmartbarKeyboard: Boolean = false,
): Unit = with(LocalDensity.current) {
val prefs by florisPreferenceModel()
val context = LocalContext.current
@@ -125,7 +124,7 @@ fun TextKeyboardLayout(
val controller = remember { TextKeyboardLayoutController(context) }.also {
it.keyboard = keyboard
if (glideEnabled && !isSmartbarKeyboard && !isPreview && keyboard.mode == KeyboardMode.CHARACTERS) {
if (glideEnabled && !isPreview && keyboard.mode == KeyboardMode.CHARACTERS) {
val keys = keyboard.keys().asSequence().toList()
glideTypingManager.setLayout(keys)
}
@@ -161,13 +160,7 @@ fun TextKeyboardLayout(
BoxWithConstraints(
modifier = modifier
.fillMaxWidth()
.height(
if (isSmartbarKeyboard) {
FlorisImeSizing.smartbarHeight
} else {
FlorisImeSizing.keyboardUiHeight()
}
)
.height(FlorisImeSizing.keyboardUiHeight())
.onGloballyPositioned { coords ->
controller.size = coords.size.toSize()
}
@@ -196,7 +189,7 @@ fun TextKeyboardLayout(
}
.drawWithContent {
drawContent()
if (glideEnabled && glideShowTrail && !isSmartbarKeyboard) {
if (glideEnabled && glideShowTrail) {
val targetDist = 3.0f
val radius = 20.0f
@@ -227,57 +220,43 @@ fun TextKeyboardLayout(
val keyboardRowBaseHeight = FlorisImeSizing.keyboardRowBaseHeight
val desiredKey = remember(
keyboard, isSmartbarKeyboard, keyboardWidth, keyboardHeight, keyMarginH, keyMarginV,
keyboardRowBaseHeight
keyboard, keyboardWidth, keyboardHeight, keyMarginH, keyMarginV,
keyboardRowBaseHeight, evaluator
) {
TextKey(data = TextKeyData.UNSPECIFIED).also { desiredKey ->
desiredKey.touchBounds.apply {
if (isSmartbarKeyboard) {
width = keyboardWidth / 8f
height = keyboardHeight
} else {
width = keyboardWidth / 10f
height = when (keyboard.mode) {
KeyboardMode.CHARACTERS,
KeyboardMode.NUMERIC_ADVANCED,
KeyboardMode.SYMBOLS,
KeyboardMode.SYMBOLS2 -> {
(keyboardHeight / keyboard.rowCount)
.coerceAtMost(keyboardRowBaseHeight.toPx() * 1.12f)
}
else -> keyboardRowBaseHeight.toPx()
width = keyboardWidth / 10f
height = when (keyboard.mode) {
KeyboardMode.CHARACTERS,
KeyboardMode.NUMERIC_ADVANCED,
KeyboardMode.SYMBOLS,
KeyboardMode.SYMBOLS2 -> {
(keyboardHeight / keyboard.rowCount)
.coerceAtMost(keyboardRowBaseHeight.toPx() * 1.12f)
}
else -> keyboardRowBaseHeight.toPx()
}
}
desiredKey.visibleBounds.applyFrom(desiredKey.touchBounds).deflateBy(keyMarginH, keyMarginV)
keyboard.layout(keyboardWidth, keyboardHeight, desiredKey, !isSmartbarKeyboard)
keyboard.layout(keyboardWidth, keyboardHeight, desiredKey, true)
}
}
val fontSizeMultiplier = prefs.keyboard.fontSizeMultiplier()
val popupUiController = rememberPopupUiController(
key1 = keyboard,
key2 = desiredKey,
boundsProvider = { key ->
val keyPopupWidth: Float
val keyPopupHeight: Float
when {
configuration.isOrientationLandscape() -> {
if (isSmartbarKeyboard) {
keyPopupWidth = key.visibleBounds.width * 1.0f
keyPopupHeight = desiredKey.visibleBounds.height * 3.0f * 1.2f
} else {
keyPopupWidth = desiredKey.visibleBounds.width * 1.0f
keyPopupHeight = desiredKey.visibleBounds.height * 3.0f
}
keyPopupWidth = desiredKey.visibleBounds.width * 1.0f
keyPopupHeight = desiredKey.visibleBounds.height * 3.0f
}
else -> {
if (isSmartbarKeyboard) {
keyPopupWidth = key.visibleBounds.width * 1.1f
keyPopupHeight = desiredKey.visibleBounds.height * 2.5f * 1.2f
} else {
keyPopupWidth = desiredKey.visibleBounds.width * 1.1f
keyPopupHeight = desiredKey.visibleBounds.height * 2.5f
}
keyPopupWidth = desiredKey.visibleBounds.width * 1.1f
keyPopupHeight = desiredKey.visibleBounds.height * 2.5f
}
}
val keyPopupDiffX = (key.visibleBounds.width - keyPopupWidth) / 2.0f
@@ -295,7 +274,7 @@ fun TextKeyboardLayout(
val numeric = keyboard.mode == KeyboardMode.NUMERIC ||
keyboard.mode == KeyboardMode.PHONE || keyboard.mode == KeyboardMode.PHONE2 ||
keyboard.mode == KeyboardMode.NUMERIC_ADVANCED && keyType == KeyType.NUMERIC
keyCode > KeyCode.SPACE && keyCode != KeyCode.MULTIPLE_CODE_POINTS && keyCode != KeyCode.CJK_SPACE && !numeric
keyCode > KeyCode.SPACE && keyCode != KeyCode.CJK_SPACE && !numeric
} else {
true
}
@@ -303,7 +282,7 @@ fun TextKeyboardLayout(
isSuitableForExtendedPopup = { key ->
if (key is TextKey) {
val keyCode = key.computedData.code
keyCode > KeyCode.SPACE && keyCode != KeyCode.MULTIPLE_CODE_POINTS && keyCode != KeyCode.CJK_SPACE || ExceptionsForKeyCodes.contains(keyCode)
keyCode > KeyCode.SPACE && keyCode != KeyCode.CJK_SPACE || ExceptionsForKeyCodes.contains(keyCode)
} else {
true
}
@@ -316,7 +295,7 @@ fun TextKeyboardLayout(
val debugShowTouchBoundaries by prefs.devtools.showKeyTouchBoundaries.observeAsState()
for (textKey in keyboard.keys()) {
TextKeyButton(
textKey, evaluator, fontSizeMultiplier, isSmartbarKeyboard,
textKey, evaluator, fontSizeMultiplier,
debugShowTouchBoundaries,
)
}
@@ -338,13 +317,12 @@ private fun TextKeyButton(
key: TextKey,
evaluator: ComputingEvaluator,
fontSizeMultiplier: Float,
isSmartbarKey: Boolean,
debugShowTouchBoundaries: Boolean,
) = with(LocalDensity.current) {
val context = LocalContext.current
val keyStyle = FlorisImeTheme.style.get(
element = if (isSmartbarKey) FlorisImeUi.SmartbarActionKey else FlorisImeUi.Key,
element = FlorisImeUi.Key,
code = key.computedData.code,
mode = evaluator.state.inputShiftState.value,
isPressed = key.isPressed && key.isEnabled,

View File

@@ -207,11 +207,6 @@ class ThemeManager(context: Context) {
val bgDrawable = Icon.createWithResource(context, bgDrawableId).apply {
setTint(bgColor.toArgb())
}
val singleIconChipStyle = ViewStyle.Builder().run {
setBackground(bgDrawable)
setPadding(0, 0, 0, 0)
build()
}
val chipStyle = ViewStyle.Builder().run {
setBackground(bgDrawable)
setPadding(
@@ -249,7 +244,7 @@ class ThemeManager(context: Context) {
build()
}
val suggestionStyle = InlineSuggestionUi.newStyleBuilder().run {
setSingleIconChipStyle(singleIconChipStyle)
setSingleIconChipStyle(chipStyle)
setChipStyle(chipStyle)
setStartIconStyle(iconStyle)
setEndIconStyle(iconStyle)

View File

@@ -114,11 +114,13 @@
<string name="pref__input_feedback__haptic_vibration_duration__label" comment="Preference title">Duración de la vibración</string>
<string name="pref__input_feedback__haptic_vibration_strength__label" comment="Preference title">Intensidá de la vibración</string>
<string name="settings__keyboard__title" comment="Title of Keyboard preferences screen">Tecláu</string>
<string name="pref__keyboard__number_row__label" comment="Preference title">Filera de númberos</string>
<string name="pref__keyboard__number_row__summary" comment="Preference summary">Amuesa la filera de númberos enriba de la distribución de tecles</string>
<string name="pref__keyboard__space_bar_mode__label" comment="Preference title">Etiqueta de la barra d\'espaciu</string>
<string name="pref__keyboard__font_size_multiplier__label" comment="Preference title">Multiplicador del tamañu de la fonte</string>
<string name="pref__keyboard__height_factor__label" comment="Preference title">Altor del tecláu</string>
<string name="pref__keyboard__group_keypress__label" comment="Preference group title">Pulsación de tecles</string>
<string name="pref__keyboard__popup_enabled__label" comment="Preference title">Visibilidá de los indicadores emerxentes</string>
<string name="pref__keyboard__popup_enabled__label" comment="Preference title">Visibilidá d\'indicadores emerxentes</string>
<string name="pref__keyboard__popup_enabled__summary" comment="Preference summary">Amuesa un indicador emerxente cuando primes una tecla</string>
<string name="pref__keyboard__long_press_delay__label" comment="Preference title">Retrasu de la pulsación de tecles llonga</string>
<!-- Smartbar strings -->
@@ -262,6 +264,7 @@
<string name="ext__validation__enter_valid_number">Introduz nun númberu válidu</string>
<string name="ext__validation__enter_positive_number">Introduz un númberu positivu (&gt;=0)</string>
<string name="ext__update_box__search_for_updates">Buscar anovamientos</string>
<string name="ext__addon_management_box__addon_manager_info">Pues remanar toles xeres rellacionaes cola importación, esportación, creación, personalización y desaniciu d\'estensiones pente\'l xestor de complementos centralizáu.</string>
<string name="ext__addon_management_box__go_to_page">Dir a «{ext_home_title}»</string>
<string name="ext__home__visit_store">Visitar la tienda de complementos</string>
<!-- Action strings -->
@@ -310,6 +313,7 @@
<string name="enum__incognito_mode__dynamic_on_off" comment="Enum value label">Des/activación automática</string>
<string name="enum__landscape_input_ui_mode__dynamically_show" comment="Enum value label">Apaición dinámica</string>
<string name="enum__snygg_level__advanced" comment="Enum value label">Configuración avanzada</string>
<string name="enum__space_bar_mode__nothing" comment="Enum value label">Ensin etiqueta</string>
<string name="enum__space_bar_mode__current_language" comment="Enum value label">Llingua actual</string>
<string name="enum__swipe_action__redo" comment="Enum value label">Refacer</string>
<string name="enum__swipe_action__undo" comment="Enum value label">Desfacer</string>

View File

@@ -578,6 +578,8 @@
<string name="devtools__show_input_state_overlay__summary" comment="Summary of Show input cache overlay in Devtools">Blendet Eingabe-Overlay zur Fehlersuche ein</string>
<string name="devtools__show_spelling_overlay__label" comment="Label of Show spelling overlay in Devtools">Zeige Rechtschreibprüfungs-Overlay</string>
<string name="devtools__show_spelling_overlay__summary" comment="Summary of Show spelling overlay in Devtools">Blendet die aktuellen Ergebnisse der Rechtschreibprüfung fürs Debugging ein</string>
<string name="devtools__show_inline_autofill_overlay__label">Zeige Autofill-Overlay</string>
<string name="devtools__show_inline_autofill_overlay__summary">Blendet das aktuelle Autofill-Ergebnis für das Debugging ein</string>
<string name="devtools__show_key_touch_boundaries__label" comment="Label of Show key touch boundaries in Devtools">Tastendruck-Umrandungen einschalten</string>
<string name="devtools__show_key_touch_boundaries__summary" comment="Summary of Show key touch boundaries in Devtools">Umrandet die gedrückte Taste in Rot</string>
<string name="devtools__show_drag_and_drop_helpers__label" comment="Label of Show drag and drop helpers in Devtools">Zeige Verschiebe-Hilfen</string>

View File

@@ -26,10 +26,11 @@
<string name="prefs__media__emoji_suggestion_enabled__summary" comment="Preference summary">Предлагать смайлики при наборе текста</string>
<string name="prefs__media__emoji_suggestion_type" comment="Preference title">Тип триггера</string>
<string name="prefs__media__emoji_suggestion_update_history" comment="Preference title">Обновить историю смайликов</string>
<string name="prefs__media__emoji_suggestion_update_history__summary" comment="Preference summary">Принятие предложенных эмодзи добавляет их в историю эмодзи</string>
<string name="prefs__media__emoji_suggestion_candidate_show_name" comment="Preference title">Показать название смайлика</string>
<string name="prefs__media__emoji_suggestion_candidate_show_name__summary" comment="Preference summary">Предложения смайликов отображают их название рядом</string>
<string name="prefs__media__emoji_suggestion_query_min_length" comment="Preference title">Минимальная длина запроса</string>
<string name="prefs__media__emoji_suggestion_candidate_max_count" comment="Preference title">Максимальное количество кандидатов</string>
<string name="prefs__media__emoji_suggestion_candidate_max_count" comment="Preference title">Максимальное количество предложений</string>
<!-- Emoji strings -->
<string name="emoji__category__smileys_emotion" comment="Emoji category name">Смайлы и эмоции</string>
<string name="emoji__category__people_body" comment="Emoji category name">Люди и тело</string>
@@ -41,6 +42,7 @@
<string name="emoji__category__symbols" comment="Emoji category name">Символы</string>
<string name="emoji__category__flags" comment="Emoji category name">Флаги</string>
<string name="emoji__history__empty_message" comment="Message if the emoji history is empty">Недавно использованные эмодзи не найдены. Как только вы начнете использовать эмодзи, они автоматически будут появляться здесь.</string>
<string name="emoji__history__phone_locked_message" comment="Message to show if phone is locked">Чтобы получить доступ к истории эмодзи, сначала разблокируйте ваше устройство.</string>
<string name="emoji__history__usage_tip" comment="Feature discoverability for actions of emoji history">Совет: Долго нажимайте на эмодзи в истории эмодзи, чтобы закрепить или удалить их!</string>
<string name="emoji__history__removal_success_message" comment="Toast message if user has used the delete action on an emoji in the emoji history">Удаление {emoji} из истории эмодзи</string>
<string name="emoji__history__pinned">Закреплено</string>
@@ -54,6 +56,7 @@
<string name="quick_action__arrow_left__tooltip">Переместить курсор влево</string>
<string name="quick_action__arrow_right" maxLength="12">Вправо</string>
<string name="quick_action__arrow_right__tooltip">Переместить курсор вправо</string>
<string name="quick_action__clipboard_clear_primary_clip" maxLength="12">Очистить</string>
<string name="quick_action__clipboard_clear_primary_clip__tooltip">Выполнить очистку основного клипа буфера обмена</string>
<string name="quick_action__clipboard_copy" maxLength="12">Копировать</string>
<string name="quick_action__clipboard_copy__tooltip">Выполнить копирование из буфера обмена</string>
@@ -580,6 +583,7 @@
<string name="devtools__show_input_state_overlay__summary" comment="Summary of Show input cache overlay in Devtools">Показывать наложением текущее состояние ввода для отладки</string>
<string name="devtools__show_spelling_overlay__label" comment="Label of Show spelling overlay in Devtools">Показывать орфографию наложением</string>
<string name="devtools__show_spelling_overlay__summary" comment="Summary of Show spelling overlay in Devtools">Показывать наложением текущие результаты проверки орфографии для отладки</string>
<string name="devtools__show_inline_autofill_overlay__label">Показать встроенное окно автозаполнения</string>
<string name="devtools__show_inline_autofill_overlay__summary">Отображает текущие результаты автозаполнения строки для отладки</string>
<string name="devtools__show_key_touch_boundaries__label" comment="Label of Show key touch boundaries in Devtools">Показывать границы нажатия клавиш</string>
<string name="devtools__show_key_touch_boundaries__summary" comment="Summary of Show key touch boundaries in Devtools">Обводить границы нажатия клавиш красным контуром</string>
@@ -759,10 +763,14 @@
<string name="enum__display_language_names_in__system_locale__description" comment="Enum value description">Подписи в приложении и интерфейсе клавиатуры указаны на языке, используемом в системе по умолчанию</string>
<string name="enum__display_language_names_in__native_locale" comment="Enum value label">В исходном виде</string>
<string name="enum__display_language_names_in__native_locale__description" comment="Enum value description">Подписи в приложении и интерфейсе клавиатуры приводятся на родных языках</string>
<string name="enum__emoji_history_update_strategy__auto_sort_prepend" comment="Enum value label">Автоматическая сортировка (добавление в начало)</string>
<string name="enum__emoji_history_update_strategy__auto_sort_prepend__description" comment="Enum value description">Автоматическое изменение порядка расположения эмодзи в зависимости от их использования. Новые эмодзи добавляются в начало.</string>
<string name="enum__emoji_history_update_strategy__auto_sort_append" comment="Enum value label">Автоматическая сортировка (добавление в конец)</string>
<string name="enum__emoji_history_update_strategy__auto_sort_append__description" comment="Enum value description">Автоматическое изменение порядка расположения эмодзи в зависимости от их использования. Новые эмодзи добавляются в конец.</string>
<string name="enum__emoji_history_update_strategy__manual_sort_prepend" comment="Enum value label">Ручная сортировка (добавление в начало)</string>
<string name="enum__emoji_history_update_strategy__manual_sort_prepend__description" comment="Enum value description">Не происходит автоматической перестановки эмодзи в зависимости от их использования.
Новые эмодзи добавляются в начало.</string>
<string name="enum__emoji_history_update_strategy__manual_sort_append" comment="Enum value label">Ручная сортировка (добавление в конец)</string>
<string name="enum__emoji_history_update_strategy__manual_sort_append__description" comment="Enum value description">Не происходит автоматической перестановки эмодзи в зависимости от их использования.
Новые эмодзи добавляются в конец.</string>
<string name="enum__emoji_skin_tone__default" comment="Enum value label">Цвет кожи {emoji} по умолчанию</string>
@@ -776,7 +784,9 @@
<string name="enum__emoji_hair_style__curly_hair" comment="Enum value label">{emoji} Вьющиеся волосы</string>
<string name="enum__emoji_hair_style__white_hair" comment="Enum value label">{emoji} Светлые волосы</string>
<string name="enum__emoji_hair_style__bald" comment="Enum value label">{emoji} Без волос</string>
<string name="enum__emoji_suggestion_type__leading_colon">Начальное двоеточие</string>
<string name="enum__emoji_suggestion_type__leading_colon__description" comment="Keep the :emoji_name while translating, this is a syntax guide">Предлагайте эмодзи, используя синтаксис :emoji_name</string>
<string name="enum__emoji_suggestion_type__inline_text">Встроенный текст</string>
<string name="enum__emoji_suggestion_type__inline_text__description">Предлагает эмодзи, просто набрав название эмодзи в виде слова</string>
<string name="enum__extended_actions_placement__above_candidates" comment="Enum value label">Вышестоящие предложение</string>
<string name="enum__extended_actions_placement__above_candidates__description" comment="Enum value description">Размещает строку расширенных действий между пользовательским интерфейсом приложения и строкой предложений</string>
@@ -901,4 +911,16 @@
<item quantity="many">{v} элементов</item>
<item quantity="other">{v} элементов</item>
</plurals>
<plurals name="unit__characters__written">
<item quantity="one">{v} символ</item>
<item quantity="few">{v} символа</item>
<item quantity="many">{v} символов</item>
<item quantity="other">{v} символов</item>
</plurals>
<plurals name="unit__candidates__written">
<item quantity="one">{v} предложение</item>
<item quantity="few">{v} предложения</item>
<item quantity="many">{v} предложений</item>
<item quantity="other">{v} предложений</item>
</plurals>
</resources>

View File

@@ -13,5 +13,5 @@ projectCompileSdk=34
projectBuildToolsVersion=34.0.0
projectNdkVersion=26.1.10909125
projectVersionCode=97
projectVersionName=0.4.0-rc02
projectVersionCode=101
projectVersionName=0.4.3