Согласование по роду
В некоторых языках глаголы и прилагательные изменяются в зависимости от пола того, о ком идёт речь в предложении. В английском этого почти нет, поэтому фраза, которую вы пишете как {username} has been invited, — это одно предложение на английском и два-три на испанском, французском или русском. Langsys обрабатывает это в процессе перевода — так же, как генерирует формы множественного числа, — а вы передаёте всего один аргумент.
Что выдаёт конвейер
Если целевому языку нужно согласование, Langsys переписывает строку этой локали в нужные ветви — ICU select. Ваша исходная фраза не меняется, а ветви не нужно писать вручную.
// Your source phrase, unchanged:
"{username} has been invited"
// What the Spanish translation becomes — note invitado / invitada:
"{username_gender, select, male {{username} ha sido invitado} \
female {{username} ha sido invitada} \
other {{username} ha sido invitado/a}}" Стоит усвоить два следствия. Аргумент называется по имени переменной, к которой он относится, с добавлением _gender: для {username} получится username_gender, а ветки всегда такие: male, female, other. Кроме того, он появляется только в тех локалях, где он нужен, и это незаметно, пока кто-нибудь не откроет приложение на языке с grammatical gender.
Передача
Передавайте аргумент всякий раз, когда он вам известен, и читатель получит предложение с правильными грамматическими формами:
// The argument is named after the variable it inflects, + _gender.
// Branches are always male / female / other.
t('{username} has been invited', 'Team', {
username: user.name,
username_gender: user.gender ?? 'other',
}); Не знаете пол? Явно передайте 'other' — это нейтральная ветка. Что выводится при отсутствии аргумента, зависит от SDK; это указано на странице каждого SDK. Там же показан вызов в идиоматике соответствующего SDK.
Каким фразам он нужен?
По собственному коду этого не определить, и это закономерно: аргумент добавляется при переводе, отдельно для каждой целевой локали, поэтому ни исходная фраза, ни ваша кодовая база на него не указывают. Есть три способа это выяснить.
Прочитайте каталог. Переводы, которые загружает ваше приложение, и есть опубликованные строки, так что ответ уже находится на клиенте. Получите каталог для поддерживаемой вами локали (его предоставляет каждый SDK) и найдите записи, содержащие , select,. Так вы получите точные фразы и имена аргументов, а проверку достаточно дёшево запускать в CI для каждой выпускаемой локали.
// The catalog your app fetches IS the promoted strings — grep it.
const wanting = Object.entries(catalog)
.filter(([, translation]) => translation.includes(', select,'))
.map(([phrase]) => phrase);
// → every phrase (and, from the string, every argument) this locale needs Включите отладку (JavaScript SDK). Передайте debug: true в конфигурации инициализации и откройте приложение в локали с grammatical gender: SDK выведет одно Langsys Warning для каждой фразы, перевод которой требует аргумент, который вы не передали, с указанием этого аргумента. Один раз на фразу для каждой локали, а в продакшене — без вывода. Один нюанс: внутри компонентов блока контента и фразы «подстраховочно» переданный _gender сам помечается как несопоставленный параметр, потому что проверка выполняется по вашему исходному тексту, где select не встречается.
Если сомневаетесь — передавайте. Значение аргумента, которого нет в строке, игнорируется при рендеринге, поэтому отправка _gender для каждой переменной, описывающей человека, безопасна и покрывает локали, которые вы ещё не проверяли.
Одна переменная на фразу. Согласование может определять только одна переменная. Строка, где их две, — например, число и пол, — остаётся без изменений и не превращается во вложенный ICU, поэтому переводится как одно простое предложение.