← Концепції

Узгодження за родом

У деяких мовах дієслова та прикметники змінюються залежно від статі особи, про яку йдеться в реченні. В англійській здебільшого ні, тож фраза, яку ви пишете як {username} has been invited, — це одне речення англійською і два чи три іспанською, французькою або російською. Langsys опрацьовує це під час перекладу — так само, як генерує форми множини, — а ви передаєте один аргумент.

Дивитися · 0:39 Узгодження за родом

Що видає конвеєр

Коли цільова мова вимагає узгодження, 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. І він з’являється лише в тих локалях, яким він потрібен: це непомітно, доки хтось не відкриє застосунок мовою з граматичним родом.

Передавання

Передавайте аргумент, щойно він вам відомий, і читач отримає речення з правильними відмінками та формами:

// 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 у конфігурації ініціалізації та відкрийте застосунок у локалі з граматичним родом: SDK виведе одне Langsys Warning для кожної фрази, переклад якої потребує аргумента, якого ви не передали, із зазначенням назви аргумента. Один раз на фразу для кожної локалі, а в продакшені — без виведення. Одна особливість: усередині компонентів блоку вмісту та фрази _gender, переданий про всяк випадок, сам повідомляється як незіставлений параметр, тому що перевірка виконується щодо вашого вихідного тексту, де select ніколи не з’являється.

Якщо вагаєтеся — передавайте. Значення для аргументу, якого рядок не має, під час відображення ігнорується, тож передавати _gender для кожної змінної, що описує особу, безпечно, і це охоплює локалі, які ви ще не переглядали.

Одна змінна на фразу. Узгодження може визначати лише одна змінна. Рядок, де їх дві — кількість і рід — залишається без змін і не перетворюється на вкладений ICU, тому перекладається як одне просте речення.

Пошук у документації та Навчальному центрі