Kotlin: Как передать несколько переменных в локализованную строку

Чтобы передать несколько переменных в локализованную строку (например, имя пользователя + число элементов), используйте позиционные плейсхолдеры в "strings.xml" и передавайте аргументы в stringResource() в нужном порядке.

Настройка строк в strings.xml


В файле "res/values/strings.xml" (и его локализованных аналогах) определите строку с несколькими плейсхолдерами:
<!-- Пример: Приветствие + количество уведомлений -->
<string name="welcome_with_count">
    Привет, %1$s! У вас %2$d уведомлений.
</string>

<!-- Пример: Дата + сумма -->
<string name="transaction_summary">
    Операция от %1$s на сумму %2$.2f рублей.
</string>

Синтаксис плейсхолдеров:
  • %1$s — первая переменная, тип String (s = string);
  • %2$d — вторая переменная, тип Int/Long (d = decimal);
  • %2$.2f — вторая переменная, тип Float/Double с 2 знаками после запятой (f = float).

Важно:
  • Нумерация (1$, 2$) обязательна — иначе порядок аргументов может нарушиться.
  • Типы (s, d, f) должны соответствовать передаваемым данным.

Использование в Compose


Передавайте аргументы в том же порядке, в каком они указаны в строке:
@Composable
fun UserScreen() {
    val username = "Анна"
    val notificationsCount = 5
    val amount = 1234.56

    Column {
        // Пример 1: Имя + число
        Text(
            text = stringResource(
                R.string.welcome_with_count,
                username,
                notificationsCount
            )
        )

        // Пример 2: Дата + сумма (с форматированием)
        Text(
            text = stringResource(
                R.string.transaction_summary,
                "15.01.2026",
                amount
            )
        )
    }
}

Что получится на экране:
  1. «Привет, Анна! У вас 5 уведомлений.»
  2. «Операция от 15.01.2026 на сумму 1234.56 рублей.»

Примеры сложных случаев



Строка с тремя переменными
<string name="trip_details">
    Вы летите в %1$s (%2$s) с %3$d пассажирами.
</string>

stringResource(
    R.string.trip_details,
    "Париж",
    "CDG",
    2
)
// Результат: «Вы летите в Париж (CDG) с 2 пассажирами.»

Переиспользование переменных
<string name="repeat_example">
    %1$s сказал: «Привет, %1$s!»
</string>

stringResource(R.string.repeat_example, "Максим")
// Результат: «Максим сказал: „Привет, Максим!“»

Важные правила



Порядок аргументов
  • В stringResource() передавайте переменные в том же порядке, как в строке (%1$, %2$ и т. д.).
  • Если порядок нарушен — текст будет некорректным.

Соответствие типов
  • %1$sString;
  • %2$dInt, Long;
  • %3$.2fFloat, Double (.2 — 2 знака после запятой).

Локализация
  • Добавьте строки с теми же ключами (name) во все "strings.xml" для других языков.
  • Пример для "values-ru/strings.xml":
    <string name="welcome_with_count">
        Привет, %1$s! У вас %2$d уведомлений.
    </string>

Экранирование символов
  • Если в строке есть символ %, напишите его дважды: %%.
  • Например: <string name="percent">Скидка %1$d%%</string> → «Скидка 20%».

Проверка
  1. Запустите приложение на устройстве с нужным языком.
  2. Убедитесь, что:
    • Все переменные подставлены корректно;
    • Нет ошибок формата (например, %1$d вместо %1$s);
    • Текст не обрезан (проверьте RTL‑языки, если поддерживаются).


Итог


  • Используйте плейсхолдеры %N$t (N — номер, t — тип).
  • Передавайте аргументы в stringResource() в правильном порядке.
  • Локализуйте строки во всех "strings.xml".


Автор:  31.01.2026 08:42:59 pm