PHP 8.5: новая функция `locale_is_right_to_left` и метод `Locale::isRightToLeft`
Расширение 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: Arabicdv: Dhivehihe: Hebrewku-Arab: Kurshish Soranips: Pashtofa: Persian (Farsi)sd: Sindhiur: Urduyi: 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 с помощью простого полифилла.