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_is_right_to_left объявлена в глобальном пространстве имён.
  • Передача без параметров вызывает ошибку ArgumentCountError.
  • Передача пустой строки возвращает false.
  • Передача недопустимой локали возвращает false.

Поведение при обработке ошибок, например, при пустой или недопустимой локали, соответствует другим функциям 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 — статический метод.
  • Использует ту же обработку ошибок, что и функция locale_is_right_to_left.
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-написаний или его префиксу:

  • ar: Arabic
  • dv: Dhivehi
  • he: Hebrew
  • ku-Arab: Kurshish Sorani
  • ps: Pashto
  • fa: Persian (Farsi)
  • sd: Sindhi
  • ur: Urdu
  • yi: Yiddish
/**
* Возвращает значение, указывающее, имеет ли заданный $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 не объявляет собственную функцию с идентичным именем, она не должна повлиять на обратную совместимость.
  • Locale::isRightToLeft — новый статический метод, добавленный в класс Locale. Он не объявлен как final. Если PHP приложение не расширяет класс Locale с совпадающим именем метода, то данное изменение не влияет на обратную совместимость.

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

Комментарии


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

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

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

Следующая Статья

PHP 8.5: Поддержка трассировки стека для фатальных ошибок PHP