PHP 8.5: новая функция `locale_is_right_to_left` и метод `Locale::isRightToLeft`

В PHP 8.5 появилось обновление для работы с многоязычными приложениями: функция `locale_is_right_to_left` и метод `Locale::isRightToLeft`, позволяющие разработчикам автоматически определять языки с написанием справа налево, включая арабский и иврит. Эти инструменты значительно упрощают локализацию приложений и обеспечивают корректное отображение текста на языках с RTL написанием письма.

Расширение Intl в PHP 8.5 добавляет новую функциональность для определения, использует ли данная локаль написание RTL (справа налево).

Арабский, иврит, фарси и некоторые другие языки пишутся справа налево. Хотя список языков, использующих RTL, относительно невелик, и новые языки добавляются редко, новая функциональность использует данные ICU, которые постоянно обновляются в других программах, использующих данные ICU.

Новая функция locale_is_right_to_left и статический метод Locale::isRightToleft принимают в качестве единственного параметра строку с именем локали и возвращают true или false, указывая, является ли написание RTL.

Новая функция locale_is_right_to_left

/**
* Возвращает значение, указывающее, имеет ли заданный $locale RTL-написание.
* @param string $locale
* @return bool Является ли написание RTL
*/

function locale_is_right_to_left(string $locale): bool {}

Поведение при обработке ошибок, например, при пустой или недопустимой локали, соответствует другим функциям locale_, возвращающим ложные значения при недопустимых вводимых данных.

locale_is_right_to_left('en'); // false
locale_is_right_to_left(''); // false
locale_is_right_to_left('ar'); // true
locale_is_right_to_left('ar-US'); // true
locale_is_right_to_left('he_IL'); // true
locale_is_right_to_left('ar-XY'); // true

Новый статический метод Locale::isRightToLeft

Класс Locale из расширения Intl в PHP 8.5 также получил новый статический метод Locale::isRightToLeft. Этот метод реализует ту же функциональность и демонстрирует такое же поведение, как функция locale_is_right_to_left.

class Locale {
// ...
/**
* Возвращает значение, указывающее, имеет ли заданный $locale RTL-написание.
* @param string $locale
* @return bool Является ли написание RTL
* @alias locale_is_right_to_left
*/

public static function isRightToLeft(string $locale): bool {}
}
Locale::isRightToLeft('en'); // false
Locale::isRightToLeft(''); // false
Locale::isRightToLeft('ar'); // true
Locale::isRightToLeft('ar-US'); // true
Locale::isRightToLeft('ar-XY'); // true

Пользовательский полифилл

Функциональность locale_is_right_to_left можно имитировать с помощью жёстко запрограммированного списка локалей. Поскольку новые RTL-написания редко появляются в ICU, это относительно безопасный полифилл.

Следующий полифилл проверяет, соответствует ли заданный параметр $locale известному списку RTL-написаний или его префиксу:

/**
* Возвращает значение, указывающее, имеет ли заданный $locale RTL-написание.
* @param string $locale
* @return bool Является ли написание RTL
*/

function locale_is_right_to_left(string $locale): bool {
// Проверяем соответствие локали известным RTL-языкам
return (bool) preg_match('/^(?:ar|he|fa|ur|ps|sd|ug|ckb|yi|dv|ku_arab|ku-arab)(?:[_-].*)?$/i', $locale);
}

Влияние на обратную совместимость

Кроме того, функциональность locale_is_right_to_left можно реализовать в более старых версиях PHP с помощью простого полифилла.

Комментарии


Дополнительные материалы

Предыдущая Статья

PHP 8.5: CLI: php --ini=diff отображает нестандартные INI директивы