PHP 8.5: 新增 locale_is_right_to_left function 以及 Locale::isRightToLeft 方法
PHP 8.5 中的 Intl 扩展添加了新功能,以确定给定的区域设置是否使用 RTL(从右向左)脚本。
阿拉伯语、希伯来语、乌尔都语和其他一些语言文字是从右向左书写的。虽然 RTL 脚本列表相对较小,而且很少添加新脚本,但新功能利用了 ICU 数据,这些数据在依赖 ICU 数据的其他软件中会持续更新。
新增加的函数 locale_is_right_to_left 以及静态方法 Locale::isRightToleft 都接收一个 string 类型的语言名称作为他们的唯一参数,并返回 true 或者 false 以表明脚本是否为 RTL。
新增的 locale_is_right_to_left 函数
/**
* Returns whether the given $locale has an RTL script.
* @param string $locale
* @return bool Whether the script is RTL
*/
function locale_is_right_to_left(string $locale): bool {}locale_is_right_to_left函数在全局命名空间中声明。- 未传入参数将抛出
ArgumentCountError错误。 - 传入空字符串将返回
false。 - 将传入无效的语言将返回
false。
错误处理行为(例如,空字符串这种无效语言)与其他的 locale_ 函数是一致的,即对无效输入返回 false。
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 静态方法
PHP 8.5 的 Intl 扩展中的 Locale 类中也新增了一个静态方法:Locale::isRightToLeft,它提供了与 locale_is_right_to_left 完全相同的功能及行为。
class Locale {
// ...
/**
* Returns whether the given $locale has an RTL script.
* @param string $locale
* @return bool Whether the script is 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用户空间 PHP Polyfill
可以用硬编码的语言环境列表来模仿 locale_is_right_to_left 函数功能。因为新的 RTL 脚本很少引入 ICU,所以这是一个相对安全的 polyfill。
以下 polyfill 检查给定的 $locale 参数是否与已知的 RTL 脚本列表匹配或前缀是否匹配:
ar: Arabicdv: Dhivehihe: Hebrewku-Arab: Kurshish Soranips: Pashtofa: Persian (Farsi)sd: Sindhiur: Urduyi: Yiddish
/**
* Returns whether the given $locale has an RTL script.
* @param string $locale
* @return bool Whether the script is RTL
*/
function locale_is_right_to_left(string $locale): bool {
return (bool) preg_match('/^(?:ar|he|fa|ur|ps|sd|ug|ckb|yi|dv|ku_arab|ku-arab)(?:[_-].*)?$/i', $locale);
}向后兼容性影响
locale_is_right_to_leftPHP 中新增到全局命名空间的函数。除非你在应用中使用了相同的名称来声明自己的函数,否则不会造成任何兼容性影响。Locale::isRightToleft是一个新增到Locale类的静态方法。它并没有被声明为final。除非你的在应用中继承了Locale类并使用了不匹配的方法名,否则不会带来任何向后兼容性影响
此外,可以使用 polyfill 将 locale_is_right_to_left 函数引入到旧版本中。