Junior: питання на співбесіді з теми «Локалізація»
Питання з реальних співбесід з відповідями: Laravel і PHP, бази даних, JavaScript і фронтенд, Git, Docker, API, безпека й архітектура. Тими самими темами, що й тести.
2 питання
Локалізація дає багатомовність. Рядки перекладів лежать у lang/{locale} (наприклад, lang/uk/messages.php або JSON-файли).
// lang/uk/messages.php
return ['welcome' => 'Ласкаво просимо, :name'];
{{ __('messages.welcome', ['name' => $user->name]) }}
app()->setLocale('uk')перемикає мову (зазвичай у middleware).trans_choice()обирає форму за кількістю (1 яблуко / 2 яблука / 5 яблук).
Плейсхолдери - змінні частини рядка позначаються двокрапкою:
// lang/uk/messages.php
'welcome' => 'Вітаємо, :name!',
__('messages.welcome', ['name' => $user->name]);
Регістр плейсхолдера впливає на регістр підстановки: :NAME дасть ОЛЕНА, :Name - Олена.
Множина. В англійській дві форми: «1 comment», «2 comments». В українській - три:
| Число | Форма |
|---|---|
| 1, 21, 31, 101 | 1 коментар |
| 2-4, 22-24 | 3 коментарі |
| 0, 5-20, 25-30, 11-14 | 5 коментарів |
Форми розділяють символом |, а функція trans_choice обирає потрібну за числом і правилами мови поточної локалі:
// lang/uk/comments.php
'count' => ':count коментар|:count коментарі|:count коментарів',
trans_choice('comments.count', 1); // 1 коментар
trans_choice('comments.count', 3); // 3 коментарі
trans_choice('comments.count', 11); // 11 коментарів
trans_choice('comments.count', 21); // 21 коментар
:count підставляється автоматично. Правила української (як і інших мов) уже вбудовані в Laravel - у класі MessageSelector, тож порядок форм для uk такий: одна, кілька, багато.
Явні діапазони - коли потрібен особливий текст для нуля чи межі:
'count' => '{0} Коментарів ще немає|{1} :count коментар|[2,4] :count коментарі|[5,*] :count коментарів',
Але явні діапазони не знають правил мови: [2,4] спрацює для 3, а для 23 - ні. Для українських текстів надійніше лишити три форми без діапазонів, а нуль обробити окремою умовою в коді чи шаблоні.
У Blade:
{{ trans_choice('comments.count', $post->comments_count) }}
Типові помилки:
- склеювати рядок з частин:
$count . ' ' . __('коментарів')- неправильна форма для половини чисел; - писати дві форми для української за англійським зразком;
- перевіряти лише 1, 2 і 5, а не 11-14 і 21 - саме там помиляються найчастіше.