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