_n()
Отримує рядок перекладу однини або множини, яка відповідає зазначеному числу (1 коментар, 2 коментарі). Функція локалізації.
У функцію вказуються рядки перекладу та число, що далі:
- Якщо передано однину (1), функція поверне переведене значення першого параметра: $single .
- Якщо передано множину (2 3 4), функцію поверне переведене значення другого параметра: $plural .
- Якщо не вдасться отримати переклад потрібного рядка з файлу перекладу, функція поверне оригінальне значення рядка.
Якщо вказано ID перекладу ( $ domain ). Функція передасть параметри $single, $plural, і $number метод Translations::translate_plural() . Потім результат та всі параметри будуть передані у фільтр ngettext
.
Якщо потрібно зробити такий переклад з урахуванням контексту, використовуйте _nx() .
Ця функція вважається внутрішньою для використання самим ядром . Не рекомендується використовувати цю функцію у своєму коді.
Translations::translate_plural()
Хуки з функції
Повертає
Строку
. Перекладений або оригінальний рядок вказаний у параметрі $single або $plural , залежно від переданого числа $number .
Використання
_n( $single, $plural, $number, $domain )
-
$single
(рядок) (обов’язковий) - Рядок перекладу, який буде використаний за $number = 1.
-
$plural
(рядок) (обов’язковий) Рядок перекладу, який буде використаний при $number більше 1.
Для російської мови, де часто використовують 3 форми (1 яблуко, 3 яблука, 5 яблук), цю функцію теж можна використовувати, але для цього потрібно буде грамотно налаштувати “Форми множини” для .mo файлу в програмі Poedit.
-
$number
(число) (обов’язковий) -
Число (множинне або єдине), яке визначатиме якийсь рядок перекладу потрібно використовувати
$single або
$plural . -
$domain
(рядок) -
Домен (ідентифікатор файлу перекладу), який визначає, який файл використовуватиме переклад.
За замовчуванням: ‘default’
Приклади
#1 Просте використання, для наочності
echo _n( '%s star', '%s stars', 1); // Виведе: %s star echo _n( '%s star', '%s stars', 3); // Виведе: %s stars
#2 З файлом перекладу
Далі, передбачається, що файл перекладу, він зареєстрований за допомогою
load_plugin_textdomain() і його ідентифікатор ‘ my_textdomain ‘.
Також у цьому файлі перекладу вказані переклади для численних чисел, тоді:
echo _n( '%s star', '%s stars', 1, 'textdomain' ); // Поверне: %s зірка echo _n( '%s star', '%s stars', 4, 'textdomain' ); // Поверне: %s зірки echo _n( '%s star', '%s stars', 6, 'textdomain' ); // Поверне: %s зірок
#3 Замінюємо %s
на потрібне число.
Для цього використовуємо PHP функцію sprintf() . Так робиться у всіх темах:
$ rating = 1; echo sprintf( _n( '%s star', '%s stars', $rating, 'your_textdomain' ), $rating ); // Поверне: 1 зірка $ rating = 4; echo sprintf( _n( '%s star', '%s stars', $rating, 'your_textdomain' ), $rating ); // Поверне: 4 зірки $ rating = 6; echo sprintf( _n( '%s star', '%s stars', $rating, 'your_textdomain' ), $rating ); // Поверне: 6 зірок
#4 Приклад файлу /wp-admin/edit-comments.php
if ( $approved > 0 ) $messages[] = sprintf( _n( '%s comment approved', '%s comments approved', $approved ), $approved );
#5 Перекладаємо фразу про кількість товарів у WooCommerce
// Отримуємо кількість товарів у кошику, нехай їх 5 $count = WC()->cart->get_cart_contents_count(); // Перекладаємо, отримаємо "%s, %d товарів" $translation = _n( '%s, has %d product', '%s, has %d products', $count, 'woocommerce' ); // Вирізаємо кому, якщо не потрібна, отримаємо "%s%d товарів" $translation = str_replace( ',', '', $translation ); // Підставляємо замість плейсхолдерів дані, отримаємо "Усього 5 товарів" $translation = sprintf( $translation, 'Всього', $count ) // Очищаємо та виводимо на екран echo wp_kses_data ($ translation);
#6 Не виконуйте обчислення всередині функції sprintf()!
Наступне не працюватиме:
$text = sprintf( _n( '%s star', '%s stars', $rating, 'your-text-domain' ), 2 <= $rating? $rating -1 : $rating );
Правильно:
$rating = 2 <= $rating? $rating - 1: $rating; $text = sprintf( _n( '%s star', '%s stars', $rating, 'your-text-domain' ), $rating );
список змін
З версії 2.8.0 | Введено. |
З версії 5.5.0 | Introduced ngettext-{$domain} filter. |